Simon Willison, a developer who writes widely on AI tooling, has published Battle Drones, a browser real-time strategy game built over 12 major iterations and 321 commits, almost all of it written by coding agents, primarily Claude Code. In his own write-up, he calls it "actually fun to play," which he says was not true of his earlier game experiments, and he admits he has reviewed almost none of the code. The headline feature is stranger than the game itself: two devices can play each other by sending data as sound, with no server.
It is a useful case study for anyone building with agents: it shows what a single person can direct, which prompts moved the needle, where the model found clever fixes, and what the author himself says remains unverified.
TL;DR: Battle Drones at a glance
| Question | Answer |
|---|---|
| What is it? | Browser RTS, Command and Conquer style, mobile and desktop |
| Who made it? | Simon Willison, directing coding agents |
| Size | 12 iterations, 321 commits; 9 buildings, 7 ground vehicles, 6 aerial vehicles, 3 infantry types |
| Maps | Six across five biomes, plus a random map generator |
| Multiplayer | Two devices exchange audio messages; no server |
| Tools | Claude Code (including Claude Code for Web and Ultracode), Claude models including Opus 5.5, OpenAI image API for sprites |
| Engines | Phaser 2D early, Three.js 3D from version 5 |
| Code review | Author says he reviewed almost none of it |
| Offline | Works as a Progressive Web App |
How it was built: 12 iterations
The author describes a staircase of prompts and ports:
- Version 1 was "barely a proof of concept."
- Version 4 came from a blunt prompt, "Make it a LOT more fun," after which Claude ran over a thousand simulated playtests to rebalance units.
- Version 5 ported the game from 2D Phaser to 3D with Three.js, using generated 3D models.
- Version 8 added the Archipelago map, where infantry must be airlifted by Condor aircraft to capture island uplinks.
- Version 10 added Goliath mechs and agent-vs-agent battles.
- Version 11 added random map generation, built in a 45-minute window using leftover usage quota.
- Version 12 added audio multiplayer.
The 3D port is the visual jump: by version 5 the battlefield is angled, and buildings, vehicles and terrain are all 3D models. The author used Claude Code for Web and its Ultracode mode, which runs dynamic workflows that orchestrate many subagents. See our guides to Ultracode effort mode and Claude managed agents with dynamic workflows and 1,000 subagents for how that works. His own caveat: it "burns tokens like there's no tomorrow."
The audio multiplayer trick
This is the part most readers will remember. Two devices in microphone range send each other audio messages to keep game state in sync. It grew out of the author's earlier Chirp Pong experiment. Claude first built a "Radio Probe" tool to measure how much data the speakers and microphones could actually carry, then implemented a full audio modem on that measurement. The author mentions prior art such as Siner and ggwave.
It avoids running a server, which suits his preference for free, static hosting. He has tested it between laptops, iPhones and iPads but says he has not tested it extensively. That caveat matters: acoustic links are sensitive to room noise, distance and device speakers, so "works on my devices" is the verified claim, and "works anywhere" is not.
Engineering details worth stealing
Two details from the post are good lessons in what agents can do when given a real constraint:
- Deterministic simulation. Replays and multiplayer both need every device to compute exactly the same game. Claude found that Chrome and Safari returned slightly different values from
Math.sin()andMath.cos(), which caused desynchronization, and replaced them with custom versions. Cross-browser floating-point drift is a classic multiplayer bug, and the fix is to avoid the platform's math functions. - Soundtrack in code. The music is generated entirely in code, with no audio files, and becomes more intense during battles.
Agent-vs-agent matches
Version 10 added agent-vs-agent play, where AI models command the two sides and the game records a replay. The author's replay viewer shows a match between a Claude Haiku model and a GPT model, as shown in his post.
A game with deterministic simulation and a replay format is effectively a small benchmark: you can pit models against each other on the same seed and watch the result. The post does not publish win rates, so we cannot say which model plays better; treat this as a capability, not a ranking. For other agent-benchmark approaches, see our coverage of four agents beating Minecraft's Ender Dragon.
Why this counts as a real workflow, not a demo
Most "I built a game with AI" posts stop at a screenshot. This one is useful because the process left artifacts you can inspect. The 321 commits form a history of how each prompt changed the project. The author also built small tools along the way, a model browser, an agent debug tool and a record viewer for replays, which turn opaque agent behavior into something a person can watch and judge. Those tools are how a non-expert in TypeScript can still steer a large code base: instead of reading every line, he watched replays, played the game and asked the agent to explain failures.
That approach has limits. Playtesting catches gameplay problems, such as a unit that is too strong, but not latent bugs, such as an unhandled edge case in the audio decoder or a memory leak on long sessions. A deterministic simulation helps here, because a bug that reproduces from a seed can be handed to an agent to fix, but it does not replace code review. The honest framing is the author's own: it is a fun, low-stakes project where unreviewed code is acceptable, and the same method would need more scrutiny for anything that handles user data.
There is also a cost question that the post leaves open. Running over a thousand simulated playtests, orchestrating subagents in parallel and regenerating 3D models are all token-heavy. Someone repeating this on a pay-per-token API rather than a subscription with a quota could spend far more than the author did, and he does not publish a figure. If you try something similar, set a budget cap per run and log what each iteration cost, so you can see which prompts were worth it.
What the author is candid about
- The game is heavily vibe coded and he has reviewed little of the code, and he has little TypeScript experience.
- Multiplayer is lightly tested.
- Ultracode consumes a large number of tokens.
- He says he feels guilty about building software this way and does not feel he has "earned the right" to create something this good.
- He would not submit it to events like Steam Next Fest, which he sees as flooded with low-effort AI games, and considers Battle Drones too low-effort for that. That connects to the debate in our post on Steam Next Fest, AI slop and vibe-coded games.
What this teaches builders
Direct with outcomes, not code. The biggest jump, version 4, came from a one-line goal and an automated loop: Claude ran simulated playtests and rebalanced. Give agents a way to measure the outcome, and they can iterate without you.
Let the agent build its own instruments. The Radio Probe is a good pattern: before building an audio modem, build a tool that measures what the channel can do.
Use leftover quota deliberately. Version 11 was built in a 45-minute window using spare usage. If your plan resets, a short, scoped feature is a good use of it.
Review what matters. An unreviewed game is low stakes; unreviewed code that handles money or credentials is not. Our Ask HN playbook for shipping AI-written code you do not understand and the earlier Claude port of Command and Conquer Generals show both ends of the spectrum.
Questions people are asking
Can I try it without installing anything? Yes, play it on GitHub Pages or read the source on GitHub. It is static HTML and JavaScript that works in a browser and as an offline Progressive Web App.
Does it need a server for multiplayer? No. The audio link replaces it, within microphone range.
How much did it cost? The post does not give a dollar figure, only that Ultracode uses a lot of tokens. We will not guess.
Is the code safe to read and reuse? It is on GitHub, but the author says he did not review most of it. Read before reuse.
What is still unknown
- Token and dollar cost for the full build.
- How reliable the audio link is outside the author's test devices.
- Any head-to-head results between models in agent-vs-agent mode.
Related reading
- Claude Code Ultracode effort mode guide
- Claude managed agents: dynamic workflows and 1,000 subagents
- Command and Conquer Generals ported with Claude
- Steam Next Fest and vibe-coded games
- Shipping AI-written code you do not understand
- Gemini 4 Argon agents beat Minecraft
Details are from the author's October 20, 2026 post and may change as the project is updated.
