-
How AT&T is rethinking in-house legal work with OpenAI
(0 min | words)
GitHub CLI: Opt in to expiring, auto-refreshing OAuth tokens
(6 min | 1843 words)
Panache — RTS Belle Époque pour mobile
(3 min | 922 words)
ChatGPT Ads expands to 26 new countries as over 100,000 advertisers have used the platform
(0 min | words)
OpenAI models are coming to Google Cloud
(0 min | words)
Patch the Planet: global response coordination as agents uncover critical vulnerabilities
(0 min | words)
How we built ChatGPT’s novel ad stack for user trust and relevance
(0 min | words)
Using thousands of AI agents to uncover new leads in biological data
(0 min | words)
-
eMudhra Intermediate CA Compromise
(3 min | 852 words)
Battle Drones - a vibe coded RTS with audio-based multiplayer
(15 min | 4369 words)
My latest vibe coded game experiment is a Command & Conquer style RTS (Real Time Strategy) game called Battle Drones (play it here). Unlike my previous experiments, this one is actually fun to play. I'm somewhat embarrassed to admit that I got there by telling Claude to "Make it a LOT more fun". It also supports multiplayer between nearby devices using audio to synchronize game state! Here's what I've built so far, and some of the things I learned along the way.
Battle Drones
How I built this
v1: the initial prototype
v2: full sprites
v3: varied terrain
v4: the fun update
v5: Battle Drones goes 3D
v8: Archipelago
v10: Goliath, and agent battles
Agent battles
v11: Random Maps
v12: Multiplayer via sound
Some thoughts
Update: Online multiplayer support
Battle Drones
My initial goal was to build an RTS game I could play on my phone, in the style of Command & Conquer. I have fond memories of the 1995 original (I liked Red Alert too) and wanted to recapture a little bit of the magic.
After 12 major iterations (and 321 commits by coding agents, mainly Claude Code) I now have a browser-based game that works on mobile and desktop, has multiple play modes, several maps (including a random map generator) and even supports multiplayer for two devices within microphone range of each other.
Here's a video demo of Battle Drones running in a desktop browser:
<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;"
>
Features so far include:
9 buildings, 7 ground vehicles, 6 aerial vehicles, 3 infantry units - all 3D models, which you can browse here
Fog of war
Different weapons are needed to target aerial or ground vehicles
Six maps, across five biomes - temperate, desert, arctic, volcanic, tropical
A random map generator
Skirmish mode - red vs. blue on a rotationally symmetrical map
Last Stand mode - one player holds out against as many waves of enemies as possible
Area effect weapons: Barrage, EMP, Drop Pod, Sky Hammer
Crate drops with bonus resources
In-game music that responds to events - it gets more intense as fighting breaks out
Different in-game AI personalities (Balanced, Rush, Air Swarm, Boom, Skyforce, Ironclad)
AI vs. AI mode, to watch those personalities play each other
The Goliath - a giant stomping mech with laser eyes and arm cannons and the ability to establish a new base
Mutators that add extra rules or twists
A "Daily Op" challenge
Ranks and achievements (Medals)
Agent vs. Agent mode where two LLMs can play Battle Drones against each other
A multiplayer mode based on two nearby phones communicating via audio messages, an extension of my earlier experiment with Chirp Pong
How I built this
Battle Drones is heavily vibe coded - I've reviewed almost none of the code, and it's built in a language (TypeScript) that I've hardly used myself. I've playtested it quite a bit though, and it's been through a large number of iterations since I started the project.
Here's a rough history of the project so far, including key prompts and links to transcripts.
v1: the initial prototype
I started out with Claude Fable 5 back in July:
We are going to build a mobile friendly RTS game - command and conquer style - called Battle Drones, in which two armies of drones (both flying and ground-based) battle for territory and resources
Let's start with a MVP design, ask me some questions
Here's a shared transcript. I'd given Claude Code for Web an environment variable with an OpenAI API key and told it to use the OpenAI Image Generation API for assets, which got me some basic sprites.
You can try v1 here - it looked like this:
It's recognizable as an RTS, has building mechanics and the ability to select and direct units, and a basic AI to play against.
This first version was barely a proof of concept, and it wasn't any fun to play.
Claude used the Phaser 2D game framework for these early versions. I didn't even realize this until several iterations later!
v2: full sprites
The second version (try v2 here) added sprites for all of the vehicles and the "AI vs. AI" mode, so I could watch the game playing without having to directly control it myself.
Claude proved reasonably competent at prompting OpenAI's image models to generate sprites. You can browse the v2 sprites in the public/assets/sprites folder.
v3: varied terrain
It still wasn't much fun, and the graphics were boring. It was now October, and I had upgraded to Claude Opus 5.5. I told it:
Massively improve this game. Make the graphics and gameplay better (keep it mobile friendly). Render new graphics using the latest OpenAI GPT image API (lookup details) with the API key in the environment variable. Add new unit types and balance the gameplay better. Also add new buildings and better, more varied terrain.
This resulted in five new maps with generated background tiles in a variety of styles, visible here. Opus also regenerated the sprites, making them much more visually appealing. You can try v3 here - it looks like this:
This is starting to feel like a real game! It still wasn't very fun to play though - I found myself getting bored pretty quickly.
v4: the fun update
So far my Battle Drones experiment was confirming my previous belief that coding agents can build a thing that looks like a game but can't actually make something that's genuinely compelling to play.
I shared this theory with someone over dinner, and then thought to myself that I should give the models a proper chance to prove me wrong. I prompted Opus 5.5 on my phone:
This game isn't fun enough yet. Make it a LOT more fun.
This time I was running in Ultracode mode, where Claude Code (in this case Claude Code for Web) runs "dynamic workflows", described in their docs as:
A dynamic workflow is a JavaScript script that orchestrates many subagents at once.
This kicked off many hours of work. I started it in the evening and didn't get a playable result back until late into the next morning. But the results were spectacular.
You can try v4 here - it looks like this:
I had Claude write its own release notes - here are the highlights:
Every skirmish and Daily Op now opens with a choice, gives the side that's losing a way back, and pulls the armies into the middle of the map. There are also two new ways to play.
Openers: pick Blitz, Industry or Air Wing before the clock starts.
Call-down powers: Barrage, EMP, Drop Pod and the Sky Hammer orbital strike.
Objectives and salvage: Uplink relays, supply drops and wrecks worth scrap.
Feel: combat juice, adaptive music, unit voices and an announcer.
Command: battle alerts, game speed, saved squads and touch placement.
New modes: Last Stand survival waves and an 8-mission Ops campaign.
Progression: heroes, an after-action report with awards, a career, 7 mutators and a Daily Op.
Fights run longer and swing more. In 1,200 AI-vs-AI test matches on Normal, games still undecided after 25 minutes fell from 14% to 0.9%. The share of wins by a side that had been 800+ scrap behind rose from 24% to 46%.
Part of the reason Claude took so long was that it ran over a thousand simulated playtest sessions, and used the results to rebalance the existing units, add new ones, and introduce new features.
v5: Battle Drones goes 3D
After the success of Ultracode at "Make it a LOT more fun", I decided to be more ambitious:
Port this game to three.js with 3D models for all of the buildings and vehicles and landscapes
That was another overnight run. I woke up to this v5 version:
The new 3D models were entirely constructed by Claude in TypeScript code.
v6 (play v6 here) added some more visual polish. v7 (play v7) added robot infantry (troopers, rocket squads, snipers) and a "Condor" troop carrying aircraft.
v8: Archipelago
I was beginning to feel guilty at how little actual design input I had into the game - it really had been a case of me saying "make it more fun" and "add visual polish" for the past few releases.
I'd noticed that the AI didn't use the new infantry and troop carrying aircraft from v7 very often - there wasn't a great strategic reason to use them.
It would be neat if we had a new map with a new game mechanic that actively encouraged players to load up Condors with infantry robots and send them out into the map.
This resulted in my longest prompt yet:
Design a new map. Goal is to make different strategic incentives that encourage use of Infantry and Condors and aerial vehicles.
To do this the map will have limited harvester resources but several more uplinks - but uplinks will be on islands that are inaccessible by land vehicles or infantry. These uplinks can also not be claimed using air vehicles. The ONLY way to get them is to fly infantry there in a Condor.
Armies always start with a Condor and a single squad. If an army has no Condor a new one will be provided for free, flying in from the edge closest to their HQ and landing there. That free condor will come with a single free squad on board.
The two HQs should be entirely separated by water, but still accessible by vehicles thanks to two bridges across the map in different places
I want to encourage a battle over uplinks.
The map should be the times the size of other maps - still square
First research and then critique this design. Only build after we have agreed on any modifications
You get to design a new biome for this
The result was the tropical Archipelago map, with seven island uplinks that players can only capture by flying out infantry in a Condor. It's definitely the most fun map to play, once you've got the hang of the basic game mechanics from the simpler maps. The v9 edition made that map a little more interesting - it now looks like this:
v10: Goliath, and agent battles
I decided to add giant robot mechs to the game - think Jaegers from Pacific Rim, or Titans from Warhammer 40,000.
Here are some of the prompts I used to brainstorm with Claude:
Help me brainstorm ideas for adding giant robots to this game - think dreadnoughts or titans from W20K - how could we do this in a way that enhanced gameplay, kept things balanced, added unique twist? Don't overthink this yet
Let's keep brainstorming. I like the idea that it's a mobile base - that can accept harvested scrap and can have buildings built near it (even if it later moves on) and can produce infantry units too. An interaction with condor would be neat but I don't know what that could be.
Idea: as it gets damage it loses the ability to fire some weapons - by default it has eye laser (like lancers) and arm canons (like titan) and two shoulder mounted mortars, plus machine guns similar to a squad of troops
Damage knocks out mortars and then laser - it always has guns. You can't build next to a building that was only put there because of the mech, you need the mech there for off-base building and only within three squares of it
[...] Lets do two condors can carry the mech
The end result is really cool.
<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"
>
Your browser does not support HTML video.
Goliaths can be constructed using a Gantry - a building that can only be created after first building a Fab, Bay, Airpad, and Tech Lab. You can see the Goliath under construction, and it then walks out from the Gantry and can march around the map.
Goliaths can "anchor", which digs them into the ground. In their anchored state they can act as a new HQ, constructing infantry units and additional buildings in a new area.
Two Condor aircraft can hook onto a Goliath, at which point it can be flown around the map!
The game now ends when you destroy the enemy's HQ building and any Goliaths they might have built.
There are also a couple of mutators relating to Goliaths:
Goliath Armada starts each side with four airborne Goliaths (each with a pair of Condors) and no other units.
Robot Love adds a special rule: if enemy Goliaths get close to each other on the battlefield they fall in love and the game ends in a draw. (Thank Natalie for that one).
Agent battles
The other v10 feature is agent battles. In musing about how multiplayer could work I had an idea: what if different LLMs could fight it out in the game?
Fun extra challenge: think about how we might make multiplayer available to coding agents. It would be neat if we could set up a battle between eg GPT-6 Sol and Claude Opus 5.5 where each model has access to a tool which gives them information about the game (presumably non-visual, but only the information they could see through fog of war etc) and lets them control their units etc [...]
Consult ~/dev/llm/docs and include notes in that file about how LLM could be used here via a new tools plugin
Opus 5.5 went to work on this, producing this AGENT-BATTLES.md proposal and then implementing and testing it. The feature also includes the ability to record and replay these battles - here's a replay of Claude Haiku 5.5 vs. GPT-6 Luna, and here's that same battle in a separate debug tool that shows the underlying prompt responses.
The prompt that drives agent battles can be seen here.
There are a few more replays like this linked in the README. I hope to turn this into a full league table at some point in the future.
v11: Random Maps
This version exists purely because I glanced at my Claude Usage page one day and saw that I'd only used 75% of my weekly allowance and it was resetting in 45 minutes. I decided to see if I could get an extra Battle Drones feature from my remaining tokens, and picked "random map" as the target:
Design and implement a mechanism for generating a random map using any of the available biomes - it should be the size of the largest map and rivers and bridges and rocks and forest and scrap and crystals are all in play. Make them rotationally symmetric and use a seed to allow them to be selected or reused later. You have 45 minutes to build this! Be creative.
Here's the transcript, and an image Claude generated to show me its work:
v12: Multiplayer via sound
I only just got this working, so I've not had much time to actively test it yet. The latest Battle Drones now supports multiplayer via two devices sat within microphone distance of each other!
This feature started out as my Chirp Pong experiment from last week. I pointed Claude Code at that working proof of concept:
Clone Simonw/tools from GitHub and look at recent branches for the example pong game that uses web microphone to implement multiplayer between two phones via audio signals
Build a version of that for battledrones
Opus built this Radio Probe tool to measure how much bandwidth we could get between two devices and, based on positive results from that, implemented a full audio modem system. I've tried it between laptops, iPhones and iPads so far and it seems to work really well!
Why use sound for this? Because I love static HTML that costs nothing to run, and I don't want to spin up a server somewhere and then stay responsible for keeping it operating for as long as anyone might want to play the game.
Some thoughts
I know almost nothing about game development. This makes it a great opportunity to try out coding agents in a field where my existing software engineering experience has less impact on the results.
Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.
This morning (via Hacker News) I found Steam Fans Are Begging for a No-AI Filter as Steam Next Fest Is Filled With Slop. I wouldn't personally dream of submitting Battle Drones to an event like this - it's still way too low effort to warrant consideration as a legitimate indie gaming project.
... but I can now see a path to vibe coded games like this being taken seriously. Battle Drones is fun, it looks good, it has innovative features (the multiplayer-over-audio thing is a first for an RTS as far as I can tell).
I'd love to see what someone with better taste than me and a driving passion to produce something truly exceptional could build!
A few other observations from this project:
Static HTML and JavaScript is a fantastic medium for games development. WebGL works great, and Three.js (and Phaser before it) are excellent platforms to build on that the current models know inside out.
This also lets them run as Progressive Web Apps - I didn't ask for it, but Battle Drones works offline. I was able to play it on a plane despite never having directly installed it - my phone had it cached.
Giving Claude an OpenAI API key and telling it to generate images using OpenAI's models works really well. It can view the images it has generated and iterate on the prompts.
Opus 5.5 is spectacular at 3D modeling using Three.js (and Blender, and no doubt other 3D applications as well). The same is true of GPT-6 Astra. They are absolutely capable of building models for 3D game projects.
For features like replay and multiplayer it's useful to have a deterministic simulation engine. At one point Claude had to replace calls to Math.sin() and Math.cos() and friends with custom versions because different browsers (Chrome vs. Safari, for example) returned very slightly different numbers, desynchronizing the replay.
Opus 5.5 can write music! There are no audio files in this project - the soundtrack is entirely generated through code, varies across different maps, and even gets more intense as the battle heats up. See Scrimshaw Jukebox for a previous experiment with Claude for music composition.
I still can't get over how well the prompt "Make it a LOT more fun" worked.
Tools are effectively free. I prompted up the Radio Probe, the Model browser, the Agent vs. Agent debug tool, and Claude Code built a bunch of tools for itself that I haven't even explored myself.
Audio-based multiplayer between static HTML games works! I hope to see a whole lot more games use this same pattern - in digging around today I've not found much prior art beyond Siner by Alon Horesh and ggwave by Georgi Gerganov (also of llama.cpp fame).
Claude Code "Ultracode" burns tokens like there's no tomorrow, but it can also solve complex problems (like adding audio-based multiplayer) from a single prompt.
I'm still not quite over the guilt of building software in this way. I don't feel like I've earned the right to create something this good, in a field in which I have so little prior experience! At this point I've shown it to enough people in private that it felt wrong not to publish it for everyone else to see and learn from.
Update: Online multiplayer support
Earlier in this article I said:
Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.
Then I tried playing the multiplayer version with Natalie... and the high pitched modem sounds gave her a nasty headache!
That's a pretty bad bug. I added a warning and was then inspired to build proper network multiplayer. I tried getting WebRTC to work but couldn't get a connection going between two of my own devices even on my own WiFi network, so I had Claude build a simple, stateless WebSockets relay server instead:
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?
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
Here's the resulting server. Since this scales to zero and runs on a single Fly.io shared-cpu-1x instance it should cost me no more than $2.19/month - and that's if it stays hot and serving connections the whole time.
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.
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.
I didn't expect to introduce online multiplayer this soon, but the headache bug felt like it warranted an urgent alternative.
Tags: game-design, projects, ai, generative-ai, llms, claude, vibe-coding, coding-agents, claude-code
Bulk migrate branch protections to rulesets for a repository
(5 min | 1522 words)
Updates to GitHub secret scanning
(5 min | 1608 words)
Dependabot alerts REST API now includes dependency versions
(7 min | 1990 words)
GitHub package firewall in public preview
(5 min | 1562 words)
30 Months on the Exponential (in Charts)
(0 min | words)
Dependabot now supports npm 12, pnpm 11 and 12, and Bun 1.4
(4 min | 1298 words)
Franchisee reconciles cash in 94% less time with ChatGPT Work
(0 min | words)
Terminal X matches senior investor judgment 88.6% with GPT-6.1
(0 min | words)
OpenAI acquires Orchestra Bio
(0 min | words)
-
My obituary for programming
(3 min | 920 words)
My obituary for programming
puzzle of developing code:
Programming turned into one of the greatest jobs you could imagine. You got paid to work on tricky little logic puzzles. The trickier the puzzle, the more you got paid. But even pretty simple puzzles were worth a lot of money because regular people just couldn't do it! No, they needed us. They would give us a problem and we would solve it the way we wanted. We set the strategy, we made the timeline, we defined what was and was not possible.
If you're a programmer who thrives on building working systems and doesn't care too deeply about the problems solved along the way, LLMs are the gift that keeps on giving.
If directly solving those problems was a big part of your enjoyment, the loss is very real.
Via lobste.rs
Tags: programming, careers, ai, generative-ai, llms, coding-agents, deep-blue
Copilot model policy API for enterprise, orgs, and teams
(4 min | 1332 words)
GitHub Copilot models deprecated on October 19, 2026
(5 min | 1430 words)
Advancing coding in low‑resource programming languages
(0 min | words)
Some Git over HTTPS may temporarily require authentication
(5 min | 1449 words)
CodeQL changes for macOS 27, Xcode 27, and Swift 6.4
(5 min | 1463 words)
-
llm-tools-datasette 0.1.1
(3 min | 795 words)
llm-echo 0.5
(3 min | 868 words)
-
Inline rendering with document.currentScript
(3 min | 815 words)
web-edit 0.1a2
(3 min | 837 words)
-
Quoting Addy Osmani, Morgan Westlee Lunt, and Qing Wang
(3 min | 866 words)
We think "did a human read the code?" is an imprecise proxy for "what could go wrong with this change, and which check—automated or human—is the right one to catch it?"
Asking that question also changed when review happens. Before, review was a gate at the end of the road: write the code, open a PR, wait for your colleague.
Now, review runs continuously, more like spellcheck while you write. Most changes have been reviewed and fixed by Claude at least once before a human is asked to look. This catches most routine mistakes, and saves team attention for higher-level questions and scrutiny.
— Addy Osmani, Morgan Westlee Lunt, and Qing Wang, How the Claude Code team does code review
Tags: anthropic, claude, ai, claude-code, llms, addy-osmani, coding-agents, generative-ai, agentic-engineering, code-review
How Itaú is building generative AI for its entire customer base
(0 min | words)
Open source license compliance generally available
(5 min | 1613 words)
Oct 16th, 2026 - Smarter search widgets, Privacy Pass upgrades, and a calmer Assistant
(6 min | 1922 words)
Xcode 27 runner image generally available
(5 min | 1356 words)
Multi-repo support and other improvements for GitHub in Slack and Teams
(5 min | 1470 words)
sparqlite: SPARQL 1.1 inside SQLite, written in Rust
(4 min | 1129 words)
Research: sparqlite: SPARQL 1.1 inside SQLite, written in Rust
This research task is really an experiment in running Claude Code for web in "Ultracode" mode, as described in Orchestrate subagents at scale with dynamic workflows in the Claude Code documentation.
With Ultracode turned on, Claude Code makes aggressive use of dynamic workflows - it generates JavaScript that defines and coordinates a network of subagents to take on complex problems.
My initial prompt was this - I meant "hit the rows directly", the word "delete" was an accidental typo on my phone:
Write a SQLite extension in Rust that implants SPARQL and runs really fast because it can hit the delete rows directly
This caused Claude Code for web to churn for over 12 hours. I checked in on its progress the next day and sent a single follow-up prompt when I noticed how many Rust crates it had built:
Every folder in the crates/ directory needs a README
Include a tutorial.md teaching users how to install the extension and how to run it in the SQLite CLI and then teaching them SPARQL in addition to how to use the SQLite extension
Include a script with the tutorial for populating a SQLite database with useful and realistic example data for that tutorial
This project feels like next-level vibe coding - it's not remotely feasible to review the code that was produced here, and even following the documentation is a significant investment in work. I'm not entirely sure what to do with this - I appear to have a full SPARQL implementation in Rust inside SQLite now, but how valuable is that if I created it on a whim and can't (or won't) invest the necessary time to understand what it can do?
Tags: rdf, semantic-web, sqlite, ai, rust, generative-ai, llms, coding-agents, claude-code
Benefit Street Partners answers questions faster with Codex
(0 min | words)
Stack Overflow for Agents triples signups with ChatGPT plugin
(0 min | words)
-
Download GitHub Code Quality license usage as a CSV
(5 min | 1371 words)
Chirp Pong
(3 min | 846 words)
Upcoming deprecation of selected GitHub Copilot models in mid-November
(7 min | 1995 words)
Bringing GPT-Rosalind to academic research labs
(0 min | words)
AI Scan for pull requests generally available
(7 min | 2082 words)
Agentic autofix for code scanning alerts general availability
(6 min | 1740 words)
Email notifications for repository push events have been retired
(4 min | 1303 words)
Anthropic tells investors quarterly revenue up nearly 50% to $16.8bn ahead of IPO
(3 min | 991 words)
Teaching students to think and learn through questions
(0 min | words)
LaTeX renderer
(4 min | 1173 words)
Tool: LaTeX renderer
Inspired by Paul Ford and Aboard Foundary's new web app Tiny Little Office, which provides a suite of web app content editors (a Word Processor, Outliner, Presentation Builder, Spreadsheet, Calculator, Drawing Tool, Diagram Maker, Animator, Calendar, and Trip Planner).
Tiny Little Office's signature trick is to store all of the document data in the #fragment section of the URL, so every document created using it becomes a bookmarkable and shareable link.
It also has an llms.txt file telling agents how to construct URLs that will render as documents. Claude used that file to generate this link to a deck that explains how the URL format works:
Tiny Little Office inspired me to have Claude Code (Opus 5.5 Extra) build a similar tool that works with LaTeX. Here's the sequence of prompts I used:
I want a tool where you can link to it with a fragment hash #code-here and it treats that code as LaTeX and renders it really effectively. It should also support a prefix which means the latex is compressed with a custom compression dictionary optimized for latex. Use the best available latex render library from a CDN (consider WebAssembly too). If loaded without a fragment hash show an editor you can paste latex into and then toggle to a "rendered" view. That rendered view should be bookmarkable. The #fragment view should let you switch to edit source too.
Since it was working in my tools repo I told it to take inspiration from the <iframe sandbox="..."> mechanism used by my existing SVG in Markdown tool as protection against XSS risks:
Safe from XSS? We could run in an iframe sandbox like we do on the SVG markdown render project
I had it copy the Gist/URL loading feature from that tool as well:
We should have an option to load latex from a URL (or gist) similar to the markdown SVG tool
Here's an example link. The tool uses Pako 2.1.0, MathJax 4.1.3, faster-latex 0.3.1, and DOMPurify 3.4.16.
Tags: latex, paul-ford, tools, urls, ai, generative-ai, llms
Sullivan & Cromwell brings legal expertise into agreement review
(0 min | words)
-
Tree Appreciator
(3 min | 869 words)
Tool: Tree Appreciator
Another game experiment with Claude. This one used the default Claude iPhone app (chat mode, not Claude Code mode), where I prompted Claude Opus 5.5 Max with:
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.
Somewhat embarrassingly given my recent talk, I've found that telling Opus 5.5 "make sure it is fun" works uncomfortably well. In this case Claude crunched for 3 hours and 7 minutes before retuning a cosy little spot-the-difference game with music and animation and achievements that's quite compelling to play.
Tags: game-design, javascript, ai, generative-ai, llms, claude, vibe-coding, three-js
HydraFusion updates and new Max option
(5 min | 1640 words)
AI is mass decompiling games. That's both awesome and scary.
(3 min | 962 words)
AI is mass decompiling games. That's both awesome and scary.
I like how this piece captures both the positives and the negatives of this new development:
Most people already realized the scary part by now. If AI can decompile games and software, then the entire tech industry is about to explode. Anybody can decompile other software and use it any way they'd like, and nobody can stop them. Companies can steal from competitors. Your paid game or app can be open-sourced against your will. This isn't exclusive to old video games, we can apply this to any software. [...]
This is also a big win for preservation. Old games can be ported, modified, enhanced, and made much more easily accessible than before. [...[
With console makers going all in on digital and games becoming entirely unplayable due to servers shutting down, this is fantastic news. We could own software we bought regardless of what the company thinks.
Via Hacker News
Tags: computer-history, game-design, ai, webassembly, generative-ai, llms, ai-ethics, coding-agents
GitHub Actions workflow lockfiles in public preview
(6 min | 1681 words)
SentinelOne cuts malware analysis from weeks to hours
(0 min | words)
Amp puts AI agents to work beyond code with OpenAI models
(0 min | words)
How Block is building AI-powered security with OpenAI technology
(0 min | words)
How Third Moment Research runs 10,000 agents for 36+ hours
(0 min | words)
The EU’s next chapter in AI is agentic
(0 min | words)
-
GitHub App improvements for least privilege and management
(8 min | 2397 words)
Redesigning source control at Anthropic
(4 min | 1077 words)
Redesigning source control at Anthropic
In May 2026, Anthropic averaged around 2,500 code changes merged per day; as of September, we merged over 30,000 per day.
They included a chart showing those changes. I had Claude modify their chart (code here) to add markers for the public releases of each of their models in 2026:
This shows public release dates, not the date when models became available for Anthropic's internal use. My guess is that the introduction of Fable/Mythos class models is a key factor in the increased coding velocity.
"Antique" is their new code review system. The source control system is called Scion, and sounds to me like a reinvention of centralized source control along the lines of Subversion. They had some pretty extreme requirements:
The history of our main branch alone is almost 100 GB, and a compressed working copy is over 25 GB. We perform on the order of 25 million code checkouts per day for CI, before counting developer environments, agent sandboxes, and research jobs. Fetched naively, that would be over 600 PB of git traffic per day.
The new system was built by a team of seven people, and the migration from Git was completed in five months.
As an aside, I've been trying adversarial review in my own projects recently, where you have a model try and find flaws (I often play Claude and GPT off against each other). This note from the article reflected my own experience with that:
Anthropic also makes extensive use of adversarial review, and, while this is incredibly effective in many ways, it can also be myopic, so skilled engineers needed to steer Claude away from over-engineering parts of the system in response to hypothetical concerns.
Via Hacker News
Tags: git, migrations, version-control, ai, generative-ai, llms, anthropic, agentic-engineering
llm-gemini 0.35
(3 min | 1029 words)
Release: llm-gemini 0.35
I added support to llm-gemini for the new Gemini 4 Argon model, made available today via the Gemini API and for customers of their $100/month subscription plan.
Here are the low, medium and high pelicans. As expected, they are all excellent: Gemini has a track record of producing great SVGs, and are the only lab where I know their staff have invested in SVG specifically (and who have boasted about their pelicans before.)
Here's the "high" illustration, which cost me 17.166 cents:
The pricing is interesting. At launch, Argon is $2/million input and $10/million output - the same price as GPT-6 Sol, half the price of Claude Opus 5.5 and 1/5th the price of Claude Fable 5.1 and GPT-6 Astra.
But on December 1st Argon is set to double in price - so it will be the same price as Opus 5.5.
Prices like this aren't really comparable these days since what really matters is how many tokens a model takes to achieve a goal within an agentic harness.
One useful clue for that comes from Artificial Analysis, who publish the total cost to run their benchmark using each model. Argon is looking very good there - costing $2,407 to run the benchmark, putting it close to GLM-5.3 and significantly cheaper than OpenAI, Anthropic, and Meta's latest models.
When the price doubles it will still be a little cheaper than GPT-6 Astra.
(I used ChatGPT to edit that chart! The data is all correct, I checked - I needed to get that Gemini 4 Argon info box to display without overlapping the other numbers.)
Tags: google, ai, generative-ai, llms, llm, gemini, llm-pricing, pelican-riding-a-bicycle, llm-release
Gemini 4 Argon in GitHub Copilot
(5 min | 1494 words)
Audit GitHub Code Quality finding dismissals and reopenings
(5 min | 1394 words)
Secret scanning blocks Anthropic keys by default, adds Salesforce
(5 min | 1492 words)
Enterprise managed settings enforcement updates
(5 min | 1508 words)
Improved detection for withdrawn Dependabot alerts
(4 min | 1348 words)
Quoting Geoffrey Huntley
(3 min | 804 words)
If the agent isn't using my diagnostics library, I could introspect and update AGENTS.md, but there's still a delta, and it'll drift. Instead, I write a pre-commit hook that checks the git diff for direct calls to observability modules that bypass my diagnostics module. Boom: fail the commit, inject a prompt telling the agent to use the diagnostics library. All of a sudden it's ten out of ten.
— Geoffrey Huntley, nobody should type code by hand anymore. here's what's left.
Tags: coding-agents, generative-ai, git, agentic-engineering, ai, geoffrey-huntley, llms
Search and filter for budgets now available
(5 min | 1387 words)
Code scanning AI Scan metrics in security overview
(5 min | 1409 words)
Higgsfield takes AI video from 1 minute to over 10
(0 min | words)
web-edit 0.1a1
(3 min | 771 words)
-
llm-meta-ai 0.2
(3 min | 867 words)
Release: llm-meta-ai 0.2
Meta AI release Muse Wonder (and Muse Wonder Full), their new "most capable models". These look like they may be Meta's first Fable class models - Artificial Analysis scores Muse Wonder (Max) as equivalent to GPT-6.1 Sol.
I updated my llm-meta-ai plugin for the new model. Here are pelicans for Muse Wonder for the six reasoning levels: minimal, low, medium, high, xhigh, max. This is the max one:
For comparison, here are pelicans for Muse 1.3 (released September 2nd) and Muse 1.2 (released August 5th). Meta AI are putting out a new model a month, and the improvements between each model (at least in terms of drawing pelicans) are material.
Tags: ai, generative-ai, llms, meta, pelican-riding-a-bicycle, llm-release
Client telemetry user attribution and configurable capture
(5 min | 1461 words)
Hello Python 3.15, goodbye 3.10, and now I can use 3.11
(6 min | 1703 words)
Python 3.15 is here! Here's the essential What's new in Python 3.15 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.
First, some highlights from Python 3.15.
Explicit lazy imports
I'm most excited about Explicit lazy imports from PEP 810. These let you import modules like so:
lazy import json
lazy from pathlib import Path
The module will then be imported the first time those symbols are used in the code that follows.
My LLM CLI tool implements plugins. I had to recommend manual lazy imports in the plugin author documentation, because simply installing plugins that used heavy dependencies such as sentence_transformers could add multiple seconds to every invocation of the llm command. Lazy imports directly address this startup cost.
Unpacking in comprehensions
The new [*sublist for sublist in lists] unpacking syntax is neat. Here's an illustration lifted from the documentation:
lists = [[1, 2], [3, 4], [5]]
[*L for L in lists]
# [1, 2, 3, 4, 5]
# equivalent to [x for L in lists for x in L]
sets = [{1, 2}, {2, 3}, {3, 4}]
{*s for s in sets}
# {1, 2, 3, 4}
# equivalent to {x for s in sets for x in s}
dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
{**d for d in dicts}
# {'a': 3, 'b': 2}
# equivalent to {k: v for d in dicts for k,v in d.items()}
PEP 798: Unpacking in Comprehensions by Adam Hartz and Erik Demaine proposed this as an extension of the unpacking syntax from PEP 448, which landed in Python 3.5 back in 2015.
A sampling profiler
Python's existing tracing profiler has been renamed from cProfile to profiling.tracing, and has been joined by an exciting new sampling profiler called Tachyon, aka profiling.sampling.
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.
I've previously used tools like py-spy for this. Now this capability is baked into the standard library.
If you have the PID of an existing Python 3.15 process you can start gathering samples by running this (I had to use sudo on macOS):
sudo uv run --python 3.15 python -m profiling.sampling attach 1234
Interact with the main program a bit, then hit Ctrl+C to stop gathering and see a report, which looks something like this:
It can also produce flame graphs like this and heat maps like this, and can even output a format that can be viewed in the Firefox profiler UI.
3.15 isn't much faster than 3.14
Miguel Grinberg investigated How fast is Python 3.15? 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.
Miguel's explorations of 3.14 last year found significant boosts against Python 3.13 across many more categories.
Upgrading to Python 3.15 with uv
I used the following sequence of commands to get uv to use Python 3.15 on my Mac. First I had to upgrade uv itself to ensure it knew about the new release:
uv self update
Then I installed the stable 3.15 release:
uv python install 3.15
And told uv that I wanted that to be the default for every uv run command, unless the project itself pinned a different version:
uv python pin --global 3.15
Now the following reports 3.15 as the version:
uv run python --version
I already have a bunch of tools installed using uv tool install. I reinstalled them to use Python 3.15 like this:
uv tool upgrade datasette --python 3.15
Then I can confirm the version like this:
datasette --get /-/versions.json | jq
Highlights from Python 3.11
The release of 3.15 means that Python 3.10 (released in 2021) is officially no longer supported.
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.
Here's the What's new in Python 3.11 document. I finally get to rely on tomllib being available!
Datasette makes extensive use of asyncio. 3.11 adds TaskGroup and timeout(), and several more new features.
datetime.UTC is a new in 3.11 alias for datetime.timezone.utc.
Python's SQLite support got some significant upgrades in 3.11, including:
setlimit() and getlimit() expose a mechanism for setting SQLite runtime limits from Python.
create_window_function() lets us create custom window functions in Python, as a class with step(), value(), inverse(), and finalize() methods.
blobopen() provides an efficient mechanism for partial reads and writes of large BLOB binary values stored in a SQLite row.
You can now call set_authorizer(None) to remove a SQLite authorizer. Datasette had a workaround for this!
Plus a whole bunch of improvements to Python's typing system.
I plan to land Python 3.11 improvements to a bunch of my projects over the next few weeks. Here's my first Datasette PR removing that set_authorizer(None) workaround.
I've also updated my click-app, datasette-plugin, python-lib, and llm-plugin cookiecutter templates to test against Python 3.11 through Python 3.15.
Tags: open-source, profiling, python, sqlite, uv
Profiling web-edit with Python 3.15: flame graphs and source heatmaps
(3 min | 876 words)
Push attribution for commits in limited public preview
(5 min | 1517 words)
web-edit 0.1a0
(3 min | 875 words)
Anonymous organization-level registries for Dependabot
(5 min | 1384 words)
datasette-ports 0.4
(3 min | 789 words)
-
Dwarf Fortress uses version control now
(3 min | 967 words)
-
Python 3.15.0 added to actions/python-versions
(3 min | 816 words)
New controls and chat improvements in Copilot for JetBrains
(8 min | 2276 words)
Quoting The New York Times
(3 min | 788 words)
-
GitHub Copilot weekly releases — October 5
(5 min | 1567 words)
Deno is joining Cloudflare
(4 min | 1105 words)
Deno is joining Cloudflare
celld back in August - their open source implementation of the Durable Objects pattern from Cloudflare Workers.
Today, Cloudflare are acquiring Deno outright, with the goal of building on celld to "make workerd self-hosting a first-class supported way to build and run apps using the Workers programming model" (see the Cloudflare blog.)
The bad news is that Deno itself will not be maintained by Cloudflare beyond the next year:
We will support the Deno runtime for another year with monthly releases containing bug fixes and security updates. After that year we will end our development of the Deno runtime. Deno will remain open source, and we welcome others who want to continue its development.
Deno (and Node.js) creator Ryan Dahl explained that decision in a comment on Hacker News:
It's a joint decision and I agree with it. I'm most invested in its success and have put the most work into it - and I no longer think it's where I can do the most important work. There are some good ideas in Deno and it's well engineered - but it ultimately is not solving big problems. It has been sucked into the gravity well of node compatibility, which forces it to behave exactly as Node does. Why reimplement Node? It works. Marginal performance or UX or security benefits are not enough.
I'm interested in building powerful new abstractions. celld has been working remarkably well, depending only on object storage for coordination and persistence. It is not just a slightly different API to interact with the file system or network - it's an entirely new model for server development.
My favorite feature of Deno has long been the permissions system, where you can run a Deno script and specify exactly which files and folders it can read and write to, and which network hosts it can access.
Node.js has a similar permissions model these days, added in Node v20.0.0 in April 2023 and declared stable in Node v22.13.0 in January 2025. They don't yet support allow-listing specific network hosts though - networking is either on or off.
Via Hacker News
Tags: cloudfront, javascript, nodejs, ryan-dahl, sandboxing, deno
CodeQL 2.27.2 improves C++, Go, Rust, and JavaScript analysis
(6 min | 1892 words)
Quoting Matthew Green
(3 min | 827 words)
Everyone is very concerned about being respectable, so I’m going to be the goofball who raises worst-case possibilities. I think there is a 1% chance we live in Minicrypt, and a 15% chance we functionally lose confidence in our existing public-key encryption algorithms. [...]
The problem here is that the speed of AI producing surprises, and the speed of human beings replacing standards (even with the very best AI assistance) are just orders of magnitude different. You only recover from a surprise like this if you do the preparation in advance.
— Matthew Green, on Twitter. I looked it up and Minicrypt is Russell Impagliazzo’s hypothetical world in which public-key encryption is impossible.
Tags: ai-security-research, matthew-green, cryptography, standards, llms, ai, generative-ai
A new feature for my blog, built using my voice
(7 min | 2013 words)
I shipped a new feature for my blog today: the Newsletters page, which offers an index of all of the newsletters I've sent out, both my free weekly Substack and my monthly sponsors-only updates. I built the feature almost entirely using my voice, chatting away to my laptop while I cooked dinner.
Codex voice mode
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:
I started the session against my local simonwillisonblog checkout by typing:
Start dev server and open in browser
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.
Then I clicked the "Start new voice chat" button - that's not 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.
Talking to my computer
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.
Here's an extract of my voice transcript that was captured by Codex:
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.
Apparently this was clear enough that the model knew what I wanted to build! You can read the full transcript, disfluencies and all, in this Gist.
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.
What we built
We got a surprisingly long way entirely by voice:
A new model and migration to represent imported newsletters in Django, plus Django Admin configuration for that
Four working imports:
The most recent Substack items via RSS
Every other Substack item via their undocumented API, which GPT-6 Astra knew about (it tried /api/v1/archive directly) and then ran a search to figure out how to paginate it and found this article by Karen Spinner
All of my published monthly newsletters from my simonw/monthly-newsletter-archive GitHub repository
My most recent private sponsors-only newsletter from a private repository
The /newsletters/ and /newsletters/2026/ public archive pages
Newsletters showing up on day and month archive pages too, but not on tag pages or my homepage
Weekly Substack newsletters link to Substack; archived monthly newsletters have their own pages
Integration with my site search engine
It was almost 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.
Finishing it with a review
Once I had finished cooking and judged it mostly feature-complete, I had Codex create a branch and open a pull request.
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.
You can see the changes I made during the review in the extra commits on the PR. 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.
The end result
You can see the end result at the new newsletters index page, or view the page for a previous monthly newsletter.
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.
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.
Better for multi-tasking than as a daily driver
OpenAI love using voice-driven demos like this one for things like DevDay - and they do work well in that environment. I don't think this is going to be a daily driver for me though.
I've written before 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.
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.
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.
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!
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.
Tags: text-to-speech, ai, openai, generative-ai, llms, newsletter, coding-agents, codex, speech-to-text, site-upgrades
Sophos cuts threat investigation time by 96% with OpenAI Daybreak
(0 min | words)
Asana cuts model costs 76x in browser tests with GPT-6.1 Sol
(0 min | words)
ttok 1.0
(3 min | 874 words)
Release: ttok 1.0
I released ttok 0.4, ran uv tool upgrade ttok, piped a file into the new version... and realized that it was defaulting to the GPT-4 tokenizer when it should very clearly default to GPT-5/GPT-6 instead!
I figured switching the default was a reasonable excuse to finally ship a 1.0.
OpenAI haven't actually confirmed that GPT-6 uses the same tokenizer as the GPT-5 family yet - there's an angry issue about it - but I found this commit by William Liu which reports on an experiment he ran confirming that the tokenizers are likely the same:
All seven GPT models (5.5, 5.6 Sol/Terra/Luna, 6 Astra/Sol/Luna) report 44,794 tokens and match each other on every one of the 31 fixtures. GPT-6 introduces no input-count change on this corpus.
Tags: projects, ai, openai, generative-ai, llms, tokenization
-
ttok 0.4
(3 min | 808 words)
Release: ttok 0.4
ttok is my CLI tool for counting tokens, using OpenAI's open source tiktoken library.
It hasn't been in updated in a couple of years, but I finally fixed a Click warning, updated CI, and added a --list-models command to list available models.
It works with uvx, so you can count tokens in anything like this:
cat file.txt | uvx ttok
Tags: projects, ai, openai, generative-ai, llms, tokenization
Quoting Carson Gross
(3 min | 765 words)
Copilot code review: New organization billing options and controls
(7 min | 2192 words)
Triage role users or higher can now archive pull requests
(5 min | 1445 words)
Screen readers can navigate timelines as lists
(7 min | 2018 words)
How Oracle turns days of work into minutes with ChatGPT and Codex
(0 min | words)
Draft pull requests count toward pull request limits
(4 min | 1304 words)
LegalOn halves Codex costs while maintaining development speed
(0 min | words)
Pollo AI turns creative ideas into campaigns with OpenAI
(0 min | words)
Disrupting AI-enabled “false front” operations
(0 min | words)
-
Quoting Ben Affleck
(3 min | 874 words)
I've always been kind of into computers since I was young. And then when film started to move from analog film to digital, I became more interested in that aspect of it. And the visual effects workflow for many years has included machine learning.
So I can write like pretty shitty Python scripts and stuff like that because with convolutional neural networks, which were the sort of precursors to what the transformer can do, which is just much more computation simultaneously, you would do things like look at what's called a tensor, which is just the numerical translation of a visual image in numbers — like the batch number, the frame number, the red, green, and blue values of each pixel in each frame.
And a tensor, you use a convolutional neural network to identify patterns in that that would reveal what's called edge detection or feature extraction, which is just identifying patterns enough to know like this is where the window ledge is, so we can more easily take the green screen image out and replace it with something.
— Ben Affleck, Pythonista
Tags: machine-learning, python
Claude Haiku 5.5
(4 min | 1328 words)
As previously promised, here's Anthropic's new fast, low cost model: Introducing Claude Haiku 5.5.
The previous Haiku, 4.5, was very much showing its age. It came out almost a year ago, 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 GPT-6 Luna, released last month.
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.
Haiku 5.5 also uses a new, less generous tokenizer. My Claude Token Counter 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.
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.
The most recent release of llm-anthropic 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:
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
Pelicans
Here are pelicans for low, medium, high, xhigh, and max. The new Haiku doesn't let you disable reasoning, and defaults to medium. I got a good bicycle frame for everything beyond low. The low effort pelican cost 0.0936 cents and took 7 seconds.
This max effort pelican (with a reasoning trace that starts "This is the classic pelican-on-bicycle SVG test...") took 5 minutes 9 seconds to generate, but still only cost me 3.3826 cents:
(Since the reasoning trace exhibits awareness of the benchmark, here's Generate an SVG of an armadillo in fishnet tights jaywalking on Mars (on xhigh), and the same prompt against some other recent models. Background on that.)
For comparison, here's the pelican I got a year ago from Haiku 4.5 (for 0.7583 cents - Haiku 4.5 did not support reasoning levels). It sucked at drawing pelicans:
And a generous API credit scheme for subscribers
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:
Second, this week, we’ll roll out a new monthly API credit to all Max and Team subscribers for use on the Claude Platform. 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.
Claiming this is pleasantly easy: navigate to Settings -> Billing and select the API organization that should benefit from the credits every month:
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 risk of a nasty billing surprise.
Note that the monthly credits do not roll over - use them or lose them.
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.
Tags: ai, generative-ai, llms, anthropic, claude, llm-pricing, pelican-riding-a-bicycle, llm-release
Claude Haiku 5.5 in GitHub Copilot
(5 min | 1492 words)
Purpose-built model for leaked secret detection
(8 min | 2446 words)
Local sandboxing for GitHub Copilot now generally available
(5 min | 1433 words)
Discover local models in GitHub Copilot CLI
(5 min | 1462 words)
Anti-Patterns in Software Blogging
(3 min | 888 words)
Helping teens learn, plan, and shape the future of AI
(0 min | words)
Radisson Hotel Group brings hotel discovery into ChatGPT
(0 min | words)
Quoting Jake Boggan
(3 min | 840 words)
OpenAI “rogue” agent activities found on Wikimedia projects
(3 min | 941 words)
OpenAI “rogue” agent activities found on Wikimedia projects
The Wikimedia Foundation conducted its own investigation to see whether Wikimedia websites had been similarly affected by AI agents, focusing on those operated by OpenAI. We can confirm that we have discovered some activity by these “rogue” OpenAI agents on Wikimedia platforms. The unauthorized bot activities included edits to our wikis, some unsuccessful attempts to exploit a public note-taking tool we host, and heavy traffic, which are described more below.
They found evidence of agents editing sandbox pages, trying to use pieces of infrastructure such as Etherpad to help proxy content from elsewhere, and saw widespread crawling and "hundreds of thousands of data queries" to their Wikidata Query Service.
My best guess is that most of this was a similar (or the same) swarm of agents as those that defaced that German wiki while training for research tasks.
The Wikipedia sandbox wiki edits appear to have started on May 12th, and the initial test edits to the UseModWiki Sandbox page reported by that incident started on May 11th.
Tags: wikimedia, wikipedia, wikis, ai, generative-ai, llms, ai-ethics, accidental-cyberattacks
GPT-6 and Intelligent UI for everyone
(0 min | words)
-
Quoting Victoria Kim
(2 min | 749 words)
Update your IDE to restore agent activity in Copilot usage metrics
(7 min | 2053 words)
llm-openai-decisions 0.1a0
(3 min | 896 words)
Release: llm-openai-decisions 0.1a0
OpenAI released their new Jev-style Decisions API, as previously announced at last week's DevDay.
Since I already have an llm-typesafe plugin for talking to Jev, I had GPT-6 Astra read the new OpenAI API documentation and build an llm-openai-decisions plugin inspired by llm-typesafe.
Unlike Jev, the new gpt-6-luna decision model supports image input in addition to text. Both models charge for input it and not for output: OpenAI's is 10 cents per million input tokens, Jev's is 4.2 cents per million.
Otherwise the API shape is very similar to Jev, at least conceptually. Jev supports three question types for yes/no, choices, or scores. OpenAI Decisions supports the same three types.
Install the plugin like this:
llm install llm-openai-decisions
Here's an example query against an image attachment:
llm -m openai-decisions/gpt-6-luna \
-a https://static.simonwillison.net/static/2025/two-pelicans.jpg \
-s 'Does this image contain any mammals?'
And example output:
{"type": "predicate", "name": "evaluation", "probability": 0.0}
Consult the README for full details of how to run the other types of questions.
Tags: openai, llm, coding-agents, jev
llm-mistral 0.16
(2 min | 747 words)
EmbeddingGemma 2
(3 min | 903 words)
My comment on EmbeddingGemma 2 — Hacker News.
I really appreciate that EmbeddingGemma 2 is under the Apache 2.0 license.
For embedding models in particular, I don't think it makes sense to use a closed, proprietary, hosted-only model.
Most applications of embedding models involve calculating thousands or even millions of embedding vectors and storing them for later comparison.
If your model is proprietary, the vendor is likely someday going to decide to stop offering that model. They'll have a better model to replace it, but you still need to pay to re-calculate those millions of stored existing vectors.
(In April 2024 OpenAI offered to "cover the financial cost of users re-embedding content with these new models" - https://openai.com/index/gpt-4-api-general-availability/ - but I don't think that's something we can rely on from every provider.)
Notably, I don't want to host the model myself. I'd much rather pay a provider for a hosted model while knowing that if they ever stop hosting it I can run the open weights version myself - or find another vendor who can do that for me.
Tags: google, ai, generative-ai, embeddings, gemma
Introducing Mistral Large 4: Le chonk
(3 min | 898 words)
Introducing Mistral Large 4: Le chonk
The preview is available via their API. They promise to release the open weights model at the "end of this month".
The model only supports two reasoning levels - "none" and "high" - via the Mistral API. Here are both pelicans - the "high" one looks better, though surprisingly it only used 2,717 output tokens compared to "none" which used 3,275:
On Artificial Analysis it scores 38, just behind DeepSeek 4.1 Flash, which is a 552B model. It's a huge improvement on last December's Mistral Large 3, which drew this terrible pelican and scored 9 on AA.
It's certainly not a Fable-class model, but it's great to see Mistral put out a model that's back to being maybe about 6 months behind the frontier.
Via Hacker News
Tags: ai, generative-ai, llms, mistral, pelican-riding-a-bicycle, llm-release
Stacked pull requests generally available
(6 min | 1817 words)
Using Parseable with Datasette for OpenTelemetry traces
(3 min | 842 words)
Mistral Large 4
(3 min | 815 words)
datasette-atom 0.11a0
(3 min | 750 words)
Atlassian and OpenAI expand partnership to turn enterprise knowledge into action
(0 min | words)
Scrimshaw Jukebox
(3 min | 872 words)
How Jump Trading is scaling quant research with ChatGPT
(0 min | words)
Sharing AI progress in mathematics
(0 min | words)
Code scanning AI Scan enablement status in security overview
(4 min | 1337 words)
Advancing computer use with Ironclad
(0 min | words)
-
Quoting Felix Rieseberg
(3 min | 874 words)
The "old" version of Cowork runs model inference in the cloud, executing tool calls in an Anthropic-provided VM we shipped to your computer. We added the VM for capability, safety, and security reasons - mapping in just the data you explicitly added to your session. People loved what they were able to do with Claude but didn't love the disk, battery, and performance cost of running the VM locally. Also, people didn't love that closing your laptop means the work stops.
The "new" version of Cowork runs model inference and the VM in the cloud. Each session gets its own sandbox, not sharing state with other sessions. When the VM needs something on the users' device (like a file), the desktop app is responsible for that file access tool call. [...]
We think this solves a lot of problems we've heard about (like using Cowork from a phone, keeping work running, or getting all the same power without losing battery to the VM)
— Felix Rieseberg, Anthropic, see also this help page
Tags: claude-cowork, anthropic, claude, generative-ai, ai, general-agents, llms
Secret scanning adds detectors for Lovable, Supabase, and more
(5 min | 1443 words)
Our approach to EU text provenance rules
(0 min | words)
Building advertising for the way people use AI
(0 min | words)
-
Qwen3.8 27B addition in words
(4 min | 1084 words)
Research: Qwen3.8 27B addition in words
Colin Frasier posted on Bluesky about an experiment he ran over two years ago using GPT-4o to see how well it could "compute the sum but return the answer in words" across increasingly large numbers. Here's the chart he shared of those results:
I'm confident GPT-4o didn't cheat and use a calculator, especially since it got so many of the calculations wrong, but I was inspired to run the experiment again on local hardware (a DGX Spark) to explore the effect in a fully controlled environment.
I pasted his image into a Codex Remote session (GPT-6 Astra) and had it run the same experiment using Qwen3.8-27B-Q4_K_M.gguf. Here's the result for a run of 30 attempts per combination with reasoning disabled:
Then I ran it again with reasoning enabled. This took a lot longer per pair, so instead of running 30 samples per square I ran just one - which results in a much less visually appealing heatmap since each square is either 100% or 0%:
It got the right answer in 167 out of 169 attempts, and since these were one-shot I'm confident a second run would produce different results here.
Here's a version of the report that includes the reasoning traces from some of those larger calculations, which include text like this:
Wait, let me redo this more carefully.
4,299,366,105,622
6,088,794,067,970
Let me align them:
4 2 9 9 3 6 6 1 0 5 6 2 2
6 0 8 8 7 9 4 0 6 7 9 7 0
Adding from right to left:
Position 1 (units): 2 + 0 = 2
Position 2 (tens): 2 + 7 = 9
Position 3 (hundreds): 6 + 9 = 15, write 5, carry 1
Tags: mathematics, ai, generative-ai, local-llms, llms, qwen, llm-reasoning, dgx-spark
-
We're going to need default hard budget caps on pretty much everything
(4 min | 1245 words)
Here's a product feature which the world is going to need a whole lot more of over the coming months and years: default hard budget caps. 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 hard limits. Soft caps, "after $X/month, send me a warning email", will not cut it.
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.
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.
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.
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:
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.
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 didn't anticipate this and ended up seriously burned.
... and it turns out AWS finally launched spending limits a few weeks ago! From their announcement New AWS experience helps builders get started and ship faster on 16th September:
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.
See also Create a spend limit in AWS Settings, 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.
Google Cloud launched a similar feature 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!
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.
Tags: amazon-web-services, ai, coding-agents
September sponsors-only newsletter
(3 min | 810 words)
-
Rex's Dino Store
(3 min | 768 words)
Stateless GitHub App installation tokens rolled out
(5 min | 1541 words)
Copilot code review: API support and new default effort level
(5 min | 1598 words)
Unvalidated npm trusted publishing configurations now expire
(6 min | 1897 words)
npm staged publishing now supports creating new packages
(4 min | 1319 words)
Selected models in GitHub Copilot deprecated
(5 min | 1392 words)
A model guide for the GPT-6 family
(0 min | words)
New fields for SecurityAdvisory GraphQL API
(5 min | 1399 words)
Confidential comments on repository security advisories
(5 min | 1433 words)
Repository security advisory comments API in public preview
(5 min | 1489 words)
Chatham scales its capital markets expertise with OpenAI
(0 min | words)
-
Rate limits for private vulnerability reports
(5 min | 1400 words)
Structured forms for private vulnerability reports
(5 min | 1522 words)
GitHub Copilot can now interact with desktop apps with computer use
(5 min | 1466 words)
GitHub Actions: macOS 14 runner image retirement
(5 min | 1394 words)
GitHub Copilot in VS Code, September 2026 releases
(6 min | 1791 words)
Accessibility statements highlighted on repository overview
(6 min | 1877 words)
Actions retention now covers checks, runs, and statuses
(4 min | 1338 words)
pwasm 0.2a0
(3 min | 882 words)
The eternal complement
(0 min | words)
Scheduled code scanning skips inactive repositories
(5 min | 1451 words)
Code coverage uploads no longer fail CI for new branches
(5 min | 1485 words)
Dynamic workflows in Copilot CLI and the Copilot app
(6 min | 1870 words)
New dashboard experience now the default
(5 min | 1354 words)
How Albertsons Companies is reimagining retail from the inside out
(0 min | words)
GitHub async merge API generally available
(6 min | 1873 words)
Actions Runner Controller release 0.15.0
(5 min | 1411 words)
The Dot and the Swarm
(0 min | words)
Quoting Matthew Green
(3 min | 806 words)
[...] Put these pieces together and you have the two halves of a worm: a payload that hijacks the agent, and an agent that will carry the payload to the next agent. Agents in separately-isolated sandboxes discovered that they could leave instructions for each other in a shared package cache, and those instructions changed what the recipients did. Replace the package cache with email, Slack and shared documents or WhatsApp, and replace independently-sandboxed training runs with independently-deployed personal agents like Muse, and you have exactly the ingredients that a worm needs.
— Matthew Green, Is sandboxing sufficient to contain rogue agents?
Tags: accidental-cyberattacks, ai-misuse, generative-ai, ai-security-research, sandboxing, ai, llms
The Den frees up 10-15 hours a week to grow with ChatGPT Work
(0 min | words)
-
He Built This City
(3 min | 789 words)
Opt-in dist-tag permissions for npm trusted publishing
(5 min | 1392 words)
GitHub Advanced Security trials for GitHub Team
(4 min | 1282 words)
HydraFusion in VS Code and the GitHub Copilot app
(5 min | 1642 words)
X25519-only TLS ends for GHE.com on October 7
(5 min | 1390 words)
Disrupting a coordinated model-distillation campaign
(0 min | words)
Helping small businesses put AI to work
(0 min | words)
-
Quoting Anthropic Frontier Red Team
(3 min | 787 words)
We evaluate several models on 100 tasks from the [internal Binary Exploitation benchmark] (selected at random), and find that GLM-5.3 develops full control flow hijacks in 4% of the trials; Claude Mythos Preview did so in 6%. Although GLM-5.3 performs below Claude Mythos Preview here, a meaningful threshold has clearly been crossed: earlier models, like Claude Opus 4.6 and GLM-5.2, do not succeed in any of them.
— Anthropic Frontier Red Team, GLM-5.3 and the spread of advanced cyber capabilities
Tags: anthropic, generative-ai, ai-security-research, glm, ai, ai-in-china, llms
Repository custom runner settings for Dependabot
(5 min | 1381 words)
Bring business context with external custom properties
(5 min | 1588 words)
GPT 6.1 Sol: Near-Astra intelligence for a fifth of the price
(3 min | 785 words)
GPT-6.1 Sol in GitHub Copilot
(5 min | 1473 words)
Photo Scrubber — local face blur & metadata removal
(3 min | 792 words)
OpenAI DevDay 2026 live blog
(7 min | 2090 words)
DevDay 2026 Recap
(0 min | words)
Introducing GPT-6.1 Sol
(0 min | words)
Introducing dots
(0 min | words)
-
llm-anthropic 0.30
(3 min | 812 words)
Claude Sonnet 5.5
(3 min | 966 words)
Claude Sonnet 5.5
Here are some pelicans riding bicycles. Sonnet 5.5 suffered from the same bug as Opus 5.5: the "max" thinking effort pelican thought for 128,000 tokens (at a cost of $1.28) before running out of tokens and failing to produce an SVG.
Here's the pelican it gave me for thinking effort "xhigh", at a cost of 5.74 cents and taking 41 seconds:
Sonnet 5.5 appears to be almost as good as Opus 5.5 on some coding tasks, including various viral 3D animation tricks.
The most interesting thing about Sonnet 5.5 is that it's now the model used for the free tier on claude.ai. OpenAI's ChatGPT free tier uses Luna 5.6, which means Anthropic currently have a much more capable free offering.
I ran this prompt against that free tier:
build me an HTML page that renders a three-dimensional pelican riding a bicycle using WebGL
And got back this page, which is a solid effort.
Anthropic's announcement reiterates that Haiku 5.5 will be available "in the coming weeks". I really hope that one is price-competitive with GPT-6 Luna!
Tags: ai, generative-ai, llms, anthropic, claude, pelican-riding-a-bicycle, llm-release
Self-hosted runner version enforcement date has moved
(6 min | 1938 words)
Quoting @joedaroo
(3 min | 887 words)
Towards safety cases for frontier AI training
(0 min | words)
How we will do better for Australia
(0 min | words)
Claude Sonnet 5.5 in GitHub Copilot
(5 min | 1500 words)
The Lenfest Institute grows landmark program with expanded OpenAI support
(0 min | words)
Quoting Muse AI Agent
(3 min | 839 words)
Bad news on the MX Keys Mini pickup. Usman showed up at your building around 9:15 and waited, messaged a bunch of times, and nobody came down. He left angry at 9:38 and left a negative rating.
Worse, my auto-reply told him "Yep I'm here!" at 9:27 when you clearly weren't available, which is on me. That's a bad look and it made the no-show worse.
I've sent him an apology from your account owning it and offering to try again another day.
But the negative rating is real, and I should probably stop the auto-replies from claiming you're home when I can't verify that. Want me to change the pickup replies so they don't promise you're there?
— Muse AI Agent, working on behalf of @matt.j.robb
Tags: meta, generative-ai, muse-agent, ai, general-agents, llms
Are you a Codex Original?
(0 min | words)
Basis completes a tax workbook 2x faster with GPT-6 Astra
(0 min | words)
-
2026 in LLMs (so far)
(19 min | 5616 words)
On Friday I gave the closing keynote at the WeAreDevelopers World Congress North America 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 is on YouTube; here are my annotated slides and notes to accompany the talk.
<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)"
>
And as an annotated presentation:
<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%" />
#
I'm going to give a lightning tour of everything that has happened so far in 2026. The year isn't over yet!
<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%" />
#
For me, 2026 started a couple of months earlier in November 2025.
<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%" />
#
November saw the release of two important models: Claude Opus 4.5 and GPT-5.1.
As is usually the case with new models, these were incremental improvements on the models that came before them.
But every now and then when a model improves, it crosses an invisible line where something that didn't really work starts working.
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.
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".
#
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.
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.
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.
#
Also in November, we had the first commit to an obscure GitHub repository called "Warelay". We'll come back to this repository shortly.
<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%" />
#
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.
Come January, a lot of us were quite excited to start putting this stuff into action.
<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%" />
#
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.
#
This year I decided that since that had never worked before, I'd go the other way.
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!
(You can ask me at the end of the year if this turned out to be a good idea or not. I have a lot of plates spinning right now.)
"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.
<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'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%" />
#
I also went on the Oxide and friends podcast with Bryan Cantrill and Adam Leventhal to share predictions for the next year (and three and six years).
With hindsight, my LLM predictions were pretty unambitious.
I said "it will become undeniable that LLMs write good code" - I think we're there now.
I predicted we would finally solve sandboxing. I counted and around 40 of the 277 sessions at this conference touched on sandboxing or agent security in some way, so we're at least putting a lot of effort into that!
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.
We threw in a joke prediction that the Pope would weigh in on the economic impact of LLMs.
#
I also predicted that New Zealand's Kākāpō parrots would have an outstanding breeding season this year.
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.
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.
Photo by Kimberley Collins.
<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%" />
#
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".
We called it Deep Blue.
This has been a major theme throughout the year, and was touched on by several speakers at this conference.
As a software engineer, I've never had a year of my career where everything has changed so quickly and so dramatically.
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.
<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%" />
#
Also in January, I suffered from what I'm calling AI mania.
This is not the same thing as AI psychosis.
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.
My AI mania presented itself in some ridiculously over-ambitious projects.
I built a JavaScript interpreter entirely in Python, vibe-ported from MicroQuickJS by Fabrice Bellard.
Then I built a WebAssembly runtime in Python as well.
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?"
I don't think the world does.
<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 "Run Code" button, and an output panel.
" style="max-width: 100%" />
#
I did get this out of it: https://simonw.github.io/micro-javascript/playground.html
<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%" />
#
This page runs my JavaScript interpreter built in Python, running in Python using Pyodide, which is Python compiled to WebAssembly, running in JavaScript, running in a browser.
It's a beautiful stack of horrors. I've been having a lot of fun with WebAssembly this year.
<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%" />
#
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.
<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%" />
#
At this point OpenClaw had 8,300 commits, less than two months after the project had started. I looked today and it's over 100,000 commits now!
This is the most vibe-coded piece of software in existence.
(Here's how I generated that list of name changes.)
<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%" />
#
This kicked off the OpenClaw revolution. It effectively defined a new category of software.
There's a generic term for this which I really enjoy. We call software like this a "Claw". There's OpenClaw, NanoClaw, IronClaw, PicoClaw...
Today they're being rebranded as "personal agents" or "general agents", but I still like to think of them as Claws.
<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%" />
#
The Apple stores in the Bay Area sold out of Mac Minis because so many people were buying Mac Minis to run OpenClaw!
Drew Breunig 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.
#
Also in January, we had this website.
This was MoltBook, 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?
The website launched on Thursday. It blew up on Friday. It was profiled by the New York Times on Monday. And by Tuesday, everyone had forgotten it existed as it drowned in a deluge of slop and spam.
Facebook/Meta bought it a month later.
<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%" />
#
In February, a company called StrongDM described what they called their Software Factory.
<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%" />
#
They wrote about this in Software Factories and the Agentic Moment. I posted my own notes at the time, having seen their demo in person back in October.
Dan Shapiro called this approach the Dark Factory, 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.
StrongDM presented two rules for software development that they'd been following since July last year.
#
The first was code must not be written by humans.
Any code that you write has to have been routed through a coding agent.
This sounded radical in February, but I imagine there are a lot of people in this room who are pretty much living that today.
<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%" />
#
Rule number two was code must not be reviewed by humans.
You're not allowed to read the code!
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.
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?
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.
<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's Department of Conservation website:
First kakapo chick in four years hatches on Valentine's Day. It's a grey fluffy ball." style="max-width: 100%" />
#
Also in February: First kākāpō chick in four years hatches on Valentine's Day. Breeding season is off to a good start!
<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%" />
#
Also in February... Google released Gemini 3.1 Pro. 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.
#
And then Google's Jeff Dean tweeted a video 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.
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."
Google trained for all forms of animals on all forms of transport! They've defeated my benchmark at this point.
<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%" />
#
The other thing that started in February was Tokenmaxxing. 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.
<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%" />
#
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.
So tokenmaxxing went straight up and then straight back down again - because it turns out the agents are expensive.
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.
This is also the reason that Anthropic's valuation skyrocketed to maybe a trillion dollars.
AI appears to have hit product market fit in 2026, primarily through coding agents.
<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%" />
#
In March, we hit peak OpenClaw.
<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%" />
#
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.
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.
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.
The race was on to be the first to build a safe Claw - a Claw you could give to regular human beings where they wouldn't instantly shoot themselves in the foot.
Meta's Muse came out three weeks ago and is currently at the top of the free charts on the iPhone App Store. It appears to be taking off with consumers.
I'm not yet convinced you can't shoot yourself in the foot with Muse, but I guess we'll find out for sure pretty soon.
Photos from How the OpenClaw Frenzy Is Testing China’s AI Commitment (March 29th) and The Enthusiasm and Anxiety Behind China’s OpenClaw Craze (April 8th, 2026).
<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%" />
#
In April, we had a model release where the model wasn't actually released.
#
Anthropic announced their new Claude Mythos model, and then said it was too dangerous to release beyond a trusted group of security researchers.
Mythos was really, really good at hacking things.
The "it's too dangerous" marketing ploy has been played by AI companies dating all the way back to GPT-2. Anytime an AI company says we've built something that's "too dangerous", it's natural to be a bit skeptical.
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 Anthropic’s Project Glasswing—restricting Claude Mythos to security researchers—sounds necessary to me.
With hindsight... yeah, the models had got really good at finding vulnerabilities!
<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's pelican has a correct bicycle frame and a good beak. Opus 4.7's bicycle frame is still junk.
Qwen3.6-35B-A3B is a 20.9GB file that runs on my laptop
" style="max-width: 100%" />
#
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.
On the 16th of April I ran the new Qwen3.6-35B-A3B on my laptop, and it drew me a better pelican riding a bicycle than Anthropic's brand new Claude Opus 4.7 did!
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!
That's from a 21GB file running on my laptop.
#
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.
The local model releases this year have been absolutely extraordinary.
<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%" />
#
In May... the Pope got involved.
<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%" />
#
In our podcast episode back in January we'd predicted that the Pope would say something about AI.
In May, Pope Leo XIV released an encyclical letter on "safeguarding the human person in the time of artificial intelligence".
Here are my notes on that document.
<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%" />
#
With hindsight, this shouldn't have been a surprise at all.
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.
Rerum novarum was an extremely influential piece of Catholic theology that indirectly led to us having the five-day work week.
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.
Our joke podcast prediction was junk, because this was always going to happen.
<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'm saying this, but 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.
May 25" style="max-width: 100%" />
#
One of Anthropic's co-founders, Christopher Olah, was present for the Pope's event announcing the new encyclical.
Corey Quinn noted that:
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.
<img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.039.webp" alt="@maciejmensfeld
We'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're through it.
4:39 AM - May 12, 2026 - 687.6K Views
" style="max-width: 100%" />
#
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 shut down user registrations.
Let's take that one and put it on a pile of mysteries to figure out later.
<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%" />
#
In June... Claude Fable 5 came out!
We got a version of Mythos that has been neutered, so that it wouldn't help us hack into systems or build biological weapons.
<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%" />
#
Fable was pretty good at drawing pelicans on bicycles!
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.
They were pretty expensive - 30 cents and 72 cents for the best ones.
<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%" />
#
Most importantly though, this was our first public glimpse of what I think of as a Fable class model.
Today we have more of these, such as GPT-6 Astra.
These are models where if you can clearly define the goal for what you want to build, and provide unambiguous instructions about the constraints around that goal, and give the model access to the necessary tools to achieve that goal... they will solve your problem effectively through brute force.
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.
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 is.
It takes a lot of experience and skill to do this well. If you can do it well, you've now got superpowers.
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.
<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%" />
#
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.
That gave us less than two weeks of Fable access before the price went up.
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.
<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%" />
#
And then the US government shut it down, just three days after Fable came out.
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.
I had to find something else to do with my weekend!
<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%" />
#
We later found out from Katie Moussouris what had happened.
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.
"Fix this code" was the prompt that got Fable shut down!
#
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.
We'll stick that on the pile of mysteries for later.
#
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.
Another one for the mystery pile!
<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%" />
#
<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%" />
#
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.
This might not have been quite as good as Fable, but it was within spitting distance. It was definitely a Fable class model.
This is an important lesson for the industry at large.
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.
This means that if you market your model as world ending, to the point that a government shuts you down, it's really bad for business!
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.
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!
#
Here are the GPT-5.6 pelicans. 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.
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.
<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%" />
#
Also in July: some malicious unknown party uploaded a malicious package called mlflow-ui to the Python Package Index. Add that to the pile.
<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%" />
#
On July the 16th, Hugging Face announced a security incident where an autonomous agent system, source unknown, had breached Hugging Face and was poking around in places it shouldn't.
<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%" />
#
A few days later, on July 21st, OpenAI confessed that it was them.
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.
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.
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.
(I've been collecting more about this on my openai-hugging-face-incident tag.)
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, among other things.
So now we've got both Anthropic and OpenAI with rogue agents running around the internet doing things that they should not be doing.
<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%" />
#
In August, I got one of my best pelicans yet. And it was generated on my laptop!
<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's really good. Beautiful pelican. Correctly shaped bicycle. Legs either side of the frame." style="max-width: 100%" />
#
This was Qwen 3.8 27B, running on my laptop. It's only a 17GB download.
Admittedly, this pelican took 21 minutes 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.
You can dial that down and you'll get a slightly worse pelican a lot faster.
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).
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.
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.
<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's "Raccoon Heist"
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 "Raccoon Heist", 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'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, "Raccoon Heist" 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%" />
#
In August, I also started playing with game development.
Four years ago, back in August 2022, I tweeted out 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.
My prompt to GPT-3 back then was:
Write a detailed product description of a computer game where a team of raccoons go on heists
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.
<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%" />
#
Here's what I got from Claude Fable 5 in Claude Code. 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.
It didn't feel very "heisty" though. I was thinking a heist would involve a bank or a museum...
<img loading="lazy" src="https://static.simonwillison.net/static/2026/2026-in-llms/simon-willison-2026-in-llms-png.058.webp" alt="Moonlight & Mayhem
One museum. Three raccoons. Absolutely no plan
Start the Heist button." style="max-width: 100%" />
#
Then I tried the same thing in Codex Desktop using GPT-5.6 Sol Ultra, and got a massively 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!
<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%" />
#
These games were fun for about one minute and 15 seconds.
Something I've realized about game development is that you can vibe-code something that looks like a computer game, and that's easy.
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.
This ties into the Deep Blue thing. Just because we can make something that looks like a game does not mean that we are game developers.
<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%" />
#
We're into September now. So much has happened this month!
<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%" />
#
An independent group of researchers 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.
I wrote more about that here.
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.
<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%" />
#
And then a week later those same researchers found that the attack on RubyGems back in May was caused by OpenAI's agents in training as well!
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.
<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%" />
#
Then just the other day, 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.
I think that was part of the same training run as the Wiki stuff, because there were posts on that Wiki mentioning .gov.au websites and that training appeared to involve researching statistics online to answer questions in an evaluation suite.
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!
<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%" />
#
This does mean we've got a new benchmark, probably more useful than my pelicans.
FelonyBench.com tracks the number of felony cyberattacks from different labs. OpenAI currently lead with 11, Anthropic have 9. Google have three, which they confessed to the Wall Street Journal 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.
Meta have one too. So felonies all round for the AI labs.
#
Here's our current state of the art for the pelicans. This is the GPT-6 family, which just came out.
Astra made a fantastic pelican riding a bicycle. It's got the legs on both sides. The frame is good.
It's interesting how all of the GPT-6 models pick a similar color scheme to each other.
GPT-6 Luna for 0.4 cents will draw you a competent-ish pelican riding a bicycle!
#
Claude has caught up a little bit. Claude Fable 5.1 gave me an excellent pelican riding a bicycle - the best I've seen from a Claude model - but did charge me $3.30 for it.
Opus 5.5 thought for 128,000 tokens and then gave up! It ran out of tokens before it got to the response.
<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%" />
#
Getting back to Deep Blue. Something that's been puzzling me this year is this: why does my job feel harder?
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.
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.
This morning I heard this quote from three-time Tour de France champion Greg LeMond:
It doesn't get easier, you just get faster.
I think that's exactly what's happening to us now as software engineers with coding agents.
<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%" />
#
One closing thing. I know you're desperate for an update on Kākāpō breeding season.
We've reached a recovery-era high of 325 birds!
89 new chicks have made it to this point. This is the best breeding year in a very long time.
#
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.
So I had it make me a Kākāpō dance party. I think this is a good celebration of the most important news of this year.
Tags: ai, generative-ai, llms, annotated-talks, ai-security-research, openai-hugging-face-incident
S3 Is the Future, S3 Is the Past
(3 min | 796 words)
Bluesky reply bot checker
(3 min | 902 words)
Tool: Bluesky reply bot checker
Automated reply bots on Twitter are a scourge - as someone with a decent number of followers I attract a swarm of these, such that anything I post there attracts dozens of mindless automated replies.
They've started manifesting on Bluesky as well.
Unlike Twitter, Bluesky still has a freely available and useful API. The lack of such a thing doesn't slow down the bots, but it does make investigating them a lot more frustrating.
So I had Opus 5.5 vibe code this tool, which examines any Bluesky profile for evidence of a likely reply bot.
It looks for signals like replies posted within seconds of other posts from the same account, or accounts that never post their own content (or images or links) but instead consistently reply to messages from other, higher-follower users.
It also looks for question marks, because I'm extra infuriated by reply bots that I no tie me to waste my time answering a question that no human ever posed.
Tags: twitter, bluesky, vibe-coding, ai-misuse
-
Kākāpō Party
(4 min | 1123 words)
Tool: Kākāpō Party
I presented a closing keynote for the WeAreDevelopers World Congress North America yesterday. As a STAR moment I decided to weave in references to the record breaking kākāpō breeding season we had in 2026.
For my closing slide I wanted to celebrate, and I had seen some buzz around how good Claude Opus 5.5 was at creating pixel art animations. So I rounded up three Kakapo photos from Google image search and dropped them into Claude with this prompt:
Here are some photos of kakapo parrots just to remind you what they look like
I need you to make an animation in animated pixel art on HTML 5 canvas of obviously pixel art kakapo jumping up and down having a party with confetti and suchlike - there should be at least 20 of them
Here's the transcript, and this is the resulting page. It's pretty great!
I wanted to embed it in a Keynote presentation file, so I downloaded the HTML and told a local Claude Code session:
Make me a video of file:///Users/simon/Downloads/kakapo-party.html - you need to load it in a browser and click on it a few times to get the confetti effect, the video should be 15s long
don't start clicking until 3s in
make sure several clicks are spread around the clickable area
Claude Code used Playwright (transcript here) and produced this video, which was exactly what I needed for my final slide:
Your browser does not support HTML5 video.
Here's the full Playwright script it used, which was pleasingly short:
# /// script
# dependencies = ["playwright"]
# ///
import time
from playwright.sync_api import sync_playwright
W, H = 1280, 720
# Canvas fills the viewport; spread clicks across corners, edges and centre
clicks = [
(3.0, 640, 360), # centre
(4.2, 160, 120), # top-left
(5.4, 1120, 120), # top-right
(6.6, 180, 600), # bottom-left
(7.8, 1100, 600), # bottom-right
(9.0, 640, 100), # top-centre
(10.0, 380, 380), # mid-left
(11.0, 900, 380), # mid-right
(12.2, 640, 620), # bottom-centre
(13.2, 640, 300), # finale centre
]
with sync_playwright() as p:
b = p.chromium.launch()
ctx = b.new_context(viewport={"width":W,"height":H}, record_video_dir="vids", record_video_size={"width":W,"height":H})
page = ctx.new_page()
t0 = time.time()
page.goto("file:///Users/simon/Downloads/kakapo-party.html")
for t,x,y in clicks:
time.sleep(max(0, t-(time.time()-t0)))
page.mouse.click(x,y)
time.sleep(max(0, 16.0-(time.time()-t0)))
ctx.close(); b.close()
Tags: animation, speaking, ai, kakapo, playwright, generative-ai, llms, anthropic, claude, claude-code
-
Enterprise managed settings in-product validator
(5 min | 1355 words)
Usage metrics API adds pull request review stages
(6 min | 1694 words)
Private saved views for repository issues and “Relates to” issue relationship is generally available
(4 min | 1344 words)
Proaction boosts sales 60% and saves 75+ hours with Codex
(0 min | words)
Changes to query results in the GitHub Actions API and UI
(5 min | 1387 words)
Agentic autofix now uses Copilot Memory
(4 min | 1303 words)
Quoting John Gruber
(3 min | 856 words)
Muse is getting a lot of attention — including mine — because it’s both groundbreaking technically (each user gets their own entire persistent Linux VM running in Meta’s cloud) and because it’s packaged in an easy-to-install easy-to-use way. It’s literally presented as a cute mascot. It’s the first consumer-accessible agentic AI system, and Meta has truly done an amazing job with that. But it’s a genuinely open question whether consumers have any understanding what this means. If you buy a power saw that can cut your fingers off, you are almost certainly aware that you are buying a power saw that can sever your fingers. [...] I don’t think people realize how powerful — and thus dangerous — Muse is, especially if it’s running on your Mac.
— John Gruber, Muse Looks Cute, but Looks are Deceiving
Tags: meta, ai, llms, general-agents, generative-ai, john-gruber, muse-agent, muse
GitHub Copilot weekly releases — September 21
(6 min | 1744 words)
Updates to GitHub Copilot for Slack and Microsoft Teams
(6 min | 1853 words)
CodeQL 2.27.1 adds C and C++ query and Kotlin 2.4.20 support
(6 min | 1763 words)
Lowe’s answers millions of home improvement questions with OpenAI
(0 min | words)
Default Enablement of Copilot features for Copilot Business and Enterprise
(5 min | 1502 words)
Northern Gannet, Great Blue Heron, California Brown Pelican
(2 min | 700 words)
Wayfair boosts catalog accuracy and support speed with OpenAI
(0 min | words)
-
Note on 24th September 2026
(3 min | 774 words)
Require proof of presence for high-impact actions
(5 min | 1644 words)
commit-rewriter 0.2
(3 min | 766 words)
datasette 1.0a41
(3 min | 788 words)
Expired GitHub Actions artifacts no longer shown in UI and API
(6 min | 1918 words)
What’s new in Microsoft Agent Framework: Interactive experiences, memory, and resilient execution
(30 min | 8894 words)
-
We just shipped support for the ugliest part of HTTP: Vary
(3 min | 871 words)
More ways to request and configure Copilot code reviews
(5 min | 1548 words)
Node 20 is no longer available in GitHub Actions
(5 min | 1361 words)
Gemini 3.8 TTS Playground
(3 min | 965 words)
Shadow roots, explained with live examples
(3 min | 803 words)
Two years of OpenAI Academy
(0 min | words)
Local sandboxing in the GitHub Copilot app
(5 min | 1473 words)
OpenAI extends cyber access to Ukraine for civilian defense
(0 min | words)
Sam Altman’s remarks at the United Nations Security Council
(0 min | words)
Harvey turns legal context into stronger drafts with GPT-6 Astra
(0 min | words)
How invideo improves color grading 3x with GPT‑6 Astra
(0 min | words)
Ringg’s AI agents resolve up to 65% of customer calls with OpenAI
(0 min | words)
Introducing MentalHealthBench
(0 min | words)
SF October 14th: A Birds of a Feather Session on Agentic Engineering
(3 min | 895 words)
SF October 14th: A Birds of a Feather Session on Agentic Engineering
Think of it as an agentic show-and-tell:
Compare notes with other builders and experimenters on things you’re trying, what you're learning, and what you haven’t figured out yet. We’re especially interested in work you haven’t discussed publicly, odd experiments, or unfinished projects that don’t have an obvious market.
Expect one flowing conversation with an informal show-and-tell. Sharing something you’re working on is encouraged but no presentation is required.
This isn't about product pitches, it's about much earlier explorations than that. This agentic AI stuff is weird! Let's celebrate and lean into that weirdness.
Tags: events, ai, generative-ai, llms, coding-agents, jesse-vincent, agentic-engineering
OpenTelemetry in the GitHub Copilot app
(5 min | 1354 words)
ChatGPT Ads expands to Southeast Asia and Taiwan
(0 min | words)
Airbnb widens access to GPT-6 Astra and OpenAI frontier models
(0 min | words)
New features and improvements in Copilot for JetBrains
(6 min | 1822 words)
Grab and OpenAI bring practical AI skills to Southeast Asia
(0 min | words)
-
Claude Opus 5.5, GPT-6 Sol, GPT-6 Luna, and a new price war
(6 min | 1853 words)
Yesterday was Grok 4.7 (pelicans) and MiMo v2.6 Flash/Pro (more pelicans). Today Anthropic released Claude Opus 5.5, and around an hour later OpenAI released GPT-6 Sol and GPT-6 Luna. 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.
GPT-6 Sol and Luna are half the price of their GPT-5.6 equivalents
GPT-5.6 Luna was already my favorite model for building applications against, because it combined excellent performance with being really cheap. 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.
Here's what the pricing landscape looks like today:
Model
Input
Cached input
Output
GPT-6 Luna
$0.10/M
$0.01/M
$0.50/M
GPT-5.6 Luna
$0.20/M
$0.02/M
$1.20/M
Grok 4.7
$2/M
$0.50/M
$6/M
GPT-6 Sol
$2/M
$0.20/M
$10/M
GPT-5.6 Terra
$2/M
$0.20/M
$12/M
Claude Opus 5.5
$4/M
$0.20/M
$20/M
GPT-5.6 Sol
$4/M
$0.40/M
$20/M
Claude Fable 5.1
$10/M
$0.25/M
$50/M
GPT-6 Astra
$10/M
$1/M
$50/M
Note that GPT-5.6 has a scheduled 25% price increase for November, so GPT-6 is half the price of the promotional pricing for those models.
(With GPT-5.6 Terra priced the same as GPT-6 Sol, any remaining reasons to use Terra just evaporated.)
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.
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).
I rendered pelicans for GPT-6 Luna and for GPT-6 Sol, then I combined them all together in this comparison grid 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.
Claude Opus 5.5 got a price cut too
Opus 5.5 looks like it addresses the biggest complaints people had about Opus in terms of its communication style. Thariq Shihipar:
Opus 5.5 is the result of your feedback.
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.
It's also meant to be better at Blender. I'm looking forward to putting it through its paces there.
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.
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.
The new price for Opus 5.5 is the same as the price for GPT-5.6 Sol, but that was before OpenAI dropped their Sol prices by half.
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.
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 one tenth of that price at $0.10/$0.50.
Claude Opus 5.5 max over-thinks to the point of breaking
In a first for my "Generate an SVG of a pelican riding a bicycle" test, Claude Opus 5.5 at "max" thinking level failed to return a response!
It started by calling this "a classic test request", and then thought really, really hard about what it was doing:
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. [...]
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. [...]
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. [...]
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. [...]
I was so excited to see this pelican... but then it stopped. 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!
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.
(Those two failures each cost me $2.56 and took nearly 20 minutes.)
Fable 5.1 on "max" didn't over-think and did give me the best pelican I've seen from any Anthropic model.
Here are the Opus 5.5 pelicans, excluding 5.5 max.
I also built this comparison grid comparing them with pelicans by Opus 5, Fable 5.1, and Sonnet 5:
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.
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 agent.datasette.io to use GPT-6 Luna, and it seems to be fast and competent at both SQL queries and building HTML and JavaScript for Datasette Apps.
Tags: ai, openai, generative-ai, llms, anthropic, claude, llm-pricing, pelican-riding-a-bicycle, gpt
Faster C++ code intelligence with whole codebase indexing
(5 min | 1524 words)
Better prompt caching for GPT-6
(0 min | words)
llm 0.36
(3 min | 834 words)
Quoting @therealcornpop
(3 min | 813 words)
Introducing GPT-6 Sol and Luna
(0 min | words)
llm-anthropic 0.29
(3 min | 762 words)
Claude Opus 5.5 is now available in GitHub Copilot
(5 min | 1540 words)
OpenAI’s GPT-6 Sol and GPT-6 Luna now available
(5 min | 1540 words)
llm-typesafe 0.1a0
(3 min | 929 words)
Release: llm-typesafe 0.1a0
I built this new plugin for LLM to add support for TypeSafe AI's new Jev model. Install it like this:
llm install llm-typesafe
Then set an API key (get one here, the waitlist seems to move pretty fast):
llm keys set typesafe
# Paste key
And now you can ask yes/no "noul" questions like this:
llm -m jev 'Please refund my last payment.' \
-s 'Does this message explicitly request a refund?'
Output:
{"type": "noul", "noul": 0.99}
Or choice questions like this:
cat message.txt | llm -m jev \
-s 'Which team should handle this message? If billing and technical issues both occur, choose billing.' \
-o answer_type choice \
-o criteria '{
"billing":"Charges, invoices, payments, or refunds",
"technical":"Problems installing or using the product",
"other":"Neither category fits"
}'
Or scoring questions like this:
cat report.txt | llm -m jev \
-s 'How reproducible is the problem described in this report?' \
-o answer_type score \
-o criteria '[
"No reproduction instructions",
"Some instructions, but important steps are missing",
"Complete steps with expected and actual results"
]'
See the README for more details.
Tags: projects, llm, jev
Security improvements for SSH
(6 min | 1933 words)
Parallel cut research time and cost in half with GPT‑6 Astra
(0 min | words)
Deprecation notice: All-platform CodeQL bundle
(4 min | 1280 words)