Lilith.
⌕
Editorial illustration: “Make it a LOT more fun” worked: Simon Willison had Claude Code build a playable RTS
Lilith illustration · editorial remix

On October 20, Simon Willison showed off Battle Drones, a browser-based real-time strategy game in the style of Command & Conquer. He reviewed almost none of the code; coding agents wrote it, mostly Claude Code. Unlike his earlier experiments, he says, this one is actually fun to play.

Four months, 321 commits and a game its author barely read

Willison started in July with Claude Fable 5 and a brief for a mobile RTS in which two armies of drones fight for territory. The first version, he says, was a bare proof of concept and no fun at all. Claude generated the art through the OpenAI Image Generation API after Willison gave it an API key in an environment variable. The project is in TypeScript, a language he has hardly used himself.

The game now stands at 12 major versions and 321 commits. It runs on mobile and desktop and includes 9 buildings, 7 ground vehicles, 6 aircraft and 3 infantry types as 3D models that Claude built directly in code with three.js. There is fog of war, six maps across five biomes, a random map generator, six AI opponent personalities and a giant mech called the Goliath. The music comes from no audio file at all: code generates it, and it intensifies when fighting breaks out.

The standout feature is multiplayer over sound. Two phones or laptops within microphone range keep the game state in sync with modem-like chirps. Willison wanted the game to stay static HTML with no server he would have to babysit. As far as he can tell, no RTS has done this before.

A vague brief worked because the agent had something to measure

The turning point came in version 4. Over dinner, Willison had argued that coding agents can build something that looks like a game but is no fun. Then, from his phone, he told Claude Opus 5.5: “This game isn't fun enough yet. Make it a LOT more fun.” He ran it in Ultracode mode, where Claude Code uses a script to orchestrate many subagents at once. The work ran from the evening until late the next morning.

Along the way, Claude ran more than a thousand simulated playtests and used the results to rebalance units and add new mechanics. According to the release notes it wrote itself, across 1,200 AI-vs-AI matches the share of games still undecided after 25 minutes fell from 14% to 0.9%. The share of wins by a side that had been 800+ scrap behind rose from 24% to 46%.

That is the real lesson for anyone handing agents soft goals. “Fun” on its own says nothing, but the agent translated it into measurable things: fewer stalemates and more comebacks. Game designers have long used metrics like these. What is new is that the agent picked them itself, tested them in its own simulations and rewrote the game overnight. Given a brief with no measurable footing, the same prompt would likely have produced little more than cosmetics.

The low stakes ended in a headache, not a code bug

Willison explains why he could afford not to read the code: the game is a toy, and the worst outcome is a bug in a silly experiment. His partner Natalie broke that assumption. The first time they played the sound-based multiplayer together, the high-pitched chirps gave her a nasty headache. None of the thousands of simulated matches could have caught that. Willison added a warning and had Claude build online multiplayer through a simple WebSockets relay on Fly.io, which should cost him no more than $2.19 a month.

Other limits are less visible. Ultracode, Willison says, burns tokens “like there's no tomorrow”. Determinism for replays and multiplayer ran into tiny differences in Math.sin() and Math.cos() results between Chrome and Safari, and Claude had to swap in its own functions. And Willison himself says he would never submit the game to Steam Next Fest: it is still far too low effort to count as a serious indie project. For business software, where someone has to stand behind the code, Battle Drones is a demonstration of capability rather than a playbook.

An LLM league and serverless games will show where this style goes

Version 10 added agent battles: two language models play each other through a tool that shows them only what is visible through the fog of war. Willison has already recorded Claude Haiku 5.5 against GPT-6 Luna and wants to turn it into a full league table. Such a league could be a more interesting benchmark of agentic decision-making than many static tests, because models have to plan under uncertainty and in real time.

The second signal is whether other games adopt sound-based multiplayer in static HTML. Willison found little prior art so far, such as Georgi Gerganov's ggwave library. The third is a fight already under way on Steam, where players want a filter for AI-made games. Willison says he can see a path for vibe coded games to be taken seriously. That will be decided by someone with better taste and more persistence than a single prompt requires.

Lilith's verdict

Claude ran more than a thousand simulated matches and tuned the game overnight. The bug no simulation could find took Natalie, whose head was pounding after a few rounds of modem chirps.

I keep the external link at the end. First, a concise explanation here — no hunting across someone else's site.

Original source ↗ ↗