How this site is built

This is a colophon: what this site is made of, and the handful of decisions behind it. If you're here to hire me, the home page is the one you want.

The stack

Next.js and React, TypeScript, deployed on Vercel. The whole thing is static — every page is generated at build time, so there's no server doing work when you load it. It's the same stack I build client platforms on, minus the database, because a personal site that needs a database is a personal site with a maintenance problem.

Rule one: content is data, not markup

Every project, capability, and job on the home page lives in one typed file. Adding a project is appending an object to an array — a name, a tag, a description, an optional link. Nothing in the page markup changes.

That sounds like a small thing. It isn't. The reason most personal sites go stale is that updating them means opening a code editor and picking through layout to find the right paragraph. If the cost of adding a project is one object in one file, the site stays current. If it's twenty minutes of archaeology, it doesn't.

Same principle I apply to client work: put the thing that changes often somewhere it's cheap to change, and keep it away from the thing that changes rarely.

Rule two: write for the machines too

There's a llms.txt at the root of this site. It's a plain-text version of who I am and what I've built, written for language models rather than for you. There's structured data in the page head saying the same thing in schema.org's vocabulary.

This isn't a trick. People increasingly ask an assistant about someone before they ever load their website, and the assistant answers from whatever it can parse. If the machine-readable version of you is missing, out of date, or contradicts the page, that's the version that gets repeated.

So both get updated in the same commit. The home page even has a button that opens ChatGPT, Claude, or Perplexity with a question about me preloaded — partly because it's a fair test, and partly because it keeps me honest. If what the assistants say doesn't match what the site says, one of them is wrong and it's worth knowing which.

What's deliberately not here

No analytics. No cookie banner, because there are no cookies to consent to. No newsletter popup. No stock photography of a laptop on a desk.

The design is one editorial column: a serif for headlines, a sans for reading, a lot of white space, and a light and dark mode that follow whatever your system is set to. It's meant to look like something printed rather than something templated.

Writing

This page you're reading is a markdown file in the repository. Publishing is adding a file and pushing it. Same rule as the projects — if it's expensive to add to, it won't get added to.