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.