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:

  1. A brief. The orchestrator gives a lane one task, with the files it may touch.
  2. A PR. The lane does the work, opens one PR for the task, and posts "Ready for review".
  3. Codex review. Codex reads the change and posts "Review round 1": approve, or a list of changes.
  4. Fixes. The lane fixes each point and posts "Fixes for round 1". Then comes round 2, and so on.
  5. Claude approves. Once Codex approves, the orchestrator checks the merge rules and approves too.
  6. My OK. Then the PR gets the stamp label 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.