How the site is built, and why it looks like this.
A short list of the choices that produced the page you're reading. Most of them are deliberate. The ones that aren't will be replaced when I notice.
Materials
- type, body
- IBM Plex Sans, 400 / 500 / 600
- type, mono
- IBM Plex Mono, 400 / 500
- background
- #1a1612
- body text
- #d8d0c0
- accent
- #a3b48c sage, picked for not being a brand colour
- dim
- #7a7268
- rule
- #2a241e the hairlines under section headings
Build
Static, and more literally so than most sites that claim it. These five pages are hand-written HTML. There is no build system, no framework, no database, no comments, and no analytics. Each page carries a short inline script whose only job is to render a list from the data file below.
The content comes out of my Obsidian vault. Notes live there as plain Markdown with front-matter, and a small Node pipeline reads the ones marked for publication and emits exactly one generated artifact: a JavaScript file holding every entry on the site. The essays come from one Markdown note per piece; the film reviews are parsed out of a single Letterboxd export note. Nothing else is generated — the pages themselves I edit by hand.
One detail I care about more than it probably deserves: the pipeline never concatenates strings into that data file. Every value goes through JSON.stringify, so a note containing something that looks like code arrives on the page as inert text. Publishing straight from a personal vault means the input is only as trustworthy as whatever I pasted into it last, and I would rather that be structurally safe than carefully handled.
Deployment is one command from the folder to Netlify. The whole site, photos included, is around half a megabyte uncompressed.
Choices that took longest
Whether to have a build system at all. The obvious move was a static site generator, and I spent a while assuming I would use one. I ended up with a single data file and five hand-written pages instead, because the overhead of a pipeline isn't justified by a site this size, and because the data shape maps cleanly onto Markdown front-matter — which means adopting a generator later is a change of mechanism, not a rewrite. It stays a deliberate choice only as long as that's still true.
Whether publishing should be automatic. It would be easy to have the vault push straight to the site, and I decided against it. Notes get drafted, extracted, and proposed by machine; nothing goes live until I've actually owned it. The gap between "generated" and "owned" is the whole point of the system this site sits on top of, and it would be strange to build that carefully and then bypass it at the last step.
What to do about the placeholder content. This site was designed before it had anything real in it, so it launched full of convincing fake entries — invented essays, invented reviews, invented projects with invented dates. Deleting them left the site much thinner than it looked. That was the right trade and it still took a while to accept: a small true site beats a large plausible one, and every fake entry is a claim that quietly asks to be believed.
Whether to show star ratings on the reviews. I keep them privately and don't publish them. A number lets you skip the sentence, and the sentence is the only part worth reading.
Influences
Less a reading list than a set of positions I arrived at building the knowledge system this site publishes from, and then found I'd applied here without deciding to.
Deterministic things belong in code; models are for judgment. Routing, dates, paths, and gates are hard-coded. Inference is reserved for the parts that actually need it. Most of what looks like intelligence in a working system is scaffolding, and the scaffolding is where the effort compounds — models get cheaper and more capable on their own schedule, the harness around them only improves if you improve it.
Confidence isn't correctness. "Done" means the tests pass, not that something reviewed the work and felt good about it. The publishing pipeline behind this site asserts exact counts on every run and refuses to proceed when they drift, which has already caught things I would have shipped.
The middle is mine. A machine can kill the blank page and it can polish the last draft. The substantive part in between doesn't delegate, and a personal site is mostly that part — which is the argument for keeping it small, plain, and slow rather than automated end to end.
It's built part-time, so anything brittle would have died months ago. That constraint did more to shape this site than any aesthetic I could name.
Provenance
- started
- 2026-05-15
- last rebuild
- 2026-08-05
- license, text
- CC BY 4.0
- license, code
- MIT