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.