Rebuilding this site with a self-correcting agent loop
I asked Claude Code to take the look of ambraglow.org, apply it to this site, and fill it with what I've actually built, using my GitHub and the notes my AI tools keep about me. Then I asked it to work in a loop: build, check, fix, repeat, without stopping to ask.
Measure the reference
It didn't guess the style from a screenshot. It opened ambraglow in Chrome and read the computed styles: a zinc-900 background, a 768px column, a monospace font everywhere, an amber name with an orange text shadow, and thin bordered rows. Those became the design tokens.
What the loop caught
- Fonts. The first build pulled Iosevka from npm at about 1 MB per weight, around 4 MB in total. It subset the font to Latin-1 plus punctuation: 31 KB for two weights.
- A wrong claim about me. My notes said I built a Rust Bitwarden server called warden-worker. A research agent checked GitHub: it's a fork with zero commits from me. The site now describes D.O.R.I.S. as my write-up of that pattern, and the notes are fixed.
- Older drift. The previous site said smuglr had a Rust core (it's Kotlin and Swift) and listed the wrong stack for my capstone. Both sat in older copy that nobody had checked against the repos.
- Invented details. Its own first draft had a printer "bolted to a wall" and an outage "at 6 a.m." Neither happened. It caught them on a reread and cut them.
- A duplicate meta tag. A build plugin swapped the page description with a regex that only matched one-line tags. The template had a multi-line one, so pages shipped two descriptions.
- Repetition. A bullet list on each project page repeated the write-up right above it. It went.
Verify with something other than your own code
Each project page has a thermal label with a Code 128 barcode. Unit tests check the encoder against the published patterns. Then the loop checked the rendered barcode with Chrome's built-in barcode detector, which decoded it to the exact page URL. A test you wrote can share your misunderstanding. A different decoder can't.
The process
superpowers ran the process: a spec, a plan, tests first, and verification before saying done. g-what-to-build set the scope for the second round and argued against features that wouldn't change what a reader does, like a GitHub stats widget. The loop loaded every route at a 360px width to check for horizontal scrolling. The build now fails if any page copy contains an em dash.
What I'd keep
Ask for a loop, but give it things it can check: a build, a linter, tests, a screenshot, a second source of truth. The fixes that mattered most came from comparing two sources. Rereading its own work didn't catch the warden-worker mistake. Checking GitHub did.