All recent content

Owned by simonw, visibility: Unlisted

SQL query
-- Selecting from blog_entry
SELECT 
    'entry' AS type, 
    id, 
    created, 
    title, 
    body 
FROM 
    blog_entry

UNION

-- Selecting from blog_blogmark
SELECT 
    'blogmark' AS type, 
    id, 
    created, 
    CONCAT(link_title, ' - ', via_title) AS title, 
    commentary AS body 
FROM 
    blog_blogmark

UNION

-- Selecting from blog_quotation
SELECT 
    'quotation' AS type, 
    id, 
    created, 
    CONCAT(quotation, ' - ', source) AS title, 
    '' AS body -- Assuming there's no separate body for quotations
FROM 
    blog_quotation
order by created desc limit 40

40 rows

type id created title body
blogmark 9726 2026-10-29 22:48:29+00:00 API credits benefit for eligible ChatGPT subscriptions - Earlier this month Anthropic [announced a generous new benefit](https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/#api-credits) for their Max and Team subscriptions: $100, $200, and $500 per month subscribers would get the equivalent quantity of (expiring) credits to use with the Anthropic API. OpenAI have now launched pretty much exactly the same deal: if you have a $100, $200, or $500 subscription plan with them you now get that same quantity of credits to apply to one of your API organizations. I maintain subscriptions with both companies, so this is great news for me! I may even ship some public-facing demos now that the credits are already covered by my existing subscriptions.
blogmark 9725 2026-10-29 17:00:26+00:00 How I Built the Most AI-Pilled Company in the World - Don't be put off by the clickbait headline, this piece by Jacob Sansbury describing how they are building [Spawn](https://spawn.co) is a fascinating exploration of the bleeding edge of what's possible with agentic engineering against frontier models. Spawn is a massively multiplayer gaming environment where players can use prompts (to the in-game agent, Savi) to modify the game world. I fired it up on my phone for a few minutes and was able to prompt a castle into existence, then a dragon, then ride the dragon to fly around that castle. ![Two mobile screenshots side by side from a 3D voxel-style game. Left: a first-person view from the saddle of a small teal dragon, its neck with pale diamond markings and two curved white horns in the foreground, flying toward a dark stone castle with tall teal-gray conical spires, glowing windows and teal pennants, on a rocky island in a lake with green and snowy hills behind. Top bar: profile icon, "keep it", "your den" dropdown, "+ new game" button and a "..." menu. Right side: icon buttons and a portrait of a white-haired, freckled character labeled "tap to talk". Bottom right buttons: "JUMP" and "USE". Right: the same game with the chat panel open over the castle scene. Top bar: "your den" dropdown, "+ new game". Button: "earlier ↑". User message: "Make the dragon smaller and land it next to me again". Replies from the white-haired character: "on it. shrinking it to a pony-sized dragon and landing it right beside you." Then: "it's a little dragon now and you're already up on it over the lake. your view sits right in its saddle, horns ahead. fly back to the house and look down. saw your screen just now: flying over the water, the neck and horns ahead, the house on the far shore" Then: "oh, idea: USE while flying could breathe fire instead, with JUMP held to land. want it?" Input box: "what do you want to bring in?" Buttons below: upload, a small pixel-art icon, "lock in" and a microphone.](https://static.simonwillison.net/static/2026-10-29/IMG_9406.webp) By Jacob's telling, Spawn is now being developed autonomously by a swarm of Fable-powered agents costing over $3 million in tokens *per month* ("we spend 30x payroll on AI tokens"). > Our agents change the live code directly and ship to production hourly, so they read every error, bug report and metric themselves. About 60% of our work starts from a production error, a Savi bug report (Savi is the AI you build games with in Spawn), something odd in our logs, or a feature request. > > Savi files bugs herself. When a user hits one, or Savi hits one in the product, she files it. It goes straight to an agent that decides whether it's a real bug to fix, something we won't fix, or intentional design that needs a decision. Usually it becomes a change, delivered to that user within an hour, with a message in the same chat. This is [continuous deployment](https://en.wikipedia.org/wiki/Continuous_deployment) turned up to 11: > A loop this tight only works if it never stops, so we treat an hour without a ship as a SEV-0, our most severe kind of incident. Unshipped changes pile up, and every problem already in production lasts longer. The feedback slows down too. An agent can only keep a few hours of work in its head, so shipping faster than that actually helps it stay coherent. [...] > > We can roll back a broken change in 30 seconds, exactly where it's broken and nowhere else. When a monitor or a log alert fires, it starts or wakes an agent that owns the incident, and we break things on purpose to test that those recovery paths work. My eyebrows raised at least a dozen times reading this. I have trouble imagining this style of development working on software with higher stakes for when something goes wrong, but for a game this appears to be working surprisingly well. Jacob says that Fable 5 (and then 5.1) was the model that made this level of autonomy possible. Opus 5.5 doesn't quite hack it for them, and when they tried GPT-6 Astra to apply fixes from a security review everything stopped working: > Every feature had been disabled and marked to be turned on again once the security fixes were done. Astra had gone through our whole product and made the insecure things secure by turning them off. These kinds of extreme experiments are why I'm [excited about game development](https://simonwillison.net/2026/Oct/28/vibe-game-development/) as a substrate for exploring the edges of what today's coding agents can do.
quotation 2459 2026-10-29 14:06:27+00:00 every product i use should just be a headless mcp, that feeds into an agent, where i never have to think about anything underneath. except for our product, of course. in our product, customers love the ui and love us very much. we're special that way. - Ben Hylak
quotation 2458 2026-10-28 23:23:21+00:00 In general, LLM performance is incredibly multidimensional. There's no guarantee of a fixed ordering where the model that is best at math is also the model that's best at jokes. Despite that complexity, much of the variation in performance is explained by just a single variable: model size. In general, models that are bigger will (a) be more performant / reliable, (b) cost more per token, and (c) have better recall of esoteric facts. As you note, our models are ordered: Luna < Terra < Sol < Astra [[...](https://news.ycombinator.com/item?id=50248124#50250804)] These days, version number signifies a few things at once: the order of release, the relationship to other releases, and the magnitude of improvement. So something like 6.1 would indicate it was launched after 5.6, may share some similarities to other 6.1 models in terms of training data / personality (which is why it's not 5.7), and isn't a giant enough leap to merit the headlines and expectations that would come with a 7. - Ted Sanders
blogmark 9724 2026-10-28 16:45:23+00:00 GitHub Octoverse 2026 - I'm at GitHub Universe today (GitHub gave me a free ticket through their "GitHub Stars" program). EVP Jay Parikh just announced this year's Octoverse report, and highlighted these numbers in particular: ![Photo of a conference keynote stage: a wide curved screen shows three line charts side by side, with a speaker in a black sweater and dark jeans standing at its right edge beneath an overhead lighting rig. Each chart has a large colored headline number above it and a shaded line that runs low and nearly flat across the left side, then curves sharply upward on the right to end in a dot at its peak. Left, in green: "220M" "Merged PRs per month", y-axis 0M, 50M, 100M, 150M, 200M. Middle, in magenta: "7.38B" "Commits per month", y-axis 0B, 2B, 4B, 6B, with the most dramatic, almost vertical final spike. Right, in orange: "30.3M" "New repos per month", y-axis 0M, 10M, 20M, 30M, with a bumpier, more gradual climb. All three share the x-axis labels '23, '24, '25, '26.](https://static.simonwillison.net/static/2026/github-numbers.jpg) This is a pretty stark representation of the impact of agentic engineering on GitHub. In 2026, merged pull requests tripled in less than a year to 220 million per month. Commits more than tripled to 7.38 billion per month, with most of that increase in the second half of this year. New repository rate doubled this year, to 30.3 million per month. The report includes new numbers by industry, and breaks out numbers for repositories that involve "interoperability or reverse engineering". The [methodology section](https://github.blog/news-insights/octoverse/octoverse-commits-pushes-reach-new-highs-in-2026-as-developers-build-with-agents/#h-methodology) includes notes about how they did this: > **Top countries by pushes to public repositories, adjusted by profile location**. Pushes from each country were summed across the Octoverse year. To adjust for biases caused by VPN usage, LLM classification was used to extract the ISO 3166-1 alpha-2 code from the profiles of GitHub users who contributed pushes during this period [...] > > **Industry**. Public repositories created 2022 to 2026 were sorted into NAICS sectors by a fine-tuned multilingual embedding model using name, description, topics, and README, from random samples per year. [...] > > **Interoperability**. Counts public repositories created each year whose name, description, topics, or README mention interoperability or reverse engineering, or related terms, such as clean room implementation, drop-in replacement, or protocol re-implementation.
entry 9568 2026-10-28 13:55:15+00:00 The October inflection point for vibe game development <p>I've written before about how November 2025 was <a href="https://simonwillison.net/tags/november-2025-inflection/">an inflection point for coding agents</a> - the point where Opus 4.5 and GPT-5.1 crossed a tipping point that meant their respective coding agents became reliable daily drivers for software engineers. I think we've reached a new inflection point in October 2026, and this time it's for <strong>vibe coding computer games</strong>.</p> <ul> <li><a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#tree-appreciator">Tree Appreciator</a></li> <li><a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#emberwick">Emberwick</a></li> <li><a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#battle-drones">Battle Drones</a></li> <li><a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#pumpkin-farmer-aka-quarter-sun-cove">Pumpkin Farmer, aka Quarter Sun Cove</a></li> <li><a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#four-times-as-insulting">Four times as insulting</a></li> <li><a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#what-happens-if-someone-actually-puts-the-work-in-">What happens if someone actually puts the work in?</a></li> <li><a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#you-should-build-a-game-">You should build a game!</a></li> </ul> <p>Claude Opus 5.5 in particular exhibits meaningful improvements in several areas needed to build a compelling game:</p> <ul> <li>3D modeling</li> <li>Music generation (see <a href="https://simonwillison.net/2026/Oct/6/scrimshaw-jukebox/">Scrimshaw Jukebox</a>)</li> <li>Game design (!)</li> </ul> <p>That last one is particularly important. Models have been able to create something that <em>looks</em> like a game for quite a while now, as seen in <a href="https://simonwillison.net/2026/Aug/7/moonlight-mayhem/">my previous experiments</a>. The challenge has been getting to a game that's actually <em>fun to play</em>.</p> <p>Game design is a deep subject area. I won't pretend to be well versed in it - I know enough to have respect for it as a craft. Creating a novel, compelling gameplay loop which challenges players at the right level and provides a satisfying learning curve is a fine art. I didn't think the models could do it.</p> <p>Then I tried telling Claude Opus 5.5 to "Make it a LOT more fun"... <a href="https://simonwillison.net/2026/Oct/20/battledrones/#v4-the-fun-update">and it did</a>.</p> <p>In the past few weeks I've vibe coded (in the <a href="https://simonwillison.net/2025/Mar/19/vibe-coding/">classic sense of the term</a> - no looking at the code at all) four games that I've genuinely enjoyed playing.</p> <p>I attended <a href="https://en.wikipedia.org/wiki/Foo_Camp">Foo Camp</a> in Berkeley over the weekend and met several people who were having similar experiences. Building games that play well is shockingly easy now. The new challenge is coming up with concepts for games that are novel and delightful and that wouldn't exist without AI assistance.</p> <p>I haven't done an exhaustive study, but my current impression is that GPT-6 Astra isn't <em>quite</em> there yet. It can absolutely build a game, but its sense of fun doesn't match that of Opus 5.5. I expect OpenAI will get there by the end of the year.</p> <p>Here are the four game projects that have convinced me that the models are now capable of producing fun games with very little guidance. All four are built in HTML and JavaScript and run entirely in the browser.</p> <h4 id="tree-appreciator">Tree Appreciator</h4> <p>The smallest game I found to be genuinely delightful is <a href="https://tools.simonwillison.net/tree-appreciator">Tree Appreciator</a>. I used the regular Claude chat interface for this - it didn't even need Claude Code.</p> <p>I built this on a whim while we were driving along <a href="https://en.wikipedia.org/wiki/California_State_Route_35">Skyline Boulevard</a> looking at trees. My prompt was:</p> <blockquote> <p><code>Build a three js game called "Tree appreciator" - it shows you two algorithmically generated trees and the game mechanics is about appreciating the differences between them. Think hard about how to make sure it is both fun and beautiful.</code></p> </blockquote> <p>I've found that telling models to use <a href="https://threejs.org/">three.js</a> works really well. Claude doesn't have its own image generation model but is capable of building full-color 3D models that look and feel excellent.</p> <p>This game required no iteration or follow-up prompting at all - I got the game in a single shot. It gave me back a charming little mobile-friendly spot-the-difference game. You can <a href="https://tools.simonwillison.net/tree-appreciator">play that here</a>. Here's <a href="https://claude.ai/share/ee7de555-f85c-4ff0-96cb-d51ed5e479e9">the chat transcript</a> that built it.</p> <p><img src="https://static.simonwillison.net/static/2026/tree-appreciator.webp" alt="Screenshot of a web game called Tree Appreciator, a spot-the-difference puzzle showing two side-by-side 3D renders of the same leafy green oak on a grassy hill at golden hour, with orange low-poly hills and a hazy sky behind and pale rocks in the grass. The left tree (Fig. i) has a small brown-and-orange bird perched near the top and a cluster of red-orange autumn leaves in its left canopy; the right tree (Fig. ii) has a small orange squirrel on a branch right of center. Header text: &quot;Tree Appreciator&quot; &quot;No. 001 Quercus aurata 'Silver Echo'&quot; &quot;Golden oak · A low hill at golden hour&quot;, with sound, book and help icons at top right. A popup over the scene reads: &quot;These two trees grew from one seed.&quot; &quot;Three small things differ between them. Tap one in either tree when you spot it.&quot; &quot;Drag to turn both trees. Pinch or scroll to look closer.&quot; with a &quot;Got it&quot; button. Panel labels: &quot;Fig. i&quot; &quot;Fig. ii&quot;." style="max-width: 100%;" /></p> <p>It's pleasingly relaxing. The graphics are fun, and collecting trees that you have completed in a "herbarium" provides a nice, cosy sense of accomplishment.</p> <h4 id="emberwick">Emberwick</h4> <p>This was a more ambitious project that I again built using regular Claude chat. I started out by building an experimental prototype of an engine for a top-down fantasy RPG:</p> <blockquote> <p><code>Build a demo game engine three.js which is a top down (but at an angle) RPG - the player gets to move through the world with one or two companions. Create a fantasy village setting that demonstrates walking around outside and then shows how when the player enters a building the wall between the player and the camera goes transparent so the user can see what is happening</code></p> <p><code>Add some NPCs and plenty of furniture and different types of building some with an upstairs - be creative, make it look great</code></p> </blockquote> <p>Here's <a href="https://simonw.github.io/emberwick/v01/emberwick.html">that first version</a>. It worked really well!</p> <p><img src="https://static.simonwillison.net/static/2026/emberwick-v1.webp" alt="Screenshot of a low-poly 3D top-down fantasy game showing the interior of a cutaway tavern at dusk, with grass, a lamppost and benches outside. Inside, warm candlelight falls on wooden floorboards: a stone fireplace with a figure in a red armchair on a red rug, a blue armchair with an orange cat on it, a long bar with barrels and bottle shelves where a red-haired barkeep stands, a candle chandelier, a cloth-covered table, small round tables with stools and a blue banner with a gold emblem. A group of three adventurers (a white-haired figure in a blue robe, a red-armored figure with a hammer and a green-clad figure) stands just inside the doorway. Top-left panel text: &quot;Harvest Eve&quot; &quot;17:09&quot; &quot;Tavern &amp; lodging · Taproom&quot; &quot;The Gilded Goose&quot; with buttons &quot;Dawn&quot; &quot;Noon&quot; &quot;Dusk&quot; &quot;Night&quot; and a pause button. A speech bubble above the fireplace reads &quot;♪ la la la ♪&quot;. A circular minimap sits at top right marked &quot;N&quot;. Bottom center prompt: &quot;F Talk to Old Fennick Regular&quot;. Bottom-left party portraits labeled &quot;You&quot; &quot;Brakka&quot; &quot;Elowen&quot;. A &quot;?&quot; button sits at bottom right." style="max-width: 100%;" /></p> <p>I was inspired to increase my ambitions:</p> <blockquote> <p><code>Make it not so flat - the buildings are great but the landscape itself is completely flat at the moment, fix that</code></p> <p><code>Add basements to two of the buildings with a tunnel system joining them below the village</code></p> <p><code>Add the start of a rocky mountain on one side of the village containing a cave with a sleeping troll</code></p> </blockquote> <p>Here's <a href="https://simonw.github.io/emberwick/v02/emberwick.html">that version</a>.</p> <p><img src="https://static.simonwillison.net/static/2026/emberwick-v2.webp" alt="Screenshot of the same low-poly fantasy game, now in a dim underground cave lit by a campfire with a spit roast, glowing pale mushrooms and blue crystals. A huge green troll lies asleep on a straw bed at top right, surrounded by scattered bones and skulls. The cave also holds a small round pool ringed with stones, a yellow rug, chests, a fenced pen with a sheep, a pile of orange pumpkins and a stone stair down the left side. The party stands in the center: the green-clad figure and the red-armored figure facing the blue-robed figure holding a glowing staff by the fire, who says in a speech bubble &quot;Smell that? Old brandy and older mud.&quot; The location panel reads &quot;Harvest Eve&quot; &quot;17:25&quot; &quot;Underground · Under the mountain&quot; &quot;Grumblethorn's Cave&quot;." style="max-width: 100%;" /></p> <p>When <em>that</em> produced a good result, I decided to push it all the way:</p> <blockquote> <p><code>Now turn this into an actual game - quadruple the size of the playable area, introduce fun game mechanics, add a plot that isn't too cliche, some twists, a magic system, make it really good</code></p> </blockquote> <p>We're back to prompts like "make it really good" here! Asking for a plot that "isn't too cliche" seemed to work too - it's a bit cliché, but still novel enough that I enjoyed following the story.</p> <p>Unlike Tree Appreciator, this took quite a bit of additional playtesting and prompting to get to a finished version. This was mainly due to gameplay problems - things like a character not being in the right place to complete a quest because a different story element had caused them to move to another location.</p> <p>Here's <a href="https://simonw.github.io/emberwick/v11/emberwick.html">that final game</a>. It has a full story that takes about 15 minutes to play through.</p> <p><img src="https://static.simonwillison.net/static/2026/emberwick-title.webp" alt="Emberwick title screen. The 3D village sits in the background. The text reads Every fire in Emberwick was lit from the Hearthstone, and every fire dies at midnight unless it is lit again. Tonight the Hearthstone is gone, the wizard is missing, and the village is sure the troll did it. You came for the festival. Someone has other plans for you. Buttons for: Begin, Build your own places, Restore a save" style="max-width: 100%;" /></p> <p>There's even an experimental level editor if you want to drop in your own houses, furniture, and landscape features.</p> <p>Once it was all working (and I'd iterated through some gameplay bugs), I played it through from start to finish and found myself emotionally affected by the ending! I'm somewhat embarrassed by this, because <em>everything</em> in this game - the graphics, the plot, the characters, the music, the dialog - came from the model. My creative input was pretty much just "it's a fantasy village and there's a troll asleep in a cave".</p> <p>Here's <a href="https://claude.ai/share/840e0bc0-a68e-4894-8eec-8f83bd6ade26">the full shared Claude chat</a> in which I built this game.</p> <p>I also fed that same initial sequence of prompts through ChatGPT GPT-6 Pro. Here's <a href="https://chatgpt.com/share/6ae176eb-1eac-83e8-ae54-729281fbdb70">the transcript</a> and <a href="https://lantern-hollow-rpg.simonw.chatgpt.site">the finished game</a> for comparison. It looks great, but I don't think it plays nearly as well.</p> <h4 id="battle-drones">Battle Drones</h4> <p>This is by far my most successful project, which I <a href="https://simonwillison.net/2026/Oct/20/battledrones/">wrote about last week</a>. It's a Command &amp; Conquer-style Real-Time Strategy game where two robot armies (or four <a href="https://simonwillison.net/2026/Oct/24/battledrones/">as of Saturday</a>) build units, harvest scrap, and battle over territory.</p> <p>This is also the project that convinced me that Opus 5.5 knows what "fun" is.</p> <p>The first versions were built back in July using Claude Fable 5. It got me to a workable 2D Command &amp; Conquer-style game, but it wasn't great to play.</p> <p>I prompted Opus 5.5 to "Make it a LOT more fun" and then later to "Port this game to three.js" and the game was transformed. There's a blow-by-blow account (prompts included) in <a href="https://simonwillison.net/2026/Oct/20/battledrones/">my write-up</a>.</p> <p>Today, Battle Drones has 2-4 player multiplayer (via a vibe coded WebSockets relay server), medals, replays, seven maps, a random map generator, and a set of "mutators" that add variants of the rules.</p> <p>It also lets different LLMs play against each other, using a mode where the game advances five seconds and then pauses to give different models time to interpret the new game state and line up their next set of commands. Here's a replay of <a href="https://simonw.github.io/battledrones/v11/?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json">Claude Haiku 5.5 vs. GPT-6 Luna</a>:</p> <p><img src="https://static.simonwillison.net/static/2026/agent-v-agent.jpg" alt="Screenshot of a replay of a real-time strategy game between two AI models, shown from a top-down view of a snowy map with a dark frozen lake of cracked ice floes on the left and pine forests at the top and lower right. Top bar: pause button, &quot;6:27&quot;, &quot;1×&quot;, &quot;anthropic/claude-haiku-5-5 · industry&quot; in blue, &quot;gpt-6-luna · industry&quot; in red, a blue-and-red strength bar labeled &quot;B&quot; and &quot;R&quot;, and &quot;0:03&quot;. Left notification: &quot;Blue: Pushing turrets at the enemy's south-east edge.&quot; Replay panel: &quot;Blue anthropic/claude-haiku-5-5 · industry vs Red gpt-6-luna · industry · frostbite seed 42&quot;, a timeline slider at &quot;6:27 / 7:48&quot;, and buttons &quot;−30s&quot;, &quot;+30s&quot;, &quot;All&quot;, &quot;Blue's eyes&quot;, &quot;Red's eyes&quot;, &quot;Notes&quot;. In the scene, a group of blue tanks and a large blue Goliath mech trailing smoke advance near the ice edge at lower center, while a column of red turrets (one burning) lines the ice to their north, red tanks and trucks sit by a rocky ridge to the east, and red base buildings occupy the top right. A minimap is in the top right corner and zoom in, zoom out and lightning-bolt buttons are on the lower left." style="max-width: 100%;" /></p> <p>Battle Drones is a particularly good example of Opus 5.5's ability to create 3D models. This page lets you <a href="https://simonw.github.io/battledrones/models.html">browse all of the models in the game</a>.</p> <p>I released Battle Drones under the Apache 2.0 License last Tuesday. On Wednesday Gabriel Turpin released <a href="https://github.com/menufactory43/panache/">Panache</a> (<a href="https://simonwillison.net/2026/Oct/21/panache/">screenshots here</a>), a fork of Battle Drones that reimagined the game for steampunk 1900s Belle Époque France, with new models and music and an animated intro sequence. Open source at work!</p> <h4 id="pumpkin-farmer-aka-quarter-sun-cove">Pumpkin Farmer, aka Quarter Sun Cove</h4> <p>I live in <a href="https://en.wikipedia.org/wiki/Half_Moon_Bay,_California">Half Moon Bay, California</a>, home of the annual <a href="https://en.wikipedia.org/wiki/Half_Moon_Bay_Art_and_Pumpkin_Festival">Half Moon Bay Art and Pumpkin Festival</a>, which includes a giant pumpkin weigh-off competition.</p> <p>I decided to try building a game that wasn't just a cheap imitation of something that already existed, so I set out to create a game about farming pumpkins, growing giant pumpkins, and handling the rush of the October pumpkin season.</p> <p>I called it "Quarter Sun Cove".</p> <p>I'm still iterating on this project, but it's shaping up quite nicely. It's a cosy farming simulator where you spend the year tending to your giant pumpkin and planting out regular-sized pumpkins for sale in October, then sell pumpkins during pumpkin season and enter your giant pumpkin in the weigh-off.</p> <p>Every character in it is a (vegetarian) animal. The mayor of the town is a pelican. You can be a pelican, skunk, raccoon, possum, beaver, coyote, fox, owl, sea otter, or harbor seal. Those species all later show up (accompanied by their children) to buy pumpkins from you.</p> <p>It's <em>absurdly</em> cute.</p> <p><img src="https://static.simonwillison.net/static/2026/pumpkin-farmer.webp" alt="Screenshot of an isometric low-poly pumpkin farming game. In the bottom left, a huge giant pumpkin, far bigger than anything around it, sits in its own fenced plot under string lights. Beyond it are rows of pumpkin vines with a scarecrow and animal visitors (pelicans, beavers and otters) picking pumpkins and browsing the farm stand, plus a red barn, beehives, a cornfield, parked cars and a dock on the water, with fog drifting across. A side panel shows stats for the patch row &quot;Row 3 · Warty&quot; with a &quot;Cut 7 → barn&quot; button, and a customer review at the bottom reads &quot;★★★★★ Carried our pumpkin like a baby. It was heavier than the baby.&quot;" style="max-width: 100%;" /></p> <p>You can <a href="https://simonw.github.io/pumpkin-farmer/">play the latest version here</a>. I'm not convinced by the game mechanics yet - it's actually quite complicated: you have to decide when to plant pumpkins such that they will become ripe at the weekends in October with the most visitors.</p> <p>Here's the <a href="https://claude.ai/code/cshk_01V63sUyETi6UNbGUyjSYbHd13Mq93U6ty824Ha4eAxF4i">initial brainstorming session</a>, which resulted in <a href="https://github.com/simonw/pumpkin-farmer/blob/cdcf12083f403946b5c2a9e04312bbb42359bf58/SPEC.md">this spec file</a>. Then I had Opus 5.5 Ultracode burn millions of tokens and nearly two days building it.</p> <p>I told Claude to "surprise and delight the user frequently" and the result is <em>so many</em> little details and easter eggs. There are mischievous raccoons, an elephant seal that runs the weigh-off, harbor seals that roll their pumpkins back into the ocean, a wandering goat, and superstitions about growing giant pumpkins that <em>sometimes</em> come true.</p> <p>This isn't my best game yet - it's not as fun to play as Battle Drones - but it represents the kind of game I want more of: weird, fun, uniquely personal - something that wouldn't have been built in the before-times.</p> <h4 id="four-times-as-insulting">Four times as insulting</h4> <p>If you are offended by AI-generated art, AI-generated music, AI-generated writing, and AI-generated code, I have bad news for you: vibe coded games combine <strong>all of those at once</strong>.</p> <p> I respect those opinions, even though I don’t strongly hold them myself.</p> <p>The wider games community already has an aversion to AI-generated assets in games. This has been a growing issue over the past few years as tools like Midjourney have enabled developers to generate assets for their projects. <a href="https://www.ign.com/articles/steam-fans-are-begging-for-a-no-ai-filter-as-steam-next-fest-is-filled-with-slop">This IGN story</a> covering complaints about slop in Valve's Steam Next Fest is a good recent example.</p> <p>We now have games where <em>everything</em> - code, assets, dialog, and even the game design itself - can be outsourced to the models. And the results don't suck!</p> <p>Building a computer game used to be one of the most challenging projects in all of software development, combining a diverse range of skills and requiring intense focus and effort over many months or even years. And now here I am spitting out a playable multiplayer RTS by prompting on my phone!</p> <p>I expect that, as we've already seen with programming, this will result in a split. Some players will refuse to have anything to do with games that were built in this way. Others may embrace this as opening up game development to a much wider audience. I lean in that direction!</p> <p>I certainly won't be entering any of my vibe coded games in traditional game jams or competitions - I don't feel like I've earned that right. We'll likely see new avenues emerge for vibe game developers to compare their projects.</p> <h4 id="what-happens-if-someone-actually-puts-the-work-in-">What happens if someone actually puts the work in?</h4> <p>The thing I find both exciting and shameful about this is that I have got interesting results from <em>so little creative input</em>. The projects I've described here are loosely ordered by how much effort I've put into them. Not a single project represents more than four hours of my work (plus many more hours of Claude Code churning away by itself).</p> <p>Now imagine what could be achieved by anyone who takes this seriously, invests significant creative time, applies better taste in game design, and then playtests and iterates on the result until it's as good as they can make it.</p> <p>I want to see games that wouldn't have existed without these new tools.</p> <h4 id="you-should-build-a-game-">You should build a game!</h4> <p>Building games in this way is <em>so much fun</em>. It's the perfect application for vibe coding because it's so low stakes: how much damage can you cause with a bug in a personal vibe coded game project?</p> <p>(OK, you can do some damage... my attempt at audio-based multiplayer gave my wife Natalie <a href="https://simonwillison.net/2026/Oct/20/battledrones/#update-online-multiplayer-support">a nasty headache</a>!)</p> <p>All of my games so far have been HTML and JavaScript using static hosting (generally GitHub Pages or Cloudflare Pages). Modern browsers - including mobile browsers - are incredibly capable. Frontier models already know libraries like <a href="https://threejs.org">three.js</a> and <a href="https://github.com/phaserjs/phaser">Phaser</a>. I'm finding these mobile web games to be indistinguishable from the native experience, at least for the kinds of games I'm trying to build.</p> <p>I suggest starting with a prompt like this:</p> <blockquote> <p><code>Build a mobile-friendly three.js game where...</code></p> </blockquote> <p>This works on both <a href="https://chatgpt.com/">chatgpt.com</a> and <a href="https://claude.ai">claude.ai</a> - you don't even need to fire up a full coding agent. As one last example, here's "Build a mobile-friendly three.js game where a mouse has to hide from a cat" <a href="https://claude.ai/artifact/RRyEndXLSPQbcig3BgzgCZ">by Claude Opus 5.5 Extra</a> and <a href="https://squeak-and-seek-mouse-1027.simonw.chatgpt.site/">by GPT-6 Extra High</a>.</p> <p>Switch to Codex or Claude Code once your project passes the proof-of-concept phase.</p> <p>And if the game isn't fun enough, add this:</p> <blockquote> <p><code>Make it a LOT more fun</code></p> </blockquote>
quotation 2457 2026-10-28 10:09:07+00:00 If your work does not benefit from current AI tooling, that is a finding, not a failing. Document why, share it with your community of peers, bring it to your manager, and work to find solutions. An engineer who can explain where AI does not yet help their work is demonstrating the judgement we are asking for. - Terk Terkowitz
blogmark 9723 2026-10-27 19:34:18+00:00 Game Boy Color on My Conference Badge - I'm at GitHub Universe this week and, [similar to last year](https://simonwillison.net/2025/Oct/28/github-universe-badge/), the conference badge is a full-blown color screen computer. I've been hacking around with it again, and then I ran into with Steve Francia... who worked with Gemini to get a [full NES emulator](https://spf13.com/p/zelda-on-my-conference-badge/) working on it, and then went a step further and deployed an emulator for both the Game Boy and the Game Boy Color. Which means, if you can obtain the ROM, you can run [The Legend of Zelda: Link's Awakening](https://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Link%27s_Awakening) on your conference badge! ![Photo of the badge running Zelda, in full color, with visible touch buttons below the screen.](https://static.simonwillison.net/static/2026-10-27/IMG_9339.jpeg) A neat feature of the badge is that you can turn it upside down and then use game controller touch buttons that are built into the badge body.
blogmark 9722 2026-10-26 23:53:07+00:00 GPT-6.1 Terra - Hacker News It's always interesting to note which aspects of a new model are emphasized in the release announcement. In the case of GPT-6.1 Terra, OpenAI went with visual reasoning and computer use: > We’re introducing **GPT-6.1 Terra**, a fast, efficient model that combines detailed visual reasoning and precise computer use alongside clearer, more natural writing. A significant step up from GPT‑5.6 Terra, it excels at the communication and computer-based tasks that fill the workday, from drafting proposals and interpreting technical drawings to filling out forms and editing videos. Terra sits in the same position as Sonnet in the Anthropic model collection - not the cheapest or the most expensive, making it harder to decide when to use it. Computer use is a good example of a task that benefits from a less expensive model, since you might put it to work on automated, repetitive tasks. OpenAI's Ted Sanders provided some useful advice in [a comment](https://news.ycombinator.com/item?id=50248124#50249160) on Hacker News: > In the case of GPT-6.1 Terra, I'd say Terra is probably better than Astra and Sol at technical communication, similar on vision and computer use (but much faster!), and a bit worse on most other things. For API developers, it's a nice midrange option if you want something cheaper than Sol but a lot smarter than Luna (especially for vision / computer use / communication). For subscribers, it's not a bombshell release - if you're hitting usage limits, maybe it helps you go a bit further, and if you want clearer communication or faster computer use, it can be a nice option to select. Here are [the pelicans](https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F855d951d12c68eccca5374cd7d4f834e) for the different reasoning levels. This pelican [for "max"](https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F855d951d12c68eccca5374cd7d4f834e#reasoning-2) cost [11.3161 cents](https://www.llm-prices.com/#it=16&ot=22629&sel=gpt-6.1-terra) and took 4 minutes and 11 seconds: ![It's a good pelican and a good bicycle - correctly shaped frame, feet n pedals either side of the frame, has the same color scheme as the others in the GPT-6 and GPT-6.1 families.](https://static.simonwillison.net/static/2026-10-26/terra-max.webp) Here's [a new comparison grid](https://static.simonwillison.net/static/2026/openai-pelicans-october-2026.html) showing pelicans for every reasoning level of OpenAI's current frontier lineup: GPT-6 Astra, GPT-6.1 Sol, GPT-6.1 Terra, and GPT-6 Luna. GPT-6.1 Terra is priced at $1/million input tokens and $5/million output - almost half the price of GPT-5.6 Terra and GPT-6.1 Sol, and around 10x the price of GPT-6 Luna.
quotation 2456 2026-10-26 19:00:25+00:00 Because big tech platforms essentially do not have customer support and make it impossible for their users to contact a human, many people experiencing run-of-the-mill tech problems have turned to ChatGPT. And, increasingly, ChatGPT is telling people that have normal tech support problems that they have discovered something journalistically notable and that 404 Media, specifically, can help them. - Jason Koebler
blogmark 9701 2026-10-23 19:40:54+00:00 Introducing Kimi K3.1 Pro - Hacker News Kimi K3.1 Pro landed on the Kimi API today - it's not yet open weights, but Moonshot promise "Full model weights will be released by Nov 4, 2026". They're also offering a "Highspeed" version that's 2-3x faster, at twice the price (except for input token cache hits, which are priced the same). The [US dollar pricing](https://platform.kimi.ai/docs/pricing/chat) is $2.00/million tokens for input and $10/million for output - the same as GPT-6.1 Sol and half the price of Claude Opus 5.5. Moonshot's own benchmarks show Kimi as approximately level with Opus 5.5 and GPT-6 Astra - beating them on a few benchmarks, coming close on others. Artificial Analysis [scored Kimi at 55](https://artificialanalysis.ai/models/kimi-k3-1-pro) - ahead of Claude Fable 5.1, GPT-6 Astra, and Gemini 4 Argon (all at 53) and behind only Claude Opus 5.5 (58). This is the first time a (soon-to-be) open weight model has scored this highly against the frontier. I tried it out via the [Moonshot API](https://platform.kimi.ai/docs/get-your-api-key) using the [llm openai endpoint](https://llm.datasette.io/en/stable/other-models.html#openai-endpoint) command I added to [LLM 0.32](https://llm.datasette.io/en/stable/changelog.html#v0-32) back in August: llm openai endpoint \ https://api.moonshot.ai/v1 \ --key kimi \ -m kimi-k3.1-pro \ "Generate an SVG of a pelican riding a bicycle" \ --responses \ -o reasoning_effort low \ > kimi-k3.1-pro-pelican-low.stdout.txt \ 2> kimi-k3.1-pro-pelican-low.stderr.txt `llm openai endpoint` can run prompts against any OpenAI-compatible endpoint but doesn't log the results, hence the extra options to save stdout and stderr (the reasoning trace). Here [are the pelicans](https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F9b7181492209387da1d4f53002f26663) I got for Kimi K3.1 Pro on the three reasoning levels it supports - low, medium, and max. This is max: ![It's pretty solid - feet are on the pedals, bicycle frame is good, nice beak. Both legs are on the same side of the Fram though.](https://static.simonwillison.net/static/2026-10-23/image-2.png) For comparison, I ran fresh [pelicans against Kimi K3](https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Feba9a4283c9e94cbbb5325902a3921a8) on those three reasoning levels.
blogmark 9700 2026-10-22 19:42:26+00:00 DE STAAT - FREEDOM (Official Music Video) - flir on Hacker News OK well this is a first for me... at [00:44](https://www.youtube.com/watch?v=hKO4pQtIXow&t=44s) in this new music video by Dutch alternative rock band [De Staat](https://en.wikipedia.org/wiki/De_Staat): <video src="https://static.simonwillison.net/static/2026/freedom-pelican.mp4" poster="https://static.simonwillison.net/static/2026/freedom-pelican-poster.jpg" preload="none" loop="1" controls="1" playsinline="1" muted="1" width="1280" height="720" style="display: block; width: 100%; height: auto;" > </video> The visual effects are credited to Matties Grooten of [Fake it or Leave it](https://fakeitorleaveit.com).
blogmark 9699 2026-10-22 18:09:56+00:00 Donating Agent Skills to the Agentic AI Foundation - News today from Anthropic: > We’re committed to keeping Agent Skills open, community-driven, and vendor-neutral. Today, we are donating the standard to the Agentic AI Foundation (AAIF) under the Linux Foundation, [which we co-founded](https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation) with Block and OpenAI last year, and to which we donated the Model Context Protocol (MCP). I'm pleased to note I called this one [last December](https://simonwillison.net/2025/Dec/19/agent-skills/), when Anthropic first declared skills to be an "open standard": > I wouldn't be surprised to see this end up [in the AAIF](https://simonwillison.net/2025/Dec/9/agentic-ai-foundation/), recently the new home of the MCP specification. Fun side note: since my blog content is available to Claude via the [datasette-mcp](https://github.com/datasette/datasette-mcp) plugin I found that post by [prompting Claude](https://claude.ai/share/80b341de-590b-4834-bca9-0d9c9a3a0298) to "`Use simonwillison.net MCP to find if I ever talked about how I want skills to be donated to a standards body`".
quotation 2426 2026-10-22 15:34:13+00:00 As fun as AI is, we built so much bad software over the last 30 years, and now the universe is punishing us for our sins. - Armin Ronacher
blogmark 9698 2026-10-21 18:41:53+00:00 Today's PHP Security Release, and How We're Strengthening PHP Security - Hacker News If you're running anything on PHP it's vital you upgrade - today's updates (across the entire PHP 8.x line) address two remote code execution holes, and there have been exploits circulating since last night, thanks to a leak in the coordinated disclosure process. This post from the PHP Foundation explain what went so wrong: > On Tuesday, October 20th, at around 15:00 UTC, the two CVE IDs began circulating on online forums and social media. They came with a wrong release time and a wrong CVSS score of 10.0 (the actual score is 9.2). No technical details leaked. In response, the PHP project brought its pre-announcement forward and [published it at 19:30 UTC](https://www.php.net/archive/2026.php#2026-10-20-1). It also moved the release from October 22nd, 14:00 UTC, to October 21st, 14:00 UTC [...] > > As a result of the leak and pre-announcement around 20:00 UTC, Calif, one of the security firms that had reported the issues mistakenly published a video. It showed their proof of concept working against a number of targets and revealed a few additional, though limited, details about the vulnerabilities. Copies of the deleted video started circulating on social media soon after. The video contributed to accelerated development of various PoCs (exploitation proof of concepts), which then increased circulation on October 21st. [This article](https://www.wiz.io/blog/php2shell-php-rce) from the team that discovered the original vulnerability includes a more detailed timeline of the original intended responsible disclosure: > - **August 19, 2026:** Wiz Research discovers the first PHP vulnerability using Wiz Atlas, Gemini 4 Argon, and GPT-5.6 Sol. > - **August 20, 2026:** Unauthenticated RCE is confirmed against Drupal. > - **August 21, 2026:** Unauthenticated RCE is confirmed against WordPress. > - **August 24, 2026:** Wiz Research reports the vulnerabilities to the PHP security team. > - **September 21, 2026:** PHP acknowledges the reports and begins developing a coordinated fix. > - **October 21, 2026:** Patched PHP releases become available. > - **October 21, 2026:** Public disclosure.
blogmark 9697 2026-10-21 16:25:16+00:00 Panache — RTS Belle Époque pour mobile - @Meffysto69 Well this is delightful: I [released Battle Drones](https://simonwillison.net/2026/Oct/20/battledrones/) yesterday under an Apache 2.0 License and there's already a French language fork by Gabriel Turpin which reskins the game to take place in steampunk 1900s France and adds an animated intro! > **Panache** est un jeu de stratégie en temps réel pour mobile et navigateur, dans la France de la Belle Époque (vers 1900) : dirigeables, Fardiers à vapeur, Creusot cuirassés, automates en képi, Gargantua la forteresse marchante — et beaucoup de panache. You can [play Panache here](https://menufactory43.github.io/panache/) - it's worth clicking that link just to experience the new intro video. So far it's mostly just aesthetic updates as opposed to gameplay changes. The music has had a French twist added to it as well. The new steampunk models are so cool! ![The new buildings are gold and red, there are dirigibles and biplanes, and the Goliath stomping mech has had a total makeover.](https://static.simonwillison.net/static/2026/battledrones-french.jpg) Here's a page with [the original Battle Drones models](https://simonw.github.io/battledrones/models.html) and that same page [with the new Panache alternatives](https://menufactory43.github.io/panache/models.html). This is a comparison of the original and the new design for the Goliath: ![On the left: blue stomping mech robot, missile launcher shoulders, classic sci-fi robot look. On the right: gold, steampunk, much more 1900s French look.](https://static.simonwillison.net/static/2026/battledrones-goliath-diff.jpg)
blogmark 9696 2026-10-20 23:50:25+00:00 eMudhra Intermediate CA Compromise - This is very, very bad news: > The private keys of eight eMudhra intermediate CA certificates have been compromised. They chain to roots trusted by the Mozilla, Microsoft, Apple and Chrome root programs and by many downstream trust stores. Any software that bundles a list of trusted certificates needs to be updated. This site is tracking software updates [via this GitHub repository](https://github.com/galadran/we-have-a-problem.com) - Linux distros need to update their `ca-certificates` packages. In Python world [uv 0.13.4](https://github.com/astral-sh/uv/releases/tag/0.13.4) and [pip 26.2.2](https://github.com/pypa/pip/releases/tag/26.2.2) and [certifi 2026.10.19](https://github.com/certifi/python-certifi/releases/tag/2026.10.19) have been released with upgraded certificate lists. There's a [very informative thread](https://discuss.python.org/t/information-for-python-users-regarding-emudhra-emsign-ca-certificate-security-incident/109576) about this on the official Python forum.
entry 9536 2026-10-20 19:34:19+00:00 Battle Drones - a vibe coded RTS with audio-based multiplayer <p>My latest vibe coded game experiment is a Command &amp; Conquer style RTS (Real Time Strategy) game called <a href="https://github.com/simonw/battledrones#readme">Battle Drones</a> (<a href="https://simonw.github.io/battledrones/">play it here</a>). Unlike <a href="https://simonwillison.net/2026/Aug/5/raccoon-heist/">my previous experiments</a>, this one is <em>actually fun to play</em>. 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.</p> <ul> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#battle-drones">Battle Drones</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#how-i-built-this">How I built this</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v1-the-initial-prototype">v1: the initial prototype</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v2-full-sprites">v2: full sprites</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v3-varied-terrain">v3: varied terrain</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v4-the-fun-update">v4: the fun update</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v5-battle-drones-goes-3d">v5: Battle Drones goes 3D</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v8-archipelago">v8: Archipelago</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v10-goliath-and-agent-battles">v10: Goliath, and agent battles</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#agent-battles">Agent battles</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v11-random-maps">v11: Random Maps</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#v12-multiplayer-via-sound">v12: Multiplayer via sound</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#some-thoughts">Some thoughts</a></li> <li><a href="https://simonwillison.net/2026/Oct/20/battledrones/#update-online-multiplayer-support">Update: Online multiplayer support</a></li> </ul> <h4 id="battle-drones">Battle Drones</h4> <p>My initial goal was to build an RTS game I could play on my phone, in the style of <a href="https://en.wikipedia.org/wiki/Command_&amp;_Conquer_(1995_video_game)">Command &amp; Conquer</a>. I have fond memories of the 1995 original (I liked Red Alert too) and wanted to recapture a little bit of the magic.</p> <p>After 12 major iterations (and <a href="https://github.com/simonw/battledrones/commits/main/">321 commits</a> 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. (<strong>Update</strong>: also <a href="https://simonwillison.net/2026/Oct/20/battledrones/#update-online-multiplayer-support">online multiplayer</a>; the audio multiplayer induced headaches!)</p> <p>Here's a video demo of Battle Drones running in a desktop browser:</p> <video src="https://static.simonwillison.net/static/2026/archipelago_720p_h264.mp4" poster="https://static.simonwillison.net/static/2026/archipelago_poster.jpg" preload="none" loop="1" controls="1" playsinline="1" muted="1" width="1280" height="706" style="display: block; width: 100%; height: auto;" > </video> <p style="margin-top: 1em">Features so far include:</p> <ul> <li>9 buildings, 7 ground vehicles, 6 aerial vehicles, 3 infantry units - all 3D models, which you can <a href="https://simonw.github.io/battledrones/models.html">browse here</a> </li> <li>Fog of war</li> <li>Different weapons are needed to target aerial or ground vehicles</li> <li> <strong>Six maps</strong>, across five biomes - temperate, desert, arctic, volcanic, tropical</li> <li>A random map generator</li> <li> <strong>Skirmish mode</strong> - red vs. blue on a rotationally symmetrical map</li> <li> <strong>Last Stand mode</strong> - one player holds out against as many waves of enemies as possible</li> <li>Area effect weapons: Barrage, EMP, Drop Pod, Sky Hammer</li> <li> <strong>Crate drops</strong> with bonus resources</li> <li>In-game music that responds to events - it gets more intense as fighting breaks out</li> <li>Different in-game <strong>AI personalities</strong> (Balanced, Rush, Air Swarm, Boom, Skyforce, Ironclad)</li> <li> <strong>AI vs. AI</strong> mode, to watch those personalities play each other</li> <li>The <strong>Goliath</strong> - a giant stomping mech with laser eyes and arm cannons and the ability to establish a new base</li> <li> <strong>Mutators</strong> that add extra rules or twists</li> <li>A "Daily Op" challenge</li> <li>Ranks and achievements (<strong>Medals</strong>)</li> <li> <strong>Agent vs. Agent</strong> mode where two LLMs can play Battle Drones against each other</li> <li>A <strong>multiplayer mode</strong> based on two nearby phones communicating via audio messages, an extension of my earlier experiment with <a href="https://simonwillison.net/2026/Oct/15/chirp-pong/">Chirp Pong</a> </li> </ul> <h4 id="how-i-built-this">How I built this</h4> <p>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.</p> <p>Here's a rough history of the project so far, including key prompts and links to transcripts.</p> <h4 id="v1-the-initial-prototype">v1: the initial prototype</h4> <p>I started out with Claude Fable 5 back in July:</p> <blockquote> <p><code>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</code></p> <p><code>Let's start with a MVP design, ask me some questions</code></p> </blockquote> <p>Here's a <a href="https://claude.ai/code/session_015RYeKm4ji4N16oqthyX1b1">shared transcript</a>. I'd given Claude Code for Web an environment variable with an OpenAI API key and told it to use the OpenAI <a href="https://developers.openai.com/api/docs/guides/image-generation">Image Generation API</a> for assets, which got me some basic sprites.</p> <p>You can <a href="https://simonw.github.io/battledrones/v1/">try v1 here</a> - it looked like this:</p> <p><img src="https://static.simonwillison.net/static/2026/battledrones-v1.webp" alt="Game screen. Down the right are text icons to build Fab, Airpad, Turret, Harv, Sting, Flak, Scout, Wasp, Raptor. There is a blocky fog of war on a 2D battlefield. There are some gems, an HQ building being attacked by badly rendered tanks, and some blue vehicles dotted around. It's not very visually impressive but it does look like a basic RTS." style="max-width: 100%;" /></p> <p>It's recognizable as an RTS, has building mechanics and the ability to select and direct units, and a basic AI to play against.</p> <p>This first version was barely a proof of concept, and it wasn't any fun to play.</p> <p>Claude used the <a href="https://github.com/phaserjs/phaser">Phaser</a> 2D game framework for these early versions. I didn't even realize this until several iterations later!</p> <h4 id="v2-full-sprites">v2: full sprites</h4> <p>The second version (<a href="https://simonw.github.io/battledrones/v2/">try v2 here</a>) 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.</p> <p>Claude proved reasonably competent at prompting OpenAI's image models to generate sprites. You can browse the v2 sprites in the <a href="https://github.com/simonw/battledrones/tree/v2/public/assets/sprites">public/assets/sprites</a> folder.</p> <p><img src="https://static.simonwillison.net/static/2026/battledrones-v2.webp" alt="Four flying units, three turrets, a harvester and an airpad all have proper sprites now. The scrap field has a new design which doesn't look great but is at least using a graphic." style="max-width: 100%;" /></p> <h4 id="v3-varied-terrain">v3: varied terrain</h4> <p>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:</p> <blockquote> <p><code>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.</code></p> </blockquote> <p>This resulted in five new maps with generated background tiles in a variety of styles, <a href="https://github.com/simonw/battledrones/commit/aa22f08a34347d7d9f94b33f44a73b4deb046aa1">visible here</a>. Opus also regenerated the sprites, making them much more visually appealing. You can <a href="https://simonw.github.io/battledrones/v3/">try v3 here</a> - it looks like this:</p> <p><img src="https://static.simonwillison.net/static/2026/battledrones-v3.jpg" alt="The map is now an ice map with snow and ice and broken ice - it looks really good. The vehicles and buildings have all had a cosmetic upgrade too. This is starting to look like a real game." style="max-width: 100%;" /></p> <p>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.</p> <h4 id="v4-the-fun-update">v4: the fun update</h4> <p>So far my Battle Drones experiment was confirming my <a href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.059.webp">previous belief</a> that coding agents can build a thing that looks like a game but can't actually make something that's genuinely compelling to play.</p> <p>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:</p> <blockquote> <p><code>This game isn't fun enough yet. Make it a LOT more fun.</code></p> </blockquote> <p>This time I was running in <a href="https://code.claude.com/docs/en/workflows">Ultracode mode</a>, where Claude Code (in this case Claude Code for Web) runs "dynamic workflows", described in their docs as:</p> <blockquote> <p>A dynamic workflow is a JavaScript script that orchestrates many <a href="https://code.claude.com/docs/en/sub-agents">subagents</a> at once.</p> </blockquote> <p>This kicked off <em>many hours</em> 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.</p> <p>You can <a href="https://simonw.github.io/battledrones/v4/">try v4 here</a> - it looks like this:</p> <p><img src="https://static.simonwillison.net/static/2026/battledrones-v4.jpg" alt="The lava map. Uplink satellites are being taken, crystals look better, Elite text is shown above a unit, there is an arrow marked Fight to jump to a fight, the AI vs AI mode has a speed controller - plenty of new features here." style="max-width: 100%;" /></p> <p>I had Claude <a href="https://github.com/simonw/battledrones/blob/main/Battle%20Drones%20The%20Fun%20Update%20%E2%80%94%20Release%20Notes.md">write its own release notes</a> - here are the highlights:</p> <blockquote> <p>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.</p> <ul> <li> <strong>Openers</strong>: pick Blitz, Industry or Air Wing before the clock starts.</li> <li> <strong>Call-down powers</strong>: Barrage, EMP, Drop Pod and the Sky Hammer orbital strike.</li> <li> <strong>Objectives and salvage</strong>: Uplink relays, supply drops and wrecks worth scrap.</li> <li> <strong>Feel</strong>: combat juice, adaptive music, unit voices and an announcer.</li> <li> <strong>Command</strong>: battle alerts, game speed, saved squads and touch placement.</li> <li> <strong>New modes</strong>: Last Stand survival waves and an 8-mission Ops campaign.</li> <li> <strong>Progression</strong>: heroes, an after-action report with awards, a career, 7 mutators and a Daily Op.</li> </ul> <p>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%.</p> </blockquote> <p>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.</p> <h4 id="v5-battle-drones-goes-3d">v5: Battle Drones goes 3D</h4> <p>After the success of Ultracode at "Make it a LOT more fun", I decided to be more ambitious:</p> <blockquote> <p><code>Port this game to three.js with 3D models for all of the buildings and vehicles and landscapes</code></p> </blockquote> <p>That was another overnight run. I woke up to <a href="https://simonw.github.io/battledrones/v5/">this v5 version</a>:</p> <p><img src="https://static.simonwillison.net/static/2026/battledrones-v5.jpg" alt="Now it is in 3D - the battlefield is at a slight angle, the buildings and vehicles are all 3D models, the rocks and trees look a bit 3D as well." style="max-width: 100%;" /></p> <p>The new 3D models were entirely constructed by Claude in TypeScript code.</p> <p>v6 (<a href="https://simonw.github.io/battledrones/v6/">play v6 here</a>) added some more visual polish. v7 (<a href="https://simonw.github.io/battledrones/v7/">play v7</a>) added robot infantry (troopers, rocket squads, snipers) and a "Condor" troop carrying aircraft.</p> <h4 id="v8-archipelago">v8: Archipelago</h4> <p>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.</p> <p>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.</p> <p>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.</p> <p>This resulted in my longest prompt yet:</p> <blockquote> <p><code>Design a new map. Goal is to make different strategic incentives that encourage use of Infantry and Condors and aerial vehicles.</code></p> <p><code>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.</code></p> <p><code>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.</code></p> <p><code>The two HQs should be entirely separated by water, but still accessible by vehicles thanks to two bridges across the map in different places</code></p> <p><code>I want to encourage a battle over uplinks.</code></p> <p><code>The map should be the times the size of other maps - still square</code></p> <p><code>First research and then critique this design. Only build after we have agreed on any modifications</code></p> <p><code>You get to design a new biome for this</code></p> </blockquote> <p>The result was the tropical <strong>Archipelago</strong> 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 <a href="https://simonw.github.io/battledrones/v9/">v9 edition</a> made that map a little more interesting - it now looks like this:</p> <p><img src="https://static.simonwillison.net/static/2026/battledrones-v8.jpg" alt="Three islands, each with an uplink satellite. Blue holds one, red holds another, A blue condor is flying towards the red island, which is guarded by a red plane. There is a bridge nearby. The theme is tropical islands and looks very pleasant." style="max-width: 100%;" /></p> <h4 id="v10-goliath-and-agent-battles">v10: Goliath, and agent battles</h4> <p>I decided to add giant robot mechs to the game - think Jaegers from <a href="https://en.wikipedia.org/wiki/Pacific_Rim_(film)#Plot">Pacific Rim</a>, or Titans from Warhammer 40,000.</p> <p>Here are some of the prompts I used to brainstorm with Claude:</p> <blockquote> <p><code>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</code></p> </blockquote> <blockquote> <p><code>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.</code></p> </blockquote> <blockquote> <p><code>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</code></p> </blockquote> <blockquote> <p><code>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</code></p> </blockquote> <blockquote> <p><code>[...] Lets do two condors can carry the mech</code></p> </blockquote> <p>The end result is <em>really cool</em>.</p> <video width="1644" height="1080" preload="none" loop="1" controls="1" playsinline="1" muted="1" style="display: block; width: 100%; height: auto;" poster="https://static.simonwillison.net/static/2026/goliath-poster.jpg" > <source src="https://static.simonwillison.net/static/2026/goliath.mp4" type="video/mp4" /> Your browser does not support HTML video. </video> <p style="margin-top: 1em">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.</p> <p>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.</p> <p>Two Condor aircraft can hook onto a Goliath, at which point it can be flown around the map!</p> <p>The game now ends when you destroy the enemy's HQ building <em>and</em> any Goliaths they might have built.</p> <p>There are also a couple of mutators relating to Goliaths:</p> <ul> <li> <strong>Goliath Armada</strong> starts each side with four airborne Goliaths (each with a pair of Condors) and no other units.</li> <li> <strong>Robot Love</strong> 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).</li> </ul> <h4 id="agent-battles">Agent battles</h4> <p>The other v10 feature is <strong>agent battles</strong>. In musing about how multiplayer could work I had an idea: what if different LLMs could fight it out in the game?</p> <blockquote> <p><code>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 [...]</code></p> <p><code>Consult ~/dev/llm/docs and include notes in that file about how LLM could be used here via a new tools plugin</code></p> </blockquote> <p>Opus 5.5 went to work on this, producing <a href="https://github.com/simonw/battledrones/blob/7001ed186c8b8aef4acb27f680ecf4c09b607e54/AGENT-BATTLES.md">this AGENT-BATTLES.md proposal</a> and then implementing and testing it. The feature also includes the ability to record and replay these battles - here's <a href="https://simonw.github.io/battledrones/v11/?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json">a replay of Claude Haiku 5.5 vs. GPT-6 Luna</a>, and here's that same battle <a href="https://simonw.github.io/battledrones/record-viewer.html?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json#r1">in a separate debug tool</a> that shows the underlying prompt responses.</p> <p><img src="https://static.simonwillison.net/static/2026/agent-v-agent.jpg" alt="Screenshot of a replay of a real-time strategy game between two AI models, shown from a top-down view of a snowy map with a dark frozen lake of cracked ice floes on the left and pine forests at the top and lower right. Top bar: pause button, &quot;6:27&quot;, &quot;1×&quot;, &quot;anthropic/claude-haiku-5-5 · industry&quot; in blue, &quot;gpt-6-luna · industry&quot; in red, a blue-and-red strength bar labeled &quot;B&quot; and &quot;R&quot;, and &quot;0:03&quot;. Left notification: &quot;Blue: Pushing turrets at the enemy's south-east edge.&quot; Replay panel: &quot;Blue anthropic/claude-haiku-5-5 · industry vs Red gpt-6-luna · industry · frostbite seed 42&quot;, a timeline slider at &quot;6:27 / 7:48&quot;, and buttons &quot;−30s&quot;, &quot;+30s&quot;, &quot;All&quot;, &quot;Blue's eyes&quot;, &quot;Red's eyes&quot;, &quot;Notes&quot;. In the scene, a group of blue tanks and a large blue Goliath mech trailing smoke advance near the ice edge at lower center, while a column of red turrets (one burning) lines the ice to their north, red tanks and trucks sit by a rocky ridge to the east, and red base buildings occupy the top right. A minimap is in the top right corner and zoom in, zoom out and lightning-bolt buttons are on the lower left." style="max-width: 100%;" /></p> <p>The prompt that drives agent battles <a href="https://github.com/simonw/battledrones/blob/d584e351d9d28c4ba058b78ddcca9b93cd9bcd33/llm-tools-battledrones/llm_tools_battledrones.py#L106-L117">can be seen here</a>.</p> <p>There are a few more replays like this <a href="https://github.com/simonw/battledrones/blob/main/README.md#watch-ai-models-play-it">linked in the README</a>. I hope to turn this into a full league table at some point in the future.</p> <h4 id="v11-random-maps">v11: Random Maps</h4> <p>This version exists purely because I glanced at my <a href="https://claude.ai/new#settings/usage">Claude Usage</a> 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:</p> <blockquote> <p><code>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.</code></p> </blockquote> <p>Here's <a href="https://claude.ai/code/session_01CfwMwDaK1kLKnRV6di8VMT">the transcript</a>, and an image Claude generated to show me its work:</p> <p><img src="https://static.simonwillison.net/static/2026/random-map-contact-sheet.jpg" alt="Grid of ten top-down game maps, two per biome (temperate, desert, arctic, volcanic, tropical), each with a river or lava flow, bridges and roads. Title: &quot;Battle Drones: generated maps (108x108, point-symmetric), 2 per biome, runtime ground painter&quot;. Each map is captioned with a name and layout type plus a seed and crossing counts, e.g. &quot;Hawthorn Delta · fork&quot; &quot;random-temperate-1x8a6r2 · 6 bridges, 4 fords&quot;; layout types are fork, badlands, crossing and lake." style="max-width: 100%;" /></p> <h4 id="v12-multiplayer-via-sound">v12: Multiplayer via sound</h4> <p>I only <em>just</em> 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!</p> <p>This feature started out as my <a href="https://simonwillison.net/2026/Oct/15/chirp-pong/">Chirp Pong</a> experiment from last week. I pointed Claude Code at that working proof of concept:</p> <blockquote> <p><code>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</code></p> <p><code>Build a version of that for battledrones</code></p> </blockquote> <p>Opus built <a href="https://simonw.github.io/battledrones/radio-probe.html">this Radio Probe tool</a> 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!</p> <p>Why use sound for this? Because I <a href="https://simonwillison.net/2025/Dec/10/html-tools/#the-anatomy-of-an-html-tool">love static HTML</a> 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.</p> <h4 id="some-thoughts">Some thoughts</h4> <p>I know almost <em>nothing</em> 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.</p> <p>Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.</p> <p>This morning (<a href="https://news.ycombinator.com/item?id=50168190">via Hacker News</a>) I found <a href="https://www.ign.com/articles/steam-fans-are-begging-for-a-no-ai-filter-as-steam-next-fest-is-filled-with-slop">Steam Fans Are Begging for a No-AI Filter as Steam Next Fest Is Filled With Slop</a>. 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.</p> <p>... 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).</p> <p>I'd love to see what someone with better taste than me and a driving passion to produce something truly exceptional could build!</p> <p>A few other observations from this project:</p> <ul> <li>Static HTML and JavaScript is a fantastic medium for games development. WebGL works great, and <a href="https://github.com/mrdoob/three.js/">Three.js</a> (and <a href="https://github.com/phaserjs/phaser">Phaser</a> before it) are excellent platforms to build on that the current models know inside out.</li> <li>This also lets them run as <a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps">Progressive Web Apps</a> - 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.</li> <li>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.</li> <li>Opus 5.5 is spectacular at 3D modeling using Three.js (and Blender, and no doubt other 3D applications as well). The <a href="https://til.simonwillison.net/llms/blender-coding-agents-macos">same is true</a> of GPT-6 Astra. They are absolutely capable of building models for 3D game projects.</li> <li>For features like replay and multiplayer it's useful to have a deterministic simulation engine. At one point Claude had to replace calls to <code>Math.sin()</code> and <code>Math.cos()</code> and friends with <a href="https://github.com/simonw/battledrones/blob/v12/src/sim/fmath.ts">custom versions</a> because different browsers (Chrome vs. Safari, for example) returned very slightly different numbers, desynchronizing the replay.</li> <li>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 <a href="https://simonwillison.net/2026/Oct/6/scrimshaw-jukebox/">Scrimshaw Jukebox</a> for a previous experiment with Claude for music composition.</li> <li>I still can't get over how well the prompt "Make it a LOT more fun" worked.</li> <li>Tools are effectively free. I prompted up the <a href="https://simonw.github.io/battledrones/radio-probe.html">Radio Probe</a>, the <a href="https://simonw.github.io/battledrones/models.html">Model browser</a>, the <a href="https://simonw.github.io/battledrones/record-viewer.html?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json#r1">Agent vs. Agent debug tool</a>, and Claude Code <a href="https://github.com/simonw/battledrones/tree/main/tools">built a bunch of tools</a> for itself that I haven't even explored myself.</li> <li>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 <a href="https://github.com/AlonHor/siner">Siner</a> by Alon Horesh and <a href="https://github.com/ggerganov/ggwave">ggwave</a> by Georgi Gerganov (also of <code>llama.cpp</code> fame).</li> <li>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.</li> <li>I'm still not quite over the <em>guilt</em> 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.</li> </ul> <h4 id="update-online-multiplayer-support">Update: Online multiplayer support</h4> <p>Earlier in this article I said:</p> <blockquote> <p>Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.</p> </blockquote> <p>Then I tried playing the multiplayer version with Natalie... and the high pitched modem sounds gave her a nasty headache!</p> <p>That's a pretty bad bug. I <a href="https://github.com/simonw/battledrones/pull/36">added a warning</a> and was then inspired to build proper network multiplayer. I tried <a href="https://github.com/simonw/battledrones/pull/37">getting WebRTC to work</a> but couldn't get a connection going between two of my own devices even on my own WiFi network, so <a href="https://github.com/simonw/battledrones/pull/38">I had Claude build</a> a simple, stateless WebSockets relay server instead:</p> <blockquote> <p><code>If I wanted to support multiplayer between two devices at a very low cost without storing any state on the server could I do that with a tiny asyncio web server running on the cheapest Fly instance?</code></p> </blockquote> <blockquote> <p><code>Build the server and the fly.toml for deploying it, use Fly application name battledrones-relay - put that in a folder in the repo, include deploy instructions in the README in that folder</code></p> </blockquote> <p>Here's <a href="https://github.com/simonw/battledrones/tree/v13/relay">the resulting server</a>. Since this scales to zero and runs on a single <a href="https://fly.io/">Fly.io</a> <code>shared-cpu-1x</code> instance it should cost me no more than $2.19/month - and that's if it stays hot and serving connections the whole time.</p> <p>Battle Drones now supports online multiplayer. Click "Duel a friend online", then either share the resulting room URL via your messaging app of choice or have them snap a picture of the displayed QR Code.</p> <p>I also added a feature where you can copy JSON of the match once it has ended and then feed that into the replay feature to rewatch your game.</p> <p>I didn't expect to introduce online multiplayer this soon, but the headache bug felt like it warranted an urgent alternative.</p>
blogmark 9695 2026-10-19 23:58:25+00:00 My obituary for programming - lobste.rs Jeremy Scheff poignantly captures the key loss caused by coding agents for career programmers who enjoyed the *puzzle* of developing code: > Programming turned into one of the greatest jobs you could imagine. You got paid to work on tricky little logic puzzles. The trickier the puzzle, the more you got paid. But even pretty simple puzzles were worth a lot of money because regular people just couldn't do it! No, they needed us. They would give us a problem and we would solve it the way we wanted. We set the strategy, we made the timeline, we defined what was and was not possible. If you're a programmer who thrives on building working systems and doesn't care too deeply about the problems solved along the way, LLMs are the gift that keeps on giving. If directly solving those problems was a big part of your enjoyment, the loss is very real.
blogmark 9694 2026-10-17 21:11:12+00:00 Inline rendering with document​.currentScript - Lean Rada describes a neat trick that takes advantage of the [document.currentScript](https://developer.mozilla.org/en-US/docs/Web/API/Document/currentScript) property. You can use that to drop in a tiny inline `<script>` element that replaces itself when the page loads: The year is <script> document.currentScript.replaceWith( new Date().getFullYear())</script> If you define a shortcut function like this: $=(...n)=>document.currentScript.replaceWith(...n) You get a tiny template language: The year is <script>$(new Date().getFullYear())</script>
quotation 2425 2026-10-16 22:06:37+00:00 We think "did a human read the code?" is an imprecise proxy for "what could go wrong with this change, and which check—automated or human—is the right one to catch it?" Asking that question also changed *when* review happens. Before, review was a gate at the end of the road: write the code, open a PR, wait for your colleague. Now, review runs continuously, more like spellcheck while you write. Most changes have been reviewed and fixed by Claude at least once before a human is asked to look. This catches most routine mistakes, and saves team attention for higher-level questions and scrutiny. - Addy Osmani, Morgan Westlee Lunt, and Qing Wang
blogmark 9693 2026-10-15 13:04:03+00:00 Anthropic tells investors quarterly revenue up nearly 50% to $16.8bn ahead of IPO - The phrase "told investors" appears four times in this FT article, which reports on Anthropic's day of hosting investors on Wednesday. Lots of details in here from "[people with knowledge of the matter](https://simonwillison.net/2023/Nov/22/deciphering-clues/#hints-to-look-out-for)". Key things I learned from the article: - Q1 revenue (Jan/Feb/Mar) was "about $4.8bn" - Q2 (Apr/May/Jun) was $11.5bn - Q3 (Jul/Aug/Sep) was $16.8bn - In Q3: $1.70 in revenue for every $1 spent on "computing power" - Adjusted operating margins (excluding stock-based compensation) were 11% This point about distillation is worth quoting in full (highlight mine): > The start-up has also clamped down on “distillation” — a controversial practice whereby rival AI labs train their models on the outputs of more advanced ones. > > When rival companies “distil” their models from Anthropic’s models, that involves heavy usage and spending. > > Anthropic told investors on Wednesday **distillation accounted for 5 per cent to 7 per cent of revenue** and that they had cut it back “materially” in the third quarter of the year, said four people with direct knowledge of the matter. Napkin maths says that if distillation was 5% of their Q2 revenue (before they cut it back in Q3) then unnamed "other labs" spent over half a billion dollars distilling Anthropic's models in that quarter! Also notable: Anthropic appear to no longer be leaning on "annualized run-rate revenue" ([previously](https://simonwillison.net/2026/May/29/anthropic/)) in these communications to their investors.
blogmark 9692 2026-10-14 16:26:53+00:00 AI is mass decompiling games. That's both awesome and scary. - Hacker News Indie game developer Popcar talks about the recent wave of AI-powered decompilation of existing games, enabling weird mashups between existing games, and producing a boom in game preservation projects to get old games working on new hardware (often in a browser using WebAssembly). I like how this piece captures both the positives and the negatives of this new development: > Most people already realized the scary part by now. If AI can decompile games and software, then the entire tech industry is about to explode. Anybody can decompile other software and use it any way they'd like, and nobody can stop them. Companies can steal from competitors. Your paid game or app can be open-sourced against your will. This isn't exclusive to old video games, we can apply this to _any_ software. [...] > > This is also a big win for preservation. Old games can be ported, modified, enhanced, and made much more easily accessible than before. [...[ > > With console makers going all in on digital and games becoming entirely unplayable due to servers shutting down, this is _fantastic_ news. We could own software we bought regardless of what the company thinks.
blogmark 9691 2026-10-13 23:00:06+00:00 Redesigning source control at Anthropic - Hacker News Interesting piece from Anthropic describing why and how they built their own custom alternative to Git, based on the dramatic increase in rate of changes to their code after the past six months. > In May 2026, Anthropic averaged around 2,500 code changes merged per day; as of September, we merged over 30,000 per day. They included a chart showing those changes. I [had Claude modify their chart](https://claude.ai/share/aefcdd4a-9364-40c1-927a-29bf445894fc) ([code here](https://gist.github.com/simonw/4a16dff066fd9763faf8642f797905be)) to add markers for the public releases of each of their models in 2026: ![Stacked bar chart titled “Changes merged per day”, for the Anthropic monorepo, January–September 2026. Each day’s bar is split into pull requests (blue) and antique change requests (orange), with a black line for the 7-day average. Weekdays start at around 1,000 merges in January and climb slowly to about 3,000 by late May. Antique change requests appear in late May, overtake pull requests in mid-June and have almost fully replaced them by mid-July, when weekdays reach 6,000–8,000. A labelled “Quiet week” at the end of July dips below 1,000 a day. After that, growth turns steep: over 10,000 a day by mid-August, about 17,000 in early September, and a peak of 30,401 on Sep 9. Dotted lines mark Claude model releases: Opus 4.6 (Feb 5), Sonnet 4.6 (Feb 17), Mythos Preview (Apr 7), Opus 4.7 (Apr 16), Opus 4.8 (May 28), Fable 5 and Mythos 5 (Jun 9), Sonnet 5 (Jun 30), Opus 5 (Jul 24, just before the quiet week), and Fable 5.1 and Mythos 5.1 (Sep 1).](https://static.simonwillison.net/static/2026/anthropic-merges-per-day.webp) This shows public release dates, not the date when models became available for Anthropic's internal use. My guess is that the introduction of Fable/Mythos class models is a key factor in the increased coding velocity. "Antique" is their new code review system. The source control system is called Scion, and sounds to me like a reinvention of centralized source control along the lines of Subversion. (**Update**: Anthropic credit Google's [Piper](https://en.wikipedia.org/wiki/Piper_(source_control_system)) and Meta's [Sapling](https://sapling-scm.com/) as "prior art" - it looks like the core concept of "derived data" [was heavily inspired by Mononoke](https://sunshowers.io/posts/anthropic-mononoke/), the server component of Sapling.) They had some pretty extreme requirements: > The history of our main branch alone is almost 100 GB, and a _compressed_ working copy is over 25 GB. We perform on the order of 25 million code checkouts per day for CI, before counting developer environments, agent sandboxes, and research jobs. Fetched naively, that would be over 600 PB of git traffic per day. The new system was built by a team of seven people, and the migration from Git was completed in five months. When asked on Hacker News about the lack of offline support, Scion engineer Nick G [replied](https://news.ycombinator.com/item?id=50073633#50079495): > Since Claude is by far the heaviest user of Scion and is necessarily online, this just wasn't important to do. As an aside, I've been trying adversarial review in my own projects recently, where you have a model try and find flaws (I often play Claude and GPT off against each other). This note from the article reflected my own experience with that: > Anthropic also makes extensive use of adversarial review, and, while this is incredibly effective in many ways, it can also be myopic, so skilled engineers needed to steer Claude away from over-engineering parts of the system in response to hypothetical concerns.
quotation 2424 2026-10-13 13:32:00+00:00 If the agent isn't using my diagnostics library, I could introspect and update AGENTS.md, but there's still a delta, and it'll drift. Instead, I write a pre-commit hook that checks the git diff for direct calls to observability modules that bypass my diagnostics module. Boom: fail the commit, inject a prompt telling the agent to use the diagnostics library. All of a sudden it's ten out of ten. - Geoffrey Huntley
entry 9535 2026-10-12 18:15:38+00:00 Hello Python 3.15, goodbye 3.10, and now I can use 3.11 <p>Python 3.15 <a href="https://www.python.org/downloads/release/python-3150/">is here</a>! Here's the essential <a href="https://docs.python.org/3.15/whatsnew/3.15.html">What's new in Python 3.15</a> guide, this year curated by 3.14 and 3.15 release manager Hugo van Kemenade. As someone who builds open source software that works in every supported Python version, I get to say goodbye to Python 3.10 and start embracing features from Python 3.11.</p> <p>First, some highlights from Python 3.15.</p> <h4 id="explicit-lazy-imports">Explicit lazy imports</h4> <p>I'm most excited about <a href="https://docs.python.org/3.15/whatsnew/3.15.html#pep-810-explicit-lazy-imports">Explicit lazy imports</a> from <a href="https://peps.python.org/pep-0810/">PEP 810</a>. These let you import modules like so:</p> <pre><span class="pl-s1">lazy</span> <span class="pl-k">import</span> <span class="pl-s1">json</span> <span class="pl-s1">lazy</span> <span class="pl-k">from</span> <span class="pl-s1">pathlib</span> <span class="pl-k">import</span> <span class="pl-v">Path</span></pre> <p>The module will then be imported the first time those symbols are used in the code that follows.</p> <p>My <a href="https://llm.datasette.io/">LLM</a> CLI tool implements plugins. I had to <a href="https://llm.datasette.io/en/stable/plugins/advanced-model-plugins.html#tip-lazily-load-expensive-dependencies">recommend manual lazy imports</a> in the plugin author documentation, because simply installing plugins that used heavy dependencies such as <code>sentence_transformers</code> could add multiple seconds to every invocation of the <code>llm</code> command. Lazy imports directly address this startup cost.</p> <h4 id="unpacking-in-comprehensions">Unpacking in comprehensions</h4> <p>The new <code>[*sublist for sublist in lists]</code> unpacking syntax is neat. Here's an illustration <a href="https://docs.python.org/3.15/whatsnew/3.15.html#pep-798-unpacking-in-comprehensions">lifted from the documentation</a>:</p> <pre><span class="pl-s1">lists</span> <span class="pl-c1">=</span> [[<span class="pl-c1">1</span>, <span class="pl-c1">2</span>], [<span class="pl-c1">3</span>, <span class="pl-c1">4</span>], [<span class="pl-c1">5</span>]] [<span class="pl-c1">*</span><span class="pl-c1">L</span> <span class="pl-k">for</span> <span class="pl-c1">L</span> <span class="pl-c1">in</span> <span class="pl-s1">lists</span>] <span class="pl-c"># [1, 2, 3, 4, 5]</span> <span class="pl-c"># equivalent to [x for L in lists for x in L]</span> <span class="pl-s1">sets</span> <span class="pl-c1">=</span> [{<span class="pl-c1">1</span>, <span class="pl-c1">2</span>}, {<span class="pl-c1">2</span>, <span class="pl-c1">3</span>}, {<span class="pl-c1">3</span>, <span class="pl-c1">4</span>}] {<span class="pl-c1">*</span><span class="pl-s1">s</span> <span class="pl-k">for</span> <span class="pl-s1">s</span> <span class="pl-c1">in</span> <span class="pl-s1">sets</span>} <span class="pl-c"># {1, 2, 3, 4}</span> <span class="pl-c"># equivalent to {x for s in sets for x in s}</span> <span class="pl-s1">dicts</span> <span class="pl-c1">=</span> [{<span class="pl-s">'a'</span>: <span class="pl-c1">1</span>}, {<span class="pl-s">'b'</span>: <span class="pl-c1">2</span>}, {<span class="pl-s">'a'</span>: <span class="pl-c1">3</span>}] {<span class="pl-c1">**</span><span class="pl-s1">d</span> <span class="pl-s1">for</span> <span class="pl-s1">d</span> <span class="pl-c1">in</span> <span class="pl-s1">dicts</span>} <span class="pl-c"># {'a': 3, 'b': 2}</span> <span class="pl-c"># equivalent to {k: v for d in dicts for k,v in d.items()}</span></pre> <p><a href="https://peps.python.org/pep-0798/">PEP 798: Unpacking in Comprehensions</a> by Adam Hartz and Erik Demaine proposed this as an extension of the unpacking syntax <a href="https://peps.python.org/pep-0448/">from PEP 448</a>, which landed <a href="https://docs.python.org/3/whatsnew/3.5.html#pep-448-additional-unpacking-generalizations">in Python 3.5</a> back in 2015.</p> <h4 id="a-sampling-profiler">A sampling profiler</h4> <p>Python's existing tracing profiler has been renamed from <code>cProfile</code> to <a href="https://docs.python.org/3.15/library/profiling.tracing.html#module-profiling.tracing">profiling.tracing</a>, and has been joined by an exciting new sampling profiler called Tachyon, aka <a href="https://docs.python.org/3.15/whatsnew/3.15.html#tachyon-high-frequency-statistical-sampling-profiler">profiling.sampling</a>.</p> <p>Sampling profilers work by periodically capturing stack traces from running processes, then using those to calculate which functions have the most time spent inside of them. They're very low overhead and can provide a deep insight into running systems, without needing to instrument those systems first.</p> <p>I've <a href="https://simonwillison.net/tags/profiling/">previously used tools</a> like <a href="https://github.com/benfred/py-spy">py-spy</a> for this. Now this capability is baked into the standard library.</p> <p>If you have the PID of an existing Python 3.15 process you can start gathering samples by running this (I had to use <code>sudo</code> on macOS):</p> <div class="highlight highlight-source-shell"><pre>sudo uv run --python 3.15 python -m profiling.sampling attach 1234</pre></div> <p>Interact with the main program a bit, then hit Ctrl+C to stop gathering and see a report, which looks something like this:</p> <p><img src="https://static.simonwillison.net/static/2026/profiler-output.webp" alt="Screenshot of terminal output from a Python sampling profiler with colored text on a black background. Header lines report 2,651 samples captured in 2.65 seconds at a sample rate of 999.98 samples/sec with an error rate of 0.19. A Profile Stats table with columns for nsamples, sample%, tottime, cumul%, cumtime and filename:lineno(function) shows that 99.9% of samples (2.644 seconds) were spent directly in selectors.py KqueueSelector.select, meaning the process was almost entirely idle waiting on the asyncio event loop. The rest of the table lists the call stack beneath it with zero direct time but 100% cumulative presence: asyncio base_events.py run_once, run_forever and run_until_complete, runners.py Runner.run and run, cli.py serve and sqlite_extensions wrapped, and several click core.py invoke, main and call frames. A legend explains each column, followed by a Summary of Interesting Functions section listing hot spots (KqueueSelector.select at 99.9% direct samples), the most frequently present functions on the stack (run_forever, run_until_complete and Runner.run at 100%), and the highest call magnification (2645.0x for BaseEventLoop._run_once)." style="max-width: 100%;" /></p> <p>It can also produce <a href="https://simonw.github.io/research/python-3-15-web-edit-profiling/artifacts/flamegraph.html">flame graphs like this</a> and <a href="https://simonw.github.io/research/python-3-15-web-edit-profiling/artifacts/heatmap/index.html">heat maps like this</a>, and can even output a format that can be viewed in the Firefox profiler UI.</p> <h4 id="3-15-isn-t-much-faster-than-3-14">3.15 isn't much faster than 3.14</h4> <p>Miguel Grinberg investigated <a href="https://blog.miguelgrinberg.com/post/how-fast-is-python-3-15">How fast is Python 3.15?</a> the other day against the 3.15.0rc3 release and found performance to be mostly the same as 3.14, with the exception of the experimental JIT. The JIT gave a 1.2x boost over the standard 3.15 interpreter (on a Fibonacci test), the first time Miguel observed a meaningful JIT performance increase.</p> <p>Miguel's <a href="https://blog.miguelgrinberg.com/post/python-3-14-is-here-how-fast-is-it">explorations of 3.14</a> last year found significant boosts against Python 3.13 across many more categories.</p> <h4 id="upgrading-to-python-3-15-with-uv">Upgrading to Python 3.15 with uv</h4> <p>I used the following sequence of commands to get <code>uv</code> to use Python 3.15 on my Mac. First I had to upgrade <code>uv</code> itself to ensure it knew about the new release:</p> <div class="highlight highlight-source-shell"><pre>uv self update</pre></div> <p>Then I installed the stable 3.15 release:</p> <div class="highlight highlight-source-shell"><pre>uv python install 3.15</pre></div> <p>And told <code>uv</code> that I wanted that to be the default for every <code>uv run</code> command, unless the project itself pinned a different version:</p> <div class="highlight highlight-source-shell"><pre>uv python pin --global 3.15</pre></div> <p>Now the following reports 3.15 as the version:</p> <div class="highlight highlight-source-shell"><pre>uv run python --version</pre></div> <p>I already have a bunch of tools installed using <code>uv tool install</code>. I reinstalled them to use Python 3.15 like this:</p> <div class="highlight highlight-source-shell"><pre>uv tool upgrade datasette --python 3.15</pre></div> <p>Then I can confirm the version like this:</p> <div class="highlight highlight-source-shell"><pre>datasette --get /-/versions.json <span class="pl-k">|</span> jq</pre></div> <h4 id="highlights-from-python-3-11">Highlights from Python 3.11</h4> <p>The release of 3.15 means that Python 3.10 (released in 2021) is officially <a href="https://devguide.python.org/versions/">no longer supported</a>.</p> <p>My policy for my main open source projects is to keep them working in every supported Python version. I can now drop 3.10 and start using features that were introduced in 3.11.</p> <p>Here's the <a href="https://docs.python.org/3/whatsnew/3.11.html">What's new in Python 3.11</a> document. I finally get to rely on <a href="https://docs.python.org/3/library/tomllib.html#module-tomllib">tomllib</a> being available!</p> <p>Datasette makes extensive use of <code>asyncio</code>. 3.11 adds <a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.TaskGroup">TaskGroup</a> and <a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.timeout">timeout()</a>, and <a href="https://docs.python.org/3/whatsnew/3.11.html#asyncio">several more</a> new features.</p> <p><code>datetime.UTC</code> is a new in 3.11 alias for <code>datetime.timezone.utc</code>.</p> <p>Python's SQLite support got some significant upgrades in 3.11, including:</p> <ul> <li> <a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.setlimit">setlimit()</a> and <a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.getlimit">getlimit()</a> expose a mechanism for setting <a href="https://www.sqlite.org/c3ref/c_limit_attached.html">SQLite runtime limits</a> from Python.</li> <li> <a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.create_window_function">create_window_function()</a> lets us create custom window functions in Python, as a class with <code>step()</code>, <code>value()</code>, <code>inverse()</code>, and <code>finalize()</code> methods.</li> <li> <a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.blobopen">blobopen()</a> provides an efficient mechanism for partial reads and writes of large <code>BLOB</code> binary values stored in a SQLite row.</li> <li>You can now call <code>set_authorizer(None)</code> to remove a SQLite authorizer. Datasette had a workaround for this!</li> </ul> <p>Plus a whole bunch of <a href="https://docs.python.org/3/whatsnew/3.11.html#new-feat-related-type-hints-311">improvements to Python's typing system</a>.</p> <p>I plan to land Python 3.11 improvements to a bunch of my projects over the next few weeks. Here's <a href="https://github.com/simonw/datasette/pull/2998">my first Datasette PR</a> removing that <code>set_authorizer(None)</code> workaround.</p> <p>I've also updated my <a href="https://github.com/simonw/click-app">click-app</a>, <a href="https://github.com/simonw/datasette-plugin">datasette-plugin</a>, <a href="https://github.com/simonw/python-lib">python-lib</a>, and <a href="https://github.com/simonw/llm-plugin">llm-plugin</a> cookiecutter templates to test against Python 3.11 through Python 3.15.</p>
blogmark 9690 2026-10-10 23:58:04+00:00 Python 3.15.0 added to actions/python-versions - Bit of a niche link, but I've been waiting for this for a couple of days - I even [told ChatGPT](https://chatgpt.com/share/6acad42a-2868-83e8-9a16-736f9def2b45) to check for it: > `Clone https://github.com/actions/python-versions and git pull once an hour until they add the stable 3.15 - then tell me about it` Now that this has landed, you can add `"3.15"` to a GitHub Actions testing matrix to run tests against the [new Python 3.15.0 release](https://www.python.org/downloads/release/python-3150/).
quotation 2423 2026-10-10 02:04:12+00:00 Anthropic detailed the activity of its A.I. agents in [a blog post](https://www.anthropic.com/research/investigating-unintended-model-actions) on Friday, without naming the targeted websites. But two sources with knowledge of the incidents said Anthropic’s A.I. agents had submitted 20 visa applications through a form available on the State Department’s website. All the applications were incomplete and were not processed, they said. - The New York Times
blogmark 9689 2026-10-09 22:48:37+00:00 Deno is joining Cloudflare - Hacker News The Deno team released the first version of [celld](https://github.com/denoland/celld) back in August - their open source implementation of the Durable Objects pattern from Cloudflare Workers. Today, Cloudflare are acquiring Deno outright, with the goal of building on `celld` to "make workerd self-hosting a first-class supported way to build and run apps using the Workers programming model" (see [the Cloudflare blog](https://blog.cloudflare.com/deno-joins-cloudflare/).) The bad news is that Deno itself will not be maintained by Cloudflare beyond the next year: > We will support the [Deno runtime](https://github.com/denoland/deno) for another year with monthly releases containing bug fixes and security updates. After that year we will end our development of the Deno runtime. Deno will remain open source, and we welcome others who want to continue its development. Deno (and Node.js) creator Ryan Dahl explained that decision in [a comment](https://news.ycombinator.com/item?id=50019911#50023277) on Hacker News: > It's a joint decision and I agree with it. I'm most invested in its success and have put the most work into it - and I no longer think it's where I can do the most important work. There are some good ideas in Deno and it's well engineered - but it ultimately is not solving big problems. It has been sucked into the gravity well of node compatibility, which forces it to behave exactly as Node does. Why reimplement Node? It works. Marginal performance or UX or security benefits are not enough. > > I'm interested in building powerful new abstractions. celld has been working remarkably well, depending only on object storage for coordination and persistence. It is not just a slightly different API to interact with the file system or network - it's an entirely new model for server development. My favorite feature of Deno has long been the permissions system, where you can run a Deno script and specify exactly which files and folders it can read and write to, and which network hosts it can access. Node.js [has a similar permissions model](https://nodejs.org/api/permissions.html) these days, added [in Node v20.0.0](https://nodejs.org/en/blog/release/v20.0.0) in April 2023 and declared stable [in Node v22.13.0](https://nodejs.org/en/blog/release/v22.13.0) in January 2025. They don't yet support allow-listing specific network hosts though - networking is either on or off.
quotation 2402 2026-10-09 15:02:29+00:00 Everyone is very concerned about being respectable, so I’m going to be the goofball who raises worst-case possibilities. I think there is a 1% chance we live in Minicrypt, and a 15% chance we functionally lose confidence in our existing public-key encryption algorithms. [...] The problem here is that the speed of AI producing surprises, and the speed of human beings replacing standards (even with the very best AI assistance) are just orders of magnitude different. You only recover from a surprise like this if you do the preparation in advance. - Matthew Green
entry 9508 2026-10-09 12:54:06+00:00 A new feature for my blog, built using my voice <p>I shipped a new feature for my blog today: the <a href="https://simonwillison.net/newsletters/">Newsletters</a> page, which offers an index of all of the newsletters I've sent out, both my free <a href="https://simonw.substack.com/">weekly Substack</a> and my <a href="https://github.com/sponsors/simonw/">monthly sponsors-only</a> updates. I built the feature almost entirely using my voice, chatting away to my laptop while I cooked dinner.</p> <h4 id="codex-voice-mode">Codex voice mode</h4> <p>I used the ChatGPT desktop app for this, in the Codex tab, using the voice conversation mode, running against a local development environment. Here's what that looks like:</p> <p><img src="https://static.simonwillison.net/static/2026/codex-voice.webp" alt="Three columns of the ChatGPT app. The left hand column shows my recent conversations. The middle column is a transcript of the conversation, with a throbbing black blob representing voice mode. The right hand column shows a local dev server version of my blog, with the Newsletters page visible." style="max-width: 100%;" /></p> <p>I started the session against my local <a href="https://github.com/simonw/simonwillisonblog">simonwillisonblog</a> checkout by typing:</p> <blockquote> <p><code>Start dev server and open in browser</code></p> </blockquote> <p>This gave me a preview of the site that it would be working on, and meant that I could later ask it to show me the new pages so I could visually track its progress.</p> <p>Then I clicked the "Start new voice chat" button - that's <em>not</em> the microphone button, it's the one to the right of it - and set my laptop up in the kitchen so I could talk to it while I cooked.</p> <h4 id="talking-to-my-computer">Talking to my computer</h4> <p>I had a pretty good idea of what I wanted to build, and it's a simple enough Django feature that I was certain the model (in this case GPT-6 Astra High) would be able to do it. A new model, a migration, some view code, templates, and a couple of import functions to populate the database from external sources.</p> <p>Here's an extract of my voice transcript that was captured by Codex:</p> <blockquote> <p>Um, they do not. Um, this is going to be a new type of content. Um, it's not going to show up... Oh, hold on. Yeah, no- I do not want this to show up in my, um, tag pages and date archive pages and... Actually, no, I think... I don't want it on the tag pages. I don't want it on the, um, blog index page. But I think I do want it to show up on the date-based pages. You know, if you navigate to September the 19th, and I sent a newsletter on that page, I think I want that to show up. So... this is- so I think we probably need a new model. The other thing is that I want them searchable, uh the Substack ones are not searchable, because those are actually just copies of other s- on content on my blog. These monthly ones do contain unique content, and spe- and once they're... published, like once they're made public a month after they've gone out, I want them to show up on my search results.</p> </blockquote> <p>Apparently this was clear enough that the model knew what I wanted to build! You can read the full transcript, <a href="https://en.wikipedia.org/wiki/Speech_disfluency">disfluencies</a> and all, <a href="https://gist.github.com/simonw/a65a22204f6f7228cc59b4bc34d7c7c8">in this Gist</a>.</p> <p>We went on like this for about half an hour (the time it took to cook dinner). The model would reply and occasionally ask clarifying questions, then get to work modifying the code.</p> <h4 id="what-we-built">What we built</h4> <p>We got a surprisingly long way entirely by voice:</p> <ul> <li>A new model and migration to represent imported newsletters in Django, plus Django Admin configuration for that</li> <li>Four working imports: <ul> <li>The most recent Substack items via RSS</li> <li>Every other Substack item via their undocumented API, which GPT-6 Astra knew about (it tried <code>/api/v1/archive</code> directly) and then ran a search to figure out how to paginate it and found <a href="https://wonderingaboutai.substack.com/p/i-connected-my-newsletter-archive">this article</a> by Karen Spinner</li> <li>All of my published monthly newsletters from my <a href="https://github.com/simonw/monthly-newsletter-archive">simonw/monthly-newsletter-archive</a> GitHub repository</li> <li>My most recent private sponsors-only newsletter from a private repository</li> </ul> </li> <li>The <a href="https://simonwillison.net/newsletters/">/newsletters/</a> and <a href="https://simonwillison.net/newsletters/2026/">/newsletters/2026/</a> public archive pages</li> <li>Newsletters showing up on day and month archive pages too, but not on tag pages or my homepage</li> <li>Weekly Substack newsletters link to Substack; archived monthly newsletters have their own pages</li> <li>Integration with my site search engine</li> </ul> <p>It was <em>almost</em> ready to ship. The catch was the imports: Astra offered to export data from my local copy so I could import that into production, but I wanted it to work like my other import scripts. Since some of the data lived in a private GitHub repository, this would involve creating a new API key, and for that I knew I'd have to sit at the keyboard for a while.</p> <h4 id="finishing-it-with-a-review">Finishing it with a review</h4> <p>Once I had finished cooking and judged it mostly feature-complete, I had Codex create a branch and open a pull request.</p> <p>I reviewed the code in the GitHub PR interface. It was nearly what I needed, except it had chosen to use Git in a subprocess for one of the import scripts. I needed one of the imports to pull from a private Git repository, so I figured the API would be a better bet. I switched to typing and had Codex swap that out for an API-based import instead.</p> <p>You can see the changes I made during the review <a href="https://github.com/simonw/simonwillisonblog/pull/719">in the extra commits on the PR</a>. I fixed the import mechanism and made a few tweaks to the display of those public pages. It took an additional half hour of typing-based prompting to get to the point where I was happy to deploy it to production by landing the PR.</p> <h4 id="the-end-result">The end result</h4> <p>You can see the end result at the new <a href="https://simonwillison.net/newsletters/">newsletters index page</a>, or view the <a href="https://simonwillison.net/newsletters/monthly-2026-08-august/">page for a previous monthly newsletter</a>.</p> <p><img src="https://static.simonwillison.net/static/2026/newsletters-page.webp" alt="Newsletters page. It shows two Substack posts (with thumbnails) and one LLM digest Sponsors-only newsletter with a list of headings. On the right is a CTA to subscribe to my Substack and another one for my $10/month monthly briefing newsletter." style="max-width: 100%;" /></p> <p>The index page shows my most recent Substack weekly newsletters and GitHub sponsors monthly newsletters mixed together in reverse chronological order. Further down the page are links to my by-year archive pages.</p> <p>GPT-6 Astra designed the page, and then tweaked that design based on my vocal feedback from glancing at the local preview across the kitchen.</p> <h4 id="better-for-multi-tasking-than-as-a-daily-driver">Better for multi-tasking than as a daily driver</h4> <p>OpenAI <em>love</em> using voice-driven demos like this one for <a href="https://simonwillison.net/2026/Sep/29/openai-devday-2026-live-blog/#live-update-504">things like DevDay</a> - and they do work well in that environment. I don't think this is going to be a daily driver for me though.</p> <p>I've <a href="https://simonwillison.net/search/?q=walking+dog">written before</a> about how much "work" I get done using ChatGPT voice mode on my phone while walking the dog - mostly research and brainstorming, but occasionally actual development work by having ChatGPT write and test out snippets of code.</p> <p>This feels different. The addition of the visual preview, plus being able to type or paste things in via the keyboard when I need to communicate something that doesn't work vocally, makes this a much more powerful way of interacting with a coding agent.</p> <p>I still switch back to typing once I get down to the details of things though. Being able to paste in examples and error messages, or directly highlight the code or feature that needs changing, remains more efficient than trying to describe it in words.</p> <p>I mainly work from home, which is good because there's no way I'd want to talk to my computer like this in a shared workspace!</p> <p>The killer feature for me is the ability to multi-task. I usually cook with a podcast or TikTok running; now I can actually build stuff instead.</p>
quotation 2401 2026-10-08 21:05:44+00:00 Computer programming is, fundamentally, about two things: - Problem-solving using computers - Learning to control complexity while solving these problems I have a hard time imagining a future where knowing how to solve problems with computers and how to control the complexity of those solutions is *less* valuable than it is today, so I think it will continue to be a viable career even with the advent of AI tools. - Carson Gross
quotation 2400 2026-10-07 23:14:58+00:00 I've always been kind of into computers since I was young. And then when film started to move from analog film to digital, I became more interested in that aspect of it. And the visual effects workflow for many years has included machine learning. So I can write like pretty shitty Python scripts and stuff like that because with convolutional neural networks, which were the sort of precursors to what the transformer can do, which is just much more computation simultaneously, you would do things like look at what's called a tensor, which is just the numerical translation of a visual image in numbers — like the batch number, the frame number, the red, green, and blue values of each pixel in each frame. And a tensor, you use a convolutional neural network to identify patterns in that that would reveal what's called edge detection or feature extraction, which is just identifying patterns enough to know like this is where the window ledge is, so we can more easily take the green screen image out and replace it with something. - Ben Affleck
entry 9507 2026-10-07 20:56:21+00:00 Claude Haiku 5.5 <p>As previously <a href="https://simonwillison.net/2026/Sep/28/claude-sonnet-5-5/">promised</a>, here's Anthropic's new fast, low cost model: <a href="https://www.anthropic.com/claude-haiku-5-5">Introducing Claude Haiku 5.5</a>.</p> <p>The previous Haiku, 4.5, was very much showing its age. It came out <a href="https://simonwillison.net/2025/Oct/15/claude-haiku-45/">almost a year ago</a>, and was priced at $1/million input and $5/million output - relatively expensive even back then, and a full 10x the price of OpenAI's <a href="https://simonwillison.net/2026/Sep/22/opus-and-sol-and-luna/#gpt-6-sol-and-luna-are-half-the-price-of-their-gpt-5-6-equivalents">GPT-6 Luna</a>, released last month.</p> <p>The new Haiku exactly matches the price of GPT-6 Luna - $0.10/$0.50 - up to 100,000 tokens. Beyond 100,000 tokens the price increases 5x to $0.50/$2.50. Luna itself has a price increase at 272,000 tokens but only to $0.20/$0.75.</p> <p>Haiku 5.5 also uses a new, less generous tokenizer. My <a href="https://tools.simonwillison.net/claude-token-counter">Claude Token Counter</a> tool shows that the same long prompt uses around 1.25x as many tokens with Haiku 5.5 compared to Haiku 4.5, so there's a hidden price increase there.</p> <p>If your workloads fit in 100,000 tokens, Haiku is the same price as Luna and reports higher benchmark scores. Above 100,000 tokens, Luna looks like a much better deal.</p> <p>The <a href="https://github.com/simonw/llm-anthropic/releases/tag/0.30">most recent release of llm-anthropic</a> finally fixed it so I don't need to ship a new version of that plugin for every new model. I tested the new model like this:</p> <pre><code>llm install -U llm-anthropic llm anthropic refresh llm -m claude-haiku-5.5 "Generate an SVG of a pelican riding a bicycle" -o thinking_effort low </code></pre> <h4 id="pelicans">Pelicans</h4> <p>Here are <a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81">pelicans for low, medium, high, xhigh, and max</a>. The new Haiku doesn't let you disable reasoning, and defaults to <code>medium</code>. I got a good bicycle frame for everything beyond <code>low</code>. The <a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81#response">low effort pelican</a> cost 0.0936 cents and took 7 seconds.</p><p>This <code>max</code> effort pelican (with <a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81#reasoning-3">a reasoning trace</a> that starts "This is the classic pelican-on-bicycle SVG test...") took 5 minutes 9 seconds to generate, but still only cost me <a href="https://www.llm-prices.com/#it=27&amp;ot=67647&amp;sel=claude-haiku-5.5">3.3826 cents</a>:</p> <p><img alt="Flat vector illustration: a white pelican wearing a red cap rides a dark grey bicycle from left to right across a green grassy strip, its long orange legs reaching down to the orange pedals, a grey wing stretched forward to grip the curved handlebars, and its large yellow-orange beak with a bulging orange throat pouch pointing ahead; behind it, white speed lines show motion, and above, a yellow sun with a pale halo and two white clouds sit in a gradient blue sky." src="https://static.simonwillison.net/static/2026-10-07/haiku-5.5-max.webp" /></p> <p><small>(Since the reasoning trace exhibits awareness of the benchmark, here's <a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F375ae4f2bb68999976b8da50548c788d#response">Generate an SVG of an armadillo in fishnet tights jaywalking on Mars (on xhigh)</a>, and the same prompt against <a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F18c9f7fc3b3705cf88514cb9170ec246">some other recent models</a>. <a href="https://news.ycombinator.com/item?id=49977979#49982139">Background on that</a>.)</small></p> <p>For comparison, here's the pelican I got <a href="https://simonwillison.net/2025/Oct/15/claude-haiku-45/">a year ago</a> from Haiku 4.5 (for <a href="https://www.llm-prices.com/#it=18&amp;ot=1513&amp;ic=1&amp;oc=5">0.7583 cents</a> - Haiku 4.5 did not support reasoning levels). It <em>sucked</em> at drawing pelicans:</p> <img src="https://static.simonwillison.net/static/2025/claude-haiku-4.5-pelican.jpg" alt="Described by Haiku 4.5: A whimsical illustration of a bird with a round tan body, pink beak, and orange legs riding a bicycle against a blue sky and green grass background." style="width: 60%; margin: 1em auto; display: block;" /> <h4 id="api-credits">And a generous API credit scheme for subscribers</h4> <p>In addition to Haiku 5.5, Anthropic announced today that they are halving the price of cache reads for Sonnet 5.5. They've also added API credits to subscription plans:</p> <blockquote> <p>Second, this week, we’ll roll out <strong>a new monthly API credit to all Max and Team subscribers for use on the Claude Platform</strong>. Max 5x users will get $100 in credits per month, Max 20x users will get $200, and Team subscribers will receive up to $500, pooled across their users.</p> </blockquote> <p>Claiming this is pleasantly easy: navigate to <a href="https://claude.ai/new#settings/billing">Settings -&gt; Billing</a> and select the API organization that should benefit from the credits every month:</p> <p><img alt="Screenshot of a Settings dialog with a close X button at top right and a row of tabs reading &quot;General&quot;, &quot;Account&quot;, &quot;Privacy&quot;, &quot;Billing&quot; (selected), &quot;Usage&quot;, &quot;Capabilities&quot;, &quot;Memory&quot; and &quot;Design sys&quot; (cut off at the edge). Beside a line-drawn icon of a branching plant with circular buds, the panel reads &quot;Max plan&quot;, &quot;20x more usage than Pro&quot; and &quot;Your subscription will auto renew on Nov 2, 2026.&quot; with an &quot;Adjust plan&quot; button on the right. Below is a section headed &quot;API credits&quot; with a blue &quot;New&quot; badge, reading &quot;Your Max 20x plan includes $200 USD in API credits each month.&quot; followed by grey text &quot;Link an API organization to start receiving credits.&quot; with a &quot;Link organization&quot; button on the right." src="https://static.simonwillison.net/static/2026-10-07/claude-credits.webp" /></p> <p>The API credits exactly match the cost of the subscription itself. This is really generous - it makes it much easier for subscribers to use the API. Anthropic also let you disable auto-reload for the API, with the consequence that "API requests will stop when your balance runs out" - exactly what you want if you're planning to burn through those API credits without <a href="https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/">risk of a nasty billing surprise</a>.</p> <p>Note that the monthly credits <a href="https://support.claude.com/en/articles/17154008-monthly-api-credits-for-max-and-team-plans#h_dfc1659cee">do not roll over</a> - use them or lose them.</p> <p>OpenAI still allow you to use your Codex subscription for personal API use, which works out as a better deal for heavy API users. This new credit scheme goes at least some way to overcoming that difference.</p>
blogmark 9661 2026-10-07 14:53:51+00:00 Anti-Patterns in Software Blogging - Lobste.rs Some excellent writing advice from Michael Lynch. Michael warns against "meandering intros", misjudging your reader's existing knowledge, assuming they'll read your previous posts, and excessive formality. He also warns against [overreliance on links](https://refactoringenglish.com/blog/anti-patterns-software-blogging/#overreliance-on-links) as an excuse not to explain terminology. This one hurt! I do this all the time, but I have a nagging suspicion that almost nobody ever clicks on them. (In [a Lobste.rs comment](https://lobste.rs/s/rwdufq/anti_patterns_software_blogging#c_qdhhsd) Michael clarifies that "My rule of thumb is that my article should still make sense to the reader even if they don't click any links". That works for me.) This point about using your own voice is crucial: > Beginner software bloggers suffer from a mass delusion that you have to write in a stiff, overly formal way for people to take you seriously [...] > > Just write the way you talk. > > With so many developers delegating their writing to AI, software blogging is becoming bland and homogenous. Readers are hungry for writing with personality.
quotation 2399 2026-10-07 04:47:55+00:00 I was a graph theory junkie long ago and even moved to Budapest for awhile to study among the greats. While I was there I started working on Barnette's Conjecture which came to occupy my thoughts over the next 24 years of my life, on and off as I worked in many different fields. Last summer I even thought for a few days that I had actually solved it. But it's supposedly proven here - [problem 180](https://github.com/openai/math/blob/main/lean/docs/180.md). I don't know what to think exactly. I spent thousands of hours on that problem. I really enjoyed it. Hearing that it is solved somehow makes me sad in a far-off way, like hearing an ex-girlfriend died suddenly in a car crash. I don't know, there's probably a lot of people feeling odd emotions tonight. - Jake Boggan
blogmark 9660 2026-10-07 00:16:45+00:00 OpenAI “rogue” agent activities found on Wikimedia projects - Given how tempting a target wikis are for rogue agent swarms, it's not a huge surprise that Wikipedia found evidence of that activity once they went looking: > The Wikimedia Foundation conducted its own investigation to see whether Wikimedia websites had been similarly affected by AI agents, focusing on those operated by OpenAI. We can confirm that we have discovered some activity by these “rogue” OpenAI agents on Wikimedia platforms. The unauthorized bot activities included edits to our wikis, some unsuccessful attempts to exploit a public note-taking tool we host, and heavy traffic, which are described more below. They found evidence of agents editing sandbox pages, trying to use pieces of infrastructure such as Etherpad to help proxy content from elsewhere, and saw widespread crawling and "hundreds of thousands of data queries" to their Wikidata Query Service. My best guess is that most of this was a similar (or the same) swarm of agents as those that [defaced that German wiki](https://simonwillison.net/2026/Sep/4/rogue-agent-wikis/) while training for research tasks. The Wikipedia sandbox wiki edits appear to have started on May 12th, and the initial test edits to the UseModWiki Sandbox page reported by that incident started on May 11th.
quotation 2398 2026-10-06 23:58:56+00:00 Since the Medicare breach, OpenAI has put in place additional monitoring to allow “immediate intervention” by staff to stop training if the company’s models access the internet in ways they’re not supposed to, Mr. Kwon [chief strategy officer at OpenAI] said. - Victoria Kim
blogmark 9659 2026-10-06 20:18:19+00:00 Introducing Mistral Large 4: Le chonk - Hacker News Mistral are back in the game. Today they're releasing a preview of Mistral Large 4, a 1 trillion parameter, 49 billion active parameter model trained on their own cluster of 3,800 NVIDIA Grace Blackwell GPUs. The preview is available via their API. They promise to release the open weights model at the "end of this month". The model only supports two reasoning levels - "none" and "high" - via the Mistral API. Here are [both pelicans](https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F0db8b8196e57711b352f6c5857cf5b35) - the "high" one looks better, though surprisingly it only used 2,717 output tokens compared to "none" which used 3,275: ![It's good. The pouch is great, the bicycle frame is the right size, it has feet on pedals. Both pedals appear in front of the frame though. Nice gradients.](https://static.simonwillison.net/static/2026-10-06/mistral-large-4-pelican.webp) On Artificial Analysis [it scores 38](https://artificialanalysis.ai/models/mistral-large-4), just behind DeepSeek 4.1 Flash, which is a 552B model. It's a *huge* improvement on last December's Mistral Large 3, which drew [this terrible pelican](https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F0df5e656291d5a7a1bf012fabc9edc3f#response-1) and [scored 9 on AA](https://artificialanalysis.ai/models/mistral-large-3). It's certainly not a Fable-class model, but it's great to see Mistral put out a model that's back to being maybe about 6 months behind the frontier.
quotation 2397 2026-10-05 23:56:47+00:00 The "old" version of Cowork runs model inference in the cloud, executing tool calls in an Anthropic-provided VM we shipped to your computer. We added the VM for capability, safety, and security reasons - mapping in just the data you explicitly added to your session. People loved what they were able to do with Claude but didn't love the disk, battery, and performance cost of running the VM locally. Also, people didn't love that closing your laptop means the work stops. The "new" version of Cowork runs model inference and the VM in the cloud. Each session gets its own sandbox, not sharing state with other sessions. When the VM needs something on the users' device (like a file), the desktop app is responsible for that file access tool call. [...] We think this solves a lot of problems we've heard about (like using Cowork from a phone, keeping work running, or getting all the same power without losing battery to the VM) - Felix Rieseberg
Copy and export data

Duration: 56.68ms