zckr.dev
This site. A monorepo engineering playground built so that spinning up a new experiment costs minutes, not evenings.
CREATED AUG 22, 2026 · UPDATED AUG 27, 2026
PROBLEM
Ideas were dying in the gap between "that would be fun to try" and "I have somewhere to put it". Every experiment started with an hour of repo setup, and finished work had no home that wasn't a README nobody reads.
HYPOTHESIS
If creating an experiment is one command and publishing it is one JSON file, more ideas survive contact with the weekend.
ARCHITECTURE
pnpm + Turborepo monorepo. Content is flat files validated by strict zod schemas at build time and the entire UI is a projection of them: projects, notes, the stack and the monthly snapshots, joined now by three registries — the agents the lab runs, the MCP servers it serves and consumes, and the infrastructure underneath. Half of each agent record is derived from the agent's own definition file rather than typed here, so the registry cannot claim a tool the harness never granted. Every relationship between those records is collected into one graph, and every edge in it comes from a field somebody filled in on purpose. Every page is statically generated — client-side JavaScript is a fixed roster of eight deliberate islands: nav state, g-key shortcuts, the ⌘K palette, the lab filter, the bench console, easter-egg modes, and two motion micro-islands (wordmark decrypt, stat tickers). The theme toggle is deliberately not one, and neither is the relationship graph: it is drawn at build time and highlights a node's neighbourhood through generated CSS rather than an event listener.
STACK
RESULT
Foundation shipped: homepage dashboard, lab, shipped, notes, graveyard, project pages, and a scaffolding CLI. Overhauled the same week with stack, currents, ideas, TILs, and feeds after a six-lens research sweep of the personal-lab-site canon. Then the registry layer: projects stopped being the only entity, and agents, MCP servers and infrastructure became first-class records with a graph joining them — which is what turned a list of things built into a description of a system. The lab covers the GitHub account repo by repo, including the empty one, and names the count it is holding back rather than rounding it away.
MEASURED
| metric | value | baseline |
|---|---|---|
| vercel production build | 28 s | — |
| client-side JS islands | 8 · nav, g-keys, ⌘K palette, lab filter, bench console, modes, decrypt, tickers | — |
| content validation | build-fails on bad data · strict zod schemas | — |
| GitHub repositories on the lab | 17 / 20 · asserted by a test; three are held back on purpose, with reasons | — |
| entities in the content graph | 45 · projects, agents, MCP servers, systems and notes, with 40 recorded relationships | — |
| machine-readable endpoints | 17 · REST paths, each with a probe on /bench and a command in the CLI | — |
LEARNINGS
- Structured content beats hardcoded pages the moment you have more than three projects.
- A build that fails on invalid metadata is a feature, not friction.
- Refusing colour outright was one refusal too many: hue as a second channel beside a word that already says the state is additive, and hue instead of a word is the thing worth banning.
- When a published set loses a member, count the gap instead of shrinking the denominator — the second one is how a true claim quietly becomes a false one.
- A registry that can disagree with the thing it registers is a brochure. Deriving the agents' tool grants from the definition files cost a sync script and a test, and bought a page that cannot be wrong.
- The interactive graph needed no client JavaScript at all: a node's neighbourhood is a selector problem, and CSS grew :has(). Reaching for a force layout would have cost an island, made the picture move between builds, and made it impossible to describe in words.
PROVENANCE
Built end-to-end by Claude Code: schema-first scaffold, then a 10-agent adversarial review pass (23 confirmed findings, all fixed) before the first deploy, then a 6-agent research sweep to drive the overhaul. Human contribution: taste, priorities, and the merge button.