This site is handmade. No framework. No CMS. Just files.
I build AI systems all day. This site is deliberately not that. The blog is a separation of concerns — a place where the craft is visible, the tools are boring, and nothing is trying to be clever. If you want to see what I think about AI, read the posts. If you want to see how I build for myself when nobody's watching, you're looking at it.
#The Secret
There isn't one. Markdown goes in, HTML comes out. The build started as ~600 lines of TypeScript; it's closer to 8,000 now, because diagrams, image optimization, and search all cost something. It still builds in about a second and a half. That's it.
If you want to build something similar, here's the whole recipe:
- Parse markdown with marked
- Add syntax highlighting with Shiki
- Render Mermaid diagrams at build time with mmdr (pure Rust, no browser needed)
- Write some templates (literal string interpolation, no JSX)
- Style with Tailwind v4 and inline the whole stylesheet into every page (no external CSS file)
- Run it with Bun
- Deploy to Cloudflare Workers — static assets, plus a small worker for redirects, security headers, and caching. (The retrieval behind Ask — D1 + Vectorize — came later. That part was not a weekend.)
You don't need Astro. You don't need Eleventy. You don't need Next.js. You need a weekend and the willingness to understand what you're building.
Start with the smallest thing that could work. Add complexity only when it hurts.
#Typography
- Body: IBM Plex Sans — variable, plainspoken, holds up at small sizes
- Headings: Cormorant Garamond — variable, italic by default, a little ceremony
- Code: JetBrains Mono — ligatures, precision
Self-hosted. No external font requests. The variable fonts are compiled from the source TTF masters with fonttools, then subset to what the site actually uses.
#Design
Warm neutrals. Burnished gold accent. Hairline borders. Whitespace that's chosen, not defaulted.
The north star is a slim, matte-bound essay collection in a small Parisian bookstore. The light theme is Soft Autumn — warm parchment, espresso ink. The dark theme is Night Studio — the same room by candlelight, not an inversion.
Colors are defined in OKLCH for perceptual uniformity, and every token carries both themes in a single light-dark(light, dark) declaration — one line per color, nothing duplicated. The gold runs slightly brighter in dark mode, never louder. Typography uses fluid sizing. The content column is 720px, which works out to about 70 characters a line.
The corner mark is a weighted viewfinder — heavy ink anchor top-left, gold whisper bottom-right. It's a gesture: on the front page the two corners frame the words themselves, hugging the text block rather than the layout around it.
Posts open with a Cormorant drop cap, but only when the first paragraph has earned it. And there are exactly two filled buttons on the entire site: "Send a note" and "Ask the librarian." Rare moments get to be ceremonial; everything else stays quiet.
#Content Tiers
Content here is split by lens, not prestige.
Drafts — Half-formed. Vulnerable. Might be wrong, might be embarrassing. They build to unlisted pages — nothing links to them, but if you find one, you found one.
Notes — Personal cognition and in-process sensemaking. I use these to think in public, test language, and track how ideas evolve.
Writing — Technical systems and argued models. These are more structured and explicit about claims, but still living documents.
#Living Documents
Everything here is iterated in public. Posts aren't published and frozen — they're tended. I fix mistakes, add context, update thinking as it evolves. The date at the top is when something started; the content is where my thinking is now.
This isn't a newspaper archive. It's a workshop.
#AI Discovery
This site is designed for both humans and machines.
llms.txt— guidance for AI crawlersllms-full.txt— clean Markdown export of all contentSOUL.md— who I am, what I valueSKILL.md— what I can do, how I work
If an AI summarizes something I wrote, I want it to get the nuance right.