This site is a pool of content, not an app. Nine plates; the left three belong to the index, the centre one is where reading happens, and the rest are teasers. Pick a plate.
The build
One binary and one program do all the work:
make bake— pandoc turns eachblog/*.mdinto an HTML fragment inpublic/frag/. File-based routing: the path underblog/is the URL.make build— Bun assembles the hand-written shell, the index, the teasers, and the one client script. Pipe operators are compiled away here.make serve— a static file server overpublic/. htmx does the rest.make deploy—wranglerpushespublic/to Cloudflare Pages.
No framework, no database, no client router. The Makefile is the interface.
The log
Everything that changes is an event, and every event is a tick.
lab.dump() shows the run, lab.seek(2) rolls
back to it, lab.mark('golden') pins it,
lab.export() hands it to the CLI:
make verify RUNS="runs/*.json" folds the runs back and
diffs them. A run recorded on one deploy replays on the next with
?import=<url>.
make ci is the gate: unit tests, a browser run, a fresh
recording of the golden path, and a diff of that recording against the
committed one. A state change you did not intend shows up as a diff, not
as a surprise.