Colophon — how this site is built
This portfolio is dogfooding: it holds itself to the same policy gate its subject builds for agent runtimes. Below is the entire trick, so you can rebuild it — or audit us for skipping it.
01The evidence loop
- Claims are data, not prose. Every metric on the site must resolve to an entry in
evidence.json(claim → status → URL). A page that cites a claim without a ledger entry failsnpm run build. - Stats are fetched, not typed. A build-time script pulls repo counts, release version, CI conclusion and the commit feed from GitHub/npm and checks the snapshot into the repo. No stale numbers; no cherry-picked ones — the xr CI row says "failure" when it's failure.
- Nightly verifier. A scheduled action re-requests every evidence link and demo URL on
the site. A dead link doesn't disappear; it shows up as a
⚠row in the footer stamp and in theverifycommand output. Link rot becomes a visible state, not an accusation waiting to happen. - Statuses are derived. Shipped/Live/On-hold chips compute from push dates and repo state — they cannot be manually inflated, because they aren't typed anywhere.
- Copy gate. A banned-phrase lint (motivational adjectives, rocket emoji, "welcome to my…"-style openers — full list in `check-data.mjs`) runs pre-build.
- The ask assistant has no model in the loop. A build-time script chunks every page into quotable passages; the browser
scores them with TF-IDF and answers with quotes linked to their source. It cannot invent a fact about me that isn't on this site —
/askexplains the pipeline.
Taste, enforced.
02Construction
- Astro 5, static output — content ships as HTML; the page is complete with JavaScript off.
- The command palette + shell are hand-rolled vanilla JS — measured at build: 13.9 KB raw / 6.0 KB gzipped total
on the home page (shell, boot sequence, and the ask engine included), no framework, no cmdk — with combobox/listbox
semantics, focus return, history, and a deep-link
?cmd=verb. The ask assistant additionally fetches a static 62 KB (≈20 KB gzipped) chunk index — only when you first open it. - Type: Martian Mono Variable (display), Geist Mono (console chrome/data), Inter (prose). Self-hosted, variable, latin-subset — three files, no font CDN.
- Dark-first tokens with a real light inversion;
prefers-reduced-motion,prefers-contrastand Windows forced-colors are implemented, not aspirational. - Deploy: GitHub Pages straight from this repo — a push runs the same checks this page describes, builds, and ships; the nightly link verifier lives in the same Actions. The whole site costs what a cron job costs.
03State of the machine
- data snapshot: 2026-09-01 (repos, CI, npm)
- last evidence check: 2026-09-01 → 46/49 pass · 3 warn · 0 fail
- budgets: zero-JS content path; console island 4.5 KB gz (the only JS on the page); fonts ≤ 3 files; images are screenshots or diagrams, never generated decoration.