An overhead view of a desk where a web page layout has been drawn in blue ink on cream paper, beside a fountain pen and a steel ruler
Illustration generated with OpenArt (GPT Image 2.5 Flare).

This site is hand-written HTML, and that is on purpose

There is no framework behind this page. No static site generator, no bundler, no node_modules, no CI pipeline that turns Markdown into HTML. The src folder is the site. Deploying it copies that folder to S3 and invalidates a CloudFront distribution. The deploy script is four lines long.

That is an unfashionable choice, so it is worth saying why.

The maintenance is in the tooling, not the content

A personal site changes a handful of times a year. A modern toolchain changes considerably more often than that. Every time I come back to a project built on a generator, the work is not writing — it is a dependency upgrade, a breaking change in a plugin, a Node version that no longer matches, a lockfile that will not resolve. The content was fine. The scaffolding rotted.

HTML does not rot. A page written in 2014 renders today. That asymmetry only grows the longer the site lives.

The cost is real, and it is duplication

I am not going to pretend this is free. The header, the navigation and the script tags are copied into every page, and when the navigation changes I have to change it everywhere. That is exactly the problem templating exists to solve, and on a site with two hundred pages I would solve it that way.

On a site with a dozen, a careful find-and-replace is cheaper than a build system I have to keep alive. The break-even point is real, and most personal sites never reach it.

What I do keep

  • A real CSS file per concern. The template's stylesheet stays untouched so it can be updated; anything I add lives in its own file.
  • Vendored libraries. Bootstrap and the rest sit in assets/vendor, pinned by being copied. They cannot change under me.
  • One deploy command. If deploying is hard, updates stop happening.

The one thing worth automating

If any of this grows past hand-editing, the thing to automate first is not the HTML. It is the index — the blog listing, the games shelf, anything that has to be regenerated whenever a new item appears, because that is the step a human will forget. The pages themselves can stay hand-written for a long time after that.

Until then: a folder of files, copied to a bucket. It has worked for thirty years.

All posts See the games shelf