How we built a desktop app in three days with AI agents
On Thursday Kadmo Desktop was a sentence; by Saturday night all thirteen stories were merged. What the agents did, what a person did, and the numbers.
On this page 8 sections
In short
- Thursday: one requirements document, written from the code of five repositories, every open question answered in one line.
- Friday and Saturday: thirteen stories in four lanes, ten agents on one playbook, forty-six pull requests, all merged.
- The numbers against published averages, with the caveats. Decisions, hardware and the demo stay a person’s job.
On Thursday morning Kadmo Desktop did not exist: no repository, no design, one sentence of direction. By Saturday night all thirteen of its stories were merged, with their tests. This is how it went, where a person was still needed, and how the numbers compare with what developers ship.
What we built
Kadmo Desktop is the Kadmo app and its agents on your own computer, in one app for macOS and Windows. At the first start it downloads the Kadmo VM, a small Linux machine of its own that carries the same images the cloud runs: the app, the database, the orchestration, and the agent image with Claude Code and Chrome. Nothing else is installed first. The first run names your account, recommends Claude Code on your own Claude plan, installs the default skill packs and starts one agent. No Kadmo account, no bill, no telemetry.
One rule sat behind every ticket: the desktop app builds no page of the app. It owns only what a browser cannot give: the system check, the download, the tray, Settings, Doctor, a newer build over the old one.
Thursday: a document, not a prototype
I wrote one sentence: Kadmo Desktop is the way to run the app and its agents locally, a local cell, with the cloud-only parts left out, built for an easy onboarding and a fast start.
A Claude Code session read the code of five repositories and wrote the requirements as an inventory: what exists, with the file that proves it; the options and the one to take; the first run as a sequence with a target time per step; the requirements, numbered; the risks; and a proposed epic with sizes and a dependency graph.
Then the questions, answered in one line each, in four rounds between Thursday evening and Friday morning: Electron, not a PWA. A Linux VM of its own, Lima on macOS and WSL2 on Windows. Claude Code on the owner’s plan, local models on demand. Chrome unmodified, the Kadmo extension from the store by policy. A dev build shared privately first.
This is the part I would not skip. The document is what every agent reads, and every ticket points at its sections by number. A ticket that says “see KDM-S1 and T-2” is a ticket an agent can plan from without asking.
Friday and Saturday: thirteen stories and a fleet
Friday at noon the repository existed; after lunch the thirteen stories were in Jira, filed from the document’s table: the problem as it stands in the code, the fix as a list, a definition of done a reviewer can check, and the two lines that matter most, Owns, the files this ticket alone edits, and Not in this ticket. Four lanes, so no two agents edit the same files on the same afternoon.
I imported the epic as a goal in Kadmo, and the agents pulled the tasks: ten agents, up to four stories in flight at once, every one on the same agentic playbook. A planning pass, read-only, that names the commits it read, lists the decisions it would take with their defaults and writes acceptance criteria. Build passes that open stacked pull requests and, when the session’s budget ends, write a handoff on the ticket: what is built, what remains, where to continue. A review pass that checks each line of the definition of done against the code, runs the gates and merges. A gate after each.
The tickets carry the whole story in the agents’ own words. The plans and handoffs add up to more words than a novella, and that is the point: the next session reads the ticket and goes on from the branch, and a reviewer reads it and knows what to check.
The first run is the best example. One agent took it late on Friday and worked through the night in seven passes, one stacked pull request each, a handoff after each. Its end-to-end suite found a bug in the sign-in step and fixed it on the branch. By the time I woke up, the review pass had merged the stack of seven.

Saturday was the desktop app’s own day: the Kadmo VM with its image build and two drivers, the first start’s screens, the shell with its menus and tray, Settings, Doctor and logs, local models on demand, and care: a newer build with the data kept, back up and restore, Bring a project. The last story merged before ten in the evening.

Where a person was still needed
The agents halted four times, and each time the halt was right.
- Decisions. The VM story stopped on Friday evening with the verdict BLOCKED and six decisions for me, each with a recommended default. I answered on Saturday in one comment of ninety-three words, and the story merged within the hour. A halted gate costs minutes; a guessed decision costs a rework.
- Hardware. The agent image has to boot to Online on amd64 and on Apple Silicon. The agents run as hosted agents on Linux VMs with no Docker and no arm64 host, so the agent pushed its pull requests and said BLOCKED instead of pretending. The proof moved to a session on my PC.
- My own mistake. The fourteen design boards never reached the remote. Every planning pass noticed, said so, and built from the ticket’s words, with copy and measures kept in one file for a board pass later.
- Merging. One agent noted that the repository’s rules say never to merge and that its job’s policy says to merge, chose the job, and wrote both down on the ticket. That is the note I want to find there.
The numbers
For comparison: Jellyfish and OpenAI measured, across more than five hundred companies, 1.36 pull requests per engineer and week without AI tools and 2.90 at full adoption, with 75 and 88 lines added per pull request. Anthropic reports 67 percent more merged pull requests per engineer and day after Claude Code. Boris Cherny, who created Claude Code, landed 259 pull requests and 40,000 lines in thirty days, every line by Claude Code. LinearB’s elite tier merges more than two pull requests per developer and week, each under a hundred lines.
In two days one Kadmo agent merged 4.6 pull requests and 8,300 lines: four times the developer with AI tools on pull requests and eighty times on lines; a quarter of Claude Code’s creator on pull requests and three times on lines. The fleet of ten merged forty-six and 83,000, and wrote 45,000 words on the tickets while doing it.
Three caveats. The lines include tests, documentation and a scaffold, and a new repository grows faster than an old one. Our pull requests are twenty times the size of a developer’s, which is a risk; the review pass and the test suites are the answer we have. And throughput is not quality: the drill on four clean machines is the measure that counts.
What we would do again
- Write the document before the first ticket, from the code, with every requirement numbered. Tickets point at numbers, not at opinions.
- Give every ticket its Owns line and a lane. Parallel agents fail on shared files, not on hard problems.
- Let a gate say BLOCKED. The agents that stopped for a decision or a machine were the cheapest ones that day.
- Expect handoffs. A session ends, the ticket keeps the state, the next session continues on the branch. One story ran seven passes overnight that way.
- Keep the boards on the remote. The one thing the agents could not read was the one thing I had not pushed.
What is next
Sunday is the second epic: the build lane and the private link for the dev build, then the drill on four clean machines, timed from the first start to the first agent Online.
If your team has a product that should run on a laptop, or a backlog that would take a quarter, this is what AI coding agents on an agentic playbook do on your own codebase.
What would your backlog look like on Monday if you filed it on Friday at lunch?
Sources
- https://jellyfish.co/blog/jellyfish-openai-team-up-to-measure-impact-of-ai-coding-tools/
- https://jellyfish.co/blog/ai-assisted-pull-requests-are-18-larger/
- https://www.anthropic.com/research/how-ai-is-transforming-work-at-anthropic
- https://news.ycombinator.com/item?id=46407967
- https://linearb.io/library/engineering-benchmarks-and-research
- https://docs.rancherdesktop.io/references/architecture/
- https://lima-vm.io/docs/config/vmtype/
- https://code.claude.com/docs/en/legal-and-compliance






