Skip to content

> cat ~/colophon

Colophon

How this site is built, how I write for it, and where AI is and is not in the loop.

Last updated

The stack

Next.js, statically exported. Every page is HTML on disk before anyone asks for it. Tailwind for styling, with one palette that has a plain light mode and a Minecraft-night dark mode. The fonts are Geist, Geist Mono, and Source Serif 4, self-hosted so nothing render-blocking comes from a third party.

Posts and case studies are markdown files in the repo. They are rendered at build time with remark and rehype. Code is highlighted at build time with Shiki, so no highlighter ships to the browser. Diagrams are Mermaid, themed to the site palette. There is no CMS and no database.

CI runs the typecheck, lint, the build, an internal link check, and Lighthouse budgets on every push.

Where AI is in the loop

I use Claude Code every day, and I use it on this site. My configuration for it is open source and written up as a case study. I would rather say exactly where it sits than pretend it is not there.

Drafting. A case study starts from my notes, the commit history, and screenshots. An agent often turns that into a first draft. The structure, the numbers, and the "what I would do differently" sections are mine. That last one is the section an agent cannot write for me, because it does not know what I got wrong.

Code. A lot of the plumbing on this site was written with an agent in the loop: the build-time highlighting, the deck viewer, the link checker. I review every diff before it lands, and the fixes in the commit log are mine to own, including the ones where the first version was the agent's and wrong.

Not AI. The opinions. The postmortems. The decisions about what to build and what to cut.

What the commit log shows

The honest part of an AI disclosure is not the policy. It is the record of what it cost. All of this is in the commit history of this repo:

  • 30 March 2026. Four commits correcting factual inaccuracies in blog posts and project pages. One draft had the storage layer wrong.
  • 25 July 2026. Six commits in one day removing AI writing patterns from every post, case study, and talk.
  • 22 August 2026. Two commits correcting overstated security and authorization claims on four project pages. The drafts claimed more than the code did.

That is the pattern. Generated text drifts toward claiming more than the thing does, and the job is catching it. If a number on this site has no source in the repo, it should not be here. Tell me if you find one.

How I write

Before the current homepage copy was written, I measured my own writing: 15,256 words across the posts and case studies. Mean sentence of 14.6 words. 190 contractions. No em dashes. New copy has to match that, which turns out to be a useful test for whether a paragraph was mine or a machine's.

Easter eggs

There are some. They never block reading.