Project zero
This website
August 2026 · Zero → live in 1 day · git-measured
← carried in Pixel office + scenarios — from Pixel Agents
← carried in The memory-file habit — from the runbook lineage
→ carried forward These build stories
Project zero: the site you're reading, live on day one, built an hour at a time — with every deploy passing through my own two hands.
Timeline: fully measured — this is the only build with a real git history. August 20, 2026: zero to live domain in one day. August 21: speech bubbles, the 3D Lab, two pre-dawn sessions. August 22: proper git workflow, then seven Kid Lab commits averaging seven minutes apart. August 23: a 4am content sprint, then link previews and prerendering. August 24: the mission statement got a deliberate rewrite, on the record.
What it is
A React site (Vite, Tailwind, React Router) on Cloudflare, auto-deployed from a private GitHub repo. Structure is deliberately boring: the projects hub renders a data file, so adding a project means adding one object. The interesting parts are the pixel-office demo, the 3D orbit Lab, Kid Lab (my son is the design authority), and the fact that the whole thing is built in ~1-hour morning sessions with an AI doing the typing and me doing the shipping.
The walls
The AI can't ship. The cloud sandbox my AI sessions run in cannot push to GitHub or reach Cloudflare — by design. Three failures in a row proved it: a blocked device-code login, a blocked push with my own access token (deleted the same day), and then acceptance. The workaround became the workflow: the AI writes files to my machine, and I move them to GitHub — first by literally dragging files into the browser upload page (dotfiles didn't survive the drag), later upgraded to a two-click GitHub Desktop commit. I'm the deploy step. Given the "no agent sends anything without me" rule everywhere else in these projects, that constraint turned out to be a feature.
First deploy failed. The standard single-page-app redirect file turned out to be invalid in Cloudflare's newer Workers flow — the deploy died with an error code until the file was deleted (the config file handles routing instead). The fix-commit's automatic rebuild was the very first proof the pipeline worked.
The redirect-loop scare that wasn't. Minutes after going live, the domain looped endlessly. Diagnosis: SSL certificates still provisioning plus a stale cache — the fix was wait. Recorded so the next scare doesn't trigger a panicked config hunt.
The invisible sunrise. The Lab's signature effect — a sunrise driven by how far you spin the project ring — simply didn't render at first. The sun sat farther away than the scene's fog limit, and the fog swallowed it whole. One flag on the sun's materials fixed it. Logged in the project notes as "bug worth remembering."
Phones broke the 3D framing. The orbit overflowed small screens. Fix: a camera that steps itself back based on your screen's shape — plus one honest design call written into the notes: side cards partially offscreen on phones is intentional framing, not a defect.
The site was invisible to machines. An outside review pointed out that fetching the site returned an empty shell — a client-rendered app with no preview tags. Links shared in chat apps showed blank grey cards, and AI crawlers saw nothing. Fix: real meta tags, a preview image (a captured frame of the Lab's sunrise), and build-time prerendering of every content route to plain HTML — done in pure Node, deliberately avoiding a headless browser that would be flaky in CI. Bonus lesson: the reviewing instruction itself contained two errors, caught in triage. Outside AI instructions get triaged, not obeyed.
The designer overruled the engineer. Twice. Kid Lab had a fully specced glass-and-aurora visual direction — until my son delivered his own design: robot athletics. His design won. Later he overruled the persistent scoreboard spec in favor of per-game reset. Both reversals are in the notes without argument; he's the design authority, and the page is better for it.
Dead ends
The access-token route (created, blocked, deleted — "no live tokens exist anywhere"). The standard redirects file, wrong for this platform. The glass-card Kid Lab direction, superseded by a better designer. A headless-browser prerender approach, rejected on paper before it could waste a build. And the original project folder itself, retired to "backup — never edit" when the git clone became the source of truth.
What I'd do differently
Start on the git-connected clone from day one — the browser-upload era worked, but it ate dotfiles and an evening. Everything else the notes answer with process evolution rather than regret.
What carried forward
Everything, inward: the pixel office became this site's live demo; the attendance project's synthetic-data instincts feed the AI-at-Work section; the runbook habit matured into NOTES.md — a memory file every session reads first and updates last, which is the only reason a project built in one-hour fragments stays coherent. The rules travel too: nothing work-related ever, synthetic data only, no secrets in the repo, and a zero-personal-info rule for my son that applies down to commit messages. This page — the one you're reading, generated from the build records — is the newest rung on the ladder.