This is the first post on my new blog, built from scratch with a custom static site generator. No frameworks, no JavaScript — just Python, Jinja2, and markdown.
Why build your own?
There are plenty of static site generators out there — Hugo, Jekyll, Eleventy, Pelican. So why build another one?
- It's small. The entire build script is under 200 lines.
- It's mine. Every line is intentional. No surprises.
- It's fun. Sometimes the best way to learn is to reinvent the wheel.
A code example
Here's the core of the build pipeline in Python:
def build(posts_dir: Path, output_dir: Path) -> None:
"""Run the full build pipeline."""
posts = load_posts(posts_dir)
for post in posts:
render_post(post, output_dir)
And some shell to run it:
uv run blog build
open output/index.html
What's next
- Tag pages and an archive view
- An Atom feed for RSS readers
- Syntax highlighting for code blocks[1]
- Eventually, deployment to S3 + CloudFront
All in good time.