How this site was built
The problem
I wanted a portfolio that shows how I work, not just what I made. That meant four case studies, a number check for each one, a visual system and the site itself. That's a lot for one person with little time. So I built it with a small team of AI agents, and I kept the design calls.
Who's on the team
- Me: I set the goals, answer questions, and give the final OK to merge.
- An orchestrator (Claude): plans the work, writes short briefs, runs reviews and keeps the status page. It doesn't build.
- Six lanes (Claude agents), one job each:
- C, content: writes the case studies and page copy.
- P, proof: checks the numbers and finds safe images.
- L, look: the visual system: color, type, spacing.
- B, build: the pages, the password gate, tests and deploys.
- G, generative UI: the answers under the prompt bar.
- V, charts: the interactive charts.
- Codex: a second AI that reviews the PRs.
The rule is that each lane only touches its own files. Content doesn't edit code, and build doesn't edit copy.
The life of a change
This is the process each PR is meant to follow:
- A brief. The orchestrator gives a lane one task, with the files it may touch.
- A PR. The lane does the work, opens one PR for the task, and posts "Ready for review".
- Codex review. Codex reads the change and posts "Review round 1": approve, or a list of changes.
- Fixes. The lane fixes each point and posts "Fixes for round 1". Then comes round 2, and so on.
- Claude approves. Once Codex approves, the orchestrator checks the merge rules and approves too.
- My OK. Then the PR gets the
stamplabel and merges.
Each step is meant to be a tagged comment on the PR, so the thread tells the story of the change.
Sometimes the orchestrator merges with one Codex point still open. That happened on 6 of 48 merged PRs, and each one has the reason posted on the PR.
One question at a time
The agents work in parallel, but I don't want four of them asking me things at once. So questions come to me through the orchestrator, in plain English, one line each. I answer when I can. Until then, the lanes mark the gap and keep going.
Some of the calls I made this way:
- Keep a current employer unnamed (#7).
- Make the home page a prompt bar, and add this page.
What Codex caught
As of October 20, 2026, 18:14 PDT (PRs #1–#60), Codex asked for changes on 32 of the 53 PRs it reviewed. It found 19 code bugs in 11 PRs, all fixed before merge. Some of what it found:
Code
- The password could be guessed by a script. The unlock page allowed unlimited tries, and the unlock cookie never expired on the server. Both were fixed before merge (#5).
- Hidden notes reaching the browser. The drafts carry hidden source notes for fact-checking. B found they were reaching the browser and opened #11 to strip them. In review, Codex then found three more problems:
- an unclosed note that wouldn't be stripped
- raw HTML in a draft passing straight to the page, so an image tag could run a script
- fact-check markers breaking HTML attributes, like image alt text All three were fixed, with tests, before merge (#11).
- The accessibility test could pass on the wrong page. Codex pointed out that a case study could redirect to the unlock page and still pass. Following that point, B found that all the case-study scans were in fact running on the unlock page. The test now checks the URL and the heading first (#13).
- Unanswered questions could have gone live. The launch gate never matched the markers for questions to me, so a production build would have shipped them (#26).
- A path check you could walk around. Image paths could follow links outside the public folder, and a malformed URL crashed the build (#36).
- Focus lost after an error. Keyboard and screen reader users landed on the page body and lost their place (#37).
Content
- A number that didn't match its source. A draft count and the plan disagreed, and one sentence overclaimed what an automated check does (#2).
- A math slip. A "per week" average didn't match the weekly counts it came from (#8).
- Big words. Most other change requests asked to source or soften claims like "every" and "never".
The numbers
As of October 20, 2026, 18:14 PDT (PRs #1–#60), about 23 hours after the first commit:
- 60 PRs opened, 48 merged, 12 still open.
- By lane: content 21, build 15, proof 9, generative UI 7, look 4, charts 3, plus 1 plan PR from the orchestrator.
- Codex reviewed 53 of 60 PRs. The 7 it hasn't reviewed are all still open. 93 review rounds in total, about 1.8 per PR, never more than 3.
- 32 of 53 needed changes (60%). 21 passed in the first round.
- 19 code bugs found in review, in 11 PRs. All fixed before merge.
- 6 of 48 merged with one Codex point still open, each with the reason on the PR.
What's still open
- Review takes rounds. 31 of 53 reviewed PRs needed two or three. That's slower than one pass.
- Some calls wait on me. That's on purpose. Taste and "should this exist?" stay with me.
- This page is a snapshot. The numbers will change as the site grows.
What I learned
The agents moved fast. The shape around them mattered: small tasks, one owner per file, a second reviewer, and a person who decides.