/colophon

How this site is built

You found your way to the colophon, which means you're exactly the sort of person this page is for. Here's how the site is put together, and why.

Static by design

The whole site is a static export: Next.js and React build it into plain HTML ahead of time, and that's what ships. No server rendering, no runtime API calls, nothing to attack at request time. It loads fast, costs almost nothing to run, and there's no server to babysit at 3am.

The stack

Next.js (App Router) and React 19 on the front, styled with Tailwind CSS v4 straight in CSS, animated with Framer Motion. TypeScript throughout, in strict mode, because I'd rather the compiler catch it than a visitor.

Words from a CMS, at build time only

The blog and a couple of pages pull their content from Sanity, but only while the site is building. When I publish, a webhook kicks off a fresh build and the new content bakes into static HTML. So there's a CMS to write in, but nothing running when you visit.

The one bit that isn't static

The like button on each post has to remember counts, and static HTML can't. So there's one small exception: a tiny Cloudflare Worker backed by a key-value store, a couple of dozen lines, no accounts and no database. Everything else on the page is pre-built; only the likes phone home.

Hosting and analytics

It's served as static assets on Cloudflare. Analytics are Cloudflare's own: cookieless, storing nothing on your device, so there's no consent banner nagging you. I can see that a page was visited, not who you are.

For the curious

There are eight easter eggs hidden around the site, and a command palette on Ctrl/Cmd+K. Open your browser console and you'll find a greeting, plus a hire() function if you fancy it. None of it is load-bearing. All of it is there because building things you enjoy is the whole point.