Builds
Agent Board: AI agents that build my side projects
I have more product ideas than evenings, so I built a team for the evenings. I write a card saying what I want. A researcher plans it, a coder builds it, two checkers look at the code and the screens, and a reviewer hands me a pull request. In its first three weeks it ran 394 cards and merged 343 pull requests across my apps. It also works on its own code. I read those ones twice.
- cards run
- 394
- pull requests merged, of 361
- 343
- median from card to pull request
- 13 min
Over 20 days, as of

One card, start to finish
A real card from Supper, our dinner planner. I wanted each recipe filter to show how many recipes it holds. Tap through to see what each agent did.
Step 1 of 7: The card, as I wrote it
The card, as I wrote it
One sentence on Supper, our dinner planner: each library filter should show how many recipes it holds.
Show how many recipes each library filter has. Show the count on each chip (All, Fast, Fish, Veg), like 'Fish 4'. Zero still shows '0' and leads to the existing empty message with 'Show all'. Keep the chip height and the sideways scroll. Also the first live test of the Design robot.
How it works
Every agent has one job and a short rulebook. Each app adds two of its own, one for the code and one for the screens. Design can only block a change when it has a screenshot that proves the problem.
- Card
- Researcher
- Coder
- Craft
- Design
- Reviewer
- Pull request
- Me
12. Never trade polish for speed.
Images go through
next/imagewith asizeshint. Never lowerqualityor ship an image below 2x its displayed size. New motion respectsprefers-reduced-motionand doesn't shift layout once the page has painted.
5. Nothing breaks at phone width.
At 390 × 844: no sideways scrolling of the page, no clipped or overlapping text, long names and URLs wrap or truncate, and nothing floating covers an action or the last line of a section. A screenshot showing any of these is a break.
Where the robots were wrong
Early on, my reviewer approved 7 of 7 real cards. It also found real bugs and filed them under “observations”. One would have deleted last week's meal plans along with a recipe. Its eval said 9.5, because I'd written easy test cases. I had built a very polite reviewer.
Pass. Delete works as the card and brief ask. type-check and lint:check are clean. test:unit: 616 pass, 0 fail, 1 cancelled. The new DB and e2e tests were not run because the cloud run has no keys.
Observations:
1. src/lib/recipes/delete.ts: the check, the cleanup of past-week meal rows and the delete all run in one transaction, scoped to the household.
The bug2. Deleting a past-week meal row also drops that meal's other parts (they cascade from plan_meals). Nothing reads past weeks, but this is the data loss the brief flagged. Owner to confirm.
3. plan_meals.skipped (jsonb) can keep a deleted recipe's id. That looks harmless because it only lists recipes to leave out.
4. The block covers the in-progress week, the upcoming week and any later week, which is broader than the brief's two weeks and safer.
5. Before merging, run npm run test:db and npm run test:e2e locally.
Later, Design told me Chrome ignores max-width on table cells. I nearly rewrote my test to agree. Then I checked. It doesn't. Try it:
| Weeknight lentil soup with lemon, spinach and a lot of garlic | 35 min |
Measuring the cell…
Now the reviewer has to prove a bug before it can pass a card, and its test cases include the messy ones. It sends back about one card in five.
How I know it’s getting better
Every agent has test cases for each app, and another model grades its answers. The same instructions can score 2 points apart on two runs, so one good run proves very little. A change to an agent's instructions ships only when it beats the current version over several runs.
Tap a dot, or tab to one and use the arrow keys, to read its score.
- Live instructions
- Trial instructions
- Average of the last three live runs, shaded across their spread
- 1Rubric changed Oct 20: Cart cases updated after cart filling shipped
- 2Rubric changed Oct 20: Researcher graded on substance
- 3Rubric changed Oct 26: Supper cases refreshed for how Supper works now
Show the researcher scores as a table
| Run | Date | Instructions | Score |
|---|---|---|---|
| 1 | Oct 18 | live | 7.92 |
| 2 | Oct 18 | live | 7.92 |
| 3 | Oct 18 | trial | 9.17 |
| 4 | Oct 18 | live | 7.77 |
| 5 | Oct 18 | trial | 8.77 |
| 6 | Oct 19 | live | 8.31 |
| 7 | Oct 19 | trial | 8.15 |
| 8 | Oct 20 | live | 7.77 |
| 9 | Oct 20 | trial | 8.92 |
| 10 | Oct 20 | live | 7.08 |
| 11 | Oct 20 | trial | 8.85 |
| 12 | Oct 20 | live | 9.15 |
| 13 | Oct 20 | trial | 9.00 |
| 14 | Oct 20 | live | 8.92 |
| 15 | Oct 20 | trial | 8.54 |
| 16 | Oct 20 | trial | 8.46 |
| 17 | Oct 20 | live | 8.54 |
| 18 | Oct 20 | trial | 9.00 |
| 19 | Oct 27 | trial | 9.13 |
| 20 | Oct 27 | live | 8.00 |
| 21 | Oct 27 | trial | 8.80 |
| 22 | Oct 28 | live | 8.80 |
| 23 | Oct 31 | live | 8.40 |
| 24 | Oct 31 | live | 8.47 |
| 25 | Oct 31 | trial | 8.67 |
Tap a dot, or tab to one and use the arrow keys, to read its score.
- Live instructions
- Trial instructions
- Average of the last three live runs, shaded across their spread
- 1Rubric changed Oct 20: Cart cases updated after cart filling shipped
- 2Rubric changed Oct 26: Supper cases refreshed for how Supper works now
Show the coder scores as a table
| Run | Date | Instructions | Score |
|---|---|---|---|
| 1 | Oct 18 | live | 8.75 |
| 2 | Oct 18 | live | 9.42 |
| 3 | Oct 19 | trial | 9.00 |
| 4 | Oct 19 | live | 9.92 |
| 5 | Oct 20 | live | 9.17 |
| 6 | Oct 20 | live | 9.92 |
| 7 | Oct 26 | trial | 9.25 |
| 8 | Oct 26 | live | 9.25 |
| 9 | Oct 26 | trial | 9.00 |
Tap a dot, or tab to one and use the arrow keys, to read its score.
- Live instructions
- Trial instructions
- Average of the last three live runs, shaded across their spread
- 1Rubric changed Oct 26: Supper cases refreshed for how Supper works now
Show the craft scores as a table
| Run | Date | Instructions | Score |
|---|---|---|---|
| 1 | Oct 18 | live | 10.00 |
| 2 | Oct 20 | live | 10.00 |
| 3 | Oct 31 | live | 9.75 |
| 4 | Oct 31 | trial | 9.75 |
| 5 | Oct 31 | trial | 10.00 |
Tap a dot, or tab to one and use the arrow keys, to read its score.
- Live instructions
- Trial instructions
- Average of the last three live runs, shaded across their spread
- 1Rubric changed Oct 19: Design may fail on a proven dark-mode contrast problem
- 2Rubric changed Oct 26: Supper cases refreshed for how Supper works now
- 3Rubric changed Nov 1: Stale cases left out of scores
Show the design scores as a table
| Run | Date | Instructions | Score |
|---|---|---|---|
| 1 | Oct 19 | live | 9.08 |
| 2 | Oct 19 | live | 9.75 |
| 3 | Oct 20 | live | 9.92 |
| 4 | Oct 20 | trial | 9.83 |
| 5 | Oct 20 | live | 9.58 |
| 6 | Oct 20 | trial | 9.67 |
| 7 | Oct 31 | live | 9.42 |
| 8 | Oct 31 | trial | 9.67 |
| 9 | Oct 31 | live | 9.67 |
| 10 | Oct 31 | trial | 9.08 |
| 11 | Nov 1 | trial | 9.92 |
| 12 | Nov 1 | live | 9.92 |
| 13 | Nov 1 | trial | 9.83 |
| 14 | Nov 1 | trial | 10.00 |
| 15 | Nov 1 | live | 9.25 |
| 16 | Nov 1 | trial | 9.92 |
Tap a dot, or tab to one and use the arrow keys, to read its score.
- Live instructions
- Trial instructions
- Average of the last three live runs, shaded across their spread
- 1Rubric changed Oct 20: Cart cases updated after cart filling shipped
- 2Rubric changed Oct 26: Supper cases refreshed for how Supper works now
- 3Rubric changed Nov 1: Reviewer given Craft’s code-quality cases
- 4Rubric changed Nov 1: Stale cases left out of scores
Show the reviewer scores as a table
| Run | Date | Instructions | Score |
|---|---|---|---|
| 1 | Oct 18 | live | 9.50 |
| 2 | Oct 18 | live | 8.36 |
| 3 | Oct 18 | trial | 8.86 |
| 4 | Oct 18 | trial | 9.00 |
| 5 | Oct 19 | live | 8.86 |
| 6 | Oct 20 | live | 8.21 |
| 7 | Oct 20 | live | 8.43 |
| 8 | Oct 20 | trial | 8.79 |
| 9 | Oct 20 | live | 8.29 |
| 10 | Oct 20 | trial | 9.07 |
| 11 | Oct 20 | live | 9.57 |
| 12 | Oct 25 | trial | 8.64 |
| 13 | Oct 25 | live | 9.07 |
| 14 | Oct 25 | trial | 8.79 |
| 15 | Oct 27 | trial | 8.47 |
| 16 | Oct 27 | live | 8.41 |
| 17 | Oct 27 | trial | 8.59 |
| 18 | Oct 31 | live | 8.59 |
| 19 | Oct 31 | live | 9.18 |
| 20 | Oct 31 | trial | 8.53 |
| 21 | Nov 2 | live | 8.16 |
| 22 | Nov 2 | trial | 8.68 |
| 23 | Nov 2 | live | 8.90 |
| 24 | Nov 2 | trial | 9.13 |
| Agent and app | Runs | Average | Range |
|---|---|---|---|
| ResearcherSupper | 25 | 8.5 | 7.1 to 9.2 |
| CoderSupper | 9 | 9.3 | 8.8 to 9.9 |
| CraftSupper | 5 | 9.9 | 9.8 to 10.0 |
| DesignSupper | 16 | 9.7 | 9.1 to 10.0 |
| ReviewerSupper | 24 | 8.8 | 8.2 to 9.6 |
| ResearcherThis site | 12 | 8.2 | 7.3 to 9.2 |
| CoderThis site | 8 | 8.5 | 7.5 to 9.0 |
| CraftThis site | 5 | 9.8 | 9.1 to 10.0 |
| DesignThis site | 8 | 9.8 | 9.6 to 9.9 |
| ReviewerThis site | 16 | 8.3 | 7.2 to 9.4 |
| ResearcherBoard | 10 | 7.6 | 6.9 to 8.7 |
| CoderBoard | 3 | 9.2 | 8.7 to 9.6 |
| CraftBoard | 4 | 9.3 | 8.6 to 9.7 |
| DesignBoard | 10 | 9.1 | 7.1 to 9.8 |
| ReviewerBoard | 15 | 8.8 | 7.3 to 9.6 |
Where the time actually goes
Once the agents got fast, most of a card's life was waiting: for a rate limit, for tests, for me. Most of my recent work on the board is about the waiting.
0 min78 min
- Researcher
- 1 min
- Coder
- 4 min
- Craft
- 2.5 min
- Design
- 3 min
- Waiting in the queue
- 41 min
- Reviewer
- 11.5 min
- Waiting for me to merge
- 15 min
What I still do myself
I decide what goes on the board, I press merge, and anything that touches live data waits for me. The agents are fast and very confident, which is a bad mix near a production database.

Where this is going
Three weeks in, writing code stopped being the slow part. Deciding what to build and proving it works took its place. I think that's where product work is going: write a clear card, write the test that says what good looks like, and catch the model when it's confidently wrong. I'm spending my evenings getting better at all three.
Next on the board
- Design walks each change like a user would. It's built and being tested now.
- Agents hand off as soon as the build passes, so slow tests stop holding them up.
- Schedule Me, my scheduling app, joins Supper, this site and the board.
- Card
- Researcher
- Coder
- Craft
- Design
- Walks it like a user
- Reviewer
- Pull request
- Me
What I'm working on this month is on my Now page.