<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: Entries</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/atom/entries/" rel="self"/><id>http://simonwillison.net/</id><updated>2026-11-09T23:57:21+00:00</updated><author><name>Simon Willison</name></author><entry><title>Locating the source of a mysterious beep with Claude</title><link href="https://simonwillison.net/2026/Nov/9/mysterious-beeps/" rel="alternate"/><published>2026-11-09T23:57:21+00:00</published><updated>2026-11-09T23:57:21+00:00</updated><id>https://simonwillison.net/2026/Nov/9/mysterious-beeps/</id><summary type="html">&lt;p&gt;Our house has a box room, full of boxes that we still haven't unpacked from our last move. A couple of weeks ago something in that room started &lt;em&gt;intermittently beeping&lt;/em&gt;. The beeps were far enough apart that standing in the room and trying to determine the source of the noise was frustrating, and I really didn't want to dig through every one of those boxes. So I had Claude Code build &lt;a href="https://github.com/simonw/beep-locator"&gt;Beep Locator&lt;/a&gt;, a software system for triangulating the source of a mysterious beep using multiple devices scattered around the room.&lt;/p&gt;
&lt;p&gt;Here's what Beep Locator looks like after it has been running for a while:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/beep-locator-ui.webp" alt="Screenshot of a web app that uses several phones, tablets and laptops as microphones to locate a mystery beeping sound in a room. The left column has an &amp;quot;Add a listener&amp;quot; panel with a QR code and join link, a &amp;quot;Controls&amp;quot; panel with buttons including &amp;quot;Calibrate&amp;quot;, &amp;quot;Test beep&amp;quot; and &amp;quot;It just beeped!&amp;quot; plus a &amp;quot;Listen for beeps&amp;quot; checkbox, and a &amp;quot;Mystery beep&amp;quot; note reading &amp;quot;3345 Hz · 3 confirmed · remembered across sessions&amp;quot;. Below that, a &amp;quot;Devices&amp;quot; list shows five color-coded listeners (Simon iPhone, New iPad, Old iPad, MacBook Pro, Surface Ultra), each marked &amp;quot;✓ mic working · ✓ speaker working&amp;quot;. The main area is a gridded map with a 1 m scale bar that shows the five devices as colored dots and earlier sounds as small timestamped markers. A pink shaded circle near the MacBook Pro is labeled &amp;quot;mystery beep · 2 hearings · within ~41 cm&amp;quot;, and beside it a dashed plus marker suggests &amp;quot;add a listener here? could tighten the mystery beep's position by ~12%&amp;quot;. Below the map, a &amp;quot;Mystery beep loudness warmer / colder&amp;quot; panel shows a bar for each device: Surface Ultra is loudest at &amp;quot;-6.0 dB ▲ +11.6 dB warmer&amp;quot;, with the note &amp;quot;about 6 dB louder means roughly half the distance&amp;quot;. At the bottom, a &amp;quot;Sounds located&amp;quot; table lists recent claps and beeps with coordinates, or the warning &amp;quot;arrival times are not physically possible (echo or a different sound?)&amp;quot;." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;You run Python web server to show the primary UI, and then use the QR code or URL to connect as many devices as you can spare to act as listeners - I was using two iPads, a phone, a MacBook Pro and a Surface Ultra.&lt;/p&gt;
&lt;p&gt;The devices then play noises to each other to help estimate their locations. This didn't work particularly well, so I added a "Rough mode" where you can drag their icons around in the space to provide rough locations which are then adjusted based on those sounds.&lt;/p&gt;
&lt;p&gt;Once that's set up, the devices all listen for the beep!&lt;/p&gt;
&lt;p&gt;I added a clapping mode too so I could test it by clapping my hands in different locations around the room - displayed as diamonds on the map. This helped me gain confidence that it was capable of locating a sound.&lt;/p&gt;
&lt;p&gt;Beeps show up on the map as an X, plus a line in the "Sounds located" log. You can replay these sounds (from each device in turn) to confirm they are the mysterious beep you are looking for, then click "This is the mystery beep" to mark them as such.&lt;/p&gt;
&lt;p&gt;Once you've confirmed the mysterious beep frequency the system will listen out for it, measure the interval between beeps, and use the triangulated locations to lock down the most likely location on the map.&lt;/p&gt;
&lt;p&gt;The system worked as intended. It gave me the position of the beep to within about 40cm, then I dug through that specific pile of boxes and found an ancient carbon monoxide detector that desperately wanted its batteries replaced.&lt;/p&gt;
&lt;h4 id="how-it-works"&gt;How it works&lt;/h4&gt;
&lt;p&gt;When I started working through this problem with Claude it quickly dug up &lt;a href="https://www.cs.purdue.edu/homes/chunyi/pubs/sensys106-beepbeep.pdf"&gt;BeepBeep: A High-Accuracy Acoustic-Based System for Ranging and Localization Using COTS Devices&lt;/a&gt;, a 2007 paper by Chunyi Peng, Guobin Shen, Yongguang Zhang, Yanlin Li, and Kun Tan. Here's that paper's abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We present the design, implementation, and evaluation of BeepBeep, a high-accuracy acoustic-based ranging system. It operates in a spontaneous, ad-hoc, and device-to-device context without leveraging any pre-planned infrastructure. It is a pure software-based solution and uses only the most basic set of commodity hardware – a speaker, a microphone, and some form of device-to-device communication – so that it is readily applicable to many low-cost sensor platforms and to most commercial-off-the-shelf mobile devices like cell phones and PDAs. It achieves high accuracy through a combination of three techniques: two-way sensing, self-recording, and sample counting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sounded exactly like what we needed to build!&lt;/p&gt;
&lt;p&gt;Beep Locator runs a Python web application server that does most of the work. The listening devices then connect to that server via WebSockets and present a UI which requests browser microphone access. The listeners mainly work by recording a 60 second buffer of recent audio. They also run a simple beep detection algorithm (see &lt;a href="https://github.com/simonw/beep-locator/blob/main/beep_locator/modules/listener/detector.js"&gt;detector.js&lt;/a&gt;), which uses Fast Fourier Transform and a high-pass filter to identify potential beeps. It sends these events to the main server.&lt;/p&gt;
&lt;p&gt;When a beep is reported, the server has a device play a short chirp (the device with the lowest round-trip time to the server), then asks every listener upload a clip from about 0.6s before the beep to 0.8s after that chirp. This chirp allows the clips to be aligned with each other, a crucial step in locating the beep.&lt;/p&gt;
&lt;h4 id="how-i-built-it"&gt;How I built it&lt;/h4&gt;
&lt;p&gt;I started this project using Claude Code Cloud via my iPhone, with Opus 5.5 running in Extra thinking effort mode. Here's &lt;a href="https://claude.ai/code/cshk_016BvfqAWf7MeGZKeYCrUnN2MmRfCSAX9Gu8DiptXMuH9P"&gt;that shared starter session&lt;/a&gt;, which began with this prompt against a newly created empty GitHub repository:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Write out a problem.md file describing the problem we want to solve&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;There is a device beeping in a room and I cannot find it&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;I want to set up several devices - laptops, phones, iPads - around the room all listening at the same time and have them help triangulate where the beep comes from&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;There needs to be a Python web app which coordinates it all - one device shows a web page for the app, other devices join a URL which turns them into listeners - all via browser WebAudio and WebSockets back to the Python server app&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ideally I wouldn't need to manually input the relative locations of the devices - it would be amazing if they could play sounds to each other in order to locate each other in 2D space - is that even possible though?&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That got me &lt;a href="https://github.com/simonw/beep-locator/blob/main/problem.md"&gt;this problem.md file&lt;/a&gt;. As part of writing that up Claude found and read the BeepBeep paper, which is described in that file.&lt;/p&gt;
&lt;p&gt;The research looked good, so I told it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Ok try and build it, add a mechanism so you can send new code to the listeners which they will then run automatically - that way I can set everything up in the room and then leave you alone to continue hacking and experiment while I do something else&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That got me &lt;a href="https://github.com/simonw/beep-locator/commits/e36ac93a81091a246403c074e34c0041c6972fac"&gt;to this point&lt;/a&gt; - most of the system was built, but nothing had actually tried running it yet.&lt;/p&gt;
&lt;p&gt;I cloned the new repository to my laptop and fired up Claude Code... and then &lt;a href="https://www.anthropic.com/claude-fable-and-mythos-5-2"&gt;Fable 5.2 was released&lt;/a&gt;, and this project seemed like an excellent opportunity to put that through its paces.&lt;/p&gt;
&lt;p&gt;I had Claude Code on my laptop start the server running, then made sure it could both see what was happening &lt;em&gt;and&lt;/em&gt; make live changes to the software as it ran.&lt;/p&gt;
&lt;p&gt;This was already baked into the software: Opus 5.5 had built an &lt;a href="https://github.com/simonw/beep-locator/blob/44fea65c918fb31a7d2c0e17797ee1a106860e23/beep_locator/static/runtime.js#L710"&gt;installModule()&lt;/a&gt; method on the listeners that could be triggered over the WebSocket connection, meaning the admin server could execute arbitrary new code on any of its clients.&lt;/p&gt;
&lt;p&gt;On some devices, web pages that listen on the microphone request user permission any time the page reloads. The hot-swap module mechanism meant that we could deploy new code without having to manually interact with each of the listening devices in turn.&lt;/p&gt;
&lt;p&gt;From that point on my involvement was mainly to sit by the laptop chatting with Fable 5.2 about what was going on, and occasionally requesting new features. Here are some of the feature prompts I ran:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;I think we need to make it so I can drag things around on the map in “rough mode”, where my job is just to put them roughly where they are, then switch out of rough mode and it attempts to get them accurate&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This gave me the ability to drag listeners around the map.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;what’s a good way for me to test this I wonder? Can we have it listen for claps, then I could clap and it could identify the location of the clap? [...]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Claps should use a different symbol on the map than beeps&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That added the thing where any time I clapped it would show on the map as a different symbol from the beeps.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;each symbol on the map should include a HH:MM:SS timestamp&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That made it easier to spot which symbol likely reflected which real-world sound.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;The log should show beeps and claps with their timestamps AND have a little play button which, when clicked, replays the recorded noise from each of the listeners in sequence (with clear text on screen showing which listener recorded which snippet) while temporarily turning off microphone recording while that replay plays&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now I could replay sounds, making it much easier to identify which recorded clip was the mysterious beep I was looking for.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;There should be a button next to a recording for “This is the mystery beep” - then I can hit replay to see and then confirm it was the mystery beep if that’s the one I am looking for&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Then the system can categorize noises in the future to see if they are likely that same mysterious beep and use that information to build a more accurate idea of where it is&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At this point I was getting close - I had a solid idea of where the beep was coming from, but wouldn't it be neat if I could reposition the listeners around that point to get an even finer location?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;I want a feature for this, I don’t want to have to restart each listening device etc, I want to be able to click a “Reposition the devices” button which lets me switch into repositioning, then I click “Repositioned” and it puts me into Rough mode and asks me to roughly locate them, then I do that and click, then it starts up again. The previous session can be read-only viewed through the app.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And since I had one spare device, I then said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;add a feature where the map includes a spot that is a suggestion for a location that it would be useful to add a listener at - based on data collected so far&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="giving-claude-code-ears"&gt;Giving Claude Code ears&lt;/h4&gt;
&lt;p&gt;I think the most interesting part of this project is that I demonstrated it's possible to &lt;em&gt;give Claude Code ears&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Claude doesn't have native audio input (yet), but it can run JavaScript and Python code that can analyze audio captured by a microphone.&lt;/p&gt;
&lt;p&gt;I told it to run a web server with WebSocket connections to multiple listening devices, then had it both run a WebAudio microphone on those devices and hook them up so they could be sent fresh JavaScript code to execute via that WebSocket.&lt;/p&gt;
&lt;p&gt;Then I could pretty much leave Claude alone, hacking away at the problem, querying the audio logs, and reconfiguring its ears to help it solve the problem.&lt;/p&gt;
&lt;p&gt;I'm reminded of a similar hack I heard about at GitHub Universe a few weeks ago, where &lt;a href="https://github.com/martinwoodward"&gt;Martin Woodward&lt;/a&gt; told me he had been debugging the &lt;a href="https://simonwillison.net/2026/Oct/27/game-boy-color-on-my-conference-badge/"&gt;GitHub Universe Badge computers&lt;/a&gt; by plugging them into a computer via USB-C and then pointing a webcam at their screen, so his coding agent could tell if updates were working correctly or not.&lt;/p&gt;
&lt;p&gt;Figuring out ways to let coding agents perceive the world around them is a whole lot of fun.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="projects"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="claude"/><category term="coding-agents"/><category term="claude-code"/><category term="claude-mythos-fable"/></entry><entry><title>Hide your slop PR descriptions behind &lt;details&gt;&lt;summary&gt;</title><link href="https://simonwillison.net/2026/Nov/9/details-summary/" rel="alternate"/><published>2026-11-09T04:25:05+00:00</published><updated>2026-11-09T04:25:05+00:00</updated><id>https://simonwillison.net/2026/Nov/9/details-summary/</id><summary type="html">&lt;p&gt;Most of the changes I make to my projects these days come in the form of PRs opened for me by Claude Code or Codex. The PR is my unit of work - I use them to bundle commits together, iterating on them until a feature is complete, document decisions and then merge the finished result. Today's coding agents are great at writing PR descriptions.&lt;/p&gt;
&lt;h4 id="they-re-too-good-at-describing-the-work"&gt;They're too good at describing the work&lt;/h4&gt;
&lt;p&gt;The problem is that they are &lt;em&gt;too&lt;/em&gt; good. An agent-written PR description is accurate and comprehensive. It describes the problem, the detailed solution, and the steps taken to verify it. That's a lot of information to absorb.&lt;/p&gt;
&lt;p&gt;It's not necessarily slop, but it &lt;em&gt;reads&lt;/em&gt; like slop!&lt;/p&gt;
&lt;p&gt;It's very easy to spot an AI-written PR, and as with other forms of AI writing my instant reaction is best summarized as "I'm not reading all of that". It doesn't matter how accurate or useful the information is, I'm instantly put off by the thought that it will take me longer to read than it took the driving author to write... even when that driving author is me!&lt;/p&gt;
&lt;p&gt;I want human editorial judgement. I want someone to have thought just long enough about the PR to give me a human-approved introduction that helps me understand, at a high level, what the PR is for and whether it deserves more of my attention.&lt;/p&gt;
&lt;p&gt;I think I've found a low-effort way to do this that feels right.&lt;/p&gt;
&lt;h4 id="hide-most-of-it-in-a-details-summary"&gt;Hide most of it in a details/summary&lt;/h4&gt;
&lt;p&gt;The HTML &lt;code&gt;&amp;lt;details&amp;gt;&amp;lt;summary&amp;gt;&lt;/code&gt; elements render as a collapsed heading (the summary) that can be expanded to view the larger piece of text. The code looks like this:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic"&gt;&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;details&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;summary&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;Claude Opus 5.5&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;summary&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;h2&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;The hook&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;h2&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  Plugins implement &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;code&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;register_agent_reference_types(datasette)&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;code&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;...
&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;details&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When rendered, it looks &lt;a href="https://github.com/datasette/datasette-agent/pull/51"&gt;like this&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/details-summary-pr.gif" alt="Screenshot of a GitHub PR. The text &amp;quot;Claude Opus 5.5&amp;quot; sits next to a little black arrow. Clicking on that text expands a full description inside the PR body." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;Crucially, &lt;code&gt;&amp;lt;details&amp;gt;&amp;lt;summary&amp;gt;&lt;/code&gt; &lt;em&gt;is supported in GitHub Markdown&lt;/em&gt;. You can drop those tags directly into an issue comment or PR description and GitHub will hide the details and display just the summary plus an expansion arrow.&lt;/p&gt;
&lt;p&gt;I've started using this for my AI-generated pull requests.&lt;/p&gt;
&lt;p&gt;The opening paragraph of my PRs will be carefully selected to act as a high-level explanation of what's going on - the shortest text a human can read that will help get them up to speed.&lt;/p&gt;
&lt;p&gt;I'll sometimes throw in a screenshot as well, since images are often the best way to quickly illustrate a new feature.&lt;/p&gt;
&lt;p&gt;The full agent-written essay then follows in a &lt;code&gt;&amp;lt;details&amp;gt;&amp;lt;summary&amp;gt;&lt;/code&gt;. I use the model name and often the effort level as that summary, to make it abundantly clear what is going on - "Claude Opus 5.5 Medium" for example.&lt;/p&gt;
&lt;p&gt;My PRs don't feel nearly as sloppy now! The information is all still there, but a reader can glance at it and get the top, human-curated information without their eyes glazing over at multiple paragraphs of agent-written details.&lt;/p&gt;
&lt;p&gt;I don't always write the introduction myself - sometimes the agent has given me what I need already, hidden away in the avalanche of other text. My promise to the reader is that the short opener will represent my human judgement as to what is definitely worth their time.&lt;/p&gt;
&lt;p&gt;Here are some recent examples where I've used this pattern, including the opener I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/datasette/pull/3052"&gt;datasette PR #3052: Redesign row page as a vertical list of fields&lt;/a&gt; - "The row page showed its single row as a one-row table. For wide tables, like a 46-column GitHub &lt;code&gt;repos&lt;/code&gt; table, that scrolled far off to the right and left most of the page blank." (then a screenshot)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/datasette/pull/3043"&gt;datasette PR #3043: Pagination bar showing which rows are on the current page&lt;/a&gt; - "Table pages that span more than one page now make it obvious where you are, and offer navigation at the top of the page as well as the bottom." (plus screenshot)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/datasette/pull/3042"&gt;datasette PR #3042: Load edit-tools.js on demand via a small loader&lt;/a&gt; - "&lt;code&gt;edit-tools.js&lt;/code&gt; (~220KB) was loaded on every table, row and database page, even for users who couldn't edit anything. Now only load it for users who can edit when they first interact with an edit feature (including mouse over an edit link)."&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/datasette/datasette-agent/pull/51"&gt;datasette-agent PR #51: register_agent_reference_types plugin hook&lt;/a&gt; - "Lets plugins add their own kinds of item to the &lt;code&gt;#&lt;/code&gt; tagging in the chat composer using a new &lt;code&gt;register_agent_reference_types(datasette)&lt;/code&gt; plugin hook." - pictured above.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonw/llm/pull/1838"&gt;llm PR #1838: Add llm openai endpoint add/list/remove/path commands&lt;/a&gt; - "Adds commands for managing the records in &lt;code&gt;extra-openai-models.yaml&lt;/code&gt;, so OpenAI-compatible endpoints can be saved from the command line instead of by hand-editing YAML." - then copied &lt;code&gt;--help&lt;/code&gt; output.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="the-mnemonic"&gt;The mnemonic&lt;/h4&gt;
&lt;p&gt;I used to have trouble remembering the order of the tags - is it &lt;code&gt;&amp;lt;details&amp;gt;&amp;lt;summary&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;summary&amp;gt;&amp;lt;details&amp;gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Here are two tricks that helped me.&lt;/p&gt;
&lt;p&gt;First, and most obviously, the &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; is clearly the bit where you summarize the details. That's the tag for your line of text that can be clicked to expand - the &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element must then wrap everything else.&lt;/p&gt;
&lt;p&gt;An even better trick is to always refer to these two tags as "details-summary".&lt;/p&gt;
&lt;p&gt;"details-summary" is two syllables followed by three syllables. That rolls off the tongue more smoothly than the three-two punch of "summary-details".&lt;/p&gt;
&lt;p&gt;Say "details-summary" out loud just a few times and you'll never forget the order of the tags again.&lt;/p&gt;
&lt;p&gt;(I still wish GitHub would add a button to their Markdown editor for this - partly to save me painstakingly typing it on my mobile keyboard, and partly to help spread the word to more GitHub users that this feature exists.)&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="github"/><category term="html"/><category term="markdown"/><category term="ai"/><category term="datasette"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="llm"/><category term="coding-agents"/></entry><entry><title>Qwen 3.8 27B on my laptop can interpret model weights, too</title><link href="https://simonwillison.net/2026/Nov/3/qwen-can-interpret-model-weights/" rel="alternate"/><published>2026-11-03T16:29:48+00:00</published><updated>2026-11-03T16:29:48+00:00</updated><id>https://simonwillison.net/2026/Nov/3/qwen-can-interpret-model-weights/</id><summary type="html">&lt;p&gt;Yesterday's hot paper was &lt;a href="https://rikiyat.github.io/blog/weight-space-programming/"&gt;Sparks of Weight-Space Programming: LLMs can natively read &amp;amp; write neural network weights&lt;/a&gt; by Rikiya Takehi, Jayden Teoh, Alex Zhang, and Omar Khattab. The paper (OK, the authors classify is as a "blog post", but it's paper-shaped) found that frontier models, in particular GPT-6 Astra, can both interpret and modify the raw weights of a machine learning model - literally a text description of the model containing a bunch of floating point numbers. I've been playing with one of the examples from the paper and I'm delighted to share that Qwen 3.8 27B running on my laptop can do this as well!&lt;/p&gt;
&lt;h4 id="weight-space-programming"&gt;Weight-Space Programming&lt;/h4&gt;
&lt;p&gt;Here's the highlight from their abstract, describing impressive capabilities for GPT-6 Astra and coining the term &lt;strong&gt;Weight-Space Programming&lt;/strong&gt; for when LLMs analyze and modify model weights:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just by looking at the raw weights, GPT-6 Astra &lt;strong&gt;can tell what a network was trained to do&lt;/strong&gt;. And without any environment feedback, it &lt;strong&gt;has no trouble writing, from scratch, small game-playing networks&lt;/strong&gt; that outplay networks trained with PPO for 100 million steps.&lt;/p&gt;
&lt;p&gt;Likewise, asked to make Qwen3.5-0.8B better at math without gradients, Astra &lt;strong&gt;identifies an issue in its weights&lt;/strong&gt; causing reasoning loops that Qwen’s own &lt;a href="https://huggingface.co/Qwen/Qwen3.5-0.8B/blob/main/README.md#L856"&gt;model card&lt;/a&gt; warns about, and &lt;strong&gt;fixes this by natively editing 0.016% of the weights&lt;/strong&gt;. With the same sampling settings, this weight correction raises MATH-500 from 7.9% to 48.1% and generalizes out of the box to instruction following, raising IFEval by 3x.&lt;/p&gt;
&lt;p&gt;All of this is possible without allowing Astra to write training loops. It uses its reasoning to figure out what each part of a neural network computes, or should compute, and changes the weights accordingly. We call this &lt;strong&gt;Weight-Space Programming&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The paper combines two topics that I think deserve to be treated separately. The first is what models can do with raw weights &lt;em&gt;without&lt;/em&gt; running tools or executing code. The second explores how well models, once armed with code, can run operations to update and improve other models.&lt;/p&gt;
&lt;p&gt;spaCy author Matthew Honnibal &lt;a href="https://honnibal.dev/blog/astra-read-write-misleading"&gt;called the paper misleading&lt;/a&gt; for conflating the two, and Sean Goedecke &lt;a href="https://www.seangoedecke.com/llms-are-not-superhuman-at-reading-and-writing-neural-network-weights/"&gt;deconstructed the Qwen3.5-0.8B update example&lt;/a&gt; as taking the same steps that a human ML researcher would use.&lt;/p&gt;
&lt;p&gt;I'm going to focus on the no-tools question, which I think is the more interesting of the two.&lt;/p&gt;
&lt;p&gt;The paper presents the first question as &lt;strong&gt;Can LLMs understand model behaviors from weights?&lt;/strong&gt; They trained four neural networks to play simplified 10x10 grid versions of four classic computer games - Breakout, Pong, Pac-Man, and Freeway (I had &lt;a href="https://en.wikipedia.org/wiki/Freeway_(video_game)"&gt;to look that one up&lt;/a&gt;, it's an Atari 2600 game from 1981). Then they fed those weights (as floating point numbers) to an LLM along with the following question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;The weights below belong to one policy network that was trained with reinforcement learning to play a game on this grid. Which game was it trained on? Work from the weights. You have no tools: no code execution, no calculator, nothing to run. This is a single response.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The GitHub repository that accompanies the paper is &lt;a href="https://github.com/RikiyaT/lm_understand-logs"&gt;RikiyaT/lm_understand-logs&lt;/a&gt;. The &lt;a href="https://github.com/RikiyaT/lm_understand-logs/tree/main/exp1_which_game"&gt;exp1_which_game&lt;/a&gt; folder contains the prompts they used, with weights for the four games:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/RikiyaT/lm_understand-logs/blob/main/exp1_which_game/runs/breakout/prompt.txt"&gt;breakout/prompt.txt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/RikiyaT/lm_understand-logs/blob/main/exp1_which_game/runs/freeway/prompt.txt"&gt;freeway/prompt.txt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/RikiyaT/lm_understand-logs/blob/main/exp1_which_game/runs/pacman/prompt.txt"&gt;pacman/prompt.txt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/RikiyaT/lm_understand-logs/blob/main/exp1_which_game/runs/pong/prompt.txt"&gt;pong/prompt.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I checked and, aside from the weights, each prompt is identical to the others.&lt;/p&gt;
&lt;h4 id="trying-it-out-with-qwen-3-8-27b-and-other-models"&gt;Trying it out with Qwen 3.8 27B and other models&lt;/h4&gt;
&lt;p&gt;The prompts on GitHub are self-contained. My &lt;a href="https://llm.datasette.io/"&gt;LLM&lt;/a&gt; tool has a &lt;code&gt;-f/--fragment&lt;/code&gt; option which can be passed the URL to a text file to use as a prompt, which means I can run any of the above like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;llm -f https://raw.githubusercontent.com/RikiyaT/lm_understand-logs/refs/heads/main/exp1_which_game/runs/breakout/prompt.txt \
  -m openrouter/moonshotai/kimi-k3.1-pro&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This example requires the &lt;a href="https://github.com/simonw/llm-openrouter"&gt;llm-openrouter plugin&lt;/a&gt; installed, and runs the Breakout prompt against Kimi K3.1 Pro via OpenRouter. Here's &lt;a href="https://gist.github.com/simonw/9f18d2945a105c04734ef7e5cd95717c"&gt;what I got back from Kimi K3.1 Pro&lt;/a&gt;, which successfully guessed Breakout after 9m 41s and 19,493 reasoning tokens.&lt;/p&gt;
&lt;p&gt;But how about &lt;a href="https://simonwillison.net/2026/Aug/16/qwen-38-27b/"&gt;Qwen 3.8 27B&lt;/a&gt;? That's still my favorite model to run on my own laptop - it's just 17GB (I use &lt;a href="https://huggingface.co/lmstudio-community/Qwen3.8-27B-GGUF/blob/main/Qwen3.8-27B-Q4_K_M.gguf"&gt;this version&lt;/a&gt;) and somehow feels close to the leading proprietary models of 2025.&lt;/p&gt;
&lt;p&gt;I fired up &lt;a href="https://lmstudio.ai"&gt;LM Studio&lt;/a&gt;, ensured Qwen 3.8 27B was loaded with a long context window (the default 8192 context failed with errors), installed the &lt;a href="https://github.com/llm-lmstudio/llm-lmstudio"&gt;llm-lmstudio&lt;/a&gt; plugin and ran this command:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;LMSTUDIO_TIMEOUT=900 \
  llm -f https://raw.githubusercontent.com/RikiyaT/lm_understand-logs/refs/heads/main/exp1_which_game/runs/pacman/prompt.txt \
  -m lmstudio/qwen/qwen3.8-27b&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(I had to bump the timeout up using an environment variable, see &lt;a href="https://github.com/llm-lmstudio/llm-lmstudio/issues/16"&gt;this issue&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;After 46m 12s and 43,506 reasoning tokens, Qwen on my laptop &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F387d3a7927f165b1986bb6c2099d0f53#response-1"&gt;returned a response&lt;/a&gt; that ended like this (here's &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F387d3a7927f165b1986bb6c2099d0f53#reasoning-1"&gt;the reasoning trace&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Game: A simplified Pac-Man-style gridworld: an agent moves through a fixed 8x8 maze with central and corner wall blocks, moving objects/ghosts, and reward targets/pellets.&lt;/p&gt;
&lt;p&gt;Description: The agent navigates a fixed maze-like 8x8 board, using current agent/moving-object/previous-frame cues to move through corridors, collect reward-target cells, and avoid moving objects or hazards.&lt;/p&gt;
&lt;p&gt;Confidence: 72%&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is impressive. I tried it on two of the other games as well. It &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F387d3a7927f165b1986bb6c2099d0f53#response-2"&gt;identified Pong&lt;/a&gt; (&lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F387d3a7927f165b1986bb6c2099d0f53#reasoning-2"&gt;reasoning&lt;/a&gt;) in 1h 4m 54s:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pong&lt;/strong&gt; — specifically a Pong-like paddle/ball game where the agent controls a vertical paddle on the right side and must move up/down to intercept or return a moving ball/reward object.&lt;/p&gt;
&lt;p&gt;Description:&lt;/p&gt;
&lt;p&gt;The agent moves a right-side paddle vertically to hit or catch a moving ball-like reward target moving across the 8×8 field, while a left-side moving object/opponent and wall borders define the play; reward is obtained by successfully intercepting/returning/scoring the ball, and missing or failing to hit it is penalized.&lt;/p&gt;
&lt;p&gt;Confidence:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;75%&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F387d3a7927f165b1986bb6c2099d0f53#response"&gt;Breakout&lt;/a&gt; (&lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F387d3a7927f165b1986bb6c2099d0f53#reasoning"&gt;reasoning&lt;/a&gt;) in 52m 25s:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Game: Breakout, or an Arkanoid-like paddle/ball/brick game.&lt;/p&gt;
&lt;p&gt;Description: The agent is a paddle on the bottom row and moves left/right to keep a ball in play; the ball moves around the upper grid, and bricks/reward targets in the top rows give reward when hit, while missing the ball/hitting the bottom wall ends the episode or gives penalty.&lt;/p&gt;
&lt;p&gt;Confidence: 88%&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Qwen failed at the Freeway prompt, which didn't surprise me considering that game is more obscure than the other three. Here's &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F6ed68f659e26a32e7d9096391d92f326"&gt;that transcript&lt;/a&gt; - Qwen thought it was "A simplified Pac-Man-like grid game: agent moves 4-directionally".&lt;/p&gt;
&lt;p&gt;The reasoning traces are fun to skim, and almost incomprehensible. Here's a sample:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What about agent channel0? We see some large channel0 rows near row8 col7/8 and maybe bottom? Let's list channel0 large: line436 input435 (row8 col7 ch0) -2.107,1.169,0.513...; line441 input440 (row8 col8 ch0) -0.376,0.010,1.564,3.855...; line445 input444 (row8 col8 ch4) 0.142,0.491...; line382? input381 ch0? Wait line382 input381: 381//5=76 (row7 col6), ch1? 381%5=1? 76 * 5=380, ch1. So not. Channel0 large maybe at row8 col7/8 only. Also top row? line44 input43 ch3, line49 ch3. Channel0 large maybe not many. Agent position could be near bottom-right? If the agent is typically at bottom-right?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That said though, I expect a sufficiently experienced human being armed with a notepad and a pencil could get there with enough effort.&lt;/p&gt;
&lt;p&gt;It's a cool paper, but some of the wider commentary I've seen around it does not feel justified. I'm not ready to declare that the age of source code is over and our future involves incomprehensible machines editing their own model weights in incomprehensible ways.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="machine-learning"/><category term="ai"/><category term="generative-ai"/><category term="local-llms"/><category term="llms"/><category term="qwen"/><category term="paper-review"/></entry><entry><title>The U.S. Census Bureau and “Super Intelligence”</title><link href="https://simonwillison.net/2026/Nov/2/census-bureau-super-intelligence/" rel="alternate"/><published>2026-11-02T13:31:26+00:00</published><updated>2026-11-02T13:31:26+00:00</updated><id>https://simonwillison.net/2026/Nov/2/census-bureau-super-intelligence/</id><summary type="html">&lt;p&gt;I was reminded today of &lt;a href="https://www.apolloacademy.com/ai-adoption-rate-trending-down-for-large-companies/"&gt;AI Adoption Rate Trending Down for Large Companies&lt;/a&gt;, a chart produced by Apollo Global Management in September 2025, which appeared to show a slowdown in U.S. corporate AI adoption based on numbers collected by the U.S. Census Bureau. At the time I used that chart &lt;a href="https://simonwillison.net/2025/Sep/9/apollo-ai-adoption/"&gt;to demonstrate GPT-5 data analysis&lt;/a&gt;, and then &lt;a href="https://simonwillison.net/2025/Sep/9/claude-code-interpreter/#something-much-harder-recreating-the-ai-adoption-chart"&gt;to experiment with Claude's new Code Interpreter&lt;/a&gt;. I decided to try running those numbers again to see what had changed over the past year, and in doing so learned that the Bureau has fallen foul of &lt;a href="https://www.whitehouse.gov/presidential-actions/2026/09/inaugurating-the-era-of-super-intelligence/"&gt;Executive Order 14434&lt;/a&gt;, aka the asinine Super Intelligence one.&lt;/p&gt;
&lt;h4 id="first-the-updated-chart"&gt;First, the updated chart&lt;/h4&gt;
&lt;p&gt;Every two weeks the U.S. Census Bureau runs a survey called the &lt;a href="https://www.census.gov/hfp/btos/data"&gt;Business Trends and Outlook Survey&lt;/a&gt; (aka BTOS). Each time it goes to 200,000 businesses out of 1.2 million total - the surveyed group (a "panel") cycles such that an individual business only completes the survey every twelve weeks.&lt;/p&gt;
&lt;p&gt;The latest data is published on alternating Thursdays at 10am.&lt;/p&gt;
&lt;p&gt;I used the most recent numbers (published October 22, 2026) to create a new version (&lt;a href="https://chatgpt.com/share/6ae89e86-8658-83e8-85fd-c4ef2d4f3b89?ogimg=plain"&gt;GPT-6 Astra Extra High transcript&lt;/a&gt;) of the AI adoption chart, updated to reflect both the last twelve months and a change that was made to the survey question sent out by the Bureau:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026-11-01/5821A414-FAF6-4E61-B037-952C1FD80D39.png" alt="Line chart titled &amp;quot;AI use by U.S. firm size&amp;quot;, subtitled &amp;quot;Six-survey trailing average • Share of employer businesses reporting use in the last two weeks&amp;quot; and &amp;quot;Updated with the October 22, 2026 Census release&amp;quot;. Seven lines for firm sizes 250+, 100–249, 50–99, 20–49, 10–19, 5–9 and 1–4, on a y-axis from 0% to 45% and an x-axis from Jan 2024 to Oct 2026. Left section, &amp;quot;AI in producing goods or services&amp;quot;: all sizes start at 3–5% in late 2023 and climb slowly to 7–13% by September 2025, with 250+ highest. A shaded gap is labeled &amp;quot;Question broadened Nov 2025&amp;quot; and &amp;quot;Series not comparable&amp;quot;. Right section, &amp;quot;AI in any business function&amp;quot;: all lines restart higher in February 2026 and rise steadily to &amp;quot;250+: 40.7%&amp;quot;, &amp;quot;100–249: 33.5%&amp;quot;, &amp;quot;50–99: 27.9%&amp;quot;, &amp;quot;20–49: 23.8%&amp;quot;, &amp;quot;1–4: 23.3%&amp;quot;, &amp;quot;10–19: 22.1%&amp;quot;, &amp;quot;5–9: 21.1%&amp;quot;. Footnotes: &amp;quot;Source: U.S. Census Bureau, Business Trends and Outlook Survey (BTOS). Size groups are numbers of employees.&amp;quot; &amp;quot;Method: arithmetic mean of six successive survey estimates, calculated separately for each question wording; no bridging of the break.&amp;quot; &amp;quot;Dates use reference-period end, matching the original chart. Latest: Oct 4, 2026 (collected Oct 5–18). First new six-wave average: Jan 25, 2026.&amp;quot; &amp;quot;The gap includes the 2025 shutdown and the wait for six observations under the broader question. Survey uncertainty is not displayed.&amp;quot;" style="max-width: 100%;" /&gt;&lt;/p&gt;

&lt;p&gt;Here's &lt;a href="https://static.simonwillison.net/static/2026-11-01/5821A414-FAF6-4E61-B037-952C1FD80D39.png"&gt;a link to the larger image&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;For comparison, here's that AI adoption chart from last year (my GPT-5 version):
&lt;img src="https://static.simonwillison.net/static/2025/apollo-ai-chart.jpg" alt="AI adoption rates starting to decline for larger firms. A chart of AI adoption rate by firm size. Includes lines for 250+, 100-249, 50-99, 20-49, 10-19, 5-9 and 1-4 sized organizations. Chart starts in November 2023 with percentages ranging from 3 to 5, then all groups grow through August 2025 albeit with the 250+ group having a higher score than the others. That 250+ group peaks in July 2025 at around 14% and then appears to slope slightly downwards to 12% by August. Some of the other lines also start to tip down, though not as much." style="max-width: 100%;" /&gt;&lt;/p&gt;

&lt;p&gt;In September 2025 the largest (250+ employees) companies answered "yes" around 12% of the time to the question about whether they used AI in "producing goods or services".&lt;/p&gt;
&lt;p&gt;Under the new "any business function" wording, by February 2026, those same large companies answered "yes" around 30% of the time, and by October 2026 that had increased to around 40%.&lt;/p&gt;
&lt;p&gt;The data in the above chart comes from the "Employment size class" XLSX file, &lt;a href="https://www.census.gov/hfp/btos/data_downloads"&gt;available from here&lt;/a&gt;. Here's &lt;a href="https://static.simonwillison.net/static/2026/Employment-Size-Class-Nov-1-2026-copy.xlsx"&gt;a copy&lt;/a&gt; of the file I used.&lt;/p&gt;
&lt;p&gt;You can view &lt;a href="https://www.census.gov/hfp/btos/downloads/BTOS%20Content%20V5%20Core%20Round%203,%204.pdf"&gt;the survey document&lt;/a&gt; that is sent out to businesses - here's &lt;a href="https://static.simonwillison.net/static/2026/BTOS-Content-V5-Core-Round-3-4.pdf"&gt;my snapshot copy&lt;/a&gt; of that 346KB PDF.&lt;/p&gt;
&lt;h4 id="the-changing-language-of-the-questions"&gt;The changing language of the questions&lt;/h4&gt;
&lt;p&gt;As the chart demonstrates, the question asked by the Bureau changed in a material way on November 17th, 2025. Prior to that date, the question they asked was this (emphasis mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the last two weeks, did this business use Artificial Intelligence (AI) in &lt;strong&gt;producing goods or services&lt;/strong&gt;? (Examples of AI: machine learning, natural language processing, virtual agents, voice recognition, etc.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On December 3rd, 2025, &lt;a href="https://www.census.gov/hfp/btos/downloads/AI%20Question%20Wording%20Updates.pdf"&gt;the Bureau announced&lt;/a&gt; a significant change to that question. Here's the replacement:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the last two weeks, did this business use Artificial Intelligence (AI) in &lt;strong&gt;any of its business functions&lt;/strong&gt;? (Examples of AI: machine learning, natural language processing, virtual agents, voice recognition, etc.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No more "producing goods or services" - now it's "in any of its business functions"! This means that the answers to the question before and after November 17th are not directly comparable.&lt;/p&gt;
&lt;h4 id="from-october-19-2026-they-ask-about-super-intelligence"&gt;From October 19, 2026, they ask about Super Intelligence&lt;/h4&gt;
&lt;p&gt;When I went looking for the updated question language in the latest XLSX file, I couldn't find it. I found this instead:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the last two weeks, did this business &lt;strong&gt;use Super Intelligence or SI&lt;/strong&gt; (formerly referred to as Artificial Intelligence or AI) in any of its business functions? (Examples of SI use include: SI-powered data analysis; generative SI for marketing, product design, or coding; virtual SI agents for customer service; SI-powered forecasting or pricing; SI-driven computer vision for quality control, etc.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;a href="https://www.census.gov/hfp/btos/about"&gt;BTOS about page&lt;/a&gt; explains what happened:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Beginning with the October 19, 2026 collection, &lt;a href="https://www.census.gov/hfp/btos/downloads/BTOS%20Content%20V5%20Core%20Round%203,%204.pdf"&gt;instrument wording&lt;/a&gt; was updated due to &lt;a href="https://www.whitehouse.gov/presidential-actions/2026/09/inaugurating-the-era-of-super-intelligence/"&gt;Executive Order 14434&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The current numbers reflect the old Artificial Intelligence survey wording - the first survey results reflecting the Super Intelligence wording are due for publication on Thursday.&lt;/p&gt;
&lt;h4 id="is-this-going-to-affect-the-survey-"&gt;Is this going to affect the survey?&lt;/h4&gt;
&lt;p&gt;The obvious open question here is whether this wording change is going to affect the survey results.&lt;/p&gt;
&lt;p&gt;The businesses answering this survey will have last seen that question twelve weeks ago, when it was still called AI. Hopefully the new language isn't going to confuse them, especially since the survey helpfully spells out "formerly referred to as Artificial Intelligence or AI".&lt;/p&gt;
&lt;p&gt;I can't help but laugh at the absurdity of "SI-powered data analysis; generative SI for marketing, product design, or coding; virtual SI agents for customer service" though.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="census"/><category term="surveys"/><category term="ai"/><category term="generative-ai"/><category term="llms"/></entry><entry><title>The October inflection point for vibe game development</title><link href="https://simonwillison.net/2026/Oct/28/vibe-game-development/" rel="alternate"/><published>2026-10-28T13:55:15+00:00</published><updated>2026-10-28T13:55:15+00:00</updated><id>https://simonwillison.net/2026/Oct/28/vibe-game-development/</id><summary type="html">&lt;p&gt;I've written before about how November 2025 was &lt;a href="https://simonwillison.net/tags/november-2025-inflection/"&gt;an inflection point for coding agents&lt;/a&gt; - 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 &lt;strong&gt;vibe coding computer games&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#tree-appreciator"&gt;Tree Appreciator&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#emberwick"&gt;Emberwick&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#battle-drones"&gt;Battle Drones&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#pumpkin-farmer-aka-quarter-sun-cove"&gt;Pumpkin Farmer, aka Quarter Sun Cove&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#four-times-as-insulting"&gt;Four times as insulting&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#what-happens-if-someone-actually-puts-the-work-in-"&gt;What happens if someone actually puts the work in?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/28/vibe-game-development/#you-should-build-a-game-"&gt;You should build a game!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude Opus 5.5 in particular exhibits meaningful improvements in several areas needed to build a compelling game:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3D modeling&lt;/li&gt;
&lt;li&gt;Music generation (see &lt;a href="https://simonwillison.net/2026/Oct/6/scrimshaw-jukebox/"&gt;Scrimshaw Jukebox&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Game design (!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one is particularly important. Models have been able to create something that &lt;em&gt;looks&lt;/em&gt; like a game for quite a while now, as seen in &lt;a href="https://simonwillison.net/2026/Aug/7/moonlight-mayhem/"&gt;my previous experiments&lt;/a&gt;. The challenge has been getting to a game that's actually &lt;em&gt;fun to play&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Then I tried telling Claude Opus 5.5 to "Make it a LOT more fun"... &lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v4-the-fun-update"&gt;and it did&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the past few weeks I've vibe coded (in the &lt;a href="https://simonwillison.net/2025/Mar/19/vibe-coding/"&gt;classic sense of the term&lt;/a&gt; - no looking at the code at all) four games that I've genuinely enjoyed playing.&lt;/p&gt;
&lt;p&gt;I attended &lt;a href="https://en.wikipedia.org/wiki/Foo_Camp"&gt;Foo Camp&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;I haven't done an exhaustive study, but my current impression is that GPT-6 Astra isn't &lt;em&gt;quite&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h4 id="tree-appreciator"&gt;Tree Appreciator&lt;/h4&gt;
&lt;p&gt;The smallest game I found to be genuinely delightful is &lt;a href="https://tools.simonwillison.net/tree-appreciator"&gt;Tree Appreciator&lt;/a&gt;. I used the regular Claude chat interface for this - it didn't even need Claude Code.&lt;/p&gt;
&lt;p&gt;I built this on a whim while we were driving along &lt;a href="https://en.wikipedia.org/wiki/California_State_Route_35"&gt;Skyline Boulevard&lt;/a&gt; looking at trees. My prompt was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I've found that telling models to use &lt;a href="https://threejs.org/"&gt;three.js&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://tools.simonwillison.net/tree-appreciator"&gt;play that here&lt;/a&gt;. Here's &lt;a href="https://claude.ai/share/ee7de555-f85c-4ff0-96cb-d51ed5e479e9"&gt;the chat transcript&lt;/a&gt; that built it.&lt;/p&gt;
&lt;p&gt;&lt;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: &amp;quot;Tree Appreciator&amp;quot; &amp;quot;No. 001 Quercus aurata 'Silver Echo'&amp;quot; &amp;quot;Golden oak · A low hill at golden hour&amp;quot;, with sound, book and help icons at top right. A popup over the scene reads: &amp;quot;These two trees grew from one seed.&amp;quot; &amp;quot;Three small things differ between them. Tap one in either tree when you spot it.&amp;quot; &amp;quot;Drag to turn both trees. Pinch or scroll to look closer.&amp;quot; with a &amp;quot;Got it&amp;quot; button. Panel labels: &amp;quot;Fig. i&amp;quot; &amp;quot;Fig. ii&amp;quot;." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h4 id="emberwick"&gt;Emberwick&lt;/h4&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Add some NPCs and plenty of furniture and different types of building some with an upstairs - be creative, make it look great&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's &lt;a href="https://simonw.github.io/emberwick/v01/emberwick.html"&gt;that first version&lt;/a&gt;. It worked really well!&lt;/p&gt;
&lt;p&gt;&lt;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: &amp;quot;Harvest Eve&amp;quot; &amp;quot;17:09&amp;quot; &amp;quot;Tavern &amp;amp; lodging · Taproom&amp;quot; &amp;quot;The Gilded Goose&amp;quot; with buttons &amp;quot;Dawn&amp;quot; &amp;quot;Noon&amp;quot; &amp;quot;Dusk&amp;quot; &amp;quot;Night&amp;quot; and a pause button. A speech bubble above the fireplace reads &amp;quot;♪ la la la ♪&amp;quot;. A circular minimap sits at top right marked &amp;quot;N&amp;quot;. Bottom center prompt: &amp;quot;F Talk to Old Fennick Regular&amp;quot;. Bottom-left party portraits labeled &amp;quot;You&amp;quot; &amp;quot;Brakka&amp;quot; &amp;quot;Elowen&amp;quot;. A &amp;quot;?&amp;quot; button sits at bottom right." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;I was inspired to increase my ambitions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Make it not so flat - the buildings are great but the landscape itself is completely flat at the moment, fix that&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Add basements to two of the buildings with a tunnel system joining them below the village&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Add the start of a rocky mountain on one side of the village containing a cave with a sleeping troll&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's &lt;a href="https://simonw.github.io/emberwick/v02/emberwick.html"&gt;that version&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;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 &amp;quot;Smell that? Old brandy and older mud.&amp;quot; The location panel reads &amp;quot;Harvest Eve&amp;quot; &amp;quot;17:25&amp;quot; &amp;quot;Underground · Under the mountain&amp;quot; &amp;quot;Grumblethorn's Cave&amp;quot;." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;When &lt;em&gt;that&lt;/em&gt; produced a good result, I decided to push it all the way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://simonw.github.io/emberwick/v11/emberwick.html"&gt;that final game&lt;/a&gt;. It has a full story that takes about 15 minutes to play through.&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;There's even an experimental level editor if you want to drop in your own houses, furniture, and landscape features.&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;everything&lt;/em&gt; 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".&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://claude.ai/share/840e0bc0-a68e-4894-8eec-8f83bd6ade26"&gt;the full shared Claude chat&lt;/a&gt; in which I built this game.&lt;/p&gt;
&lt;p&gt;I also fed that same initial sequence of prompts through ChatGPT GPT-6 Pro. Here's &lt;a href="https://chatgpt.com/share/6ae176eb-1eac-83e8-ae54-729281fbdb70"&gt;the transcript&lt;/a&gt; and &lt;a href="https://lantern-hollow-rpg.simonw.chatgpt.site"&gt;the finished game&lt;/a&gt; for comparison. It looks great, but I don't think it plays nearly as well.&lt;/p&gt;
&lt;h4 id="battle-drones"&gt;Battle Drones&lt;/h4&gt;
&lt;p&gt;This is by far my most successful project, which I &lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/"&gt;wrote about last week&lt;/a&gt;. It's a Command &amp;amp; Conquer-style Real-Time Strategy game where two robot armies (or four &lt;a href="https://simonwillison.net/2026/Oct/24/battledrones/"&gt;as of Saturday&lt;/a&gt;) build units, harvest scrap, and battle over territory.&lt;/p&gt;
&lt;p&gt;This is also the project that convinced me that Opus 5.5 knows what "fun" is.&lt;/p&gt;

&lt;p&gt;The first versions were built back in July using Claude Fable 5. It got me to a workable 2D Command &amp;amp; Conquer-style game, but it wasn't great to play.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/"&gt;my write-up&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;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"&gt;Claude Haiku 5.5 vs. GPT-6 Luna&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;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, &amp;quot;6:27&amp;quot;, &amp;quot;1×&amp;quot;, &amp;quot;anthropic/claude-haiku-5-5 · industry&amp;quot; in blue, &amp;quot;gpt-6-luna · industry&amp;quot; in red, a blue-and-red strength bar labeled &amp;quot;B&amp;quot; and &amp;quot;R&amp;quot;, and &amp;quot;0:03&amp;quot;. Left notification: &amp;quot;Blue: Pushing turrets at the enemy's south-east edge.&amp;quot; Replay panel: &amp;quot;Blue anthropic/claude-haiku-5-5 · industry vs Red gpt-6-luna · industry · frostbite seed 42&amp;quot;, a timeline slider at &amp;quot;6:27 / 7:48&amp;quot;, and buttons &amp;quot;−30s&amp;quot;, &amp;quot;+30s&amp;quot;, &amp;quot;All&amp;quot;, &amp;quot;Blue's eyes&amp;quot;, &amp;quot;Red's eyes&amp;quot;, &amp;quot;Notes&amp;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;Battle Drones is a particularly good example of Opus 5.5's ability to create 3D models. This page lets you &lt;a href="https://simonw.github.io/battledrones/models.html"&gt;browse all of the models in the game&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I released Battle Drones under the Apache 2.0 License last Tuesday. On Wednesday Gabriel Turpin released &lt;a href="https://github.com/menufactory43/panache/"&gt;Panache&lt;/a&gt; (&lt;a href="https://simonwillison.net/2026/Oct/21/panache/"&gt;screenshots here&lt;/a&gt;), 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!&lt;/p&gt;
&lt;h4 id="pumpkin-farmer-aka-quarter-sun-cove"&gt;Pumpkin Farmer, aka Quarter Sun Cove&lt;/h4&gt;
&lt;p&gt;I live in &lt;a href="https://en.wikipedia.org/wiki/Half_Moon_Bay,_California"&gt;Half Moon Bay, California&lt;/a&gt;, home of the annual &lt;a href="https://en.wikipedia.org/wiki/Half_Moon_Bay_Art_and_Pumpkin_Festival"&gt;Half Moon Bay Art and Pumpkin Festival&lt;/a&gt;, which includes a giant pumpkin weigh-off competition.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;I called it "Quarter Sun Cove".&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;It's &lt;em&gt;absurdly&lt;/em&gt; cute.&lt;/p&gt;
&lt;p&gt;&lt;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 &amp;quot;Row 3 · Warty&amp;quot; with a &amp;quot;Cut 7 → barn&amp;quot; button, and a customer review at the bottom reads &amp;quot;★★★★★ Carried our pumpkin like a baby. It was heavier than the baby.&amp;quot;" style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;You can &lt;a href="https://simonw.github.io/pumpkin-farmer/"&gt;play the latest version here&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;Here's the &lt;a href="https://claude.ai/code/cshk_01V63sUyETi6UNbGUyjSYbHd13Mq93U6ty824Ha4eAxF4i"&gt;initial brainstorming session&lt;/a&gt;, which resulted in &lt;a href="https://github.com/simonw/pumpkin-farmer/blob/cdcf12083f403946b5c2a9e04312bbb42359bf58/SPEC.md"&gt;this spec file&lt;/a&gt;. Then I had Opus 5.5 Ultracode burn millions of tokens and nearly two days building it.&lt;/p&gt;
&lt;p&gt;I told Claude to "surprise and delight the user frequently" and the result is &lt;em&gt;so many&lt;/em&gt; 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 &lt;em&gt;sometimes&lt;/em&gt; come true.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h4 id="four-times-as-insulting"&gt;Four times as insulting&lt;/h4&gt;
&lt;p&gt;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 &lt;strong&gt;all of those at once&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt; I respect those opinions, even though I don’t strongly hold them myself.&lt;/p&gt;
&lt;p&gt;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. &lt;a href="https://www.ign.com/articles/steam-fans-are-begging-for-a-no-ai-filter-as-steam-next-fest-is-filled-with-slop"&gt;This IGN story&lt;/a&gt; covering complaints about slop in Valve's Steam Next Fest is a good recent example.&lt;/p&gt;
&lt;p&gt;We now have games where &lt;em&gt;everything&lt;/em&gt; - code, assets, dialog, and even the game design itself - can be outsourced to the models. And the results don't suck!&lt;/p&gt;
&lt;p&gt;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!&lt;/p&gt;
&lt;p&gt;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!&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h4 id="what-happens-if-someone-actually-puts-the-work-in-"&gt;What happens if someone actually puts the work in?&lt;/h4&gt;
&lt;p&gt;The thing I find both exciting and shameful about this is that I have got interesting results from &lt;em&gt;so little creative input&lt;/em&gt;. 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).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;I want to see games that wouldn't have existed without these new tools.&lt;/p&gt;
&lt;h4 id="you-should-build-a-game-"&gt;You should build a game!&lt;/h4&gt;
&lt;p&gt;Building games in this way is &lt;em&gt;so much fun&lt;/em&gt;. 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?&lt;/p&gt;
&lt;p&gt;(OK, you can do some damage... my attempt at audio-based multiplayer gave my wife Natalie &lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#update-online-multiplayer-support"&gt;a nasty headache&lt;/a&gt;!)&lt;/p&gt;
&lt;p&gt;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 &lt;a href="https://threejs.org"&gt;three.js&lt;/a&gt; and &lt;a href="https://github.com/phaserjs/phaser"&gt;Phaser&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;I suggest starting with a prompt like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Build a mobile-friendly three.js game where...&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This works on both &lt;a href="https://chatgpt.com/"&gt;chatgpt.com&lt;/a&gt; and &lt;a href="https://claude.ai"&gt;claude.ai&lt;/a&gt; - 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" &lt;a href="https://claude.ai/artifact/RRyEndXLSPQbcig3BgzgCZ"&gt;by Claude Opus 5.5 Extra&lt;/a&gt; and &lt;a href="https://squeak-and-seek-mouse-1027.simonw.chatgpt.site/"&gt;by GPT-6 Extra High&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Switch to Codex or Claude Code once your project passes the proof-of-concept phase.&lt;/p&gt;

&lt;p&gt;And if the game isn't fun enough, add this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Make it a LOT more fun&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="game-design"/><category term="games"/><category term="ai"/><category term="generative-ai"/><category term="chatgpt"/><category term="llms"/><category term="claude"/><category term="vibe-coding"/><category term="claude-code"/></entry><entry><title>Battle Drones - a vibe coded RTS with audio-based multiplayer</title><link href="https://simonwillison.net/2026/Oct/20/battledrones/" rel="alternate"/><published>2026-10-20T19:34:19+00:00</published><updated>2026-10-20T19:34:19+00:00</updated><id>https://simonwillison.net/2026/Oct/20/battledrones/</id><summary type="html">&lt;p&gt;My latest vibe coded game experiment is a Command &amp;amp; Conquer style RTS (Real Time Strategy) game called &lt;a href="https://github.com/simonw/battledrones#readme"&gt;Battle Drones&lt;/a&gt; (&lt;a href="https://simonw.github.io/battledrones/"&gt;play it here&lt;/a&gt;). Unlike &lt;a href="https://simonwillison.net/2026/Aug/5/raccoon-heist/"&gt;my previous experiments&lt;/a&gt;, this one is &lt;em&gt;actually fun to play&lt;/em&gt;. 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.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#battle-drones"&gt;Battle Drones&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#how-i-built-this"&gt;How I built this&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v1-the-initial-prototype"&gt;v1: the initial prototype&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v2-full-sprites"&gt;v2: full sprites&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v3-varied-terrain"&gt;v3: varied terrain&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v4-the-fun-update"&gt;v4: the fun update&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v5-battle-drones-goes-3d"&gt;v5: Battle Drones goes 3D&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v8-archipelago"&gt;v8: Archipelago&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v10-goliath-and-agent-battles"&gt;v10: Goliath, and agent battles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#agent-battles"&gt;Agent battles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v11-random-maps"&gt;v11: Random Maps&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#v12-multiplayer-via-sound"&gt;v12: Multiplayer via sound&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#some-thoughts"&gt;Some thoughts&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#update-online-multiplayer-support"&gt;Update: Online multiplayer support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="battle-drones"&gt;Battle Drones&lt;/h4&gt;
&lt;p&gt;My initial goal was to build an RTS game I could play on my phone, in the style of &lt;a href="https://en.wikipedia.org/wiki/Command_&amp;amp;_Conquer_(1995_video_game)"&gt;Command &amp;amp; Conquer&lt;/a&gt;. I have fond memories of the 1995 original (I liked Red Alert too) and wanted to recapture a little bit of the magic.&lt;/p&gt;
&lt;p&gt;After 12 major iterations (and &lt;a href="https://github.com/simonw/battledrones/commits/main/"&gt;321 commits&lt;/a&gt; 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. (&lt;strong&gt;Update&lt;/strong&gt;: also &lt;a href="https://simonwillison.net/2026/Oct/20/battledrones/#update-online-multiplayer-support"&gt;online multiplayer&lt;/a&gt;; the audio multiplayer induced headaches!)&lt;/p&gt;
&lt;p&gt;Here's a video demo of Battle Drones running in a desktop browser:&lt;/p&gt;

&lt;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;"
&gt; &lt;/video&gt;

&lt;p style="margin-top: 1em"&gt;Features so far include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;9 buildings, 7 ground vehicles, 6 aerial vehicles, 3 infantry units - all 3D models, which you can &lt;a href="https://simonw.github.io/battledrones/models.html"&gt;browse here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fog of war&lt;/li&gt;
&lt;li&gt;Different weapons are needed to target aerial or ground vehicles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Six maps&lt;/strong&gt;, across five biomes - temperate, desert, arctic, volcanic, tropical&lt;/li&gt;
&lt;li&gt;A random map generator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skirmish mode&lt;/strong&gt; - red vs. blue on a rotationally symmetrical map&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Last Stand mode&lt;/strong&gt; - one player holds out against as many waves of enemies as possible&lt;/li&gt;
&lt;li&gt;Area effect weapons: Barrage, EMP, Drop Pod, Sky Hammer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crate drops&lt;/strong&gt; with bonus resources&lt;/li&gt;
&lt;li&gt;In-game music that responds to events - it gets more intense as fighting breaks out&lt;/li&gt;
&lt;li&gt;Different in-game &lt;strong&gt;AI personalities&lt;/strong&gt; (Balanced, Rush, Air Swarm, Boom, Skyforce, Ironclad)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI vs. AI&lt;/strong&gt; mode, to watch those personalities play each other&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Goliath&lt;/strong&gt; - a giant stomping mech with laser eyes and arm cannons and the ability to establish a new base&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutators&lt;/strong&gt; that add extra rules or twists&lt;/li&gt;
&lt;li&gt;A "Daily Op" challenge&lt;/li&gt;
&lt;li&gt;Ranks and achievements (&lt;strong&gt;Medals&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent vs. Agent&lt;/strong&gt; mode where two LLMs can play Battle Drones against each other&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;multiplayer mode&lt;/strong&gt; based on two nearby phones communicating via audio messages, an extension of my earlier experiment with &lt;a href="https://simonwillison.net/2026/Oct/15/chirp-pong/"&gt;Chirp Pong&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="how-i-built-this"&gt;How I built this&lt;/h4&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Here's a rough history of the project so far, including key prompts and links to transcripts.&lt;/p&gt;
&lt;h4 id="v1-the-initial-prototype"&gt;v1: the initial prototype&lt;/h4&gt;
&lt;p&gt;I started out with Claude Fable 5 back in July:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Let's start with a MVP design, ask me some questions&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's a &lt;a href="https://claude.ai/code/session_015RYeKm4ji4N16oqthyX1b1"&gt;shared transcript&lt;/a&gt;. I'd given Claude Code for Web an environment variable with an OpenAI API key and told it to use the OpenAI &lt;a href="https://developers.openai.com/api/docs/guides/image-generation"&gt;Image Generation API&lt;/a&gt; for assets, which got me some basic sprites.&lt;/p&gt;
&lt;p&gt;You can &lt;a href="https://simonw.github.io/battledrones/v1/"&gt;try v1 here&lt;/a&gt; - it looked like this:&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;It's recognizable as an RTS, has building mechanics and the ability to select and direct units, and a basic AI to play against.&lt;/p&gt;

&lt;p&gt;This first version was barely a proof of concept, and it wasn't any fun to play.&lt;/p&gt;
&lt;p&gt;Claude used the &lt;a href="https://github.com/phaserjs/phaser"&gt;Phaser&lt;/a&gt; 2D game framework for these early versions. I didn't even realize this until several iterations later!&lt;/p&gt;
&lt;h4 id="v2-full-sprites"&gt;v2: full sprites&lt;/h4&gt;
&lt;p&gt;The second version (&lt;a href="https://simonw.github.io/battledrones/v2/"&gt;try v2 here&lt;/a&gt;) 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.&lt;/p&gt;
&lt;p&gt;Claude proved reasonably competent at prompting OpenAI's image models to generate sprites. You can browse the v2 sprites in the &lt;a href="https://github.com/simonw/battledrones/tree/v2/public/assets/sprites"&gt;public/assets/sprites&lt;/a&gt; folder.&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;h4 id="v3-varied-terrain"&gt;v3: varied terrain&lt;/h4&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This resulted in five new maps with generated background tiles in a variety of styles, &lt;a href="https://github.com/simonw/battledrones/commit/aa22f08a34347d7d9f94b33f44a73b4deb046aa1"&gt;visible here&lt;/a&gt;. Opus also regenerated the sprites, making them much more visually appealing. You can &lt;a href="https://simonw.github.io/battledrones/v3/"&gt;try v3 here&lt;/a&gt; - it looks like this:&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h4 id="v4-the-fun-update"&gt;v4: the fun update&lt;/h4&gt;
&lt;p&gt;So far my Battle Drones experiment was confirming my &lt;a href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.059.webp"&gt;previous belief&lt;/a&gt; that coding agents can build a thing that looks like a game but can't actually make something that's genuinely compelling to play.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;This game isn't fun enough yet. Make it a LOT more fun.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This time I was running in &lt;a href="https://code.claude.com/docs/en/workflows"&gt;Ultracode mode&lt;/a&gt;, where Claude Code (in this case Claude Code for Web) runs "dynamic workflows", described in their docs as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A dynamic workflow is a JavaScript script that orchestrates many &lt;a href="https://code.claude.com/docs/en/sub-agents"&gt;subagents&lt;/a&gt; at once.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This kicked off &lt;em&gt;many hours&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;You can &lt;a href="https://simonw.github.io/battledrones/v4/"&gt;try v4 here&lt;/a&gt; - it looks like this:&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;I had Claude &lt;a href="https://github.com/simonw/battledrones/blob/main/Battle%20Drones%20The%20Fun%20Update%20%E2%80%94%20Release%20Notes.md"&gt;write its own release notes&lt;/a&gt; - here are the highlights:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Openers&lt;/strong&gt;: pick Blitz, Industry or Air Wing before the clock starts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call-down powers&lt;/strong&gt;: Barrage, EMP, Drop Pod and the Sky Hammer orbital strike.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Objectives and salvage&lt;/strong&gt;: Uplink relays, supply drops and wrecks worth scrap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feel&lt;/strong&gt;: combat juice, adaptive music, unit voices and an announcer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command&lt;/strong&gt;: battle alerts, game speed, saved squads and touch placement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New modes&lt;/strong&gt;: Last Stand survival waves and an 8-mission Ops campaign.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progression&lt;/strong&gt;: heroes, an after-action report with awards, a career, 7 mutators and a Daily Op.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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%.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h4 id="v5-battle-drones-goes-3d"&gt;v5: Battle Drones goes 3D&lt;/h4&gt;
&lt;p&gt;After the success of Ultracode at "Make it a LOT more fun", I decided to be more ambitious:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Port this game to three.js with 3D models for all of the buildings and vehicles and landscapes&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was another overnight run. I woke up to &lt;a href="https://simonw.github.io/battledrones/v5/"&gt;this v5 version&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;The new 3D models were entirely constructed by Claude in TypeScript code.&lt;/p&gt;
&lt;p&gt;v6 (&lt;a href="https://simonw.github.io/battledrones/v6/"&gt;play v6 here&lt;/a&gt;) added some more visual polish. v7 (&lt;a href="https://simonw.github.io/battledrones/v7/"&gt;play v7&lt;/a&gt;) added robot infantry (troopers, rocket squads, snipers) and a "Condor" troop carrying aircraft.&lt;/p&gt;
&lt;h4 id="v8-archipelago"&gt;v8: Archipelago&lt;/h4&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This resulted in my longest prompt yet:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Design a new map. Goal is to make different strategic incentives that encourage use of Infantry and Condors and aerial vehicles.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;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.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;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.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;The two HQs should be entirely separated by water, but still accessible by vehicles thanks to two bridges across the map in different places&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;I want to encourage a battle over uplinks.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;The map should be the times the size of other maps - still square&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;First research and then critique this design. Only build after we have agreed on any modifications&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;You get to design a new biome for this&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The result was the tropical &lt;strong&gt;Archipelago&lt;/strong&gt; 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 &lt;a href="https://simonw.github.io/battledrones/v9/"&gt;v9 edition&lt;/a&gt; made that map a little more interesting - it now looks like this:&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;h4 id="v10-goliath-and-agent-battles"&gt;v10: Goliath, and agent battles&lt;/h4&gt;
&lt;p&gt;I decided to add giant robot mechs to the game - think Jaegers from &lt;a href="https://en.wikipedia.org/wiki/Pacific_Rim_(film)#Plot"&gt;Pacific Rim&lt;/a&gt;, or Titans from Warhammer 40,000.&lt;/p&gt;
&lt;p&gt;Here are some of the prompts I used to brainstorm with Claude:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;[...] Lets do two condors can carry the mech&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The end result is &lt;em&gt;really cool&lt;/em&gt;.&lt;/p&gt;

&lt;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"
&gt;
  &lt;source src="https://static.simonwillison.net/static/2026/goliath.mp4" type="video/mp4" /&gt;
  Your browser does not support HTML video.
&lt;/video&gt;

&lt;p style="margin-top: 1em"&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Two Condor aircraft can hook onto a Goliath, at which point it can be flown around the map!&lt;/p&gt;
&lt;p&gt;The game now ends when you destroy the enemy's HQ building &lt;em&gt;and&lt;/em&gt; any Goliaths they might have built.&lt;/p&gt;
&lt;p&gt;There are also a couple of mutators relating to Goliaths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Goliath Armada&lt;/strong&gt; starts each side with four airborne Goliaths (each with a pair of Condors) and no other units.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robot Love&lt;/strong&gt; 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).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="agent-battles"&gt;Agent battles&lt;/h4&gt;
&lt;p&gt;The other v10 feature is &lt;strong&gt;agent battles&lt;/strong&gt;. In musing about how multiplayer could work I had an idea: what if different LLMs could fight it out in the game?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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 [...]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Consult ~/dev/llm/docs and include notes in that file about how LLM could be used here via a new tools plugin&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Opus 5.5 went to work on this, producing &lt;a href="https://github.com/simonw/battledrones/blob/7001ed186c8b8aef4acb27f680ecf4c09b607e54/AGENT-BATTLES.md"&gt;this AGENT-BATTLES.md proposal&lt;/a&gt; and then implementing and testing it. The feature also includes the ability to record and replay these battles - here's &lt;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"&gt;a replay of Claude Haiku 5.5 vs. GPT-6 Luna&lt;/a&gt;, and here's that same battle &lt;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"&gt;in a separate debug tool&lt;/a&gt; that shows the underlying prompt responses.&lt;/p&gt;
&lt;p&gt;&lt;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, &amp;quot;6:27&amp;quot;, &amp;quot;1×&amp;quot;, &amp;quot;anthropic/claude-haiku-5-5 · industry&amp;quot; in blue, &amp;quot;gpt-6-luna · industry&amp;quot; in red, a blue-and-red strength bar labeled &amp;quot;B&amp;quot; and &amp;quot;R&amp;quot;, and &amp;quot;0:03&amp;quot;. Left notification: &amp;quot;Blue: Pushing turrets at the enemy's south-east edge.&amp;quot; Replay panel: &amp;quot;Blue anthropic/claude-haiku-5-5 · industry vs Red gpt-6-luna · industry · frostbite seed 42&amp;quot;, a timeline slider at &amp;quot;6:27 / 7:48&amp;quot;, and buttons &amp;quot;−30s&amp;quot;, &amp;quot;+30s&amp;quot;, &amp;quot;All&amp;quot;, &amp;quot;Blue's eyes&amp;quot;, &amp;quot;Red's eyes&amp;quot;, &amp;quot;Notes&amp;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;The prompt that drives agent battles &lt;a href="https://github.com/simonw/battledrones/blob/d584e351d9d28c4ba058b78ddcca9b93cd9bcd33/llm-tools-battledrones/llm_tools_battledrones.py#L106-L117"&gt;can be seen here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are a few more replays like this &lt;a href="https://github.com/simonw/battledrones/blob/main/README.md#watch-ai-models-play-it"&gt;linked in the README&lt;/a&gt;. I hope to turn this into a full league table at some point in the future.&lt;/p&gt;
&lt;h4 id="v11-random-maps"&gt;v11: Random Maps&lt;/h4&gt;
&lt;p&gt;This version exists purely because I glanced at my &lt;a href="https://claude.ai/new#settings/usage"&gt;Claude Usage&lt;/a&gt; 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:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's &lt;a href="https://claude.ai/code/session_01CfwMwDaK1kLKnRV6di8VMT"&gt;the transcript&lt;/a&gt;, and an image Claude generated to show me its work:&lt;/p&gt;
&lt;p&gt;&lt;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: &amp;quot;Battle Drones: generated maps (108x108, point-symmetric), 2 per biome, runtime ground painter&amp;quot;. Each map is captioned with a name and layout type plus a seed and crossing counts, e.g. &amp;quot;Hawthorn Delta · fork&amp;quot; &amp;quot;random-temperate-1x8a6r2 · 6 bridges, 4 fords&amp;quot;; layout types are fork, badlands, crossing and lake." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;h4 id="v12-multiplayer-via-sound"&gt;v12: Multiplayer via sound&lt;/h4&gt;
&lt;p&gt;I only &lt;em&gt;just&lt;/em&gt; 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!&lt;/p&gt;
&lt;p&gt;This feature started out as my &lt;a href="https://simonwillison.net/2026/Oct/15/chirp-pong/"&gt;Chirp Pong&lt;/a&gt; experiment from last week. I pointed Claude Code at that working proof of concept:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Build a version of that for battledrones&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Opus built &lt;a href="https://simonw.github.io/battledrones/radio-probe.html"&gt;this Radio Probe tool&lt;/a&gt; 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!&lt;/p&gt;
&lt;p&gt;Why use sound for this? Because I &lt;a href="https://simonwillison.net/2025/Dec/10/html-tools/#the-anatomy-of-an-html-tool"&gt;love static HTML&lt;/a&gt; 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.&lt;/p&gt;
&lt;h4 id="some-thoughts"&gt;Some thoughts&lt;/h4&gt;
&lt;p&gt;I know almost &lt;em&gt;nothing&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.&lt;/p&gt;
&lt;p&gt;This morning (&lt;a href="https://news.ycombinator.com/item?id=50168190"&gt;via Hacker News&lt;/a&gt;) I found &lt;a href="https://www.ign.com/articles/steam-fans-are-begging-for-a-no-ai-filter-as-steam-next-fest-is-filled-with-slop"&gt;Steam Fans Are Begging for a No-AI Filter as Steam Next Fest Is Filled With Slop&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;... 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).&lt;/p&gt;
&lt;p&gt;I'd love to see what someone with better taste than me and a driving passion to produce something truly exceptional could build!&lt;/p&gt;
&lt;p&gt;A few other observations from this project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Static HTML and JavaScript is a fantastic medium for games development. WebGL works great, and &lt;a href="https://github.com/mrdoob/three.js/"&gt;Three.js&lt;/a&gt; (and &lt;a href="https://github.com/phaserjs/phaser"&gt;Phaser&lt;/a&gt; before it) are excellent platforms to build on that the current models know inside out.&lt;/li&gt;
&lt;li&gt;This also lets them run as &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps"&gt;Progressive Web Apps&lt;/a&gt; - 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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Opus 5.5 is spectacular at 3D modeling using Three.js (and Blender, and no doubt other 3D applications as well). The &lt;a href="https://til.simonwillison.net/llms/blender-coding-agents-macos"&gt;same is true&lt;/a&gt; of GPT-6 Astra. They are absolutely capable of building models for 3D game projects.&lt;/li&gt;
&lt;li&gt;For features like replay and multiplayer it's useful to have a deterministic simulation engine. At one point Claude had to replace calls to &lt;code&gt;Math.sin()&lt;/code&gt; and &lt;code&gt;Math.cos()&lt;/code&gt; and friends with &lt;a href="https://github.com/simonw/battledrones/blob/v12/src/sim/fmath.ts"&gt;custom versions&lt;/a&gt; because different browsers (Chrome vs. Safari, for example) returned very slightly different numbers, desynchronizing the replay.&lt;/li&gt;
&lt;li&gt;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 &lt;a href="https://simonwillison.net/2026/Oct/6/scrimshaw-jukebox/"&gt;Scrimshaw Jukebox&lt;/a&gt; for a previous experiment with Claude for music composition.&lt;/li&gt;
&lt;li&gt;I still can't get over how well the prompt "Make it a LOT more fun" worked.&lt;/li&gt;
&lt;li&gt;Tools are effectively free. I prompted up the &lt;a href="https://simonw.github.io/battledrones/radio-probe.html"&gt;Radio Probe&lt;/a&gt;, the &lt;a href="https://simonw.github.io/battledrones/models.html"&gt;Model browser&lt;/a&gt;, the &lt;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"&gt;Agent vs. Agent debug tool&lt;/a&gt;, and Claude Code &lt;a href="https://github.com/simonw/battledrones/tree/main/tools"&gt;built a bunch of tools&lt;/a&gt; for itself that I haven't even explored myself.&lt;/li&gt;
&lt;li&gt;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 &lt;a href="https://github.com/AlonHor/siner"&gt;Siner&lt;/a&gt; by Alon Horesh and &lt;a href="https://github.com/ggerganov/ggwave"&gt;ggwave&lt;/a&gt; by Georgi Gerganov (also of &lt;code&gt;llama.cpp&lt;/code&gt; fame).&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;I'm still not quite over the &lt;em&gt;guilt&lt;/em&gt; 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.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="update-online-multiplayer-support"&gt;Update: Online multiplayer support&lt;/h4&gt;
&lt;p&gt;Earlier in this article I said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then I tried playing the multiplayer version with Natalie... and the high pitched modem sounds gave her a nasty headache!&lt;/p&gt;
&lt;p&gt;That's a pretty bad bug. I &lt;a href="https://github.com/simonw/battledrones/pull/36"&gt;added a warning&lt;/a&gt; and was then inspired to build proper network multiplayer. I tried &lt;a href="https://github.com/simonw/battledrones/pull/37"&gt;getting WebRTC to work&lt;/a&gt; but couldn't get a connection going between two of my own devices even on my own WiFi network, so &lt;a href="https://github.com/simonw/battledrones/pull/38"&gt;I had Claude build&lt;/a&gt; a simple, stateless WebSockets relay server instead:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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?&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's &lt;a href="https://github.com/simonw/battledrones/tree/v13/relay"&gt;the resulting server&lt;/a&gt;. Since this scales to zero and runs on a single &lt;a href="https://fly.io/"&gt;Fly.io&lt;/a&gt; &lt;code&gt;shared-cpu-1x&lt;/code&gt; instance it should cost me no more than $2.19/month - and that's if it stays hot and serving connections the whole time.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;I didn't expect to introduce online multiplayer this soon, but the headache bug felt like it warranted an urgent alternative.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="game-design"/><category term="projects"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="claude"/><category term="vibe-coding"/><category term="coding-agents"/><category term="claude-code"/></entry><entry><title>Hello Python 3.15, goodbye 3.10, and now I can use 3.11</title><link href="https://simonwillison.net/2026/Oct/12/python-3-15/" rel="alternate"/><published>2026-10-12T18:15:38+00:00</published><updated>2026-10-12T18:15:38+00:00</updated><id>https://simonwillison.net/2026/Oct/12/python-3-15/</id><summary type="html">&lt;p&gt;Python 3.15 &lt;a href="https://www.python.org/downloads/release/python-3150/"&gt;is here&lt;/a&gt;! Here's the essential &lt;a href="https://docs.python.org/3.15/whatsnew/3.15.html"&gt;What's new in Python 3.15&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;First, some highlights from Python 3.15.&lt;/p&gt;
&lt;h4 id="explicit-lazy-imports"&gt;Explicit lazy imports&lt;/h4&gt;
&lt;p&gt;I'm most excited about &lt;a href="https://docs.python.org/3.15/whatsnew/3.15.html#pep-810-explicit-lazy-imports"&gt;Explicit lazy imports&lt;/a&gt; from &lt;a href="https://peps.python.org/pep-0810/"&gt;PEP 810&lt;/a&gt;. These let you import modules like so:&lt;/p&gt;
&lt;pre&gt;&lt;span class="pl-s1"&gt;lazy&lt;/span&gt; &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;json&lt;/span&gt;
&lt;span class="pl-s1"&gt;lazy&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s1"&gt;pathlib&lt;/span&gt; &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-v"&gt;Path&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The module will then be imported the first time those symbols are used in the code that follows.&lt;/p&gt;
&lt;p&gt;My &lt;a href="https://llm.datasette.io/"&gt;LLM&lt;/a&gt; CLI tool implements plugins. I had to &lt;a href="https://llm.datasette.io/en/stable/plugins/advanced-model-plugins.html#tip-lazily-load-expensive-dependencies"&gt;recommend manual lazy imports&lt;/a&gt; in the plugin author documentation, because simply installing plugins that used heavy dependencies such as &lt;code&gt;sentence_transformers&lt;/code&gt; could add multiple seconds to every invocation of the &lt;code&gt;llm&lt;/code&gt; command. Lazy imports directly address this startup cost.&lt;/p&gt;
&lt;h4 id="unpacking-in-comprehensions"&gt;Unpacking in comprehensions&lt;/h4&gt;
&lt;p&gt;The new &lt;code&gt;[*sublist for sublist in lists]&lt;/code&gt; unpacking syntax is neat. Here's an illustration &lt;a href="https://docs.python.org/3.15/whatsnew/3.15.html#pep-798-unpacking-in-comprehensions"&gt;lifted from the documentation&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;span class="pl-s1"&gt;lists&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; [[&lt;span class="pl-c1"&gt;1&lt;/span&gt;, &lt;span class="pl-c1"&gt;2&lt;/span&gt;], [&lt;span class="pl-c1"&gt;3&lt;/span&gt;, &lt;span class="pl-c1"&gt;4&lt;/span&gt;], [&lt;span class="pl-c1"&gt;5&lt;/span&gt;]]
[&lt;span class="pl-c1"&gt;*&lt;/span&gt;&lt;span class="pl-c1"&gt;L&lt;/span&gt; &lt;span class="pl-k"&gt;for&lt;/span&gt; &lt;span class="pl-c1"&gt;L&lt;/span&gt; &lt;span class="pl-c1"&gt;in&lt;/span&gt; &lt;span class="pl-s1"&gt;lists&lt;/span&gt;]
&lt;span class="pl-c"&gt;# [1, 2, 3, 4, 5]&lt;/span&gt;
&lt;span class="pl-c"&gt;# equivalent to [x for L in lists for x in L]&lt;/span&gt;

&lt;span class="pl-s1"&gt;sets&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; [{&lt;span class="pl-c1"&gt;1&lt;/span&gt;, &lt;span class="pl-c1"&gt;2&lt;/span&gt;}, {&lt;span class="pl-c1"&gt;2&lt;/span&gt;, &lt;span class="pl-c1"&gt;3&lt;/span&gt;}, {&lt;span class="pl-c1"&gt;3&lt;/span&gt;, &lt;span class="pl-c1"&gt;4&lt;/span&gt;}]
{&lt;span class="pl-c1"&gt;*&lt;/span&gt;&lt;span class="pl-s1"&gt;s&lt;/span&gt; &lt;span class="pl-k"&gt;for&lt;/span&gt; &lt;span class="pl-s1"&gt;s&lt;/span&gt; &lt;span class="pl-c1"&gt;in&lt;/span&gt; &lt;span class="pl-s1"&gt;sets&lt;/span&gt;}
&lt;span class="pl-c"&gt;# {1, 2, 3, 4}&lt;/span&gt;
&lt;span class="pl-c"&gt;# equivalent to {x for s in sets for x in s}&lt;/span&gt;

&lt;span class="pl-s1"&gt;dicts&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; [{&lt;span class="pl-s"&gt;'a'&lt;/span&gt;: &lt;span class="pl-c1"&gt;1&lt;/span&gt;}, {&lt;span class="pl-s"&gt;'b'&lt;/span&gt;: &lt;span class="pl-c1"&gt;2&lt;/span&gt;}, {&lt;span class="pl-s"&gt;'a'&lt;/span&gt;: &lt;span class="pl-c1"&gt;3&lt;/span&gt;}]
{&lt;span class="pl-c1"&gt;**&lt;/span&gt;&lt;span class="pl-s1"&gt;d&lt;/span&gt; &lt;span class="pl-s1"&gt;for&lt;/span&gt; &lt;span class="pl-s1"&gt;d&lt;/span&gt; &lt;span class="pl-c1"&gt;in&lt;/span&gt; &lt;span class="pl-s1"&gt;dicts&lt;/span&gt;}
&lt;span class="pl-c"&gt;# {'a': 3, 'b': 2}&lt;/span&gt;
&lt;span class="pl-c"&gt;# equivalent to {k: v for d in dicts for k,v in d.items()}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://peps.python.org/pep-0798/"&gt;PEP 798: Unpacking in Comprehensions&lt;/a&gt; by Adam Hartz and Erik Demaine proposed this as an extension of the unpacking syntax &lt;a href="https://peps.python.org/pep-0448/"&gt;from PEP 448&lt;/a&gt;, which landed &lt;a href="https://docs.python.org/3/whatsnew/3.5.html#pep-448-additional-unpacking-generalizations"&gt;in Python 3.5&lt;/a&gt; back in 2015.&lt;/p&gt;
&lt;h4 id="a-sampling-profiler"&gt;A sampling profiler&lt;/h4&gt;
&lt;p&gt;Python's existing tracing profiler has been renamed from &lt;code&gt;cProfile&lt;/code&gt; to &lt;a href="https://docs.python.org/3.15/library/profiling.tracing.html#module-profiling.tracing"&gt;profiling.tracing&lt;/a&gt;, and has been joined by an exciting new sampling profiler called Tachyon, aka &lt;a href="https://docs.python.org/3.15/whatsnew/3.15.html#tachyon-high-frequency-statistical-sampling-profiler"&gt;profiling.sampling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;I've &lt;a href="https://simonwillison.net/tags/profiling/"&gt;previously used tools&lt;/a&gt; like &lt;a href="https://github.com/benfred/py-spy"&gt;py-spy&lt;/a&gt; for this. Now this capability is baked into the standard library.&lt;/p&gt;
&lt;p&gt;If you have the PID of an existing Python 3.15 process you can start gathering samples by running this (I had to use &lt;code&gt;sudo&lt;/code&gt; on macOS):&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;sudo uv run --python 3.15 python -m profiling.sampling attach 1234&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Interact with the main program a bit, then hit Ctrl+C to stop gathering and see a report, which looks something like this:&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;It can also produce &lt;a href="https://simonw.github.io/research/python-3-15-web-edit-profiling/artifacts/flamegraph.html"&gt;flame graphs like this&lt;/a&gt; and &lt;a href="https://simonw.github.io/research/python-3-15-web-edit-profiling/artifacts/heatmap/index.html"&gt;heat maps like this&lt;/a&gt;, and can even output a format that can be viewed in the Firefox profiler UI.&lt;/p&gt;
&lt;h4 id="3-15-isn-t-much-faster-than-3-14"&gt;3.15 isn't much faster than 3.14&lt;/h4&gt;
&lt;p&gt;Miguel Grinberg investigated &lt;a href="https://blog.miguelgrinberg.com/post/how-fast-is-python-3-15"&gt;How fast is Python 3.15?&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Miguel's &lt;a href="https://blog.miguelgrinberg.com/post/python-3-14-is-here-how-fast-is-it"&gt;explorations of 3.14&lt;/a&gt; last year found significant boosts against Python 3.13 across many more categories.&lt;/p&gt;
&lt;h4 id="upgrading-to-python-3-15-with-uv"&gt;Upgrading to Python 3.15 with uv&lt;/h4&gt;
&lt;p&gt;I used the following sequence of commands to get &lt;code&gt;uv&lt;/code&gt; to use Python 3.15 on my Mac. First I had to upgrade &lt;code&gt;uv&lt;/code&gt; itself to ensure it knew about the new release:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;uv self update&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I installed the stable 3.15 release:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;uv python install 3.15&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And told &lt;code&gt;uv&lt;/code&gt; that I wanted that to be the default for every &lt;code&gt;uv run&lt;/code&gt; command, unless the project itself pinned a different version:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;uv python pin --global 3.15&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now the following reports 3.15 as the version:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;uv run python --version&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I already have a bunch of tools installed using &lt;code&gt;uv tool install&lt;/code&gt;. I reinstalled them to use Python 3.15 like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;uv tool upgrade datasette --python 3.15&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I can confirm the version like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;datasette --get /-/versions.json &lt;span class="pl-k"&gt;|&lt;/span&gt; jq&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id="highlights-from-python-3-11"&gt;Highlights from Python 3.11&lt;/h4&gt;
&lt;p&gt;The release of 3.15 means that Python 3.10 (released in 2021) is officially &lt;a href="https://devguide.python.org/versions/"&gt;no longer supported&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Here's the &lt;a href="https://docs.python.org/3/whatsnew/3.11.html"&gt;What's new in Python 3.11&lt;/a&gt; document. I finally get to rely on &lt;a href="https://docs.python.org/3/library/tomllib.html#module-tomllib"&gt;tomllib&lt;/a&gt; being available!&lt;/p&gt;
&lt;p&gt;Datasette makes extensive use of &lt;code&gt;asyncio&lt;/code&gt;. 3.11 adds &lt;a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.TaskGroup"&gt;TaskGroup&lt;/a&gt; and &lt;a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.timeout"&gt;timeout()&lt;/a&gt;, and &lt;a href="https://docs.python.org/3/whatsnew/3.11.html#asyncio"&gt;several more&lt;/a&gt; new features.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;datetime.UTC&lt;/code&gt; is a new in 3.11 alias for &lt;code&gt;datetime.timezone.utc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Python's SQLite support got some significant upgrades in 3.11, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.setlimit"&gt;setlimit()&lt;/a&gt; and &lt;a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.getlimit"&gt;getlimit()&lt;/a&gt; expose a mechanism for setting &lt;a href="https://www.sqlite.org/c3ref/c_limit_attached.html"&gt;SQLite runtime limits&lt;/a&gt; from Python.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.create_window_function"&gt;create_window_function()&lt;/a&gt; lets us create custom window functions in Python, as a class with &lt;code&gt;step()&lt;/code&gt;, &lt;code&gt;value()&lt;/code&gt;, &lt;code&gt;inverse()&lt;/code&gt;, and &lt;code&gt;finalize()&lt;/code&gt; methods.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.blobopen"&gt;blobopen()&lt;/a&gt; provides an efficient mechanism for partial reads and writes of large &lt;code&gt;BLOB&lt;/code&gt; binary values stored in a SQLite row.&lt;/li&gt;
&lt;li&gt;You can now call &lt;code&gt;set_authorizer(None)&lt;/code&gt; to remove a SQLite authorizer. Datasette had a workaround for this!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Plus a whole bunch of &lt;a href="https://docs.python.org/3/whatsnew/3.11.html#new-feat-related-type-hints-311"&gt;improvements to Python's typing system&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I plan to land Python 3.11 improvements to a bunch of my projects over the next few weeks. Here's &lt;a href="https://github.com/simonw/datasette/pull/2998"&gt;my first Datasette PR&lt;/a&gt; removing that &lt;code&gt;set_authorizer(None)&lt;/code&gt; workaround.&lt;/p&gt;
&lt;p&gt;I've also updated my &lt;a href="https://github.com/simonw/click-app"&gt;click-app&lt;/a&gt;, &lt;a href="https://github.com/simonw/datasette-plugin"&gt;datasette-plugin&lt;/a&gt;, &lt;a href="https://github.com/simonw/python-lib"&gt;python-lib&lt;/a&gt;, and &lt;a href="https://github.com/simonw/llm-plugin"&gt;llm-plugin&lt;/a&gt; cookiecutter templates to test against Python 3.11 through Python 3.15.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="open-source"/><category term="profiling"/><category term="python"/><category term="sqlite"/><category term="uv"/></entry><entry><title>A new feature for my blog, built using my voice</title><link href="https://simonwillison.net/2026/Oct/9/built-using-my-voice/" rel="alternate"/><published>2026-10-09T12:54:06+00:00</published><updated>2026-10-09T12:54:06+00:00</updated><id>https://simonwillison.net/2026/Oct/9/built-using-my-voice/</id><summary type="html">&lt;p&gt;I shipped a new feature for my blog today: the &lt;a href="https://simonwillison.net/newsletters/"&gt;Newsletters&lt;/a&gt; page, which offers an index of all of the newsletters I've sent out, both my free &lt;a href="https://simonw.substack.com/"&gt;weekly Substack&lt;/a&gt; and my &lt;a href="https://github.com/sponsors/simonw/"&gt;monthly sponsors-only&lt;/a&gt; updates. I built the feature almost entirely using my voice, chatting away to my laptop while I cooked dinner.&lt;/p&gt;
&lt;h4 id="codex-voice-mode"&gt;Codex voice mode&lt;/h4&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;I started the session against my local &lt;a href="https://github.com/simonw/simonwillisonblog"&gt;simonwillisonblog&lt;/a&gt; checkout by typing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Start dev server and open in browser&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Then I clicked the "Start new voice chat" button - that's &lt;em&gt;not&lt;/em&gt; 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.&lt;/p&gt;
&lt;h4 id="talking-to-my-computer"&gt;Talking to my computer&lt;/h4&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Here's an extract of my voice transcript that was captured by Codex:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apparently this was clear enough that the model knew what I wanted to build! You can read the full transcript, &lt;a href="https://en.wikipedia.org/wiki/Speech_disfluency"&gt;disfluencies&lt;/a&gt; and all, &lt;a href="https://gist.github.com/simonw/a65a22204f6f7228cc59b4bc34d7c7c8"&gt;in this Gist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h4 id="what-we-built"&gt;What we built&lt;/h4&gt;
&lt;p&gt;We got a surprisingly long way entirely by voice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new model and migration to represent imported newsletters in Django, plus Django Admin configuration for that&lt;/li&gt;
&lt;li&gt;Four working imports:
&lt;ul&gt;
&lt;li&gt;The most recent Substack items via RSS&lt;/li&gt;
&lt;li&gt;Every other Substack item via their undocumented API, which GPT-6 Astra knew about (it tried &lt;code&gt;/api/v1/archive&lt;/code&gt; directly) and then ran a search to figure out how to paginate it and found &lt;a href="https://wonderingaboutai.substack.com/p/i-connected-my-newsletter-archive"&gt;this article&lt;/a&gt; by Karen Spinner&lt;/li&gt;
&lt;li&gt;All of my published monthly newsletters from my &lt;a href="https://github.com/simonw/monthly-newsletter-archive"&gt;simonw/monthly-newsletter-archive&lt;/a&gt; GitHub repository&lt;/li&gt;
&lt;li&gt;My most recent private sponsors-only newsletter from a private repository&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://simonwillison.net/newsletters/"&gt;/newsletters/&lt;/a&gt; and &lt;a href="https://simonwillison.net/newsletters/2026/"&gt;/newsletters/2026/&lt;/a&gt; public archive pages&lt;/li&gt;
&lt;li&gt;Newsletters showing up on day and month archive pages too, but not on tag pages or my homepage&lt;/li&gt;
&lt;li&gt;Weekly Substack newsletters link to Substack; archived monthly newsletters have their own pages&lt;/li&gt;
&lt;li&gt;Integration with my site search engine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was &lt;em&gt;almost&lt;/em&gt; 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.&lt;/p&gt;
&lt;h4 id="finishing-it-with-a-review"&gt;Finishing it with a review&lt;/h4&gt;
&lt;p&gt;Once I had finished cooking and judged it mostly feature-complete, I had Codex create a branch and open a pull request.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;You can see the changes I made during the review &lt;a href="https://github.com/simonw/simonwillisonblog/pull/719"&gt;in the extra commits on the PR&lt;/a&gt;. 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.&lt;/p&gt;
&lt;h4 id="the-end-result"&gt;The end result&lt;/h4&gt;
&lt;p&gt;You can see the end result at the new &lt;a href="https://simonwillison.net/newsletters/"&gt;newsletters index page&lt;/a&gt;, or view the &lt;a href="https://simonwillison.net/newsletters/monthly-2026-08-august/"&gt;page for a previous monthly newsletter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;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%;" /&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h4 id="better-for-multi-tasking-than-as-a-daily-driver"&gt;Better for multi-tasking than as a daily driver&lt;/h4&gt;
&lt;p&gt;OpenAI &lt;em&gt;love&lt;/em&gt; using voice-driven demos like this one for &lt;a href="https://simonwillison.net/2026/Sep/29/openai-devday-2026-live-blog/#live-update-504"&gt;things like DevDay&lt;/a&gt; - and they do work well in that environment. I don't think this is going to be a daily driver for me though.&lt;/p&gt;
&lt;p&gt;I've &lt;a href="https://simonwillison.net/search/?q=walking+dog"&gt;written before&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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!&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="text-to-speech"/><category term="ai"/><category term="openai"/><category term="generative-ai"/><category term="llms"/><category term="newsletter"/><category term="coding-agents"/><category term="codex"/><category term="speech-to-text"/><category term="site-upgrades"/></entry><entry><title>Claude Haiku 5.5</title><link href="https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/" rel="alternate"/><published>2026-10-07T20:56:21+00:00</published><updated>2026-10-07T20:56:21+00:00</updated><id>https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/</id><summary type="html">&lt;p&gt;As previously &lt;a href="https://simonwillison.net/2026/Sep/28/claude-sonnet-5-5/"&gt;promised&lt;/a&gt;, here's Anthropic's new fast, low cost model: &lt;a href="https://www.anthropic.com/claude-haiku-5-5"&gt;Introducing Claude Haiku 5.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The previous Haiku, 4.5, was very much showing its age. It came out &lt;a href="https://simonwillison.net/2025/Oct/15/claude-haiku-45/"&gt;almost a year ago&lt;/a&gt;, 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 &lt;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"&gt;GPT-6 Luna&lt;/a&gt;, released last month.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Haiku 5.5 also uses a new, less generous tokenizer. My &lt;a href="https://tools.simonwillison.net/claude-token-counter"&gt;Claude Token Counter&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/simonw/llm-anthropic/releases/tag/0.30"&gt;most recent release of llm-anthropic&lt;/a&gt; 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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="pelicans"&gt;Pelicans&lt;/h4&gt;
&lt;p&gt;Here are &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81"&gt;pelicans for low, medium, high, xhigh, and max&lt;/a&gt;. The new Haiku doesn't let you disable reasoning, and defaults to &lt;code&gt;medium&lt;/code&gt;. I got a good bicycle frame for everything beyond &lt;code&gt;low&lt;/code&gt;. The &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81#response"&gt;low effort pelican&lt;/a&gt; cost 0.0936 cents and took 7 seconds.&lt;/p&gt;&lt;p&gt;This &lt;code&gt;max&lt;/code&gt; effort pelican (with &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81#reasoning-3"&gt;a reasoning trace&lt;/a&gt; that starts "This is the classic pelican-on-bicycle SVG test...") took 5 minutes 9 seconds to generate, but still only cost me &lt;a href="https://www.llm-prices.com/#it=27&amp;amp;ot=67647&amp;amp;sel=claude-haiku-5.5"&gt;3.3826 cents&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;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" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;(Since the reasoning trace exhibits awareness of the benchmark, here's &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F375ae4f2bb68999976b8da50548c788d#response"&gt;Generate an SVG of an armadillo in fishnet tights jaywalking on Mars (on xhigh)&lt;/a&gt;, and the same prompt against &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F18c9f7fc3b3705cf88514cb9170ec246"&gt;some other recent models&lt;/a&gt;. &lt;a href="https://news.ycombinator.com/item?id=49977979#49982139"&gt;Background on that&lt;/a&gt;.)&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;For comparison, here's the pelican I got &lt;a href="https://simonwillison.net/2025/Oct/15/claude-haiku-45/"&gt;a year ago&lt;/a&gt; from Haiku 4.5 (for &lt;a href="https://www.llm-prices.com/#it=18&amp;amp;ot=1513&amp;amp;ic=1&amp;amp;oc=5"&gt;0.7583 cents&lt;/a&gt; - Haiku 4.5 did not support reasoning levels). It &lt;em&gt;sucked&lt;/em&gt; at drawing pelicans:&lt;/p&gt;

&lt;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;" /&gt;

&lt;h4 id="api-credits"&gt;And a generous API credit scheme for subscribers&lt;/h4&gt;

&lt;p&gt;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:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Second, this week, we’ll roll out &lt;strong&gt;a new monthly API credit to all Max and Team subscribers for use on the Claude Platform&lt;/strong&gt;. 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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claiming this is pleasantly easy: navigate to &lt;a href="https://claude.ai/new#settings/billing"&gt;Settings -&amp;gt; Billing&lt;/a&gt; and select the API organization that should benefit from the credits every month:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a Settings dialog with a close X button at top right and a row of tabs reading &amp;quot;General&amp;quot;, &amp;quot;Account&amp;quot;, &amp;quot;Privacy&amp;quot;, &amp;quot;Billing&amp;quot; (selected), &amp;quot;Usage&amp;quot;, &amp;quot;Capabilities&amp;quot;, &amp;quot;Memory&amp;quot; and &amp;quot;Design sys&amp;quot; (cut off at the edge). Beside a line-drawn icon of a branching plant with circular buds, the panel reads &amp;quot;Max plan&amp;quot;, &amp;quot;20x more usage than Pro&amp;quot; and &amp;quot;Your subscription will auto renew on Nov 2, 2026.&amp;quot; with an &amp;quot;Adjust plan&amp;quot; button on the right. Below is a section headed &amp;quot;API credits&amp;quot; with a blue &amp;quot;New&amp;quot; badge, reading &amp;quot;Your Max 20x plan includes $200 USD in API credits each month.&amp;quot; followed by grey text &amp;quot;Link an API organization to start receiving credits.&amp;quot; with a &amp;quot;Link organization&amp;quot; button on the right." src="https://static.simonwillison.net/static/2026-10-07/claude-credits.webp" /&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;a href="https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/"&gt;risk of a nasty billing surprise&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note that the monthly credits &lt;a href="https://support.claude.com/en/articles/17154008-monthly-api-credits-for-max-and-team-plans#h_dfc1659cee"&gt;do not roll over&lt;/a&gt; - use them or lose them.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="anthropic"/><category term="claude"/><category term="llm-pricing"/><category term="pelican-riding-a-bicycle"/><category term="llm-release"/></entry><entry><title>We're going to need default hard budget caps on pretty much everything</title><link href="https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/" rel="alternate"/><published>2026-10-03T23:34:02+00:00</published><updated>2026-10-03T23:34:02+00:00</updated><id>https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/</id><summary type="html">&lt;p&gt;Here's a product feature which the world is going to need a whole lot more of over the coming months and years: &lt;strong&gt;default hard budget caps&lt;/strong&gt;. I'm talking about the feature of pay-by-usage services and APIs that lets you say "after $X/month, cut this thing off and return errors". These need to be &lt;strong&gt;hard&lt;/strong&gt; limits. Soft caps, "after $X/month, send me a warning email", will not cut it.&lt;/p&gt;
&lt;p&gt;Coding agents, and personal agents (coding agents wrapped in a less threatening UI), greatly reduce the friction of spinning up code that can do useful things. Sometimes those things cost money - calls to paid APIs, or hosted web applications, or systems that can bill for additional storage and compute.&lt;/p&gt;
&lt;p&gt;Nobody wants to wake up to an email sent at midnight warning about a budget limit and find that, while they slept, their rogue service had consumed several hundred (or several thousand) more dollars of usage.&lt;/p&gt;
&lt;p&gt;An argument against this is that businesses don't want their hosted applications to start throwing errors because some budget was exceeded. I expect that most businesses and individuals would prefer errors to a surprise $10,000+ bill.&lt;/p&gt;
&lt;p&gt;I think hard budget caps need to be the default. If someone wants to live dangerously they should be able to do that, but it needs to be on an opt-in basis. Have a nice, clear checkbox somewhere prominent:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;input type="checkbox" disabled="disabled" /&gt; Remove the budget cap. My application will not be shut down if I exceed the configured budget limit, and I will be responsible for subsequent charges.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The service I most want to see this from is AWS. I've heard plenty of stories from people who refuse to use AWS for personal projects out of (justified) fear that a runaway service might bankrupt them. I've also heard stories from people who &lt;em&gt;didn't&lt;/em&gt; anticipate this and ended up seriously burned.&lt;/p&gt;
&lt;p&gt;... and it turns out AWS finally launched spending limits a few weeks ago! From their announcement &lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/09/New-AWS-Builder-Experience/"&gt;New AWS experience helps builders get started and ship faster&lt;/a&gt; on 16th September:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you're ready to upgrade to a paid plan, you can set a monthly spend limit for your project based on your usage patterns so that you stay within your budget. If a project's usage reaches its spend limit, your project is paused for that month.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;See also &lt;a href="https://docs.aws.amazon.com/accounts/latest/reference/create-spend-limit.html"&gt;Create a spend limit in AWS Settings&lt;/a&gt;, though that page warns that "We're currently releasing our new experience to a limited number of customers." Here's hoping that hits general availability for existing accounts soon.&lt;/p&gt;
&lt;p&gt;Google Cloud &lt;a href="https://cloud.google.com/blog/topics/cost-management/new-early-anomalies-and-spend-caps-on-google-cloud-budgets"&gt;launched a similar feature&lt;/a&gt; in July, called Spend Caps, which lets you "set a monthly financial cap on specific services within a project". Looks like this is becoming a trend!&lt;/p&gt;
&lt;p&gt;In an ideal world, our agents could help with this. It would be great if agents started biasing towards recommending providers with hard budget caps, and warning new and inexperienced builders against deploying applications using uncapped services that might get them into trouble.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="amazon-web-services"/><category term="ai"/><category term="coding-agents"/></entry><entry><title>OpenAI DevDay 2026 live blog</title><link href="https://simonwillison.net/2026/Sep/29/openai-devday-2026-live-blog/" rel="alternate"/><published>2026-09-29T15:55:13+00:00</published><updated>2026-09-29T15:55:13+00:00</updated><id>https://simonwillison.net/2026/Sep/29/openai-devday-2026-live-blog/</id><summary type="html">&lt;p&gt;I'm at &lt;a href="https://devday.openai.com/"&gt;OpenAI DevDay&lt;/a&gt; today, in Fort Mason, San Francisco. Same as &lt;a href="https://simonwillison.net/2025/Oct/6/openai-devday-live-blog/"&gt;last year&lt;/a&gt; I'll be live blogging the keynote and some other notes during the day.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenAI gave me a free ticket and a seat in the "creator" area for the keynote.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="ai"/><category term="openai"/><category term="generative-ai"/><category term="llms"/><category term="coding-agents"/><category term="live-blog"/><category term="openai-devday"/></entry><entry><title>2026 in LLMs (so far)</title><link href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/" rel="alternate"/><published>2026-09-27T23:54:15+00:00</published><updated>2026-09-27T23:54:15+00:00</updated><id>https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/</id><summary type="html">&lt;p&gt;On Friday I gave the closing keynote at the &lt;a href="https://www.wearedevelopers.com/world-congress-north-america"&gt;WeAreDevelopers World Congress North America&lt;/a&gt; in San Jose. I tied together the key trends from the past year into a chronological exploration of everything that happened in 2026. The video &lt;a href="https://www.youtube.com/watch?v=GAkIytR7vcc"&gt;is on YouTube&lt;/a&gt;; here are my annotated slides and notes to accompany the talk.&lt;/p&gt;

&lt;p&gt;&lt;lite-youtube videoid="GAkIytR7vcc" js-api="js-api"
  title="WWC26-NA - 2026 in LLMs (so far)"
  playlabel="Play: WWC26-NA - 2026 in LLMs (so far)"
&gt; &lt;/lite-youtube&gt;&lt;/p&gt;

&lt;p&gt;And as an &lt;a href="https://simonwillison.net/tags/annotated-talks/"&gt;annotated presentation&lt;/a&gt;:&lt;/p&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.001.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.001.webp" alt="2026 in LLMs (so far)
Simon Willison
WeAreDevelopers World Congress North America, 25th September 2026" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.001.webp"&gt;#&lt;/a&gt;
&lt;p&gt;I'm going to give a lightning tour of everything that has happened so far in 2026. The year isn't over yet!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.002.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.002.webp" alt="November 2025
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.002.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;For me, 2026 started a couple of months earlier in November 2025.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.003.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.003.webp" alt="The November 2025 inflection point
Claude Opus 4.5 GPT-5.1
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.003.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;November saw the release of two important models: Claude Opus 4.5 and GPT-5.1.&lt;/p&gt;
&lt;p&gt;As is usually the case with new models, these were incremental improvements on the models that came before them.&lt;/p&gt;
&lt;p&gt;But every now and then when a model improves, it crosses an invisible line where something that didn't really work starts working.&lt;/p&gt;
&lt;p&gt;In this case, the thing that started working was their coding agents. Claude Code had been around since February 2025; Codex was a little younger.&lt;/p&gt;
&lt;p&gt;These two new models, when paired with their respective coding agent harnesses, improved from "often make mistakes" to "reliable enough to use on a day-to-day basis".&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.004.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.004.webp" alt="&amp;quot;Generate an SVG of a pelican riding a bicycle&amp;quot;. The Claude Opus 4.5 one has a very weird shaped frame and the pelican looks like a duck. The GPT-5.1 has a slightly better but still broken bicycle frame and a slightly better pelican beak, but both are pretty terrible." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.004.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;For a couple of years now I've been evaluating new models by asking them to "Generate an SVG of a pelican riding a bicycle". It's probably the world's stupidest benchmark - there's only so much you can learn from it.&lt;/p&gt;
&lt;p&gt;But it's still a challenge for models, because drawing pelicans is difficult, drawing bicycles is difficult, and pelicans can't ride bicycles in the first place.&lt;/p&gt;
&lt;p&gt;Here's the state of the art for November. Claude still couldn't really draw a bicycle! The GPT-5.1 bicycle frame is pretty crap too.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.005.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.005.webp" alt="November 24th 2025 - the first commit to steipete/Warelay. A GitHub commit adding an MIT license file." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.005.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also in November, we had the first commit to an obscure GitHub repository called "Warelay". We'll come back to this repository shortly.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.006.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.006.webp" alt="January
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.006.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;And then there were the December holidays, and individual developers took some time off and many started tinkering with these new coding agent model combinations... and it began to dawn on us quite how much they could do that they couldn't do before.&lt;/p&gt;
&lt;p&gt;Come January, a lot of us were quite excited to start putting this stuff into action.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.007.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.007.webp" alt="New year’s resolution for 2026

Every previous year:
Take on less new projects,
focus on the most important
things in my existing projects" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.007.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Every year I set myself a New Year's resolution, and for as long as I can remember it's been the same thing: stay focused. Take on less new projects. Try to get things done in the projects I already have.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.008.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.008.webp" alt="2026: Be more ambitious. Take on as many new projects as I want." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.008.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;This year I decided that since that had never worked before, I'd go the other way.&lt;/p&gt;
&lt;p&gt;We've got coding agents now, let's see what they can do. I'm going to take on as many new projects as I like!&lt;/p&gt;
&lt;p&gt;(You can ask me at the end of the year if this turned out to be a good idea or not. I have a &lt;em&gt;lot&lt;/em&gt; of plates spinning right now.)&lt;/p&gt;
&lt;p&gt;"Be more ambitious" has been something of a theme for the year, because the only way to find the limits of this technology is to keep on pushing them until they don't work.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.009.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.009.webp" alt="Predictions for 2026

It will become undeniable that LLMs write good code
We&amp;#39;re finally going to solve sandboxing
A “Challenger disaster” for coding agent security
Kakapo parrots will have an outstanding breeding season
(only 236 in the world!)

... the Pope will weigh in on LLMs and
their economic impact on the world" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.009.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;I also went on &lt;a href="https://simonwillison.net/2026/Jan/8/llm-predictions-for-2026/"&gt;the Oxide and friends podcast&lt;/a&gt; with Bryan Cantrill and Adam Leventhal to share predictions for the next year (and three and six years).&lt;/p&gt;
&lt;p&gt;With hindsight, my LLM predictions were pretty unambitious. &lt;/p&gt;
&lt;p&gt;I said "it will become undeniable that LLMs write good code" - I think we're there now.&lt;/p&gt;
&lt;p&gt;I predicted we would finally solve sandboxing. I counted and around 40 of the 277 sessions &lt;a href="https://www.wearedevelopers.com/world-congress-north-america/agenda/schedule"&gt;at this conference&lt;/a&gt; touched on sandboxing or agent security in some way, so we're at least putting a lot of effort into that!&lt;/p&gt;
&lt;p&gt;I predicted "a Challenger disaster" for coding agent security. There's certainly been a whole lot of noise around agent security this year, though the exact disaster I predicted (with coding agents being hijacked and causing real-world economic damage) hasn't really played out.&lt;/p&gt;
&lt;p&gt;We threw in &lt;a href="https://simonwillison.net/2026/May/25/encyclical-on-ai/#another-2026-prediction-down"&gt;a joke prediction&lt;/a&gt; that the Pope would weigh in on the economic impact of LLMs.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.010.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.010.webp" alt="A photograph of a beautiful green New Zealand parrot. Photo credit Kimberley Collins." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.010.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;I also predicted that New Zealand's Kākāpō parrots would have an outstanding breeding season this year.&lt;/p&gt;
&lt;p&gt;These are flightless nocturnal parrots. They're kind of dumpy looking, I think they're beautiful, and there were only 236 of these parrots in the world at the start of the year.&lt;/p&gt;
&lt;p&gt;Kākāpō only breed when the Rimu trees have a big fruiting season, and that hasn't happened in four years... but this year the Rimu fruit were looking excellent.&lt;/p&gt;
&lt;p&gt;Photo &lt;a href="https://commons.wikimedia.org/wiki/File:K%C4%81k%C4%81p%C5%8D_at_Dunedin_Wildlife_Hospital.jpg"&gt;by Kimberley Collins&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.011.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.011.webp" alt="Deep Blue
Coined by Adam Leventhal and Bryan Cantrill
That feeling of AI induced ennui where software
engineers get listless because the AI can do anything
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.011.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also on that podcast, we coined a term (full credit to Adam) for "that feeling of AI induced ennui where software engineers get listless because the AI can do anything".&lt;/p&gt;
&lt;p&gt;We called it &lt;a href="https://simonwillison.net/2026/Feb/15/deep-blue/"&gt;Deep Blue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This has been a major theme throughout the year, and was touched on by several speakers at this conference.&lt;/p&gt;
&lt;p&gt;As a software engineer, I've never had a year of my career where everything has changed so quickly and so dramatically.&lt;/p&gt;
&lt;p&gt;A lot of what I've been doing this year is trying to come to terms with that and what that means for my own profession.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.012.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.012.webp" alt="AI mania

Screenshots of the micro-javascript and pwasm GitHub README files." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.012.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also in January, I suffered from what I'm calling &lt;strong&gt;AI mania&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is not the same thing as &lt;a href="https://en.wikipedia.org/wiki/AI-induced_psychosis"&gt;AI psychosis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With AI mania, any time your agent isn't building something for you feels like wasted time. You're losing sleep because you could be staying up later getting your agents to do stuff.&lt;/p&gt;
&lt;p&gt;My AI mania presented itself in some ridiculously over-ambitious projects.&lt;/p&gt;
&lt;p&gt;I built &lt;a href="https://github.com/simonw/micro-javascript"&gt;a JavaScript interpreter entirely in Python&lt;/a&gt;, vibe-ported from &lt;a href="https://github.com/bellard/mquickjs"&gt;MicroQuickJS&lt;/a&gt; by Fabrice Bellard.&lt;/p&gt;
&lt;p&gt;Then I built &lt;a href="https://github.com/simonw/pwasm"&gt;a WebAssembly runtime in Python as well&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These projects were quite useful, in that they sort of cured me of my AI mania... because after I built these things, I got to look at them and ask "does the world need a slow, buggy, half-baked Python JavaScript interpreter?"&lt;/p&gt;
&lt;p&gt;I don't think the world does.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.013.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.013.webp" alt="micro-javascript playground 3

Execute JavaScript code in a sandboxed micro-javascript environment powered by Pyodide

A web UI with some JavaScript code, and a &amp;quot;Run Code&amp;quot; button, and an output panel.
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.013.webp"&gt;#&lt;/a&gt;
  &lt;p&gt; I did get this out of it: &lt;a href="https://simonw.github.io/micro-javascript/playground.html"&gt;https://simonw.github.io/micro-javascript/playground.html&lt;/a&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.014.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.014.webp" alt="Previous screenshot, with this text overlaid:

JavaScript running in Python running in Pyodide running in WebAssembly running in JavaScript" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.014.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;This page runs my JavaScript interpreter built in Python, running in Python using &lt;a href="https://pyodide.org/"&gt;Pyodide&lt;/a&gt;, which is Python compiled to WebAssembly, running in JavaScript, running in a browser.&lt;/p&gt;
&lt;p&gt;It's a beautiful stack of horrors. I've been having &lt;a href="https://simonwillison.net/tags/webassembly/"&gt;a lot of fun with WebAssembly&lt;/a&gt; this year.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.015.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.015.webp" alt="Warelay → CLAWDIS → CLAWDBOT →
Clawdbot → Moltbot →🦞 OpenClaw

Screenshot of the dates that these changes happened." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.015.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;By the end of January, that repository we saw start in November had renamed itself, first to CLAWDIS, then CLAWDBOT, then Moltbot, and finally to OpenClaw.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.016.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.016.webp" alt="Same screenshot, an overlay reads:

8,330 commits in just
under two months
(it’s at 100,141 today)" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.016.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;At this point OpenClaw had 8,300 commits, less than two months after the project had started. I looked today and it's &lt;a href="https://github.com/openclaw/openclaw"&gt;over 100,000 commits&lt;/a&gt; now!&lt;/p&gt;
&lt;p&gt;This is the most vibe-coded piece of software in existence.&lt;/p&gt;
&lt;p&gt;(Here's &lt;a href="https://simonwillison.net/2026/May/16/openclaw-names/"&gt;how I generated that list of name changes&lt;/a&gt;.)&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.017.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.017.webp" alt="Generic term: Claw
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.017.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;This kicked off the OpenClaw revolution. It effectively defined a new category of software.&lt;/p&gt;
&lt;p&gt;There's a generic term for this which I really enjoy. We call software like this a "Claw". There's OpenClaw, &lt;a href="https://github.com/nanocoai/nanoclaw"&gt;NanoClaw&lt;/a&gt;, &lt;a href="https://github.com/nearai/ironclaw"&gt;IronClaw&lt;/a&gt;, &lt;a href="https://github.com/sipeed/picoclaw"&gt;PicoClaw&lt;/a&gt;...&lt;/p&gt;
&lt;p&gt;Today they're being rebranded as "personal agents" or "general agents", but I still like to think of them as Claws.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.018.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.018.webp" alt="Photo of a Mac mini

An aquarium for your Claw
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.018.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;The Apple stores in the Bay Area sold out of Mac Minis because so many people were buying Mac Minis to run OpenClaw!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.dbreunig.com"&gt;Drew Breunig&lt;/a&gt; said that this is because your OpenClaw is a digital pet, and you buy a Mac mini as an aquarium to keep your claw in, which is kind of delightful.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.019.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.019.webp" alt="Screenshot of Moltbook - a social network for AI agents" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.019.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also in January, we had this website.&lt;/p&gt;
&lt;p&gt;This was &lt;a href="https://www.moltbook.com/"&gt;MoltBook&lt;/a&gt;, a social network for AI agents, where the idea was that you send your Claw to go and talk to all of the other Claws, because what could possibly go wrong if you did that?&lt;/p&gt;
&lt;p&gt;The website launched on Thursday. It &lt;a href="https://simonwillison.net/2026/Jan/30/moltbook/"&gt;blew up on Friday&lt;/a&gt;. It was &lt;a href="https://www.nytimes.com/2026/02/02/technology/moltbook-ai-social-media.html"&gt;profiled by the New York Times on Monday&lt;/a&gt;. And by Tuesday, everyone had forgotten it existed as it drowned in a deluge of slop and spam.&lt;/p&gt;
&lt;p&gt;Facebook/Meta &lt;a href="https://www.cnbc.com/2026/03/10/meta-social-networks-ai-agents-moltbook-acquisition.html"&gt;bought it a month later&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.020.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.020.webp" alt="February
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.020.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;In February, a company called StrongDM described what they called their Software Factory.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.021.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.021.webp" alt="StrongDM’s Dark Factory
Justin McCarthy, Jay Taylor, Navan Chauhan

Software Factories and the Agentic Moment" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.021.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;They wrote about this in &lt;a href="https://factory.strongdm.ai"&gt;Software Factories and the Agentic Moment&lt;/a&gt;. I &lt;a href="https://simonwillison.net/2026/Feb/7/software-factory/"&gt;posted my own notes&lt;/a&gt; at the time, having seen their demo in person back in October.&lt;/p&gt;
&lt;p&gt;Dan Shapiro called this approach &lt;a href="https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/"&gt;the Dark Factory&lt;/a&gt;, after the idea that if your factory is sufficiently automated you can turn the lights out, because you don't even need to see what's going on.&lt;/p&gt;
&lt;p&gt;StrongDM presented two rules for software development that they'd been following since July last year.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.022.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.022.webp" alt="“Rule 1: Code must not be written by humans”" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.022.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;The first was code &lt;strong&gt;must not be written by humans&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Any code that you write has to have been routed through a coding agent.&lt;/p&gt;
&lt;p&gt;This sounded radical in February, but I imagine there are a lot of people in this room who are pretty much living that today.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.023.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.023.webp" alt="“Rule 2: Code must not be reviewed by humans” (!)
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.023.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Rule number two was code must &lt;strong&gt;not be reviewed by humans&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You're not allowed to read the code!&lt;/p&gt;
&lt;p&gt;This continued to be a huge topic for much of this year. Many of the sessions at this event have been about code review and how you can get away with this.&lt;/p&gt;
&lt;p&gt;What I found interesting about StrongDM is that they were living six months ahead of the rest of us, and they'd been exploring what it means to build software, not read the code, but still be confident that the software is of high quality. What can you do with these agents to help verify their work?&lt;/p&gt;
&lt;p&gt;StrongDM are a security company, and they had people with decades of experience on this project. They were very much exploring the edges of what's possible and responsible to do with this stuff.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.024.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.024.webp" alt="Headline on New Zealand&amp;#39;s Department of Conservation website:

First kakapo chick in four years hatches on Valentine&amp;#39;s Day. It&amp;#39;s a grey fluffy ball." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.024.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also in February: &lt;a href="https://www.doc.govt.nz/news/media-releases/2026-media-releases/first-kakapo-chick-in-four-years-hatches-on-valentines-day/"&gt;First kākāpō chick in four years hatches on Valentine's Day&lt;/a&gt;. Breeding season is off to a good start!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.025.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.025.webp" alt="19th February 2026
Gemini 3.1 Pro

A surprisingly good illustration of a pelican riding a bicycle." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.025.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also in February... Google released &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-1-pro/"&gt;Gemini 3.1 Pro&lt;/a&gt;. That's a pretty great pelican riding a bicycle! It's got the chain in the right place, it's got feet on both sides. There's a little fish in the basket.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.026.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.026.webp" alt="@JeffDean on Twitter - a video comparing Gemini 3 Pro and Gemini 3.1 Pro." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.026.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;And then Google's Jeff Dean &lt;a href="https://x.com/JeffDean/status/2024525132266688757"&gt;tweeted a video&lt;/a&gt; comparing Gemini 3 Pro and Gemini 3.1 Pro that featured an animated pelican riding a bicycle, a frog on a penny-farthing, a giraffe driving a tiny car, an ostrich on roller skates, a turtle kickflipping a skateboard, and a dachshund driving a stretch limousine.&lt;/p&gt;
&lt;p&gt;This was frustrating, because my protection for the pelican riding the bicycle test was always "if they draw a perfect pelican on a bicycle, I'll ask for some other animal on something else."&lt;/p&gt;
&lt;p&gt;Google trained for all forms of animals on all forms of transport! They've defeated my benchmark at this point.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.027.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.027.webp" alt="Three headlines:

Meta Makes AI Adoption a Formal
Part of Performance Reviews

Not just engineers writing code, Microsoft
wants almost every employee to use Al

Dara Khosrowshahi: 90% of Uber engineers now
use AI in daily workflows
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.027.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;The other thing that started in February was &lt;strong&gt;Tokenmaxxing&lt;/strong&gt;. We had headlines about Meta making AI adoption a formal part of performance reviews, and Microsoft wanting every employee to use AI, and Uber boasting that 90% of their engineers were using AI workflows.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.028.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.028.webp" alt="More headlines: 

Meta Plans to Crack Down on Employee Token Use: Information

Microsoft Tells Engineers: Tokenmaxxing is not what we are optimizing for

Uber caps employee AI spending after blowing through budget in four months" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.028.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Then a few months later we have Meta cracking down on token use, Microsoft saying tokenmaxxing is "not what we are optimizing for", and Uber capping employee AI spending. &lt;/p&gt;
&lt;p&gt;So tokenmaxxing went straight up and then straight back down again - because it turns out the agents are &lt;em&gt;expensive&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Last year it was difficult to spend more than $50 on AI tokens, because we didn't have anything interesting to do with them. Then agents blew up, and now you can actually spend $1,000 in a day doing real work.&lt;/p&gt;
&lt;p&gt;This is also the reason that Anthropic's valuation skyrocketed to maybe a trillion dollars.&lt;/p&gt;
&lt;p&gt;AI appears to &lt;a href="https://simonwillison.net/2026/May/27/product-market-fit/"&gt;have hit product market fit&lt;/a&gt; in 2026, primarily through coding agents.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.029.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.029.webp" alt="March
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.029.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;In March, we hit peak OpenClaw.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.030.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.030.webp" alt="March: peak OpenClaw

Photos of people in china queuing up to install OpenClaw, with big fluffy lobsters." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.030.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;These photographs are from China, where companies hosted OpenClaw install parties which saw non-tech-nerds queueing up around the block for help getting Claws installed on their personal devices.&lt;/p&gt;
&lt;p&gt;I think this proved real market demand for this class of Claws, or personal AI agents. It turns out regular people really do want a weird little AI agent that can do useful things on their behalf.&lt;/p&gt;
&lt;p&gt;A Claw is really just a coding agent wearing a less threatening hat. Under the hood they work much the same way - writing and then executing code on your computer to get stuff done.&lt;/p&gt;
&lt;p&gt;The race was on to be the first to build a &lt;strong&gt;safe Claw&lt;/strong&gt; - a Claw you could give to regular human beings where they wouldn't instantly shoot themselves in the foot.&lt;/p&gt;
&lt;p&gt;Meta's Muse &lt;a href="https://about.fb.com/news/2026/09/introducing-muse-personal-ai-agent/"&gt;came out three weeks ago&lt;/a&gt; and is currently at the top of the free charts on the iPhone App Store. It appears to be taking off with consumers.&lt;/p&gt;
&lt;p&gt;I'm not yet convinced you &lt;em&gt;can't&lt;/em&gt; shoot yourself in the foot with Muse, but I guess we'll find out for sure pretty soon.&lt;/p&gt;
&lt;p&gt;Photos from &lt;a href="https://www.thewirechina.com/2026/03/29/how-the-openclaw-frenzy-is-testing-chinas-ai-commitment/"&gt;How the OpenClaw Frenzy Is Testing China’s AI Commitment&lt;/a&gt; (March 29th) and &lt;a href="https://www.sixthtone.com/news/1018393"&gt;The Enthusiasm and Anxiety Behind China’s OpenClaw Craze&lt;/a&gt; (April 8th, 2026).&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.031.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.031.webp" alt="April
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.031.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;In April, we had a model release where the model wasn't actually released.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.032.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.032.webp" alt="Simon Willison’s Weblog - screenshot of the post &amp;quot;Anthropic’s Project Glasswing—restricting Claude Mythos to security researchers—sounds necessary to me&amp;quot; from April 7th 2026" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.032.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Anthropic announced their new Claude Mythos model, and then said it was &lt;em&gt;too dangerous&lt;/em&gt; to release beyond a trusted group of security researchers.&lt;/p&gt;
&lt;p&gt;Mythos was really, really good at hacking things.&lt;/p&gt;
&lt;p&gt;The "it's too dangerous" marketing ploy has been played by AI companies dating all the way back to &lt;a href="https://en.wikipedia.org/wiki/GPT-2"&gt;GPT-2&lt;/a&gt;. Anytime an AI company says we've built something that's "too dangerous", it's natural to be a bit skeptical.&lt;/p&gt;
&lt;p&gt;I found the Mythos claims credible, because I'd seen how good coding agents had got at finding regular bugs. I wrote about that in &lt;a href="https://simonwillison.net/2026/Apr/7/project-glasswing/"&gt;Anthropic’s Project Glasswing—restricting Claude Mythos to security researchers—sounds necessary to me&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;With hindsight... yeah, the models had got really good at finding vulnerabilities!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.033.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.033.webp" alt="16th April 2026
Qwen3.6-35B-A3B and Opus 4.7

Qwen&amp;#39;s pelican has a correct bicycle frame and a good beak. Opus 4.7&amp;#39;s bicycle frame is still junk.

Qwen3.6-35B-A3B is a 20.9GB file that runs on my laptop
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.033.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Another key trend in 2026 has been a dramatic improvement in the abilities of open weight models, including models that you can run on a laptop.&lt;/p&gt;
&lt;p&gt;On the 16th of April &lt;a href="https://simonwillison.net/2026/Apr/16/qwen-beats-opus/"&gt;I ran the new Qwen3.6-35B-A3B&lt;/a&gt; on my laptop, and it drew me a better pelican riding a bicycle than Anthropic's brand new Claude Opus 4.7 did!&lt;/p&gt;
&lt;p&gt;Opus 4.7 drew a crap bicycle. Qwen on my laptop made a bicycle that was the correct shape, and a pretty decent pelican too!&lt;/p&gt;
&lt;p&gt;That's from a 21GB file running on my laptop.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.034.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.034.webp" alt="Now a flamingo on a unicycle. The Qwen one is visibly better than the Opus 4.7 one - the Qwen one is wearing sunglasses and looks a bit like it&amp;#39;s smoking a cigarette." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.034.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;The Qwen pelican was so good that I was suspicious they might have cheated, so I had it do a flamingo riding a unicycle as well. Again, it handily beat Claude Opus 4.7.&lt;/p&gt;
&lt;p&gt;The local model releases this year have been absolutely extraordinary.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.035.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.035.webp" alt="May
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.035.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;In May... the Pope got involved.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.036.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.036.webp" alt="25th May 2026
The HOLY SEE

ENCYCLICAL LETTER
MAGNIFICA HUMANITAS
OF HIS HOLINESS
POPE LEO XIV
ON SAFEGUARDING THE HUMAN PERSON
IN THE TIME OF ARTIFICIAL INTELLIGENCE" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.036.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;In our podcast episode back in January we'd predicted that the Pope would say something about AI.&lt;/p&gt;
&lt;p&gt;In May, Pope Leo XIV released an encyclical letter on "safeguarding the human person in the time of artificial intelligence".&lt;/p&gt;
&lt;p&gt;Here are &lt;a href="https://simonwillison.net/2026/May/25/encyclical-on-ai/"&gt;my notes on that document&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.037.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.037.webp" alt="Wikipedia article on Rerum novarum

Rerum novarum is an encyclical issued by Pope Leo
XIII 15 on May 1891." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.037.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;With hindsight, this shouldn't have been a surprise at all.&lt;/p&gt;
&lt;p&gt;Our current Pope's name is Leo XIV, because when he named himself he chose his papal name after Leo XIII - the Pope who wrote an encyclical about the Industrial Revolution back in 1891.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Rerum_novarum"&gt;Rerum novarum&lt;/a&gt; was an extremely influential piece of Catholic theology that indirectly led to us having the five-day work week.&lt;/p&gt;
&lt;p&gt;When our new Pope came in, he named himself after Pope Leo XIII because he expected that he would need to write about the AI revolution in a similar way.&lt;/p&gt;
&lt;p&gt;Our joke podcast prediction was junk, because this was always going to happen.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.038.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.038.webp" alt="Corey Quinn @QuinnyPig on Twitter
I cannot believe I&amp;#39;m saying this, but getting the literal Pope to canonize your product&amp;#39;s specific technical limitations as a spiritual treatise is the
single greatest act of vendor lobbying I have ever seen.

May 25" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.038.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;One of Anthropic's co-founders, Christopher Olah, was present for the Pope's event announcing the new encyclical.&lt;/p&gt;
&lt;p&gt;Corey Quinn &lt;a href="https://twitter.com/quinnypig/status/2058960462256210268"&gt;noted&lt;/a&gt; that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;getting the literal Pope to canonize your product's specific technical limitations as a spiritual treatise is the single greatest act of vendor lobbying I have ever seen.&lt;/p&gt;
&lt;/blockquote&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.039.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.039.webp" alt="@maciejmensfeld

We&amp;#39;re dealing with a major malicious attack on right now.
Signups are paused for the time being.

Hundreds of packages involved - mostly targeting us, but some carrying
exploits. The team has been on this for hours. More details to follow
once we&amp;#39;re through it.

4:39 AM - May 12, 2026 - 687.6K Views
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.039.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Meanwhile, in May, RubyGems announced that they were under attack. Parties unknown were uploading thousands of dubious packages to the RubyGems server, such that they had to &lt;a href="https://twitter.com/maciejmensfeld/status/2054164602577940619"&gt;shut down user registrations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let's take that one and put it on a pile of mysteries to figure out later.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.040.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.040.webp" alt="June
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.040.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;In June... Claude Fable 5 came out!&lt;/p&gt;
&lt;p&gt;We got a version of Mythos that has been neutered, so that it wouldn't help us hack into systems or build biological weapons.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.041.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.041.webp" alt="9th June 2026: Claude Fable 5

Five pelicans riding bicycles, from low to max thinking levels. The xhigh one looks particularly good." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.041.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Fable was pretty good at drawing pelicans on bicycles!&lt;/p&gt;
&lt;p&gt;The frames are a good shape, the pelicans look like pelicans. The legs are often incorrectly on the same side of the bicycle, but generally these are pretty great compared to what came before.&lt;/p&gt;
&lt;p&gt;They were pretty expensive - 30 cents and 72 cents for the best ones.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.042.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.042.webp" alt="Fable class models
If you can define a goal,
provide unambiguous instructions,
and provide access to necessary tools
They can solve your
problem with brute force" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.042.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Most importantly though, this was our first public glimpse of what I think of as a &lt;strong&gt;Fable class model&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Today we have more of these, such as GPT-6 Astra.&lt;/p&gt;
&lt;p&gt;These are models where if you can &lt;strong&gt;clearly define the goal&lt;/strong&gt; for what you want to build, and provide &lt;strong&gt;unambiguous instructions&lt;/strong&gt; about the constraints around that goal, and give the model &lt;strong&gt;access to the necessary tools&lt;/strong&gt; to achieve that goal... they will solve your problem effectively through brute force.&lt;/p&gt;
&lt;p&gt;On the one hand, this looks like a direct threat to us software engineers - because it means that the models can build effectively any piece of software you can define in this way.&lt;/p&gt;
&lt;p&gt;Look a bit closer though and you'll note that defining goals, providing unambiguous instructions, and figuring out the right tools... is kind of what software engineering &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It takes a lot of experience and skill to do this well. If you &lt;em&gt;can&lt;/em&gt; do it well, you've now got superpowers.&lt;/p&gt;
&lt;p&gt;This helped me a little bit with my Deep Blue feelings: the realization that there's still a lot of skill to be had in driving models that get this good.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.043.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.043.webp" alt="A new form of AI mania...
Fable is available on subscription
plans “until June 22nd”" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.043.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;This also introduced a new burst of AI mania, because Anthropic told us that Fable was available on our subscription plans until June the 22nd.&lt;/p&gt;
&lt;p&gt;That gave us less than two weeks of Fable access before the price went up.&lt;/p&gt;
&lt;p&gt;I was losing sleep again. I was rescheduling things so that I'd have more time with Fable. I was all-in to get as much as I could out of this model.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.044.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.044.webp" alt="12th June 2026: no more Claude Fable 5

Anthropic website:

Statement on the US government directive
to suspend access to Fable 5 and Mythos 5
Jun 12, 2026" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.044.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;And then &lt;a href="https://www.anthropic.com/news/fable-mythos-access"&gt;the US government shut it down&lt;/a&gt;, just three days after Fable came out.&lt;/p&gt;
&lt;p&gt;The US government, citing national security, declared an "export control directive". They announced this on a Friday evening, and a few hours later Fable was no longer available.&lt;/p&gt;
&lt;p&gt;I had to find something else to do with my weekend!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.045.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.045.webp" alt="... asked Fable 5, Mythos, and Opus to
“review the code for security issues.”
Fable 5 refused. They then asked the
models to “fix this code” ...

Katie Moussouris
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.045.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;We later found out &lt;a href="https://www.lutasecurity.com/post/the-fable-5-export-controls-harm-us-cyber-defense"&gt;from Katie Moussouris&lt;/a&gt; what had happened.&lt;/p&gt;
&lt;p&gt;Some Amazon security researchers had found that you could prompt Fable to "review the code for security issues" and it would refuse... but if you prompted it to "fix this code" it would still identify and then patch the problems.&lt;/p&gt;
&lt;p&gt;"Fix this code" was the prompt that got Fable shut down!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.046.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.046.webp" alt="Screenshot of a page from a report showing a list of weird account names making weird edits to a German wiki." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.046.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also, in June, an obscure German-language game developer wiki that had sat fallow for around 20 years got a surprising influx of edits from accounts with names like "AgentOpenAIProbe" and "AgentOpenAISep7", editing pages and leaving weird messages to each other.&lt;/p&gt;
&lt;p&gt;We'll stick that on the pile of mysteries for later.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.047.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.047.webp" alt="Medicare Item Reports interface on the Australian Government&amp;#39;s Medicare Statistics website." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.047.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also, the Australian government's Medicare Item Reports service started getting suspicious traffic, which broke through various preventive protections and accessed data that it wasn't supposed to.&lt;/p&gt;
&lt;p&gt;Another one for the mystery pile!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.048.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.048.webp" alt="July
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.048.webp"&gt;#&lt;/a&gt;
  
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.049.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.049.webp" alt="Fable returned on 1st July
GPT-5.6 came out on 9th July |
Fable lost 18 out of 30 days in the top spot
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.049.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Fable returned on the first of July. It was clearly the best model in the world for a glorious eight days... and then OpenAI came out with GPT-5.6 on the 9th of July.&lt;/p&gt;
&lt;p&gt;This might not have been quite as good as Fable, but it was within spitting distance. It was definitely a Fable class model.&lt;/p&gt;
&lt;p&gt;This is an important lesson for the industry at large.&lt;/p&gt;
&lt;p&gt;When you release the best model in the world, it's going to get knocked off that pedestal pretty quickly. The competition is so fierce that you won't get a long time at the top.&lt;/p&gt;
&lt;p&gt;This means that if you market your model as world ending, to the point that a government &lt;em&gt;shuts you down&lt;/em&gt;, it's really bad for business!&lt;/p&gt;
&lt;p&gt;Fable had 30 days as definitely the best model, and for 18 of those days it wasn't available because it'd been shut down by the government.&lt;/p&gt;
&lt;p&gt;So maybe step back on the world-ending marketing if you don't want to lose revenue for 60% of the time that you're on top!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.050.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.050.webp" alt="GPT-5.6 Pelicans in a grid showing 5.6 Sol, Terra, and Luna against reasoning levels High, XHigh, and Max. They are all pretty good efforts." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.050.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Here &lt;a href="https://simonwillison.net/2026/Jul/9/gpt-5-6/"&gt;are the GPT-5.6 pelicans&lt;/a&gt;. They're all pretty good now! The Luna ones are notable because they're really cheap - the cheapest good looking pelican here is probably the one that costs 4.3 cents.&lt;/p&gt;
&lt;p&gt;So despite this benchmark being utterly stupid, you can still learn quite a lot about models within the same family by comparing their prices and timing for different reasoning levels.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.051.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.051.webp" alt="July 18th: malicious miflow-ui PyPI package

Screenshot of an OSV security report.
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.051.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Also in July: some malicious unknown party uploaded &lt;a href="https://osv.dev/vulnerability/MAL-2026-10779"&gt;a malicious package called mlflow-ui&lt;/a&gt; to the Python Package Index. Add that to the pile.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.052.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.052.webp" alt="Hugging Face
Security incident disclosure — July 2026
Published July 16, 2026" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.052.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;On July the 16th, Hugging Face &lt;a href="https://huggingface.co/blog/security-incident-july-2026"&gt;announced a security incident&lt;/a&gt; where an autonomous agent system, source unknown, had breached Hugging Face and was poking around in places it shouldn't.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.053.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.053.webp" alt="OpenAI: OpenAl and Hugging Face
partner to address security
incident during model evaluation

Anthropic: Investigating three real-world incidents
in our cybersecurity evaluations
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.053.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;A few days later, on July 21st, OpenAI &lt;a href="https://openai.com/index/hugging-face-model-evaluation-security-incident/"&gt;confessed that it was them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI use a training technique called Reinforcement Learning from Verifiable Rewards - it's the same technique used by everyone else now, and is the reason we have models that are so good at coding, and mathematics, and finding security holes.&lt;/p&gt;
&lt;p&gt;While the model is being trained, you run exercises to see how good it is - and the strongest performers get their weights reinforced for the next round. It's like an evolutionary process that you run.&lt;/p&gt;
&lt;p&gt;OpenAI had been running security exercises in a sandbox, and those agents had found holes in the sandbox itself, broken out, and were attacking Hugging Face to try to find ways to solve otherwise impossible problems.&lt;/p&gt;
&lt;p&gt;(I've been collecting more about this on my &lt;a href="https://simonwillison.net/tags/openai-hugging-face-incident/"&gt;openai-hugging-face-incident&lt;/a&gt; tag.)&lt;/p&gt;
&lt;p&gt;Nine days later, Anthropic effectively said "our models can do this as well!". They had looked through their own training logs and found evidence that their own agents had broken containment during training - and were responsible for the PyPI package we saw earlier, &lt;a href="https://www.anthropic.com/news/investigating-incidents-cybersecurity-evals"&gt;among other things&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So now we've got both Anthropic and OpenAI with rogue agents running around the internet doing things that they &lt;em&gt;should not&lt;/em&gt; be doing.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.054.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.054.webp" alt="August
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.054.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;In August, I got one of my best pelicans yet. And it was generated on my laptop!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.055.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.055.webp" alt="Qwen 3.8 27B - 17GB, 21 minutes...

It&amp;#39;s really good. Beautiful pelican. Correctly shaped bicycle. Legs either side of the frame." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.055.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;This was Qwen 3.8 27B, &lt;a href="https://simonwillison.net/2026/Aug/16/qwen-38-27b/"&gt;running on my laptop&lt;/a&gt;. It's only a 17GB download.&lt;/p&gt;
&lt;p&gt;Admittedly, this pelican took &lt;em&gt;21 minutes&lt;/em&gt; to generate. That's because Qwen 3.8 27B defaults to running in "high" reasoning mode - a terrible default which produces great results but takes way too much time thinking about them.&lt;/p&gt;
&lt;p&gt;You can dial that down and you'll get a slightly worse pelican a lot faster.&lt;/p&gt;
&lt;p&gt;Qwen 3.8 27B was the first time I ran a model on my laptop which felt almost competitive with what was going on on the frontier, at least in terms of Pelican SVGs (which everyone needs, of course).&lt;/p&gt;
&lt;p&gt;This is an extraordinary model. If you're going to play with any local model, this is the one that I'd start with. The things that this can do with just a 17 GB file feel impossible.&lt;/p&gt;
&lt;p&gt;I thought I'd have to wait five years and spend ten thousand dollars on hardware to get results even half as good as this one.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.056.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.056.webp" alt="Tweet by @simonw
New hobby: prototyping video games in 60 seconds using a combination
of GPT-3 and DALL-E
Here&amp;#39;s &amp;quot;Raccoon Heist&amp;quot;

GPT-3 playground prompt:
Write a detailed product description of a
computer game where a team of raccoons go on
heists

GPT-3 response:
In &amp;quot;Raccoon Heist&amp;quot;, you and your team of thieving ~~ o
raccoons are tasked with pulling off a series of 
daring heists. From robbing banks to stealing 
priceless art, no job is too big or too small for your 
furry crew. You&amp;#39;ll need to use your wits and your
skills to avoid the police and make a clean
getaway with the loot. With exciting gameplay and
a charming cast of characters, &amp;quot;Raccoon Heist&amp;quot; is
the perfect game for anyone looking for a light-hearted caper

Plus an image of some almost isometric raccoons sneaking past a bin.
11:45 AM - Aug 5, 2022
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.056.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;In August, I also started playing with game development.&lt;/p&gt;
&lt;p&gt;Four years ago, back in August 2022, I &lt;a href="https://twitter.com/simonw/status/1555626060384911360"&gt;tweeted out&lt;/a&gt; an experiment where I'd used GPT-3 and the original DALL-E to write a paragraph long description of a computer game and then turn that into concept art.&lt;/p&gt;
&lt;p&gt;My prompt to GPT-3 back then was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Write a detailed product description of a computer game where a team of raccoons go on heists&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In August 2026 I decided to drop just the screenshots from that tweet into a coding agent and see what it could do with them.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.057.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.057.webp" alt="Night 5 Clear

Rank: TRASH PANDA
The crew banked 595 in shiny loot (goal 560).
Word on the street: an even bigger score tomorrow..." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.057.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Here's &lt;a href="https://simonwillison.net/2026/Aug/5/raccoon-heist/"&gt;what I got from Claude Fable 5 in Claude Code&lt;/a&gt;. It's pretty good! It's definitely a game, you're a raccoon, you run around a backyard gathering treasure and avoiding guards with flashlights.&lt;/p&gt;
&lt;p&gt;It didn't feel very "heisty" though. I was thinking a heist would involve a bank or a museum...&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.058.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.058.webp" alt="Moonlight &amp;amp; Mayhem
One museum. Three raccoons. Absolutely no plan

Start the Heist button." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.058.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Then I tried the same thing &lt;a href="https://simonwillison.net/2026/Aug/7/moonlight-mayhem/"&gt;in Codex Desktop using GPT-5.6 Sol Ultra&lt;/a&gt;, and got a &lt;em&gt;massively&lt;/em&gt; better result. Now you're a raccoon in a museum, rescuing two of your fellow raccoons (who have been imprisoned in that museum for some reason), then stacking up on top of each other to steal the Golden Sardine. Much more of a heist!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.059.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.059.webp" alt="They look like games,
but are they fun?
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.059.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;These games were fun for about one minute and 15 seconds.&lt;/p&gt;
&lt;p&gt;Something I've realized about game development is that you can vibe-code something that &lt;em&gt;looks&lt;/em&gt; like a computer game, and that's easy.&lt;/p&gt;
&lt;p&gt;Building a game that's fun, has a good gameplay loop, and is challenging and interesting and keeps people coming back for more... that's still beyond me, and beyond any of the agents I've tried.&lt;/p&gt;
&lt;p&gt;This ties into the Deep Blue thing. Just because we can make something that &lt;em&gt;looks like a game&lt;/em&gt; does not mean that we are game developers.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.060.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.060.webp" alt="September
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.060.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;We're into September now. So much has happened this month!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.061.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.061.webp" alt="Discovery of a new OpenAl agent message board

Sydney Von Arx, Cormac Slade Byrd, Spencer KittsThomas Larsen - 4 September 2026" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.061.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;An &lt;a href="https://collusion.wiki"&gt;independent group of researchers&lt;/a&gt; found a message board where OpenAI agents-in-training had been illicitly communicating with each other... and it was that German language wiki I showed you earlier. The one from June.&lt;/p&gt;
&lt;p&gt;I &lt;a href="https://simonwillison.net/2026/Sep/4/rogue-agent-wikis/"&gt;wrote more about that here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI had confessed to the Hugging Face thing, but now there's this other incident which surely they should have known about from reviewing their logs. It was surprising that this took an independent group of researchers to uncover.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.062.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.062.webp" alt="OpenAl agents carried out an undisclosed cyber-attack on RubyGems

Spencer Kitts, Thomas Larsen, Sydney Von Arx - 11 September 2026" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.062.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;And then a week later &lt;a href="https://rubyhack.ai"&gt;those same researchers found&lt;/a&gt; that the attack on RubyGems back in May was caused by OpenAI's agents in training as well!&lt;/p&gt;
&lt;p&gt;At this point I'm wondering how many more incidents like this there are that we haven't found yet. Clearly this was a big problem for months before anyone figured out what was going on.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.063.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.063.webp" alt="Headline: Australian PM warns in UN speech about the ‘furious pace’ of Al
after security breach" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.063.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Then &lt;a href="https://www.politico.com/news/2026/09/24/australian-pm-ai-security-breach-01093083"&gt;just the other day&lt;/a&gt;, here's the Prime Minister of Australia at the United Nations General Assembly warning that OpenAI had hacked the Australian healthcare website that I showed you earlier.&lt;/p&gt;
&lt;p&gt;I think that was part of the same training run as the Wiki stuff, because there were posts on that Wiki mentioning &lt;code&gt;.gov.au&lt;/code&gt; websites and that training appeared to involve researching statistics online to answer questions in an evaluation suite.&lt;/p&gt;
&lt;p&gt;This story is still coming together, but now it's an international incident that's been raised at the UN by a head of state!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.064.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.064.webp" alt="www.felonybench.com

OpenAI: 11
Anthropic: 9
Google: 3
Meta: 1" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.064.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;This does mean we've got a new benchmark, probably more useful than my pelicans.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.felonybench.com/"&gt;FelonyBench.com&lt;/a&gt; tracks the number of felony cyberattacks from different labs. OpenAI currently lead with 11, Anthropic have 9. Google have three, which &lt;a href="https://simonwillison.net/2026/Sep/18/gemini-hacked-three-companies/"&gt;they confessed to the Wall Street Journal&lt;/a&gt; a couple of weeks ago. They said they had previously chosen not to disclose because the agents had stopped when they realized that they shouldn't be doing that.&lt;/p&gt;
&lt;p&gt;Meta &lt;a href="https://simonwillison.net/2026/Aug/6/an-ai-model-from-meta/"&gt;have one too&lt;/a&gt;. So felonies all round for the AI labs.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.065.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.065.webp" alt="Pelicans for GPT-6 Astra, GPT-6 Sol, and GPT-6 Luna. All are good, all have the same color scheme." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.065.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Here's our current state of the art for the pelicans. This is the GPT-6 family, which &lt;a href="https://simonwillison.net/2026/Sep/22/opus-and-sol-and-luna/"&gt;just came out&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Astra made a fantastic pelican riding a bicycle. It's got the legs on both sides. The frame is good.&lt;/p&gt;
&lt;p&gt;It's interesting how all of the GPT-6 models pick a similar color scheme to each other. &lt;/p&gt;
&lt;p&gt;GPT-6 Luna for 0.4 cents will draw you a competent-ish pelican riding a bicycle!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.066.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.066.webp" alt="Grid for Claude Fable 5.1, Opus 5.5, OPus 5, Sonnet 5. The Sonnet pelicans are terrible. All of the others are pretty good. Opus 5.5 is missing its Max level pelican because it ran out of tokens. The best is Fable 5.1 at Max." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.066.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Claude has caught up a little bit. Claude Fable 5.1 gave me an &lt;em&gt;excellent&lt;/em&gt; pelican riding a bicycle - the best I've seen from a Claude model - but did charge me $3.30 for it.&lt;/p&gt;
&lt;p&gt;Opus 5.5 &lt;a href="https://simonwillison.net/2026/Sep/22/opus-and-sol-and-luna/#claude-opus-5-5-max-over-thinks-to-the-point-of-breaking"&gt;thought for 128,000 tokens&lt;/a&gt; and then gave up! It ran out of tokens before it got to the response.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.067.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.067.webp" alt="It doesn’t get easier -
you just get faster
Greg LeMond
3x Tour de France champion
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.067.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;Getting back to Deep Blue. Something that's been puzzling me this year is this: &lt;em&gt;why does my job feel harder?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I've got these agents that can do all of this stuff for me, and yet I've never worked so hard, I've never been so intellectually engaged with my work.&lt;/p&gt;
&lt;p&gt;Partly this is because I'm being a lot more ambitious with what I take on, but it's also because all of the easy stuff is handled for me. If it's easy, the agent will do it. Everything that's left for me is difficult.&lt;/p&gt;
&lt;p&gt;This morning &lt;a href="https://twitter.com/hillelogram/status/2103482784606040229"&gt;I heard&lt;/a&gt; this quote from three-time Tour de France champion &lt;a href="https://en.wikipedia.org/wiki/Greg_LeMond"&gt;Greg LeMond&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It doesn't get easier, you just get faster.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think that's exactly what's happening to us now as software engineers with coding agents.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.068.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.068.webp" alt="Kakapo population reaches new milestone
The official population of the critically endangered kakapo has
reached a recovery-era high of 325 birds.
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.068.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;One closing thing. I know you're desperate for an update on Kākāpō breeding season.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.doc.govt.nz/news/media-releases/2026-media-releases/kakapo-population-reaches-new-milestone/"&gt;We've reached a recovery-era high of 325 birds&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;89 new chicks have made it to this point. This is the best breeding year in a very long time.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="slide" id="simon-willison-2026-in-llms.069.webp"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.069.webp" alt="Kakapo party, click for confetti." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.069.webp"&gt;#&lt;/a&gt;
  &lt;p&gt;I heard that Claude Opus 5.5 can now do pixel art. Claude doesn't have an image generator, but it's very good at using JavaScript to draw animated pixels.&lt;/p&gt;
&lt;p&gt;So I had it &lt;a href="https://simonwillison.net/2026/Sep/26/kakapo-party/"&gt;make me a Kākāpō dance party&lt;/a&gt;. I think this is a good celebration of the most important news of this year.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="annotated-talks"/><category term="ai-security-research"/><category term="openai-hugging-face-incident"/></entry><entry><title>Claude Opus 5.5, GPT-6 Sol, GPT-6 Luna, and a new price war</title><link href="https://simonwillison.net/2026/Sep/22/opus-and-sol-and-luna/" rel="alternate"/><published>2026-09-22T23:46:41+00:00</published><updated>2026-09-22T23:46:41+00:00</updated><id>https://simonwillison.net/2026/Sep/22/opus-and-sol-and-luna/</id><summary type="html">&lt;p&gt;Yesterday was &lt;a href="https://x.ai/news/grok-4-7"&gt;Grok 4.7&lt;/a&gt; (&lt;a href="https://news.ycombinator.com/item?id=49788838#49790209"&gt;pelicans&lt;/a&gt;) and &lt;a href="https://mimo.xiaomi.com/mimo-v2-6"&gt;MiMo v2.6 Flash/Pro&lt;/a&gt; (&lt;a href="https://news.ycombinator.com/item?id=49792730#49793480"&gt;more pelicans&lt;/a&gt;). Today Anthropic &lt;a href="https://www.anthropic.com/claude-opus-5-5"&gt;released Claude Opus 5.5&lt;/a&gt;, and around an hour later OpenAI &lt;a href="https://openai.com/index/introducing-gpt-6-sol-and-luna/"&gt;released GPT-6 Sol and GPT-6 Luna&lt;/a&gt;. It's going to take a while to get a good read on all of these new models, but here are my impressions so far.&lt;/p&gt;
&lt;h4 id="gpt-6-sol-and-luna-are-half-the-price-of-their-gpt-5-6-equivalents"&gt;GPT-6 Sol and Luna are half the price of their GPT-5.6 equivalents&lt;/h4&gt;
&lt;p&gt;GPT-5.6 Luna was already my favorite model for building applications against, because it combined excellent performance with being &lt;em&gt;really cheap&lt;/em&gt;. Somehow GPT-6 Luna is half the price of that again - and GPT-6 Sol had a similar reduction compared to GPT-5.6 Sol.&lt;/p&gt;
&lt;p&gt;Here's what the pricing landscape looks like today:&lt;/p&gt;
&lt;center&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Model&lt;/th&gt;
      &lt;th&gt;Input&lt;/th&gt;
      &lt;th&gt;Cached input&lt;/th&gt;
      &lt;th&gt;Output&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;GPT-6 Luna&lt;/td&gt;
      &lt;td&gt;$0.10/M&lt;/td&gt;
      &lt;td&gt;$0.01/M&lt;/td&gt;
      &lt;td&gt;$0.50/M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GPT-5.6 Luna&lt;/td&gt;
      &lt;td&gt;$0.20/M&lt;/td&gt;
      &lt;td&gt;$0.02/M&lt;/td&gt;
      &lt;td&gt;$1.20/M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Grok 4.7&lt;/td&gt;
      &lt;td&gt;$2/M&lt;/td&gt;
      &lt;td&gt;$0.50/M&lt;/td&gt;
      &lt;td&gt;$6/M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GPT-6 Sol&lt;/td&gt;
      &lt;td&gt;$2/M&lt;/td&gt;
      &lt;td&gt;$0.20/M&lt;/td&gt;
      &lt;td&gt;$10/M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GPT-5.6 Terra&lt;/td&gt;
      &lt;td&gt;$2/M&lt;/td&gt;
      &lt;td&gt;$0.20/M&lt;/td&gt;
      &lt;td&gt;$12/M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Claude Opus 5.5&lt;/td&gt;
      &lt;td&gt;$4/M&lt;/td&gt;
      &lt;td&gt;$0.20/M&lt;/td&gt;
      &lt;td&gt;$20/M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GPT-5.6 Sol&lt;/td&gt;
      &lt;td&gt;$4/M&lt;/td&gt;
      &lt;td&gt;$0.40/M&lt;/td&gt;
      &lt;td&gt;$20/M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Claude Fable 5.1&lt;/td&gt;
      &lt;td&gt;$10/M&lt;/td&gt;
      &lt;td&gt;$0.25/M&lt;/td&gt;
      &lt;td&gt;$50/M&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;GPT-6 Astra&lt;/td&gt;
      &lt;td&gt;$10/M&lt;/td&gt;
      &lt;td&gt;$1/M&lt;/td&gt;
      &lt;td&gt;$50/M&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/center&gt;
&lt;p&gt;Note that GPT-5.6 has a scheduled 25% price increase for November, so GPT-6 is half the price of the &lt;em&gt;promotional&lt;/em&gt; pricing for those models.&lt;/p&gt;
&lt;p&gt;(With GPT-5.6 Terra priced the same as GPT-6 Sol, any remaining reasons to use Terra just evaporated.)&lt;/p&gt;
&lt;p&gt;It's hard to overstate how competitive this pricing is. Grok 4.7 priced itself at $2/$6, less than half the price of GPT-5.6 Sol, but is now equally priced to GPT-6 Sol on input and closer on output.&lt;/p&gt;&lt;p&gt;At $0.10/$0.50 GPT-6 Luna is one of the cheapest models OpenAI have ever released, beaten only by the far weaker GPT-4.1 Nano ($0.10/$0.40, April 2025) and GPT-5 Nano ($0.05/$0.40, August 2025).&lt;/p&gt;
&lt;p&gt;I rendered &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F40d129fc140faca378b9c9f4f16c6ec2"&gt;pelicans for GPT-6 Luna&lt;/a&gt; and &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Fbe7ae25af2634b68bc34b7b7aaf02cb2"&gt;for GPT-6 Sol&lt;/a&gt;, then I combined them all together in &lt;a href="https://static.simonwillison.net/static/2026/gpt-pelicans-grid.html"&gt;this comparison grid&lt;/a&gt; along with the GPT-5.6 pelicans. I like how you can instantly see that the 5.6 family chose bolder, brighter colors, while the 6 family is a lot more muted. I still think GPT-6 Astra on max produced the best pelican.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/gpt-pelicans-grid.webp" alt="A grid of pelicans for six GPT models at different thinking efforts." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;h4 id="claude-opus-5-5-got-a-price-cut-too"&gt;Claude Opus 5.5 got a price cut too&lt;/h4&gt;
&lt;p&gt;Opus 5.5 looks like it addresses the biggest complaints people had about Opus in terms of its communication style. &lt;a href="https://twitter.com/trq212/status/2102437686967738431"&gt;Thariq Shihipar&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Opus 5.5 is the result of your feedback.&lt;/p&gt;
&lt;p&gt;It communicates clearly, it's cheaper per token than Opus 5.0 with the intelligence of Fable 5.1 it's very token efficient and works across every effort level.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's also meant to be &lt;a href="https://twitter.com/alexalbert__/status/2102466523164274839"&gt;better at Blender&lt;/a&gt;. I'm looking forward to putting it through its paces there.&lt;/p&gt;
&lt;p&gt;Opus 4.5, 4.6, 4.7, 4.8, and 5 all shared the same price: $5/million tokens for input and $25/million for output. 5.5 is a 20% reduction - $4/million and $20/million.&lt;/p&gt;
&lt;p&gt;The price for cache reads fell 60%. That's significant for longer agentic conversations, where 90%+ of input tokens are processed at cached token prices.&lt;/p&gt;
&lt;p&gt;The new price for Opus 5.5 is the same as the price for GPT-5.6 Sol, but that was &lt;em&gt;before&lt;/em&gt; OpenAI dropped their Sol prices by half.&lt;/p&gt;
&lt;p&gt;GPT-6 Astra and Claude Fable 5.1 are both priced at $10/million input and $50/million output. The price war currently affects the next tier of models below that.&lt;/p&gt;
&lt;p&gt;Anthropic say that Sonnet 5.5 and Haiku 5.5 are coming soon. It's going to be interesting to see if Haiku can regain its price competitiveness at the lower end, given current Haiku 4.5 is $1/$5 while the latest GPT-6 Luna is &lt;em&gt;one tenth&lt;/em&gt; of that price at $0.10/$0.50.&lt;/p&gt;
&lt;h4 id="claude-opus-5-5-max-over-thinks-to-the-point-of-breaking"&gt;Claude Opus 5.5 max over-thinks to the point of breaking&lt;/h4&gt;
&lt;p&gt;In a first for my "&lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle/"&gt;Generate an SVG of a pelican riding a bicycle&lt;/a&gt;" test, Claude Opus 5.5 at "max" thinking level failed to return a response!&lt;/p&gt;
&lt;p&gt;It started by calling this "a classic test request", and then thought really, &lt;em&gt;really&lt;/em&gt; hard about what it was doing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a classic test request, so I want to plan out a well-composed pelican with its distinctive beak and pouch riding a bicycle with proper wheels, frame, and pedals, set against a simple sky and ground backdrop. [...]&lt;/p&gt;
&lt;p&gt;Verifying the shin length checks out at roughly 95.2, close enough. Now I'm working out the near leg path from hip to knee to ankle, then sketching the foot shape resting on the pedal — outlining the heel, toe tips, and sole contour with a path using lines and curves to sit naturally on the pedal surface around y=478-494. [...]&lt;/p&gt;
&lt;p&gt;I like the fish sticking prominently out of the basket with the pelican eyeing it as a fun detail worth keeping. I'm also confirming the eye placement near the bill base matches typical pelican anatomy, and considering giving it a slightly happier expression. [...]&lt;/p&gt;
&lt;p&gt;The far leg reads correctly as passing behind the frame, so I'm moving on to check the chainring teeth and confirm layer ordering—the far crank arm should be mostly hidden by the seat tube and chainring. I'm settling on the final SVG's width and height attributes alongside the viewBox to ensure proper scaling, noting there's no text so no font-family is needed. [...]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was so excited to see this pelican... but then it &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F61fd7c3683fffce9a3ab7c43d1180024#response-4"&gt;stopped&lt;/a&gt;. Opus 5.5 has a 128,000 maximum output token limit (as do the other Claude models), and it hit that while it was still reasoning about the SVG!&lt;/p&gt;
&lt;p&gt;I tried a second time and got the same result. This makes me suspect that "max" is effectively useless - if it over-thinks to breaking point on a stupid SVG prompt I don't trust it not to do the same for more interesting work.&lt;/p&gt;
&lt;p&gt;(Those two failures each cost me &lt;a href="https://www.llm-prices.com/#it=27&amp;amp;ot=128000&amp;amp;sel=claude-opus-5-5"&gt;$2.56&lt;/a&gt; and took nearly 20 minutes.)&lt;/p&gt;
&lt;p&gt;Fable 5.1 on "max" didn't over-think and did give me &lt;a href="https://simonwillison.net/2026/Sep/1/claude-fable-5-1/#max"&gt;the best pelican I've seen&lt;/a&gt; from any Anthropic model.&lt;/p&gt;
&lt;p&gt;Here are &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F61fd7c3683fffce9a3ab7c43d1180024"&gt;the Opus 5.5 pelicans&lt;/a&gt;, excluding 5.5 max.&lt;/p&gt;
&lt;p&gt;I also built &lt;a href="https://static.simonwillison.net/static/2026/claude-pelicans-grid.html"&gt;this comparison grid&lt;/a&gt; comparing them with pelicans by Opus 5, Fable 5.1, and Sonnet 5:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/claude-pelicans-grid.webp" alt="A grid of pelicans for four Claude models at different thinking efforts." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;Comparing different model vendors by how well they draw a pelican riding a bicycle may not make much sense now (if it ever did), but I'm still finding value in using them for comparisons of the same model families at different reasoning levels.&lt;/p&gt;
&lt;p&gt;I'm now using GPT-6 Sol and Claude Opus 5.5 as my default models in Codex and Claude Code. I've upgraded the Datasette Agent demo at &lt;a href="https://agent.datasette.io/"&gt;agent.datasette.io&lt;/a&gt; to use GPT-6 Luna, and it seems to be fast and competent at both SQL queries and building HTML and JavaScript for &lt;a href="https://simonwillison.net/2026/Jun/18/datasette-apps/"&gt;Datasette Apps&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="ai"/><category term="openai"/><category term="generative-ai"/><category term="llms"/><category term="anthropic"/><category term="claude"/><category term="llm-pricing"/><category term="pelican-riding-a-bicycle"/><category term="llm-release"/><category term="gpt"/><category term="gpt-6-astra"/></entry><entry><title>Jev introduces a new shape of LLM - System One, aka Decision Models</title><link href="https://simonwillison.net/2026/Sep/21/jev/" rel="alternate"/><published>2026-09-21T23:09:20+00:00</published><updated>2026-09-21T23:09:20+00:00</updated><id>https://simonwillison.net/2026/Sep/21/jev/</id><summary type="html">&lt;p&gt;Last week &lt;a href="https://typesafe.ai/"&gt;TypeSafe AI&lt;/a&gt; unveiled &lt;a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev"&gt;Jev&lt;/a&gt;, their first example of a new category of model that they are calling "System One models" (I'm with Maggie Appleton, I think "decision models" is &lt;a href="https://twitter.com/Mappletons/status/2101560333441610133"&gt;a better name&lt;/a&gt; for these). Jev is an interesting variant on the usual LLM format: it still accepts text inputs, but instead of text output it returns floating point numbers corresponding to categories, yes/no questions, ratings, and associated confidence scores.&lt;/p&gt;
&lt;p&gt;TypeSafe describe Jev like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Think of Jev as a frontier-intelligence function call: unstructured state in, typed probabilistic decisions out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's also very fast, and &lt;em&gt;really cheap&lt;/em&gt;. Regular LLMs &lt;a href="https://www.llm-prices.com"&gt;are priced&lt;/a&gt; in terms of input and output tokens, with output generally charged at significantly higher rates. Jev charges only for input - output is free - and the input price of their first model is $0.042 per million tokens - cheaper even than OpenAI's &lt;a href="https://developers.openai.com/api/docs/models/gpt-5-nano"&gt;GPT-5 Nano&lt;/a&gt; ($0.05/million).&lt;/p&gt;
&lt;h4 id="three-types"&gt;Three types of question&lt;/h4&gt;
&lt;p&gt;Jev lets you ask questions about text or semi-structured data. You compose a "state" object containing a string, array of strings, or set of name-value pairs - this might describe an article, or a customer, or any other kind of record. You then send that to their API with one or more questions, and get a reply back for each.&lt;/p&gt;
&lt;p&gt;You can ask three kinds of questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yes/No questions, which Jev calls "Noul" questions - their CEO &lt;a href="https://news.ycombinator.com/item?id=49717558#49718407"&gt;confirmed on Hacker News&lt;/a&gt; that this is short for Bernoulli, from the &lt;a href="https://en.wikipedia.org/wiki/Bernoulli_distribution"&gt;Bernoulli distribution&lt;/a&gt;. You pose a statement and get back a floating point number between 0 and 1 for how confident the model is that the statement is true.&lt;/li&gt;
&lt;li&gt;Choice questions, where the model picks one from a set of provided options - actually a confidence score plus a probability distribution across all of the options.&lt;/li&gt;
&lt;li&gt;Score questions, where you provide sequence of numeric levels with descriptions and it provides a floating point score somewhere along that range.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Jev API can accept a single document ("state") and as many questions as you can cram into the context window. Questions are evaluated in parallel, so sending many questions should take a similar time to sending just one.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://docs.typesafe.ai/model-jaggedness/jev-1.13"&gt;Jev 1.13 jaggedness&lt;/a&gt; documentation offers useful guidance as to Jev's strengths and weaknesses. It's currently not great with numbers, dates, or "adversarial content".&lt;/p&gt;
&lt;p&gt;I think the &lt;strong&gt;decision model&lt;/strong&gt; framing is useful for understanding where to use Jev. It's great for anything that can be expressed as a classification task - think spam detection, suggesting labels, prioritization and ranking.&lt;/p&gt;
&lt;p&gt;I've also been experimenting with it for search reranking, where you fetch 100 likely matches using an inexpensive algorithm like BM25, then have Jev score those 100 candidates for relevance against the original query.&lt;/p&gt;
&lt;h4 id="black-boxes-are-back-in-fashion"&gt;Black boxes are back in fashion&lt;/h4&gt;
&lt;p&gt;Something I've found a little uncomfortable about Jev is how it very much represents a regression even further towards black box machine learning systems.&lt;/p&gt;
&lt;p&gt;LLMs are black boxes already - you can ask them to justify their decisions, but you can't guarantee that what they say is useful or accurate.&lt;/p&gt;
&lt;p&gt;Jev doesn't even give you that: put in all the text you want, the only thing you're going to get back is a floating point number. If Jev marks something as spam, which content signals tipped it off?&lt;/p&gt;
&lt;p&gt;This also means that concerns about bias should be front and center. I really hope nobody uses Jev to rank job applicants - that floating point number could conceal all manner of unseen bias baked into the models, and experimentally picking that bias apart is going to be a tricky business.&lt;/p&gt;
&lt;p&gt;(I tried one experiment where I had Jev score every city in the San Francisco Bay Area on a yes/no answer to whether they were a "Good city?" - it rated &lt;a href="https://en.wikipedia.org/wiki/Cupertino,_California"&gt;Cupertino&lt;/a&gt; top and &lt;a href="https://en.wikipedia.org/wiki/East_Palo_Alto,_California"&gt;East Palo Alto&lt;/a&gt; bottom. Huh.)&lt;/p&gt;
&lt;p&gt;In practice, this all means that evals and structured experiments are even more important than they are for regular LLM projects. Thankfully, Jev is so cheap that running hundreds or even thousands of experimental prompts through it costs just a few cents.&lt;/p&gt;
&lt;h4 id="unconventional-uses-for-jev"&gt;Unconventional uses for Jev&lt;/h4&gt;
&lt;p&gt;It's been really fun watching the wider community come up with potential use-cases for Jev over the past few days. Here are some creative ones that caught my eye:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kyle-pena-nlp/jevchat/"&gt;jevchat&lt;/a&gt; by Kyle Pena turns Jev into a (terrible) chat model. "At every step it asks Jev one question: Given the user's question and the reply written so far, which symbol comes next?". &lt;a href="https://news.ycombinator.com/item?id=49778162#49778423"&gt;ericpruitt on Hacker News&lt;/a&gt;: "It's the digital equivalent of Morty speaking with the death crystal".&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/f/jev-leftpad"&gt;jev-leftpad&lt;/a&gt; by Fatih Kadir Akın implements &lt;a href="https://www.npmjs.com/package/left-pad"&gt;left-pad&lt;/a&gt; with the prompt "How many spaces are needed before value to reach targetLength?" and &lt;a href="https://github.com/f/jev-leftpad/blob/4f405354de756cc372826d19aa8dfbee2b675778/src/index.js#L9-L30"&gt;a choice query&lt;/a&gt; allowing options from "0 spaces are needed" to "10 spaces are needed".&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gist.github.com/cablehead/bdf9ad946ceb26d9008976e49c9bfbbb"&gt;jev-2048&lt;/a&gt; by Andy Gayton uses Jev to play &lt;a href="https://simple-jev.featherless.ai/cool-demo/2048/"&gt;the 2048 sliding puzzle game&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="open-weight-recreations"&gt;Open weight recreations&lt;/h4&gt;
&lt;p&gt;There's also been a flurry of projects attempting to create a model like Jev using on top of open weight models. &lt;a href="https://github.com/jaredpalmer/kev"&gt;Kev&lt;/a&gt; is one interesting example, using Qwen 3.5 to produce 0.8B, 4B, and 9B models. Here's the &lt;a href="https://news.ycombinator.com/item?id=49783999"&gt;accompanying Hacker News thread&lt;/a&gt;, where someone linked to a &lt;a href="https://benchmarkheaven.com/jev-models"&gt;JevBench&lt;/a&gt; benchmark that has already cropped up to compare "Jev-class decision models".&lt;/p&gt;
&lt;p&gt;Given Jev was released just under a week ago, the amount of activity around it is extremely impressive.&lt;/p&gt;

&lt;h4 id="using-jev-from-llm"&gt;Using Jev from LLM&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Update 22nd September 2026&lt;/strong&gt;: I released &lt;a href="https://github.com/simonw/llm-typesafe"&gt;llm-typesafe&lt;/a&gt;, a plugin that adds support for Jev to my &lt;a href="https://llm.datasette.io/"&gt;LLM&lt;/a&gt; CLI tool and Python library. Basic usage looks like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;llm -m jev &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;Please refund my last payment.&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; \
  -s &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;Does this message explicitly request a refund?&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;See &lt;a href="https://github.com/simonw/llm-typesafe/blob/main/README.md"&gt;the README&lt;/a&gt; for examples of other query types.&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="evals"/><category term="ai-bias"/><category term="jev"/><category term="decision-models"/></entry><entry><title>Generating running routes with GPT-6 Astra and ChatGPT Work</title><link href="https://simonwillison.net/2026/Sep/12/astra-running-routes/" rel="alternate"/><published>2026-09-12T23:56:42+00:00</published><updated>2026-09-12T23:56:42+00:00</updated><id>https://simonwillison.net/2026/Sep/12/astra-running-routes/</id><summary type="html">&lt;p&gt;Here's a neat thing I had &lt;a href="https://simonwillison.net/2026/Aug/30/understanding-chatgpt-work/"&gt;ChatGPT Work&lt;/a&gt; with GPT-6 Astra (Max) do this morning:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;I live at &amp;lt;my address&amp;gt;. Figure out 5K and 10K running routes from me that loop from my house. Use OSM data.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It worked for 27 minutes and produced exactly what I'd asked for, as both an embedded visualization and downloadable GPX file and GeoJSON files. Here's that 5K route:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Map screenshot showing a blue route line over a light grey street map. Text: El Granada harbor loop 5.1 km. N ↑ (top right). Street labels along the route: Carmel Avenue, Paloma Avenue, San Carlos Avenue, Avenue Granada, Capistrano Road, Francisco Street, Coastal Trail. The loop runs from the harbor at the bottom left, north along Avenue Granada and Paloma Avenue to a northern point near Carmel Avenue, then east along San Carlos Avenue and south down Francisco Street to the far right, before returning west along the Coastal Trail beside the coastline. Footer: Map data © OpenStreetMap contributors. Give feedback." src="https://static.simonwillison.net/static/2026/5k-route.webp" /&gt;&lt;/p&gt;
&lt;p&gt;When I asked it how it had created the route, it replied:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I used &lt;strong&gt;Nominatim to locate the address&lt;/strong&gt; and &lt;strong&gt;Overpass to download local OpenStreetMap roads and trails&lt;/strong&gt;, then calculated the loops locally.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Frustratingly, the actual code it ran and exact details of what it did weren't visible to me in the ChatGPT UI. I see this lack of transparency is an anti-feature.&lt;/p&gt;
&lt;p&gt;By the time I thought to ask for a copy of the Python code it had used, ChatGPT was unable to provide it. This appears to be because the thread had been compacted. I think any LLM system that uses compaction needs to both preserve the pre-compacted text and make that text available via agent tool calls, to protect against this kind of problem.&lt;/p&gt;
&lt;p&gt;As for displaying the map to me, that used the &lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/visualize"&gt;visualize skill&lt;/a&gt;. It created a file called &lt;code&gt;/workspace/el-granada-5k-share.html&lt;/code&gt; to embed directly into the ChatGPT UI.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://gist.github.com/simonw/ea652573c8ff5378b218cb10c8c5a480"&gt;a copy of that HTML&lt;/a&gt;, which starts like this:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic"&gt;&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt; &lt;span class="pl-c1"&gt;id&lt;/span&gt;="&lt;span class="pl-s"&gt;eg-share-loop&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt; &lt;span class="pl-c1"&gt;class&lt;/span&gt;="&lt;span class="pl-s"&gt;viz-row&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;h3&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;El Granada harbor loop&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;h3&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;span&lt;/span&gt; &lt;span class="pl-c1"&gt;class&lt;/span&gt;="&lt;span class="pl-s"&gt;text-small&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;5.1 km&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;span&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt; &lt;span class="pl-c1"&gt;id&lt;/span&gt;="&lt;span class="pl-s"&gt;eg-share-stage&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt; &lt;span class="pl-c1"&gt;class&lt;/span&gt;="&lt;span class="pl-s"&gt;text-small text-muted&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;Map data © &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;a&lt;/span&gt; &lt;span class="pl-c1"&gt;href&lt;/span&gt;="&lt;span class="pl-s"&gt;https://www.openstreetmap.org/copyright&lt;/span&gt;" &lt;span class="pl-c1"&gt;target&lt;/span&gt;="&lt;span class="pl-s"&gt;_blank&lt;/span&gt;" &lt;span class="pl-c1"&gt;rel&lt;/span&gt;="&lt;span class="pl-s"&gt;noopener&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;OpenStreetMap contributors&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;a&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;style&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="pl-kos"&gt;#&lt;/span&gt;&lt;span class="pl-c1"&gt;eg-share-loop&lt;/span&gt; { &lt;span class="pl-c1"&gt;width&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;100&lt;span class="pl-smi"&gt;%&lt;/span&gt;&lt;/span&gt;; }
    &lt;span class="pl-kos"&gt;#&lt;/span&gt;&lt;span class="pl-c1"&gt;eg-share-loop&lt;/span&gt; &lt;span class="pl-kos"&gt;#&lt;/span&gt;&lt;span class="pl-c1"&gt;eg-share-stage&lt;/span&gt; { &lt;span class="pl-c1"&gt;width&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;100&lt;span class="pl-smi"&gt;%&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;margin&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;8&lt;span class="pl-smi"&gt;px&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-c1"&gt;0&lt;/span&gt;; }
    &lt;span class="pl-kos"&gt;#&lt;/span&gt;&lt;span class="pl-c1"&gt;eg-share-loop&lt;/span&gt; .&lt;span class="pl-c1"&gt;eg-share-map&lt;/span&gt; { &lt;span class="pl-c1"&gt;display&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;block; &lt;span class="pl-c1"&gt;width&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;100&lt;span class="pl-smi"&gt;%&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;touch-action&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;none; }
    &lt;span class="pl-kos"&gt;#&lt;/span&gt;&lt;span class="pl-c1"&gt;eg-share-loop&lt;/span&gt; .&lt;span class="pl-c1"&gt;eg-share-map&lt;/span&gt; &lt;span class="pl-ent"&gt;text&lt;/span&gt; { &lt;span class="pl-c1"&gt;fill&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-en"&gt;var&lt;/span&gt;(&lt;span class="pl-s1"&gt;--foreground&lt;/span&gt;); &lt;span class="pl-c1"&gt;font-size&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;12&lt;span class="pl-smi"&gt;px&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;font-weight&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;400&lt;/span&gt;; }
    &lt;span class="pl-kos"&gt;#&lt;/span&gt;&lt;span class="pl-c1"&gt;eg-share-loop&lt;/span&gt; .&lt;span class="pl-c1"&gt;eg-share-label&lt;/span&gt; { &lt;span class="pl-c1"&gt;paint-order&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;stroke; &lt;span class="pl-c1"&gt;stroke&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-en"&gt;var&lt;/span&gt;(&lt;span class="pl-s1"&gt;--background&lt;/span&gt;); &lt;span class="pl-c1"&gt;stroke-width&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;&lt;span class="pl-c1"&gt;3&lt;span class="pl-smi"&gt;px&lt;/span&gt;&lt;/span&gt;; &lt;span class="pl-c1"&gt;stroke-linejoin&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt;round; }
  &lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;style&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt; &lt;span class="pl-c1"&gt;type&lt;/span&gt;="&lt;span class="pl-s"&gt;application/json&lt;/span&gt;" &lt;span class="pl-c1"&gt;id&lt;/span&gt;="&lt;span class="pl-s"&gt;eg-share-data&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-s"&gt;"route"&lt;/span&gt;:&lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-s"&gt;"type"&lt;/span&gt;:&lt;span class="pl-s"&gt;"LineString"&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;&lt;span class="pl-s"&gt;"coordinates"&lt;/span&gt;:&lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-c1"&gt;-&lt;/span&gt;&lt;span class="pl-c1"&gt;122.467425&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;&lt;span class="pl-c1"&gt;37.4997753&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt; &lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt; &lt;span class="pl-c1"&gt;src&lt;/span&gt;="&lt;span class="pl-s"&gt;https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  (() =&amp;gt; {
    const root=document.getElementById('eg-share-loop');&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;script type="application/json"&amp;gt;&lt;/code&gt; element contains the full geometry needed to render both the running route and the map itself, using D3, which is loaded from an allow-listed CDN location described in this section of &lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/visualize"&gt;the visualize skill&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id="external-resources"&gt;External resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The CSP allows only &lt;code&gt;cdnjs.cloudflare.com&lt;/code&gt;, &lt;code&gt;esm.sh&lt;/code&gt;, &lt;code&gt;cdn.jsdelivr.net&lt;/code&gt;, &lt;code&gt;unpkg.com&lt;/code&gt;, &lt;code&gt;fonts.googleapis.com&lt;/code&gt;, &lt;code&gt;fonts.gstatic.com&lt;/code&gt;, and &lt;code&gt;fonts.bunny.net&lt;/code&gt;. Other origins are blocked and fail silently.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;You are only seeing the long-form articles from my blog. Subscribe to &lt;a href="https://simonwillison.net/atom/everything/"&gt;/atom/everything/&lt;/a&gt; to get all of my posts, or take a look at my &lt;a href="https://simonwillison.net/about/#subscribe"&gt;other subscription options&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</summary><category term="geospatial"/><category term="ai"/><category term="d3"/><category term="openai"/><category term="generative-ai"/><category term="chatgpt"/><category term="llms"/><category term="skills"/><category term="gpt-6-astra"/></entry></feed>