We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
Long runs: give a blunt goal, then a structured brief
Simon Willison built Battle Drones, a browser RTS, mostly with Claude Code. Two of his prompts are worth reusing.
- A vague goal plus orchestration. He sent Opus 5.5 the prompt "This game isn't fun enough yet. Make it a LOT more fun." in Ultracode mode, where Claude Code runs "dynamic workflows": JavaScript scripts that orchestrate many subagents at once . The run took from evening until late the next morning . Claude ran more than a thousand simulated playtests and used the results to rebalance units and add features. In 1,200 AI-vs-AI matches, games still undecided after 25 minutes fell from 14% to 0.9% .
- Research and critique before building. When the game's AI ignored infantry and troop carriers, he wrote a detailed design brief: the incentives, the map constraints and the win condition. It ended with "First research and then critique this design. Only build after we have agreed on any modifications" . The result was the Archipelago map, which he calls the most fun map in the game .
Other lessons from the project:
- Static HTML/JS with Three.js is a strong medium for agent-built games because the models know those platforms well .
- Giving Claude an OpenAI API key lets it generate images, look at them and refine its prompts .
-
Replays and multiplayer need a deterministic simulation. Claude had to replace
Math.sin()/Math.cos()with custom versions because Chrome and Safari returned slightly different numbers .
Peter Steinberger started a loop to move OpenClaw's Lit frontend to Solid 2.0. Removing Lit took about 6 days, and making the code idiomatic Solid took another week. He checked in every other day, and the work took about 600 PRs . The agent missed a few small regressions, mostly button shapes and minor UX details . His setup:
- Astra plans and Sol 6.1 codes. Prompting Astra to run Codex CLI in worktrees worked "FAR better than relying on subagents" .
-
A second agent challenges the first. Instead of one agent checking its own progress against a text file, as with
/goal, a separate agent pushes back on Astra. He built this as an OpenClaw plugin he calls "smart goal" .
He also moved OpenClaw to tsrs (npx tsrs). Its announcement describes a Rust port of the TypeScript compiler, built in collaboration with the TypeScript team. It claims up to 8x the speed of TS 7.0 and about 70% less memory, runs in WASM, and is due to join Oxc . Steinberger calls it a drop-in replacement and saw about a 5x speedup , or 9x against stable releases, since they were already on 7.1-dev .
Give agents a paved path to verification
Kent C. Dodds says the fix for low confidence in legacy codebases is verification. Agents should do what humans did: run with mock data, use the UI, seed varied database data and deploy to a production-like environment. They will do this reliably if you give them a paved path . His agents maintain a control-kody CLI for exactly this (SKILL.md) . Separately, a team that was "all in" on agents turned out not to be running tests in CI. Dodds calls that a prompting problem: an agent asked to audit the codebase for obvious problems would have caught it .
Theo reported something similar after a rough night. Most breakages came from legacy vendors, GitHub Actions and flaky Chromium-driver tests. The "slop" parts, such as ts-rust, were stable . In a new video, he describes building his machine images for the agents rather than for himself. The image is a customized, headless Ubuntu with Bash instead of Zsh. His audit found over 30% of Claude's errors came from Zsh's newline handling breaking ripgrep commands, and agents also did worse on Arch and CachyOS dev boxes .
AGENTS.md as a scheduler for follow-up work
After the eMudhra CA key leak, Geoffrey Huntley asked an agent whether his NixOS fleet was affected. Because Nix has a single source of truth, one patch covers transitive dependencies: patch, commit, autodeploy . His new trick is to have the agent write a dated reminder into AGENTS.md so the temporary workaround gets backed out later . The reminder names the nixpkgs commit to check for, the command to run, a recheck every two days, which files to delete, and which unrelated changes to keep .
Overalls also got "hive mode." Agents in the same profile zone (oss, standard or customer) share a message board for coordinating work. The customer zone has no outbound connectivity, and a machine's entries are wiped when it suspends . Huntley points to Claude Code's crossSessionInbound=accept setting as the apparent primitive behind hive swarms , and says it has him "back to loving claude" . He is moving 95% of his usage to Anthropic because OpenAI "falls over" after every usage reset .
OpenAI: longer cache retention and a usage-limit fix
The API now offers 12-hour prompt caching, so persistent agents pay the cached-input rate even when requests are hours apart . Tibo says logged-in Codex and Work users get cache kept "forever," with guaranteed hits when they resume old conversations . OpenAI also says about 40,000 accounts had usage limits that didn't match their plan. It has corrected the issue and will add credits for affected users .
T3 Code Stable
The new T3 Code Stable release has more than 1,400 changes . Highlights:
- Add a project to another machine from the "Run on" menu.
- PR diffs that separate code, tests and docs.
- Idle Claude threads compact early so the cache stays warm (beta).
-
t3 connectreachability checks. - Webhook-task filters and dedupe.
- More reliable skill discovery .
Theo suggests moving back to Stable because Nightly is getting more experimental .
Other notes
- Tenex's "meta harness" is structured repo docs plus a CLI that agents use to drive plans and readouts. Agents log their decisions, and everything is checked into Git, so the reasons behind changes live in the repo . Tenex has loosened the plan template as models improved . Its engineers mostly drive with Opus 5.5 and use Codex to review, which they say gives the best results . They report output roughly doubled this year .
- Claude Code Projects tip: tell the coordinator to save a project-memory rule to post a one-line update linking the thread whenever a thread is blocked or finishes a milestone. Before this, it wouldn't even report blocked threads .
- Kody lets agents file feedback about their experience, which often becomes a fix within an hour or two .
- Simon Willison built Battle Drones through 12 major iterations and 321 agent commits, mainly by Claude Code; although he knew little TypeScript and reviewed almost none of the code, he playtested it extensively . For a major gameplay revision, he prompted Claude Opus 5.5 with “Make it a LOT more fun” in Ultracode, a dynamic workflow that orchestrates many subagents; the overnight run included more than 1,000 simulated playtests . In 1,200 Normal AI-vs-AI matches, games still undecided after 25 minutes fell from 14% to 0.9%, while wins by sides that had been 800+ scrap behind rose from 24% to 46% .
- When the game’s AI ignored infantry and troop-carrying Condors, Willison turned that observation into a design brief: specify the strategic incentives and map constraints, then have the agent research and critique the design before building, with changes agreed first . The resulting Archipelago map had seven uplinks capturable only by flying infantry in a Condor, and Willison described it as the game’s most fun map .
- To add audio multiplayer, he pointed Claude Code at his working Chirp Pong proof of concept and asked it to adapt the approach; Claude built a Radio Probe to measure bandwidth before implementing an audio modem . He had not extensively tested the feature, though it seemed to work across laptops, iPhones, and iPads; after a player got a headache from the high-pitched sounds, he added a warning and moved toward online multiplayer, using a stateless WebSocket relay after WebRTC failed between his devices .
- The Claude Code team at Anthropic describes a review workflow in which Claude reviews and fixes most changes before a human reviewer is asked to focus on higher-level questions; it frames review around what could go wrong and which automated or human check can catch it, rather than whether a human read every line . As a complementary enforcement technique, Geoffrey Huntley described a pre-commit hook that checks diffs for direct calls bypassing a diagnostics library, fails the commit, and injects a prompt telling the agent to use the library—avoiding reliance on instructions that can drift .
-
DeepSeek open-sourced DeepInfer, the production inference framework used for V4.1 Flash, with distributed inference, speculative decoding, SWA Bounded Replay and structured output; it runs on NVIDIA and Huawei Ascend and includes the
deepseek-recipeAPI/token conversion component. KVCache management and load balancing are not fully open-sourced. - Agent-serving cache pattern: retain reusable Block KVCache prefixes in shared 3FS storage. DeepSeek reports a 3-day TTL for agent traffic; shared storage lets any prefill machine hit any prefix without prefix-affinity routing, reducing repeated prefill work. SWA KV remains in machine memory (about 180 seconds’ TTL and over 98% hit rate); on a miss, SWA Bounded Replay recalculates only the latest 128 tokens to rebuild it.
-
deepseek-recipemaps prompt-builder-inserted special tokens to token IDs and treats user/tool text that merely resembles them as ordinary text, preventing token injection; it also parallel-encodes ordinary-text segments between known special-token boundaries to reduce long-context tokenization latency. DSpark allocates speculative-token validation according to per-token confidence; DeepSeek reports 6% higher online throughput than fixed five-token validation.
-
For an agent-visible personal workspace, he used a Markdown
to-do's.mdfile as the shared data layer and synced it to a web app every 10 minutes; he and his agent could edit it from different devices, and access was restricted to approved email addresses. - To keep build requests from interrupting his personal-agent conversations, he set up a separate builder, Bill, as a new thread using workspace instructions; the personal agent can pass build requests to Bill, and he finds agents better at prompting one another than he is. For review, he asked subagents to test desktop and mobile, check for bugs, and perform a thorough review, then had the agent fix the reported issues.
- In BB, he uses Codex, Claude, Factory, and Pi; for UI exploration, a prototyping scale generated three alternatives that he mixed and refined with a simple request for a Linear-like feel, producing features such as a Kanban board and alternate detail views. He also uses Executor to connect services and tools once, then gives its setup prompt to an agent so the connected tools can be used across workflows.
- Omarchy is designed as an agent-ready Linux desktop: agents are preconfigured so users can start making a theme, app, or plugin from an invitation to “make something cool.” DHH’s stated setup target is a computer ready to use in 30 seconds, rather than spending half an hour or half a day configuring a developer machine.
- He says he used a model he names “Kim E K25” as his primary driver for over a month, praising its 200 tokens per second versus 30–40 tokens per second for frontier models at the time.
- Simon Willison built Battle Drones through 12 major iterations and 321 coding-agent commits, mainly with Claude Code; he reviewed almost none of the TypeScript code but playtested extensively. He found static HTML/JavaScript with WebGL, Phaser, and Three.js effective platforms for agent-built games.
- For a stalled gameplay problem, he gave Opus 5.5 the blunt prompt “Make it a LOT more fun” using Claude Code’s Ultracode dynamic workflows, which orchestrate multiple subagents. The overnight run included more than 1,000 simulated playtests; in 1,200 AI-vs-AI matches on Normal, games still undecided after 25 minutes fell from 14% to 0.9%, while wins by a side that had been 800+ scrap behind rose from 24% to 46%.
- When infantry and troop-carrying Condors lacked a strategic role, he prompted Claude to design a map around that problem and explicitly requested research and critique before implementation, with agreement on modifications before building. The resulting Archipelago map made seven island uplinks capturable only by flying infantry there in a Condor.
- To add audio multiplayer, he pointed Claude Code at his working Chirp Pong proof of concept, then had it build a Battle Drones version. Claude created a Radio Probe to measure device bandwidth before implementing a full audio modem; Willison reported successful trials between laptops, iPhones, and iPads, while cautioning that testing was still limited.
-
For replay and multiplayer, use a deterministic simulation: tiny differences in browser implementations of
Math.sin()andMath.cos()caused desynchronization, so Claude replaced them with custom versions.
- For this add-on, the host treated model choice as secondary: a capable Codex setup was likely enough, while Opus was described as more correct but much more expensive. Cursor was recommended as an approachable interface for building without relying on the terminal.
- Keeping the project folder pointed at the WoW add-on folder made changes testable with a game reload; the host also recommended initializing Git. Local-only version control was considered workable, but a remote copy would help if switching computers or losing the machine.
- Check platform capabilities before settling on a feature: in this WoW add-on exploration, the investigation found no general HTTP/socket or arbitrary file access, and detailed combat-log events were restricted.
- Use a review gate before implementation: the host avoids formal plan mode but has agents discuss their approach and answer questions before he authorizes coding, because their eventual implementation can differ from what he expected.
- Build and verify in small increments: the first generated legacy-menu dropdown reused an existing screen, so the pair tested it in-game and refined the request; the host recommends starting small and working one step at a time.
- The host said dictating ideas on his phone while pacing worked better for him than typing, which could not keep up with his thoughts. He also said agent-assisted coding had become better than his hand coding for completing tasks, while manual coding still produced better quality and thoughtfulness; with implementation less of a barrier, idea and design quality remain limiting factors.
- Tenex’s “meta harness” pairs structured repository documentation with a CLI that agents use for plans, visualizations, client readouts, and other parts of the engineering process; its canonical plan has become less prescriptive as models improved. Agents log decisions and activity, check the artifacts into Git, and keep the context for why decisions were made alongside the code as a durable record.
- The team’s current model preference is Opus 5.5, with Codex still useful for computer-use tasks and for reviewing Opus’s work; engineers report the back-and-forth produces the best results. One engineer uses AMP’s cloud “orbs” to run work off his computer and have another orb review Opus’s output; he says a newly added subscription hookup cuts costs by about 80%.
- Tenex reports roughly doubled engineer output over the period discussed, tracks average story points per engineer per month, and re-evaluates story-point criteria and project estimates at least quarterly as models improve.
- DeepSeek open-sourced DeepInfer, its large-scale inference framework for V4.1 Flash. It supports distributed inference, speculative decoding and structured output, and runs on NVIDIA and Huawei Ascend hardware.
- DeepSeek Recipe handles encoding and decoding between mainstream LLM API protocols and model tokens, with processing aligned to DeepSeek’s official API for third-party deployments. For agent-serving systems, DeepSeek identifies prefix KVCache reuse as a way to cut repeated prefill as contexts grow; its stated agent-traffic cache TTL is 3 days. Its persistent Block KVCache is stored on 3FS, while SWA KVCache stays in machine memory and has a reported ~180-second TTL and over 98% hit rate.
- Caveat: DeepInfer’s KVCache-management and load-balancing components are coupled to DeepSeek’s internal infrastructure and are not yet fully open source.
Sanfilippo describes DeepSeek Infer as a cloud inference engine for DeepSeek V4.1 Flash, built from a vLLM fork and ideas from other engines; its key design choice is specializing kernels for a particular model rather than maintaining a general-purpose engine. The release targets SM100/B200-class Nvidia and Huawei accelerators, but is incomplete for some serving needs: KV-cache management is withheld as a proprietary advantage, and prefill/generation separation for microbatching is not included. For local deployment, he cautions that kernels tuned for SM100 do not transfer directly to DGX Spark’s SM121 architecture and are optimized for heavy batching; he may adapt selected parts only if they offer a benefit.
- After a CA-key leak, Huntley prompted an agent to check whether his NixOS fleet was affected. He used Nix’s single source of truth to patch transitive dependencies fleet-wide, then commit and autodeploy the fix.
-
For a temporary workaround, he had the agent add an
AGENTS.mdreminder to reassess and back out the patch later. The reminder specified checking on or after Oct. 22 whethernixos-26.05included nixpkgs commit7816d39, checking again two days later if not, and removing the workaround once it was included—while retaining separate TLS andrustls-webpkichanges.
Simon Willison built browser-based RTS Battle Drones mainly with Claude Opus 5.5; Claude also generated all of its Three.js 3D models, and a model explorer lists their animation states.
The game can pit two LLMs against each other by pausing every five seconds for them to assess the game state and queue commands; a replay pairs Claude Haiku 5.5 with GPT-6 Luna. The device-to-device audio multiplayer produced a persistent high-pitched noise, prompting a warning that it might cause a headache; Willison added online multiplayer using a small Fly.io-hosted WebSockets relay, so players can share a link to join.
- Tenex’s MetaHarness combines shared skills, structured project documentation and a CLI. Agents work from a canonical plan, log decisions and activity, and check the records into Git alongside the code—preserving the rationale and context needed to resume long-running work. Tenex cautions that this level of structure can be overkill for a small team on one project.
- As models can get to roughly 90% of a solution when given the right context, Tenex’s CJ says his work has shifted from coding toward drawing out customer context and providing it to the model.
- Tenex describes Opus 5.5 as the team’s usual model, with Codex used for computer-use tasks and review; the discussion also describes using AMP’s remote Orbs to switch models and review another agent’s work.
- Tenex reports engineering output roughly doubled over the period as models improved at long-running tasks, and says it reevaluates story-point criteria at least quarterly.
A TODO-board build was shared with a video and a post containing copy/paste instructions for agents, giving developers a starting point for trying an agent-assisted project.
- Macroscope describes a PR-review workflow in which language-specific code “walkers” provide change context and team rules run as native GitHub checks that can block failing PRs. The workflow auto-approves a PR when it passes those checks and a code review and has a small blast radius; Macroscope says it now auto-approves 40% of customer PRs.
- For motion graphics, Claude can generate the code that renders a sequence instead of producing video with diffusion; having the code makes the result easier to customize and analyze.
- The video’s self-described “Trust Me Bro” benchmark roundup gives Gemini 4 Argon a mixed coding profile: it reports a lead on deep software engineering, but Claude Opus 5.5 scores 66 to 57 on Terminal Bench 4.0, GPT-6 Astra leads by more than 10 points on Frontier S, and Argon ranks ninth in webdev Code Arena. These are the video’s benchmark-specific claims, not a settled overall ranking.
For AINews reporting, swyx made Opus 5.5 the default after a side-by-side evaluation, praising its concise, tasteful writing and reduced “slopese” versus Opus 5 . He also cautioned that Opus’s writing quality can be undermined by unspecified “no-no words” in prompts, making it unsuitable for the critical path of his AI media organization .
- Theo built a custom Ubuntu-based environment for agents rather than his personal preferences: it is headless but can spin up XFCE-fork GUIs for agent computer use, and uses Bash instead of Zsh. He says over 30% of Claude’s errors across his machines came from Zsh newline formatting that led Claude to misformat ripgrep commands; he also found agents less capable on Arch and CachyOS dev boxes.
- Choose the stack around agent throughput, not developer preference: Theo kept the React Native mobile app instead of pursuing his preferred SwiftUI rewrite because agents could work faster in the existing app; he says team performance work made it comparable to, or in some ways faster than, the alternative.
- Theo reports that an AI-assisted Rust rewrite of the TypeScript compiler was working in under 20 hours, ran 2–3 times faster than TSGO, supported WASM, and achieved 99.99% accuracy against other TypeScript versions on the real projects he cared about.
Peter Steinberger says his “claw” automatically mutes most replies he characterizes as “slop.”
Ben Tossell describes a custom workspace combining a Superhuman-like email experience with a Linear-style todo board; the email is built on Rhys Sullivan’s Executor. His bot uses the workspace and can be tagged in comments; it also tracks domains, expirations, hosts, and linked local repositories, with plans to add links to mini-apps. He shared a video and copy/paste instructions for agents explaining how he built it.
ThePrimeagen says he dislikes Claude’s apparent preference for legacy versions “just in case.”
The quoted post claims DeepSeek V4.1 Flash 1017 beat GPT 6 Sol on a multi-step offensive-cybersecurity task and says it can be run locally . Primeagen disputed the local-running claim, saying that even his “incredible setup” is far from sufficient to run it locally .
Battle Drones - a vibe coded RTS with audio-based multiplayer
My latest vibe coded game experiment is a Command & Conquer style RTS (Real Time Strategy) game called Battle Drones (opens in new tab) (play it here (opens in new tab)). Unlike my previous experiments (opens in new tab), this one is actually fun to play. I’m somewhat embarrassed to admit that I got there by telling Claude to “Make it a LOT more fun”. It also supports multiplayer between nearby devices using audio to synchronize game state! Here’s what I’ve built so far, and some of the things I learned along the way.
- Battle Drones (opens in new tab)
- How I built this (opens in new tab)
- v1: the initial prototype (opens in new tab)
- v2: full sprites (opens in new tab)
- v3: varied terrain (opens in new tab)
- v4: the fun update (opens in new tab)
- v5: Battle Drones goes 3D (opens in new tab)
- v8: Archipelago (opens in new tab)
- v10: Goliath, and agent battles (opens in new tab)
- Agent battles (opens in new tab)
- v11: Random Maps (opens in new tab)
- v12: Multiplayer via sound (opens in new tab)
- Some thoughts (opens in new tab)
Battle Drones
My initial goal was to build an RTS game I could play on my phone, in the style of Command & Conquer (opens in new tab))). I have fond memories of the 1995 original (I liked Red Alert too) and wanted to recapture a little bit of the magic.
After 12 major iterations (and 321 commits (opens in new tab) by coding agents, mainly Claude Code) I now have a browser-based game that works on mobile and desktop, has multiple play modes, several maps (including a random map generator) and even supports multiplayer for two devices within microphone range of each other.
Here’s a video demo of Battle Drones running in a desktop browser:
Features so far include:
- 9 buildings, 7 ground vehicles, 6 aerial vehicles, 3 infantry units—all 3D models, which you can browse here (opens in new tab)
- Fog of war
- Different weapons are needed to target aerial or ground vehicles
- Six maps, across five biomes—temperate, desert, arctic, volcanic, tropical
- A random map generator
- Skirmish mode —red vs. blue on a rotationally symmetrical map
- Last Stand mode —one player holds out against as many waves of enemies as possible
- Area effect weapons: Barrage, EMP, Drop Pod, Sky Hammer
- Crate drops with bonus resources
- In-game music that responds to events—it gets more intense as fighting breaks out
- Different in-game AI personalities (Balanced, Rush, Air Swarm, Boom, Skyforce, Ironclad)
- AI vs. AI mode, to watch those personalities play each other
- The Goliath —a giant stomping mech with laser eyes and arm cannons and the ability to establish a new base
- Mutators that add extra rules or twists
- A “Daily Op” challenge
- Ranks and achievements (Medals)
- Agent vs. Agent mode where two LLMs can play Battle Drones against each other
- A multiplayer mode based on two nearby phones communicating via audio messages, an extension of my earlier experiment with Chirp Pong (opens in new tab)
How I built this
Battle Drones is heavily vibe coded—I’ve reviewed almost none of the code, and it’s built in a language (TypeScript) that I’ve hardly used myself. I’ve playtested it quite a bit though, and it’s been through a large number of iterations since I started the project.
Here’s a rough history of the project so far, including key prompts and links to transcripts.
v1: the initial prototype
I started out with Claude Fable 5 back in July:
We are going to build a mobile friendly RTS game - command and conquer style - called Battle Drones, in which two armies of drones (both flying and ground-based) battle for territory and resources
Let's start with a MVP design, ask me some questions
Here’s a shared transcript (opens in new tab). I’d given Claude Code for Web an environment variable with an OpenAI API key and told it to use the OpenAI Image Generation API (opens in new tab) for assets, which got me some basic sprites.
You can try v1 here (opens in new tab) —it looked like this:

It’s recognizable as an RTS, has building mechanics and the ability to select and direct units, and a basic AI to play against.
This first version was barely a proof of concept, and it wasn’t any fun to play.
Claude used the Phaser (opens in new tab) 2D game framework for these early versions. I didn’t even realize this until several iterations later!
v2: full sprites
The second version (try v2 here (opens in new tab)) added sprites for all of the vehicles and the “AI vs. AI” mode, so I could watch the game playing without having to directly control it myself.
Claude proved reasonably competent at prompting OpenAI’s image models to generate sprites. You can browse the v2 sprites in the public/assets/sprites (opens in new tab) folder.

v3: varied terrain
It still wasn’t much fun, and the graphics were boring. It was now October, and I had upgraded to Claude Opus 5.5. I told it:
Massively improve this game. Make the graphics and gameplay better (keep it mobile friendly). Render new graphics using the latest OpenAI GPT image API (lookup details) with the API key in the environment variable. Add new unit types and balance the gameplay better. Also add new buildings and better, more varied terrain.
This resulted in five new maps with generated background tiles in a variety of styles, visible here (opens in new tab). Opus also regenerated the sprites, making them much more visually appealing. You can try v3 here (opens in new tab) —it looks like this:

This is starting to feel like a real game! It still wasn’t very fun to play though—I found myself getting bored pretty quickly.
v4: the fun update
So far my Battle Drones experiment was confirming my previous belief (opens in new tab) that coding agents can build a thing that looks like a game but can’t actually make something that’s genuinely compelling to play.
I shared this theory with someone over dinner, and then thought to myself that I should give the models a proper chance to prove me wrong. I prompted Opus 5.5 on my phone:
This game isn't fun enough yet. Make it a LOT more fun.
This time I was running in Ultracode mode (opens in new tab), where Claude Code (in this case Claude Code for Web) runs “dynamic workflows”, described in their docs as:
A dynamic workflow is a JavaScript script that orchestrates many subagents (opens in new tab) at once.
This kicked off many hours of work. I started it in the evening and didn’t get a playable result back until late into the next morning. But the results were spectacular.
You can try v4 here (opens in new tab) —it looks like this:

I had Claude write its own release notes (opens in new tab) —here are the highlights:
Every skirmish and Daily Op now opens with a choice, gives the side that’s losing a way back, and pulls the armies into the middle of the map. There are also two new ways to play.
- Openers: pick Blitz, Industry or Air Wing before the clock starts.
- Call-down powers: Barrage, EMP, Drop Pod and the Sky Hammer orbital strike.
- Objectives and salvage: Uplink relays, supply drops and wrecks worth scrap.
- Feel: combat juice, adaptive music, unit voices and an announcer.
- Command: battle alerts, game speed, saved squads and touch placement.
- New modes: Last Stand survival waves and an 8-mission Ops campaign.
- Progression: heroes, an after-action report with awards, a career, 7 mutators and a Daily Op.
Fights run longer and swing more. In 1,200 AI-vs-AI test matches on Normal, 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%.
Part of the reason Claude took so long was that it ran over a thousand simulated playtest sessions, and used the results to rebalance the existing units, add new ones, and introduce new features.
v5: Battle Drones goes 3D
After the success of Ultracode at “Make it a LOT more fun”, I decided to be more ambitious:
Port this game to three.js with 3D models for all of the buildings and vehicles and landscapes
That was another overnight run. I woke up to this v5 version (opens in new tab):

The new 3D models were entirely constructed by Claude in TypeScript code.
v6 (play v6 here (opens in new tab)) added some more visual polish. v7 (play v7 (opens in new tab)) added robot infantry (troopers, rocket squads, snipers) and a “Condor” troop carrying aircraft.
v8: Archipelago
I was beginning to feel guilty at how little actual design input I had into the game—it really had been a case of me saying “make it more fun” and “add visual polish” for the past few releases.
I’d noticed that the AI didn’t use the new infantry and troop carrying aircraft from v7 very often—there wasn’t a great strategic reason to use them.
It would be neat if we had a new map with a new game mechanic that actively encouraged players to load up Condors with infantry robots and send them out into the map.
This resulted in my longest prompt yet:
Design a new map. Goal is to make different strategic incentives that encourage use of Infantry and Condors and aerial vehicles.
To do this the map will have limited harvester resources but several more uplinks - but uplinks will be on islands that are inaccessible by land vehicles or infantry. These uplinks can also not be claimed using air vehicles. The ONLY way to get them is to fly infantry there in a Condor.
Armies always start with a Condor and a single squad. If an army has no Condor a new one will be provided for free, flying in from the edge closest to their HQ and landing there. That free condor will come with a single free squad on board.
The two HQs should be entirely separated by water, but still accessible by vehicles thanks to two bridges across the map in different places
I want to encourage a battle over uplinks.
The map should be the times the size of other maps - still square
First research and then critique this design. Only build after we have agreed on any modifications
You get to design a new biome for this
The result was the tropical Archipelago map, with seven island uplinks that players can only capture by flying out infantry in a Condor. It’s definitely the most fun map to play, once you’ve got the hang of the basic game mechanics from the simpler maps. The v9 edition (opens in new tab) made that map a little more interesting—it now looks like this:

v10: Goliath, and agent battles
I decided to add giant robot mechs to the game—think Jaegers from Pacific Rim (opens in new tab)t), or Titans from Warhammer 40,000.
Here are some of the prompts I used to brainstorm with Claude:
Help me brainstorm ideas for adding giant robots to this game - think dreadnoughts or titans from W20K - how could we do this in a way that enhanced gameplay, kept things balanced, added unique twist? Don't overthink this yet
Let's keep brainstorming. I like the idea that it's a mobile base - that can accept harvested scrap and can have buildings built near it (even if it later moves on) and can produce infantry units too. An interaction with condor would be neat but I don't know what that could be.
Idea: as it gets damage it loses the ability to fire some weapons - by default it has eye laser (like lancers) and arm canons (like titan) and two shoulder mounted mortars, plus machine guns similar to a squad of troops
Damage knocks out mortars and then laser - it always has guns. You can't build next to a building that was only put there because of the mech, you need the mech there for off-base building and only within three squares of it
[...] Lets do two condors can carry the mech
The end result is really cool.
Goliaths can be constructed using a Gantry—a building that can only be created after first building a Fab, Bay, Airpad, and Tech Lab. You can see the Goliath under construction, and it then walks out from the Gantry and can march around the map.
Goliaths can “anchor”, which digs them into the ground. In their anchored state they can act as a new HQ, constructing infantry units and additional buildings in a new area.
Two Condor aircraft can hook onto a Goliath, at which point it can be flown around the map!
The game now ends when you destroy the enemy’s HQ building and any Goliaths they might have built.
There are also a couple of mutators relating to Goliaths:
- Goliath Armada starts each side with four airborne Goliaths (each with a pair of Condors) and no other units.
- Robot Love adds a special rule: if enemy Goliaths get close to each other on the battlefield they fall in love and the game ends in a draw. (Thank Natalie for that one).
Agent battles
The other v10 feature is agent battles. In musing about how multiplayer could work I had an idea: what if different LLMs could fight it out in the game?
Fun extra challenge: think about how we might make multiplayer available to coding agents. It would be neat if we could set up a battle between eg GPT-6 Sol and Claude Opus 5.5 where each model has access to a tool which gives them information about the game (presumably non-visual, but only the information they could see through fog of war etc) and lets them control their units etc [...]
Consult ~/dev/llm/docs and include notes in that file about how LLM could be used here via a new tools plugin
Opus 5.5 went to work on this, producing this AGENT-BATTLES.md proposal (opens in new tab) and then implementing and testing it. The feature also includes the ability to record and replay these battles—here’s a replay of Claude Haiku 5.5 vs. GPT-6 Luna (opens in new tab), and here’s that same battle in a separate debug tool (opens in new tab) that shows the underlying prompt responses.

The prompt that drives agent battles can be seen here (opens in new tab).
There are a few more replays like this linked in the README (opens in new tab). I hope to turn this into a full league table at some point in the future.
v11: Random Maps
This version exists purely because I glanced at my Claude Usage (opens in new tab) page one day and saw that I’d only used 75% of my weekly allowance and it was resetting in 45 minutes. I decided to see if I could get an extra Battle Drones feature from my remaining tokens, and picked “random map” as the target:
Design and implement a mechanism for generating a random map using any of the available biomes - it should be the size of the largest map and rivers and bridges and rocks and forest and scrap and crystals are all in play. Make them rotationally symmetric and use a seed to allow them to be selected or reused later. You have 45 minutes to build this! Be creative.
Here’s the transcript (opens in new tab), and an image Claude generated to show me its work:

v12: Multiplayer via sound
I only just got this working, so I’ve not had much time to actively test it yet. The latest Battle Drones now supports multiplayer via two devices sat within microphone distance of each other!
This feature started out as my Chirp Pong (opens in new tab) experiment from last week. I pointed Claude Code at that working proof of concept:
Clone Simonw/tools from GitHub and look at recent branches for the example pong game that uses web microphone to implement multiplayer between two phones via audio signals
Build a version of that for battledrones
Opus built this Radio Probe tool (opens in new tab) to measure how much bandwidth we could get between two devices and, based on positive results from that, implemented a full audio modem system. I’ve tried it between laptops, iPhones and iPads so far and it seems to work really well!
Why use sound for this? Because I love static HTML (opens in new tab) that costs nothing to run, and I don’t want to spin up a server somewhere and then stay responsible for keeping it operating for as long as anyone might want to play the game.
Some thoughts
I know almost nothing about game development. This makes it a great opportunity to try out coding agents in a field where my existing software engineering experience has less impact on the results.
Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.
This morning (via Hacker News (opens in new tab)) I found Steam Fans Are Begging for a No-AI Filter as Steam Next Fest Is Filled With Slop (opens in new tab). I wouldn’t personally dream of submitting Battle Drones to an event like this—it’s still way too low effort to warrant consideration as a legitimate indie gaming project.
… but I can now see a path to vibe coded games like this being taken seriously. Battle Drones is fun, it looks good, it has innovative features (the multiplayer-over-audio thing is a first for an RTS as far as I can tell).
I’d love to see what someone with better taste than me and a driving passion to produce something truly exceptional could build!
A few other observations from this project:
- Static HTML and JavaScript is a fantastic medium for games development. WebGL works great, and Three.js (opens in new tab) (and Phaser (opens in new tab) before it) are excellent platforms to build on that the current models know inside out.
- This also lets them run as Progressive Web Apps (opens in new tab) —I didn’t ask for it, but Battle Drones works offline. I was able to play it on a plane despite never having directly installed it—my phone had it cached.
- Giving Claude an OpenAI API key and telling it to generate images using OpenAI’s models works really well. It can view the images it has generated and iterate on the prompts.
- Opus 5.5 is spectacular at 3D modeling using Three.js (and Blender, and no doubt other 3D applications as well). The same is true (opens in new tab) of GPT-6 Astra. They are absolutely capable of building models for 3D game projects.
-
For features like replay and multiplayer it’s useful to have a deterministic simulation engine. At one point Claude had to replace calls to
Math.sin()andMath.cos()and friends with custom versions (opens in new tab) because different browsers (Chrome vs. Safari, for example) returned very slightly different numbers, desynchronizing the replay. - Opus 5.5 can write music! There are no audio files in this project—the soundtrack is entirely generated through code, varies across different maps, and even gets more intense as the battle heats up. See Scrimshaw Jukebox (opens in new tab) for a previous experiment with Claude for music composition.
- I still can’t get over how well the prompt “Make it a LOT more fun” worked.
- Tools are effectively free. I prompted up the Radio Probe (opens in new tab), the Model browser (opens in new tab), the Agent vs. Agent debug tool (opens in new tab), and Claude Code built a bunch of tools (opens in new tab) for itself that I haven’t even explored myself.
-
Audio-based multiplayer between static HTML games works! I hope to see a whole lot more games use this same pattern—in digging around today I’ve not found much prior art beyond Siner (opens in new tab) by Alon Horesh and ggwave (opens in new tab) by Georgi Gerganov (also of
llama.cppfame). - Claude Code “Ultracode” burns tokens like there’s no tomorrow, but it can also solve complex problems (like adding audio-based multiplayer) from a single prompt.
- I’m still not quite over the guilt of building software in this way. I don’t feel like I’ve earned the right to create something this good, in a field in which I have so little prior experience! At this point I’ve shown it to enough people in private that it felt wrong not to publish it for everyone else to see and learn from.
- Simon Willison built Battle Drones through 12 major iterations and 321 coding-agent commits, mainly with Claude Code; he reviewed almost none of the TypeScript code but playtested extensively. He found static HTML/JavaScript with WebGL, Phaser, and Three.js effective platforms for agent-built games.
- For a stalled gameplay problem, he gave Opus 5.5 the blunt prompt “Make it a LOT more fun” using Claude Code’s Ultracode dynamic workflows, which orchestrate multiple subagents. The overnight run included more than 1,000 simulated playtests; in 1,200 AI-vs-AI matches on Normal, games still undecided after 25 minutes fell from 14% to 0.9%, while wins by a side that had been 800+ scrap behind rose from 24% to 46%.
- When infantry and troop-carrying Condors lacked a strategic role, he prompted Claude to design a map around that problem and explicitly requested research and critique before implementation, with agreement on modifications before building. The resulting Archipelago map made seven island uplinks capturable only by flying infantry there in a Condor.
- To add audio multiplayer, he pointed Claude Code at his working Chirp Pong proof of concept, then had it build a Battle Drones version. Claude created a Radio Probe to measure device bandwidth before implementing a full audio modem; Willison reported successful trials between laptops, iPhones, and iPads, while cautioning that testing was still limited.
-
For replay and multiplayer, use a deterministic simulation: tiny differences in browser implementations of
Math.sin()andMath.cos()caused desynchronization, so Claude replaced them with custom versions.