Colophon
Plain files
This site is mostly hand-authored HTML, with some writing drafted in Obsidian and rendered from Markdown. There is no JavaScript, no framework, no templating engine, no bundler, and no client-side interactivity. Every deployed page is a static file. 1. This page uses the wider reading layout as a static HTML/CSS example: a left contents rail and right marginal notes, without scripting.
One stylesheet
The only stylesheet is a lightly extended normalize.css. The ordinary body is capped at 600 pixels and uses your system font stack. Dark mode follows your OS preference via prefers-color-scheme.
2. Pages can opt into the annotated layout with class="annotated-layout"; pages without that class keep the normal single column.
Derived state
A single Python script (regen.py) manages derived state: Markdown posts from content/, Obsidian-style pasted images, sidenotes and mobile footnotes, the RSS feed, sitemap, reading times, structured data, and a few other things that would be tedious to maintain by hand. A git pre-commit hook runs it automatically, so generated files match the source in the same commit.
Local tools
A small local-only Flask app, paired with a Chromium extension, handles the essay archive: a read-later queue and one-click publishing that inserts the archive row, commits, and pushes. It runs only on my machine and is not part of the deployed site.
Hosting
The site is hosted on GitLab Pages. Every push to master triggers a CI job that copies the files into a public/ directory. There is no build step beyond that copy.
The source is a plain git repository. No database, no CMS, no dependencies to install.