Colophon
Plain files
This site is mostly hand-authored HTML, with some writing drafted in Obsidian and rendered from Markdown. There is no client-side framework or application runtime. 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
Python scripts manage derived state: regen.py renders Markdown from content/, processes Obsidian-style pasted images, creates sidenotes and mobile footnotes, and updates the RSS feed, sitemap, reading times, and structured data. The book pages have their own deterministic generator. A git pre-commit hook runs the main regeneration step automatically, so generated files match their sources in the same commit.
Local tools
A small local-only Flask app, paired with a Chromium extension, handles the essay archive, commonplace notes, dictionary, and book catalog. It includes a read-later queue and assisted publishing tools. The app and its credentials run only on my machine and are not part of the deployed site.
Book catalog
The library, reading queue, current reading list, and book archive are generated from a local SQLite catalog. Each canonical book has edition metadata and one reading state: untracked, queued, reading, or archived. A previous Libib export supplied most ISBNs and publication metadata; Google Books supplies edition links and covers where available. The database remains local and gitignored. Only the generated HTML tables are published. 3. The book titles link to exact Google Books editions when an ISBN or volume identifier is known, with title-and-author search as the fallback.
Hosting
The site is hosted on GitLab Pages. Every push to master triggers a CI job that copies the committed static files into a public/ directory. Content generation happens locally before the push; deployment itself is only a copy.
The published site needs no database, CMS, JavaScript runtime, or server-side application.