Why I built this blog with Express instead of a static site generator
There are faster ways to ship a blog. I picked Express + Handlebars anyway — here's why.
Most engineers I know would reach for Astro, Hugo, or Next.js for a personal blog. And they'd be right — static site generators are fast, cheap, and well-suited for content sites. So why didn't I?
The boring answer: consistency
I already run an Express + Handlebars stack for another project on the same server. Same patterns, same mental model, same deployment pipeline. When something breaks at 2 AM, I want to debug one architecture, not two.
The real answer: it says something
A hand-built Express app on a personal blog signals something different than npx create-astro. It's the difference between a chef cooking at home and ordering takeout — both feed you, but one demonstrates the craft.
This isn't gatekeeping. Static site generators are excellent tools. But for a site that's meant to showcase how I think about engineering, the stack itself is part of the message.
What I traded away
Let me be honest about the downsides:
- 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.
What I gained
- Dynamic features are trivial. Want to add a contact form, search API, or webhook endpoint? It's just another Express route.
- Content is markdown files. No build step, no config files, no plugins. Write markdown, deploy, done.
- 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's no JavaScript framework, no client-side rendering, no webpack. It's fast because there's nothing to slow it down.
Sometimes the best architecture is the one you understand completely.