Why I built this blog with Express instead of a static site generator
There are faster ways to ship a blog. I picked Express and Handlebars anyway, and this post explains the reasoning.
Most engineers I know would reach for Astro, Hugo, or Next.js for a personal blog, and they would be right. Static site generators are fast, cheap, and well-suited for content sites. I picked Express and Handlebars anyway.
Consistency
I already run an Express and Handlebars stack for another project on the same server. It uses the same patterns, mental model, and deployment pipeline. When something breaks at 2 AM, debugging one architecture is easier than debugging two.
Signal
A hand-built Express app on a personal blog signals something different from npx create-astro. Both approaches produce a working site, but building the stack by hand demonstrates the engineering craft the site is meant to showcase.
This isn't gatekeeping. Static site generators are excellent tools. But for a site meant to showcase how I think about engineering, the stack itself is part of the message.
Downsides
The trade-offs:
- No free hosting. Vercel/Netlify give you static hosting for free. I'm paying for a Hetzner VPS.
- Slightly higher memory. The Express process uses ~50-100MB, versus zero for pre-rendered HTML.
- No incremental builds. I rebuild the content index on deploy. For a personal blog, this takes milliseconds.
Benefits
- Dynamic features are trivial. A contact form, search API, or webhook endpoint is just another Express route.
- Content is markdown files. No build step, no config files, no plugins. I write the markdown and deploy it.
- Full control. No framework abstractions between me and the HTML. Every byte of CSS is intentional.
The site loads in under a second. The markup is clean. The CSS uses custom properties for dark mode. There is no JavaScript framework, no client-side rendering, and no webpack. With nothing extra running, it loads fast.
I understand this stack completely, and for a system I maintain alone, that matters more than the convenience I gave up.