This site is homebuilt. Markdown files, a few focused libraries, and templates I can read from top to bottom. I chose the pieces and assembled them with AI's help.
I wanted a place to write and try things, with workings I could understand and change. The choices about how the pages read, what belongs in the margins, and which features earn their complexity are mine. The implementation can move around those intentions. I'm not especially attached to it.
#How It Works
Markdown goes in, HTML comes out. The build grew as diagrams, image optimization, and search joined it, but the writing still lives in files and the pages are rendered ahead of time. Reading an essay doesn't need a database connection.
The current recipe:
- markedParse Markdown into HTML.
- ShikiAdd syntax highlighting at build time.
- mmdrRender Mermaid diagrams with a native Rust renderer. No browser needed.
- TemplatesLiteral string interpolation in TypeScript. No JSX.
- CSSNamed components share CSS custom properties for color, type, and spacing. Lightning CSS bundles and minifies the styles; the result is embedded in each page.
- BunRun the build.
- Cloudflare WorkersServe static assets, redirects, security headers, and caching, plus the endpoints for Ask, Search, and Contact.
The retrieval behind Ask and Search uses D1 and Vectorize. Those features added a service layer around the static site; the source writing and page build still work without it. I can change a paragraph or a template locally without first connecting to a running backend.
#Working environment
I use cmux as my terminal. It has workspaces, split panes, and an embedded browser for keeping coding sessions and previews together. The working environment can evolve along with the site.
#Keeping It Changeable
I chose this arrangement because most of what I want here is a page. A framework or CMS would bring its own conventions, and for this site I prefer choosing the parts as I need them.
The styles started with Tailwind alongside custom CSS. As the site developed its own recurring layouts, more of the design lived in named classes, while the templates still carried long strings of utilities. I removed Tailwind so those decisions would live together: ordinary CSS, shared tokens, and a name for each component. The reason was easier editing and fewer conventions to keep track of. Any byte savings are a bonus.
Keeping the content, templates, styles, and build instructions in the repository also gives an LLM a fairly direct path through the work. It can read the source of a page and trace how it gets rendered. My intent still needs explaining, but I want as little of the implementation as possible to depend on context elsewhere or state in a database.
I do want constraints. The palette, typography, content types, and build path give me a known surface area: what I'm dealing with, why it's here, and what a change might touch. That makes it easier to move quickly without having to rediscover the site every time I open it. I'm happy to replace the machinery when it gets in the way of what I want to make.
#Typography
- Headings & reading proseNewsreaderAn editorial serif, with italics for asides and observations.
- Body & interfaceSource Sans 3Plainspoken and comfortable at small sizes.
- Metadata & codeIBM Plex MonoA compact technical register.
Self-hosted from the fonts’ upstream distributions, with their open-source licenses included. No external font requests. Standard ligatures and kerning are enabled.
#Design
A technical notebook with an editorial sensibility. Fine paths, translucent layers, sparse dots, and plenty of untouched paper. The warmth comes from the palette and typography.
- Paper
#F7F4ED - Ink
#241B17 - Terracotta
#AD5845 - Olive
#777A55 - Taupe
#8A8074 - Rule
#DCD5C9
These are the source colors. Semantic tokens pair light and dark values with light-dark(). Dark mode keeps the same relationships on warm charcoal, with lighter ink and accents.
Newsreader headings sit above quiet Source Sans descriptions and mono dates. The page can spread across 1120px; long-form reading stays within 720px. Margin notes have their own space beside the text. Article navigation marks the current section. Desktop sidebars follow the scroll between their top and bottom edges, keeping long navigation reachable without a hidden inner scroll area. Small screens use ordinary page flow.
The logo and favicon share two offset corners: terracotta above, ink below. Illustrations use one relationship at a time — branching, filtering, feedback, overlap — and leave room for the reader. Editorial artwork stays free of lettering; infographics use carefully checked labels. Header motifs are transparent SVG-based diagrams over one faint page grid. The image tools target GPT Image 2.5; precise diagrams are SVG or plotted data.
“Send a note” is the one filled action. Ask and Search use matching quiet controls with small line icons and underlined labels. Search combines keyword and semantic retrieval across essays and notes, with a local keyword fallback. Search and copy controls are small progressive enhancements; the underlying writing remains ordinary HTML. The theme switch has light, system, and dark positions. The mobile menu uses frosted paper, with a solid background when reduced transparency is preferred.
Social previews are composed at build time: a Newsreader title on paper, the piece’s illustration, and a thin author strip. They use opaque light backgrounds so they stay legible in other apps.
The RSS feed has a quiet browser view of its own: a subscription address followed by dated essays and notes. Feed readers receive the underlying XML.
#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. I fix mistakes, add context, and update the writing as my thinking changes and the world gives me new things to account for. Tools improve, assumptions stop holding, and an argument that made sense six months ago may need another look. The date at the top is when something started; the content reflects what I can stand behind now. The site gets the same treatment. A layout or feature can be useful for a while and then make way for something that fits better.
#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.

