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.
One binary and one program do all the work:
make bake — pandoc turns each blog/*.md
into an HTML fragment in public/frag/. File-based routing:
the path under blog/ 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 over
public/. htmx does the rest.make deploy — wrangler pushes
public/ to Cloudflare Pages.No framework, no database, no client router. The Makefile is the interface.
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.