<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Simon Willison&#39;s Weblog</title>
  <subtitle>Browse aymeric&#39;s, an independent, searchable archive of readable snapshots from followed feeds, preserved in Git with aggr.</subtitle>
  <id>https://aggr.aymericbeaumet.com/sources/simonwillison.net/</id>
  <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/sources/simonwillison.net/"/>
  <link rel="self" type="application/atom+xml" href="https://aggr.aymericbeaumet.com/sources/simonwillison.net/atom.xml"/>
  <updated>2026-10-21T18:41:53+00:00</updated>
  <author>
    <name>aymeric&#39;s</name>
  </author>
  <generator version="2.0.0" uri="https://github.com/aymericbeaumet/aggr">aggr</generator>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:63a54d1ce9e7c418a57515da611de7bfa38a48d3</id>
    <title type="text">Today&#39;s PHP Security Release, and How We&#39;re Strengthening PHP Security</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-21-today-s-php-security-release-and-how-we-re-strengthening/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/21/php-security-release/"/>
    <published>2026-10-21T18:41:53+00:00</published>
    <updated>2026-10-21T18:41:53+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="ai-security-research"/>
    <category term="open-source"/>
    <category term="php"/>
    <category term="security"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Today&#39;s PHP Security Release, and How We&#39;re Strengthening PHP Security If you&#39;re running anything on PHP it&#39;s vital you upgrade - today&#39;s updates (across the entire PHP 8.x line) address two remote code execution holes, and there have been…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/&quot;&gt;Today&#39;s PHP Security Release, and How We&#39;re Strengthening PHP Security&lt;/a&gt;&lt;/strong&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=50182987&quot; title=&quot;Hacker News&quot;&gt;via&lt;/a&gt;) If you&#39;re running anything on PHP it&#39;s vital you upgrade - today&#39;s updates (across the entire PHP 8.x line) address two remote code execution holes, and there have been exploits circulating since last night, thanks to a leak in the coordinated disclosure process.&lt;/p&gt;
&lt;p&gt;This post from the PHP Foundation explain what went so wrong:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On Tuesday, October 20th, at around 15:00 UTC, the two CVE IDs began circulating on online forums and social media. They came with a wrong release time and a wrong CVSS score of 10.0 (the actual score is 9.2). No technical details leaked. In response, the PHP project brought its pre-announcement forward and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.php.net/archive/2026.php#2026-10-20-1&quot;&gt;published it at 19:30 UTC&lt;/a&gt;. It also moved the release from October 22nd, 14:00 UTC, to October 21st, 14:00 UTC [...]&lt;/p&gt;
&lt;p&gt;As a result of the leak and pre-announcement around 20:00 UTC, Calif, one of the security firms that had reported the issues mistakenly published a video. It showed their proof of concept working against a number of targets and revealed a few additional, though limited, details about the vulnerabilities. Copies of the deleted video started circulating on social media soon after. The video contributed to accelerated development of various PoCs (exploitation proof of concepts), which then increased circulation on October 21st.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.wiz.io/blog/php2shell-php-rce&quot;&gt;This article&lt;/a&gt; from the team that discovered the original vulnerability includes a more detailed timeline of the original intended responsible disclosure:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;August 19, 2026:&lt;/strong&gt; Wiz Research discovers the first PHP vulnerability using Wiz Atlas, Gemini 4 Argon, and GPT-5.6 Sol.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;August 20, 2026:&lt;/strong&gt; Unauthenticated RCE is confirmed against Drupal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;August 21, 2026:&lt;/strong&gt; Unauthenticated RCE is confirmed against WordPress.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;August 24, 2026:&lt;/strong&gt; Wiz Research reports the vulnerabilities to the PHP security team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;September 21, 2026:&lt;/strong&gt; PHP acknowledges the reports and begins developing a coordinated fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;October 21, 2026:&lt;/strong&gt; Patched PHP releases become available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;October 21, 2026:&lt;/strong&gt; Public disclosure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:1b0795644924b22c1d6affc570759297d4a94224</id>
    <title type="text">Panache — RTS Belle Époque pour mobile</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-21-panache-rts-belle-epoque-pour-mobile/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/21/panache/"/>
    <published>2026-10-21T16:25:16+00:00</published>
    <updated>2026-10-21T16:25:16+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="game-design"/>
    <category term="open-source"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Panache — RTS Belle Époque pour mobile Well this is delightful: I released Battle Drones yesterday under an Apache 2.0 License and there&#39;s already a French language fork which reskins the game to take place in steampunk 1900s France and…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/menufactory43/panache/&quot;&gt;Panache — RTS Belle Époque pour mobile&lt;/a&gt;&lt;/strong&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://twitter.com/Meffysto69/status/2112908755654365220&quot; title=&quot;@Meffysto69&quot;&gt;via&lt;/a&gt;) Well this is delightful: I &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/&quot;&gt;released Battle Drones&lt;/a&gt; yesterday under an Apache 2.0 License and there&#39;s already a French language fork which reskins the game to take place in steampunk 1900s France and adds an animated intro!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Panache&lt;/strong&gt; est un jeu de stratégie en temps réel pour mobile et navigateur, dans la France de la Belle Époque (vers 1900) : dirigeables, Fardiers à vapeur, Creusot cuirassés, automates en képi, Gargantua la forteresse marchante — et beaucoup de panache.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://menufactory43.github.io/panache/&quot;&gt;play Panache here&lt;/a&gt; - it&#39;s worth clicking that link just to experience the new intro video.&lt;/p&gt;
&lt;p&gt;So far it&#39;s mostly just aesthetic updates as opposed to gameplay changes. The music has had a French twist added to it as well.&lt;/p&gt;
&lt;p&gt;The new steampunk models are so cool!&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/battledrones-french.jpg&quot; alt=&quot;The new buildings are gold and red, there are dirigibles and biplanes, and the Goliath stomping mech has had a total makeover.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Here&#39;s a page with &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/models.html&quot;&gt;the original Battle Drones models&lt;/a&gt; and that same page &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://menufactory43.github.io/panache/models.html&quot;&gt;with the new Panache alternatives&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a comparison of the original and the new design for the Goliath:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/battledrones-goliath-diff.jpg&quot; alt=&quot;On the left: blue stomping mech robot, missile launcher shoulders, classic sci-fi robot look. On the right: gold, steampunk, much more 1900s French look.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:09b06ee9aa009a2d28af3d4fa4e3264a2533346b</id>
    <title type="text">eMudhra Intermediate CA Compromise</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-20-emudhra-intermediate-ca-compromise/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/20/emudhra-certificates/"/>
    <published>2026-10-20T23:50:25+00:00</published>
    <updated>2026-10-20T23:50:25+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="encryption"/>
    <category term="https"/>
    <category term="pip"/>
    <category term="python"/>
    <category term="security"/>
    <category term="uv"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">eMudhra Intermediate CA Compromise This is very, very bad news: The private keys of eight eMudhra intermediate CA certificates have been compromised. They chain to roots trusted by the Mozilla, Microsoft, Apple and Chrome root programs and…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://emudhra.we-have-a-problem.com&quot;&gt;eMudhra Intermediate CA Compromise&lt;/a&gt;&lt;/strong&gt;. This is very, very bad news:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The private keys of eight eMudhra intermediate CA certificates have been compromised. They chain to roots trusted by the Mozilla, Microsoft, Apple and Chrome root programs and by many downstream trust stores.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Any software that bundles a list of trusted certificates needs to be updated. This site is tracking software updates &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/galadran/we-have-a-problem.com&quot;&gt;via this GitHub repository&lt;/a&gt; - Linux distros need to update their &lt;code&gt;ca-certificates&lt;/code&gt; packages.&lt;/p&gt;
&lt;p&gt;In Python world &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/astral-sh/uv/releases/tag/0.13.4&quot;&gt;uv 0.13.4&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pypa/pip/releases/tag/26.2.2&quot;&gt;pip 26.2.2&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/certifi/python-certifi/releases/tag/2026.10.19&quot;&gt;certifi 2026.10.19&lt;/a&gt; have been released with upgraded certificate lists.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:4f03dfb1358a680a7b81738912f5a29a606884c9</id>
    <title type="text">Battle Drones - a vibe coded RTS with audio-based multiplayer</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-20-battle-drones-a-vibe-coded-rts-with-audio-based-multiplayer/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/20/battledrones/"/>
    <published>2026-10-20T19:34:19+00:00</published>
    <updated>2026-10-20T19:34:19+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="claude"/>
    <category term="claude-code"/>
    <category term="coding-agents"/>
    <category term="game-design"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="projects"/>
    <category term="vibe-coding"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">My latest vibe coded game experiment is a Command &amp; 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&#39;m somewhat embarrassed to admit that I…</summary>
    <content type="html">&lt;p&gt;My latest vibe coded game experiment is a Command &amp;amp; Conquer style RTS (Real Time Strategy) game called &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones#readme&quot;&gt;Battle Drones&lt;/a&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/&quot;&gt;play it here&lt;/a&gt;). Unlike &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Aug/5/raccoon-heist/&quot;&gt;my previous experiments&lt;/a&gt;, this one is &lt;em&gt;actually fun to play&lt;/em&gt;. I’m somewhat embarrassed to admit that I got there by telling Claude to “Make it a LOT more fun”. It also supports multiplayer between nearby devices using audio to synchronize game state! Here’s what I’ve built so far, and some of the things I learned along the way.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#battle-drones&quot;&gt;Battle Drones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#how-i-built-this&quot;&gt;How I built this&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v1-the-initial-prototype&quot;&gt;v1: the initial prototype&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v2-full-sprites&quot;&gt;v2: full sprites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v3-varied-terrain&quot;&gt;v3: varied terrain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v4-the-fun-update&quot;&gt;v4: the fun update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v5-battle-drones-goes-3d&quot;&gt;v5: Battle Drones goes 3D&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v8-archipelago&quot;&gt;v8: Archipelago&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v10-goliath-and-agent-battles&quot;&gt;v10: Goliath, and agent battles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#agent-battles&quot;&gt;Agent battles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v11-random-maps&quot;&gt;v11: Random Maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#v12-multiplayer-via-sound&quot;&gt;v12: Multiplayer via sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/20/battledrones/#some-thoughts&quot;&gt;Some thoughts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Battle Drones&lt;/h4&gt;
&lt;p&gt;My initial goal was to build an RTS game I could play on my phone, in the style of &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Command_&amp;amp;_Conquer_(1995_video_game)&quot;&gt;Command &amp;amp; Conquer&lt;/a&gt;. I have fond memories of the 1995 original (I liked Red Alert too) and wanted to recapture a little bit of the magic.&lt;/p&gt;
&lt;p&gt;After 12 major iterations (and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/commits/main/&quot;&gt;321 commits&lt;/a&gt; by coding agents, mainly Claude Code) I now have a browser-based game that works on mobile and desktop, has multiple play modes, several maps (including a random map generator) and even supports multiplayer for two devices within microphone range of each other.&lt;/p&gt;
&lt;p&gt;Here’s a video demo of Battle Drones running in a desktop browser:&lt;/p&gt;
&lt;p&gt;Features so far include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;9 buildings, 7 ground vehicles, 6 aerial vehicles, 3 infantry units—all 3D models, which you can &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/models.html&quot;&gt;browse here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fog of war&lt;/li&gt;
&lt;li&gt;Different weapons are needed to target aerial or ground vehicles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Six maps&lt;/strong&gt;, across five biomes—temperate, desert, arctic, volcanic, tropical&lt;/li&gt;
&lt;li&gt;A random map generator&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skirmish mode&lt;/strong&gt;—red vs. blue on a rotationally symmetrical map&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Last Stand mode&lt;/strong&gt;—one player holds out against as many waves of enemies as possible&lt;/li&gt;
&lt;li&gt;Area effect weapons: Barrage, EMP, Drop Pod, Sky Hammer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crate drops&lt;/strong&gt; with bonus resources&lt;/li&gt;
&lt;li&gt;In-game music that responds to events—it gets more intense as fighting breaks out&lt;/li&gt;
&lt;li&gt;Different in-game &lt;strong&gt;AI personalities&lt;/strong&gt; (Balanced, Rush, Air Swarm, Boom, Skyforce, Ironclad)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI vs. AI&lt;/strong&gt; mode, to watch those personalities play each other&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Goliath&lt;/strong&gt;—a giant stomping mech with laser eyes and arm cannons and the ability to establish a new base&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mutators&lt;/strong&gt; that add extra rules or twists&lt;/li&gt;
&lt;li&gt;A “Daily Op” challenge&lt;/li&gt;
&lt;li&gt;Ranks and achievements (&lt;strong&gt;Medals&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent vs. Agent&lt;/strong&gt; mode where two LLMs can play Battle Drones against each other&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;multiplayer mode&lt;/strong&gt; based on two nearby phones communicating via audio messages, an extension of my earlier experiment with &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/15/chirp-pong/&quot;&gt;Chirp Pong&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;How I built this&lt;/h4&gt;
&lt;p&gt;Battle Drones is heavily vibe coded—I’ve reviewed almost none of the code, and it’s built in a language (TypeScript) that I’ve hardly used myself. I’ve playtested it quite a bit though, and it’s been through a large number of iterations since I started the project.&lt;/p&gt;
&lt;p&gt;Here’s a rough history of the project so far, including key prompts and links to transcripts.&lt;/p&gt;
&lt;h4&gt;v1: the initial prototype&lt;/h4&gt;
&lt;p&gt;I started out with Claude Fable 5 back in July:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;We are going to build a mobile friendly RTS game - command and conquer style - called Battle Drones, in which two armies of drones (both flying and ground-based) battle for territory and resources&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Let&#39;s start with a MVP design, ask me some questions&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here’s a &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/code/session_015RYeKm4ji4N16oqthyX1b1&quot;&gt;shared transcript&lt;/a&gt;. I’d given Claude Code for Web an environment variable with an OpenAI API key and told it to use the OpenAI &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developers.openai.com/api/docs/guides/image-generation&quot;&gt;Image Generation API&lt;/a&gt; for assets, which got me some basic sprites.&lt;/p&gt;
&lt;p&gt;You can &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v1/&quot;&gt;try v1 here&lt;/a&gt;—it looked like this:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/battledrones-v1.webp&quot; alt=&quot;Game screen. Down the right are text icons to build Fab, Airpad, Turret, Harv, Sting, Flak, Scout, Wasp, Raptor. There is a blocky fog of war on a 2D battlefield. There are some gems, an HQ building being attacked by badly rendered tanks, and some blue vehicles dotted around. It&amp;#39;s not very visually impressive but it does look like a basic RTS.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;It’s recognizable as an RTS, has building mechanics and the ability to select and direct units, and a basic AI to play against.&lt;/p&gt;
&lt;p&gt;This first version was barely a proof of concept, and it wasn’t any fun to play.&lt;/p&gt;
&lt;p&gt;Claude used the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/phaserjs/phaser&quot;&gt;Phaser&lt;/a&gt; 2D game framework for these early versions. I didn’t even realize this until several iterations later!&lt;/p&gt;
&lt;h4&gt;v2: full sprites&lt;/h4&gt;
&lt;p&gt;The second version (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v2/&quot;&gt;try v2 here&lt;/a&gt;) added sprites for all of the vehicles and the “AI vs. AI” mode, so I could watch the game playing without having to directly control it myself.&lt;/p&gt;
&lt;p&gt;Claude proved reasonably competent at prompting OpenAI’s image models to generate sprites. You can browse the v2 sprites in the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/tree/v2/public/assets/sprites&quot;&gt;public/assets/sprites&lt;/a&gt; folder.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/battledrones-v2.webp&quot; alt=&quot;Four flying units, three turrets, a harvester and an airpad all have proper sprites now. The scrap field has a new design which doesn&amp;#39;t look great but is at least using a graphic.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4&gt;v3: varied terrain&lt;/h4&gt;
&lt;p&gt;It still wasn’t much fun, and the graphics were boring. It was now October, and I had upgraded to Claude Opus 5.5. I told it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Massively improve this game. Make the graphics and gameplay better (keep it mobile friendly). Render new graphics using the latest OpenAI GPT image API (lookup details) with the API key in the environment variable. Add new unit types and balance the gameplay better. Also add new buildings and better, more varied terrain.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This resulted in five new maps with generated background tiles in a variety of styles, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/commit/aa22f08a34347d7d9f94b33f44a73b4deb046aa1&quot;&gt;visible here&lt;/a&gt;. Opus also regenerated the sprites, making them much more visually appealing. You can &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v3/&quot;&gt;try v3 here&lt;/a&gt;—it looks like this:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/battledrones-v3.jpg&quot; alt=&quot;The map is now an ice map with snow and ice and broken ice - it looks really good. The vehicles and buildings have all had a cosmetic upgrade too. This is starting to look like a real game.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;This is starting to feel like a real game! It still wasn’t very fun to play though—I found myself getting bored pretty quickly.&lt;/p&gt;
&lt;h4&gt;v4: the fun update&lt;/h4&gt;
&lt;p&gt;So far my Battle Drones experiment was confirming my &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.059.webp&quot;&gt;previous belief&lt;/a&gt; that coding agents can build a thing that looks like a game but can’t actually make something that’s genuinely compelling to play.&lt;/p&gt;
&lt;p&gt;I shared this theory with someone over dinner, and then thought to myself that I should give the models a proper chance to prove me wrong. I prompted Opus 5.5 on my phone:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;This game isn&#39;t fun enough yet. Make it a LOT more fun.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This time I was running in &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://code.claude.com/docs/en/workflows&quot;&gt;Ultracode mode&lt;/a&gt;, where Claude Code (in this case Claude Code for Web) runs “dynamic workflows”, described in their docs as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A dynamic workflow is a JavaScript script that orchestrates many &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://code.claude.com/docs/en/sub-agents&quot;&gt;subagents&lt;/a&gt; at once.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This kicked off &lt;em&gt;many hours&lt;/em&gt; of work. I started it in the evening and didn’t get a playable result back until late into the next morning. But the results were spectacular.&lt;/p&gt;
&lt;p&gt;You can &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v4/&quot;&gt;try v4 here&lt;/a&gt;—it looks like this:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/battledrones-v4.jpg&quot; alt=&quot;The lava map. Uplink satellites are being taken, crystals look better, Elite text is shown above a unit, there is an arrow marked Fight to jump to a fight, the AI vs AI mode has a speed controller - plenty of new features here.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I had Claude &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/blob/main/Battle%20Drones%20The%20Fun%20Update%20%E2%80%94%20Release%20Notes.md&quot;&gt;write its own release notes&lt;/a&gt;—here are the highlights:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every skirmish and Daily Op now opens with a choice, gives the side that’s losing a way back, and pulls the armies into the middle of the map. There are also two new ways to play.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Openers&lt;/strong&gt;: pick Blitz, Industry or Air Wing before the clock starts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Call-down powers&lt;/strong&gt;: Barrage, EMP, Drop Pod and the Sky Hammer orbital strike.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectives and salvage&lt;/strong&gt;: Uplink relays, supply drops and wrecks worth scrap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feel&lt;/strong&gt;: combat juice, adaptive music, unit voices and an announcer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command&lt;/strong&gt;: battle alerts, game speed, saved squads and touch placement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New modes&lt;/strong&gt;: Last Stand survival waves and an 8-mission Ops campaign.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Progression&lt;/strong&gt;: heroes, an after-action report with awards, a career, 7 mutators and a Daily Op.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fights run longer and swing more. In 1,200 AI-vs-AI test matches on Normal, games still undecided after 25 minutes fell from 14% to 0.9%. The share of wins by a side that had been 800+ scrap behind rose from 24% to 46%.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Part of the reason Claude took so long was that it ran over a thousand simulated playtest sessions, and used the results to rebalance the existing units, add new ones, and introduce new features.&lt;/p&gt;
&lt;h4&gt;v5: Battle Drones goes 3D&lt;/h4&gt;
&lt;p&gt;After the success of Ultracode at “Make it a LOT more fun”, I decided to be more ambitious:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Port this game to three.js with 3D models for all of the buildings and vehicles and landscapes&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was another overnight run. I woke up to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v5/&quot;&gt;this v5 version&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/battledrones-v5.jpg&quot; alt=&quot;Now it is in 3D - the battlefield is at a slight angle, the buildings and vehicles are all 3D models, the rocks and trees look a bit 3D as well.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The new 3D models were entirely constructed by Claude in TypeScript code.&lt;/p&gt;
&lt;p&gt;v6 (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v6/&quot;&gt;play v6 here&lt;/a&gt;) added some more visual polish. v7 (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v7/&quot;&gt;play v7&lt;/a&gt;) added robot infantry (troopers, rocket squads, snipers) and a “Condor” troop carrying aircraft.&lt;/p&gt;
&lt;h4&gt;v8: Archipelago&lt;/h4&gt;
&lt;p&gt;I was beginning to feel guilty at how little actual design input I had into the game—it really had been a case of me saying “make it more fun” and “add visual polish” for the past few releases.&lt;/p&gt;
&lt;p&gt;I’d noticed that the AI didn’t use the new infantry and troop carrying aircraft from v7 very often—there wasn’t a great strategic reason to use them.&lt;/p&gt;
&lt;p&gt;It would be neat if we had a new map with a new game mechanic that actively encouraged players to load up Condors with infantry robots and send them out into the map.&lt;/p&gt;
&lt;p&gt;This resulted in my longest prompt yet:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Design a new map. Goal is to make different strategic incentives that encourage use of Infantry and Condors and aerial vehicles.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;To do this the map will have limited harvester resources but several more uplinks - but uplinks will be on islands that are inaccessible by land vehicles or infantry. These uplinks can also not be claimed using air vehicles. The ONLY way to get them is to fly infantry there in a Condor.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Armies always start with a Condor and a single squad. If an army has no Condor a new one will be provided for free, flying in from the edge closest to their HQ and landing there. That free condor will come with a single free squad on board.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;The two HQs should be entirely separated by water, but still accessible by vehicles thanks to two bridges across the map in different places&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;I want to encourage a battle over uplinks.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;The map should be the times the size of other maps - still square&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;First research and then critique this design. Only build after we have agreed on any modifications&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;You get to design a new biome for this&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The result was the tropical &lt;strong&gt;Archipelago&lt;/strong&gt; map, with seven island uplinks that players can only capture by flying out infantry in a Condor. It’s definitely the most fun map to play, once you’ve got the hang of the basic game mechanics from the simpler maps. The &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v9/&quot;&gt;v9 edition&lt;/a&gt; made that map a little more interesting—it now looks like this:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/battledrones-v8.jpg&quot; alt=&quot;Three islands, each with an uplink satellite. Blue holds one, red holds another, A blue condor is flying towards the red island, which is guarded by a red plane. There is a bridge nearby. The theme is tropical islands and looks very pleasant.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4&gt;v10: Goliath, and agent battles&lt;/h4&gt;
&lt;p&gt;I decided to add giant robot mechs to the game—think Jaegers from &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Pacific_Rim_(film)#Plot&quot;&gt;Pacific Rim&lt;/a&gt;, or Titans from Warhammer 40,000.&lt;/p&gt;
&lt;p&gt;Here are some of the prompts I used to brainstorm with Claude:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Help me brainstorm ideas for adding giant robots to this game - think dreadnoughts or titans from W20K - how could we do this in a way that enhanced gameplay, kept things balanced, added unique twist? Don&#39;t overthink this yet&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Let&#39;s keep brainstorming. I like the idea that it&#39;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&#39;t know what that could be.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Idea: as it gets damage it loses the ability to fire some weapons - by default it has eye laser (like lancers) and arm canons (like titan) and two shoulder mounted mortars, plus machine guns similar to a squad of troops&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Damage knocks out mortars and then laser - it always has guns. You can&#39;t build next to a building that was only put there because of the mech, you need the mech there for off-base building and only within three squares of it&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;[...] Lets do two condors can carry the mech&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The end result is &lt;em&gt;really cool&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Your browser does not support HTML video.&lt;/p&gt;
&lt;p&gt;Goliaths can be constructed using a Gantry—a building that can only be created after first building a Fab, Bay, Airpad, and Tech Lab. You can see the Goliath under construction, and it then walks out from the Gantry and can march around the map.&lt;/p&gt;
&lt;p&gt;Goliaths can “anchor”, which digs them into the ground. In their anchored state they can act as a new HQ, constructing infantry units and additional buildings in a new area.&lt;/p&gt;
&lt;p&gt;Two Condor aircraft can hook onto a Goliath, at which point it can be flown around the map!&lt;/p&gt;
&lt;p&gt;The game now ends when you destroy the enemy’s HQ building &lt;em&gt;and&lt;/em&gt; any Goliaths they might have built.&lt;/p&gt;
&lt;p&gt;There are also a couple of mutators relating to Goliaths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Goliath Armada&lt;/strong&gt; starts each side with four airborne Goliaths (each with a pair of Condors) and no other units.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robot Love&lt;/strong&gt; adds a special rule: if enemy Goliaths get close to each other on the battlefield they fall in love and the game ends in a draw. (Thank Natalie for that one).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Agent battles&lt;/h4&gt;
&lt;p&gt;The other v10 feature is &lt;strong&gt;agent battles&lt;/strong&gt;. In musing about how multiplayer could work I had an idea: what if different LLMs could fight it out in the game?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Fun extra challenge: think about how we might make multiplayer available to coding agents. It would be neat if we could set up a battle between eg GPT-6 Sol and Claude Opus 5.5 where each model has access to a tool which gives them information about the game (presumably non-visual, but only the information they could see through fog of war etc) and lets them control their units etc [...]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Consult ~/dev/llm/docs and include notes in that file about how LLM could be used here via a new tools plugin&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Opus 5.5 went to work on this, producing &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/blob/7001ed186c8b8aef4acb27f680ecf4c09b607e54/AGENT-BATTLES.md&quot;&gt;this AGENT-BATTLES.md proposal&lt;/a&gt; and then implementing and testing it. The feature also includes the ability to record and replay these battles—here’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/v11/?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json&quot;&gt;a replay of Claude Haiku 5.5 vs. GPT-6 Luna&lt;/a&gt;, and here’s that same battle &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/record-viewer.html?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json#r1&quot;&gt;in a separate debug tool&lt;/a&gt; that shows the underlying prompt responses.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/agent-v-agent.jpg&quot; alt=&quot;Screenshot of a replay of a real-time strategy game between two AI models, shown from a top-down view of a snowy map with a dark frozen lake of cracked ice floes on the left and pine forests at the top and lower right. Top bar: pause button, &amp;quot;6:27&amp;quot;, &amp;quot;1×&amp;quot;, &amp;quot;anthropic/claude-haiku-5-5 · industry&amp;quot; in blue, &amp;quot;gpt-6-luna · industry&amp;quot; in red, a blue-and-red strength bar labeled &amp;quot;B&amp;quot; and &amp;quot;R&amp;quot;, and &amp;quot;0:03&amp;quot;. Left notification: &amp;quot;Blue: Pushing turrets at the enemy&amp;#39;s south-east edge.&amp;quot; Replay panel: &amp;quot;Blue anthropic/claude-haiku-5-5 · industry vs Red gpt-6-luna · industry · frostbite seed 42&amp;quot;, a timeline slider at &amp;quot;6:27 / 7:48&amp;quot;, and buttons &amp;quot;−30s&amp;quot;, &amp;quot;+30s&amp;quot;, &amp;quot;All&amp;quot;, &amp;quot;Blue&amp;#39;s eyes&amp;quot;, &amp;quot;Red&amp;#39;s eyes&amp;quot;, &amp;quot;Notes&amp;quot;. In the scene, a group of blue tanks and a large blue Goliath mech trailing smoke advance near the ice edge at lower center, while a column of red turrets (one burning) lines the ice to their north, red tanks and trucks sit by a rocky ridge to the east, and red base buildings occupy the top right. A minimap is in the top right corner and zoom in, zoom out and lightning-bolt buttons are on the lower left.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The prompt that drives agent battles &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/blob/d584e351d9d28c4ba058b78ddcca9b93cd9bcd33/llm-tools-battledrones/llm_tools_battledrones.py#L106-L117&quot;&gt;can be seen here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are a few more replays like this &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/blob/main/README.md#watch-ai-models-play-it&quot;&gt;linked in the README&lt;/a&gt;. I hope to turn this into a full league table at some point in the future.&lt;/p&gt;
&lt;h4&gt;v11: Random Maps&lt;/h4&gt;
&lt;p&gt;This version exists purely because I glanced at my &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/new#settings/usage&quot;&gt;Claude Usage&lt;/a&gt; page one day and saw that I’d only used 75% of my weekly allowance and it was resetting in 45 minutes. I decided to see if I could get an extra Battle Drones feature from my remaining tokens, and picked “random map” as the target:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Design and implement a mechanism for generating a random map using any of the available biomes - it should be the size of the largest map and rivers and bridges and rocks and forest and scrap and crystals are all in play. Make them rotationally symmetric and use a seed to allow them to be selected or reused later. You have 45 minutes to build this! Be creative.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/code/session_01CfwMwDaK1kLKnRV6di8VMT&quot;&gt;the transcript&lt;/a&gt;, and an image Claude generated to show me its work:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/random-map-contact-sheet.jpg&quot; alt=&quot;Grid of ten top-down game maps, two per biome (temperate, desert, arctic, volcanic, tropical), each with a river or lava flow, bridges and roads. Title: &amp;quot;Battle Drones: generated maps (108x108, point-symmetric), 2 per biome, runtime ground painter&amp;quot;. Each map is captioned with a name and layout type plus a seed and crossing counts, e.g. &amp;quot;Hawthorn Delta · fork&amp;quot; &amp;quot;random-temperate-1x8a6r2 · 6 bridges, 4 fords&amp;quot;; layout types are fork, badlands, crossing and lake.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4&gt;v12: Multiplayer via sound&lt;/h4&gt;
&lt;p&gt;I only &lt;em&gt;just&lt;/em&gt; got this working, so I’ve not had much time to actively test it yet. The latest Battle Drones now supports multiplayer via two devices sat within microphone distance of each other!&lt;/p&gt;
&lt;p&gt;This feature started out as my &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/15/chirp-pong/&quot;&gt;Chirp Pong&lt;/a&gt; experiment from last week. I pointed Claude Code at that working proof of concept:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Clone Simonw/tools from GitHub and look at recent branches for the example pong game that uses web microphone to implement multiplayer between two phones via audio signals&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Build a version of that for battledrones&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Opus built &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/radio-probe.html&quot;&gt;this Radio Probe tool&lt;/a&gt; to measure how much bandwidth we could get between two devices and, based on positive results from that, implemented a full audio modem system. I’ve tried it between laptops, iPhones and iPads so far and it seems to work really well!&lt;/p&gt;
&lt;p&gt;Why use sound for this? Because I &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2025/Dec/10/html-tools/#the-anatomy-of-an-html-tool&quot;&gt;love static HTML&lt;/a&gt; that costs nothing to run, and I don’t want to spin up a server somewhere and then stay responsible for keeping it operating for as long as anyone might want to play the game.&lt;/p&gt;
&lt;h4&gt;Some thoughts&lt;/h4&gt;
&lt;p&gt;I know almost &lt;em&gt;nothing&lt;/em&gt; about game development. This makes it a great opportunity to try out coding agents in a field where my existing software engineering experience has less impact on the results.&lt;/p&gt;
&lt;p&gt;Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug.&lt;/p&gt;
&lt;p&gt;This morning (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=50168190&quot;&gt;via Hacker News&lt;/a&gt;) I found &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.ign.com/articles/steam-fans-are-begging-for-a-no-ai-filter-as-steam-next-fest-is-filled-with-slop&quot;&gt;Steam Fans Are Begging for a No-AI Filter as Steam Next Fest Is Filled With Slop&lt;/a&gt;. I wouldn’t personally dream of submitting Battle Drones to an event like this—it’s still way too low effort to warrant consideration as a legitimate indie gaming project.&lt;/p&gt;
&lt;p&gt;... but I can now see a path to vibe coded games like this being taken seriously. Battle Drones is fun, it looks good, it has innovative features (the multiplayer-over-audio thing is a first for an RTS as far as I can tell).&lt;/p&gt;
&lt;p&gt;I’d love to see what someone with better taste than me and a driving passion to produce something truly exceptional could build!&lt;/p&gt;
&lt;p&gt;A few other observations from this project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Static HTML and JavaScript is a fantastic medium for games development. WebGL works great, and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/mrdoob/three.js/&quot;&gt;Three.js&lt;/a&gt; (and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/phaserjs/phaser&quot;&gt;Phaser&lt;/a&gt; before it) are excellent platforms to build on that the current models know inside out.&lt;/li&gt;
&lt;li&gt;This also lets them run as &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps&quot;&gt;Progressive Web Apps&lt;/a&gt;—I didn’t ask for it, but Battle Drones works offline. I was able to play it on a plane despite never having directly installed it—my phone had it cached.&lt;/li&gt;
&lt;li&gt;Giving Claude an OpenAI API key and telling it to generate images using OpenAI’s models works really well. It can view the images it has generated and iterate on the prompts.&lt;/li&gt;
&lt;li&gt;Opus 5.5 is spectacular at 3D modeling using Three.js (and Blender, and no doubt other 3D applications as well). The &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://til.simonwillison.net/llms/blender-coding-agents-macos&quot;&gt;same is true&lt;/a&gt; of GPT-6 Astra. They are absolutely capable of building models for 3D game projects.&lt;/li&gt;
&lt;li&gt;For features like replay and multiplayer it’s useful to have a deterministic simulation engine. At one point Claude had to replace calls to &lt;code&gt;Math.sin()&lt;/code&gt; and &lt;code&gt;Math.cos()&lt;/code&gt; and friends with &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/blob/v12/src/sim/fmath.ts&quot;&gt;custom versions&lt;/a&gt; because different browsers (Chrome vs. Safari, for example) returned very slightly different numbers, desynchronizing the replay.&lt;/li&gt;
&lt;li&gt;Opus 5.5 can write music! There are no audio files in this project—the soundtrack is entirely generated through code, varies across different maps, and even gets more intense as the battle heats up. See &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/6/scrimshaw-jukebox/&quot;&gt;Scrimshaw Jukebox&lt;/a&gt; for a previous experiment with Claude for music composition.&lt;/li&gt;
&lt;li&gt;I still can’t get over how well the prompt “Make it a LOT more fun” worked.&lt;/li&gt;
&lt;li&gt;Tools are effectively free. I prompted up the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/radio-probe.html&quot;&gt;Radio Probe&lt;/a&gt;, the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/models.html&quot;&gt;Model browser&lt;/a&gt;, the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/battledrones/record-viewer.html?replay=battles/showcase/2026-10-14-frostbite-42-claude-haiku-5.5-vs-gpt-6-luna.json#r1&quot;&gt;Agent vs. Agent debug tool&lt;/a&gt;, and Claude Code &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/battledrones/tree/main/tools&quot;&gt;built a bunch of tools&lt;/a&gt; for itself that I haven’t even explored myself.&lt;/li&gt;
&lt;li&gt;Audio-based multiplayer between static HTML games works! I hope to see a whole lot more games use this same pattern—in digging around today I’ve not found much prior art beyond &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/AlonHor/siner&quot;&gt;Siner&lt;/a&gt; by Alon Horesh and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/ggerganov/ggwave&quot;&gt;ggwave&lt;/a&gt; by Georgi Gerganov (also of &lt;code&gt;llama.cpp&lt;/code&gt; fame).&lt;/li&gt;
&lt;li&gt;Claude Code “Ultracode” burns tokens like there’s no tomorrow, but it can also solve complex problems (like adding audio-based multiplayer) from a single prompt.&lt;/li&gt;
&lt;li&gt;I’m still not quite over the &lt;em&gt;guilt&lt;/em&gt; of building software in this way. I don’t feel like I’ve earned the right to create something this good, in a field in which I have so little prior experience! At this point I’ve shown it to enough people in private that it felt wrong not to publish it for everyone else to see and learn from.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:5871538a399db9604ea6acad9de3d6f3602c6d0c</id>
    <title type="text">My obituary for programming</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-19-my-obituary-for-programming/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/19/my-obituary-for-programming/"/>
    <published>2026-10-19T23:58:25+00:00</published>
    <updated>2026-10-19T23:58:25+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="careers"/>
    <category term="coding-agents"/>
    <category term="deep-blue"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">My obituary for programming Jeremy Scheff poignantly captures the key loss caused by coding agents for career programmers who enjoyed the puzzle of developing code: Programming turned into one of the greatest jobs you could imagine. You…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://dumbmatter.com/2026/10/programming-obituary/&quot;&gt;My obituary for programming&lt;/a&gt;&lt;/strong&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://lobste.rs/s/wtobpt/my_obituary_for_programming&quot; title=&quot;lobste.rs&quot;&gt;via&lt;/a&gt;) Jeremy Scheff poignantly captures the key loss caused by coding agents for career programmers who enjoyed the &lt;em&gt;puzzle&lt;/em&gt; of developing code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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&#39;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you&#39;re a programmer who thrives on building working systems and doesn&#39;t care too deeply about the problems solved along the way, LLMs are the gift that keeps on giving.&lt;/p&gt;
&lt;p&gt;If directly solving those problems was a big part of your enjoyment, the loss is very real.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:c19da3f465ec3a35e04c30cdf62b320f53ab2a7d</id>
    <title type="text">llm-tools-datasette 0.1.1</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-18-llm-tools-datasette-0-1-1/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/18/llm-tools-datasette/"/>
    <published>2026-10-18T23:43:09+00:00</published>
    <updated>2026-10-18T23:43:09+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="datasette"/>
    <category term="llm"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: llm-tools-datasette 0.1.1 When I switched LLM over to httpx2 in LLM 0.33 I forget that this would break any plugins which used httpx without directly depending on it. llm-tools-datasette was one of those plugins, now fixed. Tags:…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/llm-tools-datasette/releases/tag/0.1.1&quot;&gt;llm-tools-datasette 0.1.1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When I switched LLM over to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pydantic/httpx2&quot;&gt;httpx2&lt;/a&gt; in &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://llm.datasette.io/en/stable/changelog.html#v0-33&quot;&gt;LLM 0.33&lt;/a&gt; I forget that this would break any plugins which used &lt;code&gt;httpx&lt;/code&gt; without directly depending on it. &lt;code&gt;llm-tools-datasette&lt;/code&gt; was one of those plugins, now fixed.&lt;/p&gt;
&lt;p&gt;Tags: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/datasette&quot;&gt;datasette&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/llm&quot;&gt;llm&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:f4bd5c295b915a8d37e86cb1e7d011ce24a6731b</id>
    <title type="text">llm-echo 0.5</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-18-llm-echo-0-5/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/18/llm-echo/"/>
    <published>2026-10-18T23:16:16+00:00</published>
    <updated>2026-10-18T23:16:16+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="llm"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: llm-echo 0.5 I&#39;m working towards a new LLM release, and testing PRs caused me to revisit the llm-echo debug plugin. This plugin provides a &quot;model&quot; which doesn&#39;t involve an LLM at all - it just repeats back the prompts that have…</summary>
    <content type="html">&lt;p&gt;I&#39;m working towards a new &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://llm.datasette.io/&quot;&gt;LLM&lt;/a&gt; release, and testing PRs caused me to revisit the &lt;code&gt;llm-echo&lt;/code&gt; debug plugin. This plugin provides a &amp;quot;model&amp;quot; which doesn&#39;t involve an LLM at all - it just repeats back the prompts that have been fed to it. The new release now updates the simulated token usage counts to take tool calls, system prompts, and reasoning tokens into account.&lt;/p&gt;
&lt;p&gt;Example usage:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;uvx --with llm-echo llm -m echo &amp;#39;hi there&amp;#39; -o thinking 1 --usage
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Outputs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;First I consider the prompt, then I decide what to say.
{
  &amp;quot;prompt&amp;quot;: &amp;quot;hi there&amp;quot;,
  &amp;quot;system&amp;quot;: &amp;quot;&amp;quot;,
  &amp;quot;attachments&amp;quot;: [],
  &amp;quot;stream&amp;quot;: true,
  &amp;quot;previous&amp;quot;: []
}
Token usage: 2 input, 24 output
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:96d1c4d1e656150218aac30ee774cd3ddd73accf</id>
    <title type="text">Inline rendering with document​.currentScript</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-17-inline-rendering-with-document-currentscript/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/17/document-currentscript/"/>
    <published>2026-10-17T21:11:12+00:00</published>
    <updated>2026-10-17T21:11:12+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="javascript"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Inline rendering with document​.currentScript Lean Rada describes a neat trick that takes advantage of the document.currentScript property. You can use that to drop in a tiny inline &lt;script&gt; element that replaces itself when the page…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://leanrada.com/notes/inline-rendering-currentscript/&quot;&gt;Inline rendering with document.currentScript&lt;/a&gt;&lt;/strong&gt;. Lean Rada describes a neat trick that takes advantage of the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document/currentScript&quot;&gt;document.currentScript&lt;/a&gt; property. You can use that to drop in a tiny inline &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; element that replaces itself when the page loads:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;The year is &amp;lt;script&amp;gt;
document.currentScript.replaceWith(
  new Date().getFullYear())&amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you define a shortcut function like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;$=(...n)=&amp;gt;document.currentScript.replaceWith(...n)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You get a tiny template language:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;The year is &amp;lt;script&amp;gt;$(new Date().getFullYear())&amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:7b2d2548f88005377ff463cd2566c482397e5e37</id>
    <title type="text">web-edit 0.1a2</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-17-web-edit-0-1a2/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/17/web-edit/"/>
    <published>2026-10-17T13:16:49+00:00</published>
    <updated>2026-10-17T13:16:49+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="deepseek"/>
    <category term="pelican-riding-a-bicycle"/>
    <category term="projects"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: web-edit 0.1a2 web-edit (previously) is my tiny web app for browsing and editing files in a folder. I mainly built it for editing files on different machines via Tailscale. I added a &quot;copy to clipboard&quot; option for both text and…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/web-edit/releases/tag/0.1a2&quot;&gt;web-edit 0.1a2&lt;/a&gt; — Web app for editing files in a folder&lt;/p&gt;
&lt;p&gt;web-edit (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/web-edit/&quot;&gt;previously&lt;/a&gt;) is my tiny web app for browsing and editing files in a folder. I mainly built it for editing files on different machines via Tailscale.&lt;/p&gt;
&lt;p&gt;I added a &amp;quot;copy to clipboard&amp;quot; option for both text and image data. I needed this because I was running pelican prompts on a laptop from my phone (here&#39;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Fb1cec9726b6aa62d4de47100f90f0c1a&quot;&gt;DeepSeek 4.1 Flash 1017&lt;/a&gt;) and I wanted an easy way to copy the resulting logs into a Gist.&lt;/p&gt;
&lt;p&gt;Posted &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/17/&quot;&gt;17th October 2026&lt;/a&gt; at 1:16 pm&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:8db1a6f198637719942e856a273ebb3229b0ef75</id>
    <title type="text">Quoting Addy Osmani, Morgan Westlee Lunt, and Qing Wang</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-16-quoting-addy-osmani-morgan-westlee-lunt-and-qing-wang/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/16/code-review/"/>
    <published>2026-10-16T22:06:37+00:00</published>
    <updated>2026-10-16T22:06:37+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="addy-osmani"/>
    <category term="agentic-engineering"/>
    <category term="ai"/>
    <category term="anthropic"/>
    <category term="claude"/>
    <category term="claude-code"/>
    <category term="code-review"/>
    <category term="coding-agents"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">We think &quot;did a human read the code?&quot; is an imprecise proxy for &quot;what could go wrong with this change, and which check—automated or human—is the right one to catch it?&quot; Asking that question also changed when review happens. Before, review…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;We think &amp;quot;did a human read the code?&amp;quot; is an imprecise proxy for &amp;quot;what could go wrong with this change, and which check—automated or human—is the right one to catch it?&amp;quot;&lt;/p&gt;
&lt;p&gt;Asking that question also changed &lt;em&gt;when&lt;/em&gt; review happens. Before, review was a gate at the end of the road: write the code, open a PR, wait for your colleague.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.dev/blog/solving-code-review-at-anthropic/&quot;&gt;Addy Osmani, Morgan Westlee Lunt, and Qing Wang&lt;/a&gt;, How the Claude Code team does code review&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:7272fc84849dcc6d079688398f1810f1078ac99e</id>
    <title type="text">sparqlite: SPARQL 1.1 inside SQLite, written in Rust</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-16-sparqlite-sparql-1-1-inside-sqlite-written-in-rust/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/16/sqlite-sparql-rust/"/>
    <published>2026-10-16T01:58:00+00:00</published>
    <updated>2026-10-16T01:58:00+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="claude-code"/>
    <category term="coding-agents"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="rdf"/>
    <category term="rust"/>
    <category term="semantic-web"/>
    <category term="sqlite"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Research: sparqlite: SPARQL 1.1 inside SQLite, written in Rust This research task is really an experiment in running Claude Code for web in &quot;Ultracode&quot; mode, as described in Orchestrate subagents at scale with dynamic workflows in the…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/research/tree/main/sqlite-sparql-rust#readme&quot;&gt;sparqlite: SPARQL 1.1 inside SQLite, written in Rust&lt;/a&gt; — sparqlite is a Rust-based SQLite loadable extension that stores RDF quads in ordinary SQLite tables and executes SPARQL 1.1 queries and updates natively inside the SQLite process. Its integer-encoded terms, covering indexes, cost-based planner, batched joins, and optional direct SQLite B-tree reader deliver 3.5× speedups over SQL translation in count mode and 2.8× when returning full results, while passing 636 of 639 applicable W3C evaluation tests and millions of differential-fuzz…&lt;/p&gt;
&lt;p&gt;This research task is really an experiment in running Claude Code for web in &amp;quot;Ultracode&amp;quot; mode, as described in &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://code.claude.com/docs/en/workflows&quot;&gt;Orchestrate subagents at scale with dynamic workflows&lt;/a&gt; in the Claude Code documentation.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;My initial prompt was this - I meant &amp;quot;hit the rows directly&amp;quot;, the word &amp;quot;delete&amp;quot; was an accidental typo on my phone:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Write a SQLite extension in Rust that implants SPARQL and runs really fast because it can hit the delete rows directly&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Every folder in the crates/ directory needs a README&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;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&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Include a script with the tutorial for populating a SQLite database with useful and realistic example data for that tutorial&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This project feels like next-level vibe coding - it&#39;s not remotely feasible to review the code that was produced here, and even following the documentation is a significant investment in work. I&#39;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&#39;t (or won&#39;t) invest the necessary time to understand what it can do?&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:a8ae048488b145522be0fda3254fb06d819535df</id>
    <title type="text">Chirp Pong</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-15-chirp-pong/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/15/chirp-pong/"/>
    <published>2026-10-15T19:47:52+00:00</published>
    <updated>2026-10-15T19:47:52+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="claude-code"/>
    <category term="game-design"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Tool: Chirp Pong Another game experiment - I wanted to see if it was feasible to have a two player game on two separate phones running in static HTML where the networking code uses chirps sent via the microphone. It seems to work! Build a…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/chirp-pong&quot;&gt;Chirp Pong&lt;/a&gt; — Chirp Pong is a two-player paddle game where two phones pair and exchange the ball over sound, using each device&#39;s speaker and microphone instead of Wi-Fi or Bluetooth. The page offers a duel mode that pairs two phones through a chirp handshake and a practice mode against a CPU opponent, with selectable match lengths of 7, 11, or 15 points.&lt;/p&gt;
&lt;p&gt;Another game experiment - I wanted to see if it was feasible to have a two player game on two separate phones running in static HTML where the networking code uses chirps sent via the microphone. It seems to work!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Build a two player competitive pong like game where two players use their phones close to each other and the game state is sent via audio noises which the web microphone API can interpret - but add graphical and gameplay twists to make it a lot more fun and intertwine than pong&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Opus 5.5 Extra &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/code/session_019awUnNB7NoYd7noBNAsNdd&quot;&gt;in Claude Code&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:3d967dfac307328b46452d71bc6a7f319c78e413</id>
    <title type="text">Anthropic tells investors quarterly revenue up nearly 50% to $16.8bn ahead of IPO</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-15-anthropic-tells-investors-quarterly-revenue-up-nearly-50-to/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/15/anthropic-tells-investors/"/>
    <published>2026-10-15T13:04:03+00:00</published>
    <updated>2026-10-15T13:04:03+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="anthropic"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Anthropic tells investors quarterly revenue up nearly 50% to $16.8bn ahead of IPO The phrase &quot;told investors&quot; appears four times in this FT article, which reports on Anthropic&#39;s day of hosting investors on Wednesday. Lots of details in…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.ft.com/content/11632d03-358c-454b-af95-d06d4072932b?syn-25a6b1a6=1&quot;&gt;Anthropic tells investors quarterly revenue up nearly 50% to $16.8bn ahead of IPO&lt;/a&gt;&lt;/strong&gt;. The phrase &amp;quot;told investors&amp;quot; appears four times in this FT article, which reports on Anthropic&#39;s day of hosting investors on Wednesday. Lots of details in here from &amp;quot;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2023/Nov/22/deciphering-clues/#hints-to-look-out-for&quot;&gt;people with knowledge of the matter&lt;/a&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;Key things I learned from the article:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q1 revenue (Jan/Feb/Mar) was &amp;quot;about $4.8bn&amp;quot;&lt;/li&gt;
&lt;li&gt;Q2 (Apr/May/Jun) was $11.5bn&lt;/li&gt;
&lt;li&gt;Q3 (Jul/Aug/Sep) was $16.8bn&lt;/li&gt;
&lt;li&gt;In Q3: $1.70 in revenue for every $1 spent on &amp;quot;computing power&amp;quot;&lt;/li&gt;
&lt;li&gt;Adjusted operating margins (excluding stock-based compensation) were 11%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This point about distillation is worth quoting in full (highlight mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The start-up has also clamped down on “distillation” — a controversial practice whereby rival AI labs train their models on the outputs of more advanced ones.&lt;/p&gt;
&lt;p&gt;When rival companies “distil” their models from Anthropic’s models, that involves heavy usage and spending.&lt;/p&gt;
&lt;p&gt;Anthropic told investors on Wednesday &lt;strong&gt;distillation accounted for 5 per cent to 7 per cent of revenue&lt;/strong&gt; and that they had cut it back “materially” in the third quarter of the year, said four people with direct knowledge of the matter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Napkin maths says that if distillation was 5% of their Q2 revenue (before they cut it back in Q3) then unnamed &amp;quot;other labs&amp;quot; spent over half a billion dollars distilling Anthropic&#39;s models in that quarter!&lt;/p&gt;
&lt;p&gt;Also notable: Anthropic appear to no longer be leaning on &amp;quot;annualized run-rate revenue&amp;quot; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/May/29/anthropic/&quot;&gt;previously&lt;/a&gt;) in these communications to their investors.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:83844fdfd21157ce1d2cdc7d9999ee03f0a818dc</id>
    <title type="text">LaTeX renderer</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-15-latex-renderer/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/15/latex/"/>
    <published>2026-10-15T02:07:28+00:00</published>
    <updated>2026-10-15T02:07:28+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="generative-ai"/>
    <category term="latex"/>
    <category term="llms"/>
    <category term="paul-ford"/>
    <category term="tools"/>
    <category term="urls"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Tool: LaTeX renderer Inspired by Paul Ford and Aboard Foundary&#39;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,…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/latex&quot;&gt;LaTeX renderer&lt;/a&gt; — LaTeX renderer turns LaTeX source into a rendered view, either a single display equation typeset by MathJax or a full document or prose fragment typeset by faster-latex, with a live preview beside the editor and a toolbar switch between Edit and Rendered views. Source can be typed, loaded from a URL or GitHub Gist, or picked from built-in examples, and the page keeps the LaTeX in the URL fragment so it can be shared as a readable or compressed link.&lt;/p&gt;
&lt;p&gt;Inspired by Paul Ford and Aboard Foundary&#39;s new web app &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tinylittleoffice.com/&quot;&gt;Tiny Little Office&lt;/a&gt;, 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).&lt;/p&gt;
&lt;p&gt;Tiny Little Office&#39;s signature trick is to store all of the document data in the &lt;code&gt;#fragment&lt;/code&gt; section of the URL, so every document created using it becomes a bookmarkable and shareable link.&lt;/p&gt;
&lt;p&gt;It also has &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tinylittleoffice.com/llms.txt&quot;&gt;an llms.txt file&lt;/a&gt; telling agents how to construct URLs that will render as documents. Claude &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/share/239301ff-edde-420e-b433-b9c16fe40a6c&quot;&gt;used that file&lt;/a&gt; to generate &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tinylittleoffice.com/#/v1/deck/zXVVdb9tGEHznr1hED2kBSbZcO4UFtIHTuCgQtylstwH6Uq7Io3gRdcfeHS1T_fjtnV1Ssp038r52d2Z2djabZcmmxizpJ78jpnvrerqxCUv0sapsYaixbkM7HzYxS7XZ4ujWls6u65SlwC7aZL1bUmxsabIZHpxMaCmXlnRfG9rVHm~Vvui2xiWykfDK8Ojfc439b5bN6BdP0YQHE6bkPJWceMXR6A8Xhe9cwqFr7Peptm5NXCUT9Kl8klNM3EeyjnrfBVoFv8Nj2TGbaDgU9ZKuHCe_7clXKFVSkMh5Qs2Nluy14nnhtyeTk4fFSWmKzUn_7e~f5_N5LkcfFvlSg1Y~bDkR8omoXrbkLDZ3tS1q4rYl3xqHnCTvvB~vbX2J2k1C7rI8vjzsHSCaEuK3wcRoSmJXknEFrpVZ9r0CWgVeK5QDBBOB1BlkAgCxmry~dgAz~hePj0i1wT5wMnIY_Ohl0FQ~cTN_Aq~yIo~7ZFpaoL5gcc8iOg6bx5QdaHlB8f3Nxykg_pnDpvQ7Rw8cLCuFdyKTSLEF4uQd5QiTS0gTsftDzSHFKZWBd2A5av3sLLAGzPgNqB94AJlV44uN3LmvEVDQl8C88l2iBX14JyS3DUMTY5pjOS0XG14fKjqDcP_qjNlLTVLLLe_o_fWPN1f319MBSN4a4mbtUXi9lbL3ttW81vgQFvcgcIg0XjwwPv7SDjeBhnBqEpW2kGI49HIu4Bw0fqAcGwRdcdMc6O6fXdAKAcBurA9dWSrYR_AjddGIuH1ayqNbvHft1o2N9RTqc5IIUi~5J4fCAHVEXC5jbZBa1TkNheUjdbF3iR_ndGtaw3i_9RYcr1jwdtAPaLQuJrwhGa2MNGdsTdOAI3DxTEii4hH2b2AivFEd_XZ7M4tcGQH_XZ~gjZVB4oak_9~cd6FZ0htaWQkNmRZQCBdj_1zN_iCe7el0dpkLWZDTf7kWmP~p_Yq_YMBNYQZpd7HjBprLp8OpmViHbRpSDKiCDNWLBo9xxpQatQCyM21DLD8rSNQ6uBwKtgU71eGUVj1Fu0dJeZ4rsnplPL7ioL93CTKkf4aiMyFRhIqFi_PLs~y9qRp0aDmIp8fy4vzsIrsR32y5bzzwxtrl6UKCiFgu5hejLNSKozTg2EdjGz11EioV2kYXpM6VgPZsenp6~gSwaKP2IcF_fLeuxfKgoJjkRBKHi8~43Zh~SZ_qXgyYAMTrpJAKwQDD9ErvJ5Qi7amGdBT1lGpuKl1cKf~DwhDDDTxoj3N6HeFVvfSR9pp1ChBVbJs4oPSqtLA3uAN8zWMjqExfaZshma~~zqVmbWqYGN7j1s4_q3l4MSXG7BunwnFwpCQ~tKTrRwy7KI4l940rdXS8BUK7fLR6HlxI29ylIfH8bZkfJ4HYrSRyGBfztk2PJzIBSFpNOI2jtaLLYbs4~KsWK~MGpgAz10G8pHyYTRP0_Xc5EOm~0CmE89L2ihrnoVUxkfRi8sJzHYTonVE_Ua0cR3Shm1H9CXPLNP2XjovGNI3M0_1smG4C4P8&quot;&gt;this link to a deck&lt;/a&gt; that explains how the URL format works:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/tiny-little-office.webp&quot; alt=&quot;Screenshot of a slide deck editor in a web app with a dark-themed presentation open. The document title field reads &amp;quot;How a Tiny Little Office link works&amp;quot;, with a progress ring, share icon and menu icon at top right. Below is a formatting toolbar with an &amp;quot;Insert&amp;quot; dropdown followed by icon buttons for play, bold, italic, underline, strikethrough, highlight, code, link, superscript, emoji, outdent, indent, layout and color palette. The main canvas shows slide 1 with a blue chain-link icon and the text: &amp;quot;The whole document is the link&amp;quot; &amp;quot;No server, no database, no account&amp;quot; &amp;quot;Everything after the # stays in your browser&amp;quot; and a slide counter &amp;quot;1 / 9&amp;quot;. Below the canvas is a &amp;quot;SPEAKER NOTES&amp;quot; heading. A sidebar on the right shows slide thumbnails. Slide 1 (selected): &amp;quot;The whole document is the link&amp;quot; &amp;quot;No server, no database, no account&amp;quot; &amp;quot;Everything after the # stays in your browser&amp;quot;. Slide 2: &amp;quot;Anatomy of a link&amp;quot; with bullets &amp;quot;tinylittleoffice.com/#/v1/deck/y7Vj...&amp;quot; &amp;quot;v1: the format version&amp;quot; &amp;quot;deck: which app opens it&amp;quot; &amp;quot;y: the mode letter&amp;quot; &amp;quot;7Vj...: the document, compressed and encoded&amp;quot;. Slide 3: &amp;quot;Step 1: write it as text&amp;quot; with bullets &amp;quot;Every document is TLO, a Markdown variant&amp;quot; &amp;quot;Slides split on --- lines&amp;quot; &amp;quot;Charts, drawings and animations are fenced blocks&amp;quot; &amp;quot;This deck is about 1 KB of plain text&amp;quot;. Slide 4: &amp;quot;Step 2: squeeze it&amp;quot; with bullets &amp;quot;Raw DEFLATE, the same algorithm as zip and gzip&amp;quot; &amp;quot;z: plain DEFLATE&amp;quot; &amp;quot;y: DEFLATE with a preset dictionary&amp;quot; &amp;quot;r: no compression at all&amp;quot;.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Tiny Little Office inspired me &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/code/session_017KJrPqqWVHLqr4E7TLPnpt&quot;&gt;to have Claude Code&lt;/a&gt; (Opus 5.5 Extra) build a similar tool that works with LaTeX. Here&#39;s the sequence of prompts I used:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;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 &amp;quot;rendered&amp;quot; view. That rendered view should be bookmarkable. The #fragment view should let you switch to edit source too.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since it was working in &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/tools&quot;&gt;my tools repo&lt;/a&gt; I told it to take inspiration from the &lt;code&gt;&amp;lt;iframe sandbox=&amp;quot;...&amp;quot;&amp;gt;&lt;/code&gt; mechanism used by my existing &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer&quot;&gt;SVG in Markdown tool&lt;/a&gt; as protection against XSS risks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Safe from XSS? We could run in an iframe sandbox like we do on the SVG markdown render project&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had it copy the Gist/URL loading feature from that tool as well:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;We should have an option to load latex from a URL (or gist) similar to the markdown SVG tool&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&#39;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/latex#~1jZq9DoIwEIB3nuKGbigJJS5svoAOMJuQ4EBEJWJjGHh3765A_8DIQtJfIMdR-n0uCV9l4DOs_p8ua3ZZKK2anOsaTqya9AZnHhMo3qqewKWPMh2SOQOFkhSJtmruY1QungBJFk-cQLsspAF8qgFPWKQ6FmdYdCB7oseX5HVNfgE-HGmM2OPATDfAlCssyLcLGI4BONwZ7E8pby5KWoilFBK0n5T4lMeHgQaMMsYjS6hrG61G4Micmcj2EN48tyVgHpzNKMBEHuxEbV0dZhsJwZB7_Lux0mR4YDc9HTd1bnGaki0V1nr6kGHSI8NAwCWaVjeAPyYUNAYxUZt8k2aKlODPRQq7JIYMS-VKaQwHrMmoxqWeLlT6Ag&quot;&gt;an example link&lt;/a&gt;. The tool uses &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/nodeca/pako&quot;&gt;Pako 2.1.0&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/mathjax/MathJax&quot;&gt;MathJax 4.1.3&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/arena-ai/faster-latex&quot;&gt;faster-latex 0.3.1&lt;/a&gt;, and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/cure53/DOMPurify&quot;&gt;DOMPurify 3.4.16&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/latex-tool.webp&quot; alt=&quot;Screenshot of a web app titled &amp;quot;LaTeX renderer&amp;quot; with a split-pane layout. The top bar has an Edit/Rendered toggle, a blue Copy link button, and a Share button. The left pane, labeled LaTeX source with a &amp;quot;Document · faster-latex (WASM)&amp;quot; badge, has a URL/GitHub Gist input with a Load button, a code editor containing a LaTeX document, and rows of example buttons (Quadratic formula, Gaussian integral, Maxwell, Attention, Matrix, Chemistry, Prose, TikZ, Document). The right pane shows the typeset output: a paper titled &amp;quot;Sums of Odd Numbers&amp;quot; by A. Student, with a section stating a theorem that the first n odd numbers sum to n squared, a Proof section with numbered equations, and a bulleted list of small cases.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:ada9106860efae6502064bc66f24bf546420ef4d</id>
    <title type="text">Tree Appreciator</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-14-tree-appreciator/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/14/tree-appreciator/"/>
    <published>2026-10-14T21:23:01+00:00</published>
    <updated>2026-10-14T21:23:01+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="claude"/>
    <category term="game-design"/>
    <category term="generative-ai"/>
    <category term="javascript"/>
    <category term="llms"/>
    <category term="three-js"/>
    <category term="vibe-coding"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">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 &quot;Tree appreciator&quot; - it shows…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/tree-appreciator&quot;&gt;Tree Appreciator&lt;/a&gt; — Tree Appreciator is a slow spot-the-difference game in which each round grows two 3D trees from one seed and asks the player to find a handful of small differences between them, such as a missing bough, a visiting bird, or an early-turning branch. Players tap a difference in either tree to notice it, can use limited hints and drag or zoom to view the trees from different angles, and earn appreciation points, leaves and herbarium entries for each pair completed.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Build a three js game called &amp;quot;Tree appreciator&amp;quot; - it shows you two algorithmically generated trees and the game mechanics is about appreciating the differences between them. Think hard about how to make sure it is both fun and beautiful.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Somewhat embarrassingly given &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.059.webp&quot;&gt;my recent talk&lt;/a&gt;, I&#39;ve found that telling Opus 5.5 &amp;quot;make sure it is fun&amp;quot; works uncomfortably well. In this case Claude &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/share/ee7de555-f85c-4ff0-96cb-d51ed5e479e9&quot;&gt;crunched for 3 hours and 7 minutes&lt;/a&gt; before retuning a cosy little spot-the-difference game with music and animation and achievements that&#39;s quite compelling to play.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026-10-14/image_crop_1320x2195_w1320_q0.7.webp&quot; alt=&quot;Screenshot of a mobile spot-the-difference puzzle game with a dark interface. Header reads &amp;quot;No. 003 Acer autumnalis ‘Hid…&amp;quot; with subtitle &amp;quot;Autumn maple · A country lane in late a…&amp;quot; and icons for sound, a book, and help. Two nearly identical 3D-rendered scenes are stacked vertically, labeled &amp;quot;Fig. i&amp;quot; and &amp;quot;Fig. ii&amp;quot;, each showing a dark-trunked maple tree with red, orange and pale peach leaves, leaves falling through the air, a golden grassy field with a few small rocks, and hazy hills with pine silhouettes under a pale sky. Two differences are circled in blue in both images: circle &amp;quot;a&amp;quot; at the base of the trunk, where Fig. i has a small red mushroom that is missing in Fig. ii, and circle &amp;quot;b&amp;quot; in the right side of the canopy, where Fig. i has a patch of green leaves that are red in Fig. ii. The bottom bar shows &amp;quot;2 of 4&amp;quot;, a reset button, a &amp;quot;Hint&amp;quot; button with three filled and two empty dots, and a score of &amp;quot;1,803&amp;quot;.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:703cbc8577553eb4053f9b9e142ad97ee4f288d9</id>
    <title type="text">AI is mass decompiling games. That&#39;s both awesome and scary.</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-14-ai-is-mass-decompiling-games-that-s-both-awesome-and-scary/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/14/ai-is-mass-decompiling-games/"/>
    <published>2026-10-14T16:26:53+00:00</published>
    <updated>2026-10-14T16:26:53+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="ai-ethics"/>
    <category term="coding-agents"/>
    <category term="computer-history"/>
    <category term="game-design"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="webassembly"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">AI is mass decompiling games. That&#39;s both awesome and scary. Indie game developer Popcar talks about the recent wave of AI-powered decompilation of existing games, enabling weird mashups between existing games, and producing a boom in game…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://popcar.bearblog.dev/ai-is-mass-decompiling-games-thats-both-awesome-and-scary/&quot;&gt;AI is mass decompiling games. That&#39;s both awesome and scary.&lt;/a&gt;&lt;/strong&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=50088534&quot; title=&quot;Hacker News&quot;&gt;via&lt;/a&gt;) Indie game developer Popcar talks about the recent wave of AI-powered decompilation of existing games, enabling weird mashups between existing games, and producing a boom in game preservation projects to get old games working on new hardware (often in a browser using WebAssembly).&lt;/p&gt;
&lt;p&gt;I like how this piece captures both the positives and the negatives of this new development:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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&#39;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&#39;t exclusive to old video games, we can apply this to &lt;em&gt;any&lt;/em&gt; software. [...]&lt;/p&gt;
&lt;p&gt;This is also a big win for preservation. Old games can be ported, modified, enhanced, and made much more easily accessible than before. [...[&lt;/p&gt;
&lt;p&gt;With console makers going all in on digital and games becoming entirely unplayable due to servers shutting down, this is &lt;em&gt;fantastic&lt;/em&gt; news. We could own software we bought regardless of what the company thinks.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:5afbdc84a2cb92cb2ad9b70dbd234e8643d2f196</id>
    <title type="text">Redesigning source control at Anthropic</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-13-redesigning-source-control-at-anthropic/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/13/redesigning-source-control-at-anthropic/"/>
    <published>2026-10-13T23:00:06+00:00</published>
    <updated>2026-10-13T23:00:06+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="agentic-engineering"/>
    <category term="ai"/>
    <category term="anthropic"/>
    <category term="generative-ai"/>
    <category term="git"/>
    <category term="llms"/>
    <category term="migrations"/>
    <category term="version-control"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Redesigning source control at Anthropic Interesting piece from Anthropic describing why and how they built their own custom alternative to Git, based on the dramatic increase in rate of changes to their code after the past six months. In…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.anthropic.com/engineering/redesigning-source-control&quot;&gt;Redesigning source control at Anthropic&lt;/a&gt;&lt;/strong&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=50073633&quot; title=&quot;Hacker News&quot;&gt;via&lt;/a&gt;) Interesting piece from Anthropic describing why and how they built their own custom alternative to Git, based on the dramatic increase in rate of changes to their code after the past six months.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In May 2026, Anthropic averaged around 2,500 code changes merged per day; as of September, we merged over 30,000 per day.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They included a chart showing those changes. I &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/share/aefcdd4a-9364-40c1-927a-29bf445894fc&quot;&gt;had Claude modify their chart&lt;/a&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://gist.github.com/simonw/4a16dff066fd9763faf8642f797905be&quot;&gt;code here&lt;/a&gt;) to add markers for the public releases of each of their models in 2026:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/anthropic-merges-per-day.webp&quot; alt=&quot;Stacked bar chart titled “Changes merged per day”, for the Anthropic monorepo, January–September 2026. Each day’s bar is split into pull requests (blue) and antique change requests (orange), with a black line for the 7-day average. Weekdays start at around 1,000 merges in January and climb slowly to about 3,000 by late May. Antique change requests appear in late May, overtake pull requests in mid-June and have almost fully replaced them by mid-July, when weekdays reach 6,000–8,000. A labelled “Quiet week” at the end of July dips below 1,000 a day. After that, growth turns steep: over 10,000 a day by mid-August, about 17,000 in early September, and a peak of 30,401 on Sep 9. Dotted lines mark Claude model releases: Opus 4.6 (Feb 5), Sonnet 4.6 (Feb 17), Mythos Preview (Apr 7), Opus 4.7 (Apr 16), Opus 4.8 (May 28), Fable 5 and Mythos 5 (Jun 9), Sonnet 5 (Jun 30), Opus 5 (Jul 24, just before the quiet week), and Fable 5.1 and Mythos 5.1 (Sep 1).&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;This shows public release dates, not the date when models became available for Anthropic&#39;s internal use. My guess is that the introduction of Fable/Mythos class models is a key factor in the increased coding velocity.&lt;/p&gt;
&lt;p&gt;&amp;quot;Antique&amp;quot; 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.&lt;/p&gt;
&lt;p&gt;(&lt;strong&gt;Update&lt;/strong&gt;: Anthropic credit Google&#39;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Piper_(source_control_system)&quot;&gt;Piper&lt;/a&gt; and Meta&#39;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://sapling-scm.com/&quot;&gt;Sapling&lt;/a&gt; as &amp;quot;prior art&amp;quot; - it looks like the core concept of &amp;quot;derived data&amp;quot; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://sunshowers.io/posts/anthropic-mononoke/&quot;&gt;was heavily inspired by Mononoke&lt;/a&gt;, the server component of Sapling.)&lt;/p&gt;
&lt;p&gt;They had some pretty extreme requirements:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The history of our main branch alone is almost 100 GB, and a &lt;em&gt;compressed&lt;/em&gt; 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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The new system was built by a team of seven people, and the migration from Git was completed in five months.&lt;/p&gt;
&lt;p&gt;When asked on Hacker News about the lack of offline support, Scion engineer Nick G &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=50073633#50079495&quot;&gt;replied&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Since Claude is by far the heaviest user of Scion and is necessarily online, this just wasn&#39;t important to do.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As an aside, I&#39;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:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:a3313a1f46cc7caf3c8fbe56c49eaf5a9b32ecdb</id>
    <title type="text">llm-gemini 0.35</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-13-llm-gemini-0-35/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/13/llm-gemini/"/>
    <published>2026-10-13T22:28:54+00:00</published>
    <updated>2026-10-13T22:28:54+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="gemini"/>
    <category term="generative-ai"/>
    <category term="google"/>
    <category term="llm"/>
    <category term="llm-pricing"/>
    <category term="llm-release"/>
    <category term="llms"/>
    <category term="pelican-riding-a-bicycle"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">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…</summary>
    <content type="html">&lt;p&gt;I added support to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/llm-gemini&quot;&gt;llm-gemini&lt;/a&gt; for the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-4-argon/&quot;&gt;new Gemini 4 Argon&lt;/a&gt; model, made available today via the Gemini API and for customers of their $100/month subscription plan.&lt;/p&gt;
&lt;p&gt;Here are &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Fd741e4420dea14c460f0108ac22dbc26&quot;&gt;the low, medium and high pelicans&lt;/a&gt;. As expected, they are all excellent: Gemini has a track record of producing great SVGs, and are the only lab where I know their &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://twitter.com/sunjiao123sun_/status/2024555516551372920&quot;&gt;staff have invested in SVG specifically&lt;/a&gt; (and who have &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Feb/19/gemini-31-pro/#jeff-dean&quot;&gt;boasted about their pelicans&lt;/a&gt; before.)&lt;/p&gt;
&lt;p&gt;Here&#39;s the &amp;quot;high&amp;quot; illustration, which cost me 17.166 cents:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/gemini-4-argon-high.webp&quot; alt=&quot;Stylish, accurate bicycle frame. Fish in the basket. Snazzy scarf. Feet on either side of the frame touching the pedals. Spokes, a little hat, a good beak and pouch, a somewhat fierce expression.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;But on December 1st Argon is set to double in price - so it will be the same price as Opus 5.5.&lt;/p&gt;
&lt;p&gt;Prices like this aren&#39;t really comparable these days since what really matters is how many tokens a model takes to achieve a goal within an agentic harness.&lt;/p&gt;
&lt;p&gt;One useful clue for that comes from Artificial Analysis, who publish &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://artificialanalysis.ai/#total-cost-tabs&quot;&gt;the total cost to run their benchmark&lt;/a&gt; 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&#39;s latest models.&lt;/p&gt;
&lt;p&gt;When the price doubles it will still be a little cheaper than GPT-6 Astra.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/gemini-4-argon-artificial-analysis.webp&quot; alt=&quot;Screenshot of a stacked bar chart from Artificial Analysis comparing dollar costs for 14 AI models, sorted from lowest to highest, with bars colored by provider, the provider&amp;#39;s logo beneath each bar and angled model names along the bottom. Logo at top right: Artificial Analysis. A hover tooltip pointing at the Gemini 4 Argon bar reads: Gemini 4 Argon (High), $2,407, Output $313, Reasoning $815, Cache Write $897, Cache Read $264, Non-Cache Input $118, Click for more info. Bars from left to right, with the total above each bar and some segment values printed inside: Qwen3.8 27B (xhigh), $1,336, Alibaba logo; Mistral Large 4 Preview, $1,607, Mistral logo; Gemini 3.8 Flash (high), $1,623, Google logo; Muse Spark 1.3 (max), $2,000, segment $769, Meta logo; Gemini 4 Argon (high), $2,407, segments $815 and $897, Google logo; GLM-5.3 (max), $2,503, segment $790, Z.ai logo; Kimi K3 (max), $3,658, Kimi logo; Qwen3.8 Max (0902), $4,935, segments $893 and $1,441, Alibaba logo; Grok 4.7 (xhigh), $4,967, segments $1,861 and $1,618, xAI logo; GPT-6 Astra (max), $5,324, segments $778 and $978, OpenAI logo; Muse Wonder (max), $5,733, segment $1,748, Meta logo; Claude Sonnet 5.5 (max with fallback), $7,260, segments $1,216 and $1,815, Anthropic logo; Claude Opus 5.5 (max with fallback), $8,708, segment $921, Anthropic logo; Claude Fable 5.1 (max with fallback), $13,129, segment $7,219, Anthropic logo.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;(I &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://chatgpt.com/share/6acebe13-5378-83e8-bf2f-9f4d05b206f4&quot;&gt;used ChatGPT to edit that chart&lt;/a&gt;! The data is all correct, I checked - I needed to get that Gemini 4 Argon info box to display without overlapping the other numbers.)&lt;/p&gt;
&lt;p&gt;Some bonus examples using Gemini 4 Argon: here&#39;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F9589ff9e0c977bbf3b012b7a11f5bd71&quot;&gt;Generate an SVG of an armadillo in fishnet tights jaywalking on Mars&lt;/a&gt;, here&#39;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/blender-viewer?url=https%3A%2F%2Fstatic.simonwillison.net%2Fstatic%2Fcors-allow%2F2026%2Fgemini-4-astra-egg.blend&quot;&gt;a Fabergé egg&lt;/a&gt; it created for me using Blender, and DeepMind staffer @fofrAI shared &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://twitter.com/fofrai/status/2110043023954284889&quot;&gt;a video of a pelican riding a bike, using fourier epicycles&lt;/a&gt;. That&#39;s a fun new twist!&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:903c3c9c66f0e63683b77c2cb42d0fed3d8db61d</id>
    <title type="text">Quoting Geoffrey Huntley</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-13-quoting-geoffrey-huntley/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/13/geoffrey-huntley/"/>
    <published>2026-10-13T13:32:00+00:00</published>
    <updated>2026-10-13T13:32:00+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="agentic-engineering"/>
    <category term="ai"/>
    <category term="coding-agents"/>
    <category term="generative-ai"/>
    <category term="geoffrey-huntley"/>
    <category term="git"/>
    <category term="llms"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">If the agent isn&#39;t using my diagnostics library, I could introspect and update AGENTS.md, but there&#39;s still a delta, and it&#39;ll drift. Instead, I write a pre-commit hook that checks the git diff for direct calls to observability modules…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;If the agent isn&#39;t using my diagnostics library, I could introspect and update AGENTS.md, but there&#39;s still a delta, and it&#39;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&#39;s ten out of ten.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://ghuntley.com/agency/&quot;&gt;Geoffrey Huntley&lt;/a&gt;, nobody should type code by hand anymore. here&#39;s what&#39;s left.&lt;/p&gt;
&lt;p&gt;Posted &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/13/&quot;&gt;13th October 2026&lt;/a&gt; at 1:32 pm&lt;/p&gt;
&lt;h2&gt;Recent articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/python-3-15/&quot;&gt;Hello Python 3.15, goodbye 3.10, and now I can use 3.11&lt;/a&gt; - 12th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/9/built-using-my-voice/&quot;&gt;A new feature for my blog, built using my voice&lt;/a&gt; - 9th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/&quot;&gt;Claude Haiku 5.5&lt;/a&gt; - 7th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/&quot;&gt;We&#39;re going to need default hard budget caps on pretty much everything&lt;/a&gt; - 3rd October 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a &lt;strong&gt;quotation&lt;/strong&gt; collected by Simon Willison, posted on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/13/&quot;&gt;13th October 2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/git/&quot;&gt;git 58&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/ai/&quot;&gt;ai 2,285&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/generative-ai/&quot;&gt;generative-ai 2,027&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/llms/&quot;&gt;llms 1,993&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/coding-agents/&quot;&gt;coding-agents 259&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/geoffrey-huntley/&quot;&gt;geoffrey-huntley 4&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/agentic-engineering/&quot;&gt;agentic-engineering 67&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:70bae349fd6a77ee1d3529806ebb56b95bde7261</id>
    <title type="text">web-edit 0.1a1</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-13-web-edit-0-1a1/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/13/web-edit/"/>
    <published>2026-10-13T01:40:05+00:00</published>
    <updated>2026-10-13T01:40:05+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="profiling"/>
    <category term="projects"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: web-edit 0.1a1 Includes performance optimizations written by Claude Opus 5.5 after I fed it this Python 3.15 profiling report generated by GPT-6 Astra. Tags: profiling, projects</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/web-edit/releases/tag/0.1a1&quot;&gt;web-edit 0.1a1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Includes &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/web-edit/pull/1&quot;&gt;performance optimizations&lt;/a&gt; written &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/code/session_01LE2R4P74P9GGUbE6yQ5YBt&quot;&gt;by Claude Opus 5.5&lt;/a&gt; after I fed it &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/python-3-15-web-edit-profiling/&quot;&gt;this Python 3.15 profiling report&lt;/a&gt; generated by GPT-6 Astra.&lt;/p&gt;
&lt;p&gt;Tags: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/profiling&quot;&gt;profiling&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/projects&quot;&gt;projects&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:f58f945fcefa9f242c706a5e50239ccbf0ecb495</id>
    <title type="text">llm-meta-ai 0.2</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-12-llm-meta-ai-0-2/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/12/llm-meta-ai/"/>
    <published>2026-10-12T23:58:46+00:00</published>
    <updated>2026-10-12T23:58:46+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="generative-ai"/>
    <category term="llm-release"/>
    <category term="llms"/>
    <category term="meta"/>
    <category term="pelican-riding-a-bicycle"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: llm-meta-ai 0.2 Meta AI release Muse Wonder (and Muse Wonder Full), their new &quot;most capable models&quot;. These look like they may be Meta&#39;s first Fable class models - Artificial Analysis scores Muse Wonder (Max) as equivalent to…</summary>
    <content type="html">&lt;p&gt;Meta AI release &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://research.meta.ai/blog/muse-wonder&quot;&gt;Muse Wonder&lt;/a&gt; (and Muse Wonder Full), their new &amp;quot;most capable models&amp;quot;. These look like they may be Meta&#39;s first &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Sep/27/2026-in-llms-so-far/#simon-willison-2026-in-llms.042.webp&quot;&gt;Fable class models&lt;/a&gt; - Artificial Analysis &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://artificialanalysis.ai/models/muse-wonder&quot;&gt;scores Muse Wonder (Max)&lt;/a&gt; as equivalent to GPT-6.1 Sol.&lt;/p&gt;
&lt;p&gt;I updated my &lt;code&gt;llm-meta-ai&lt;/code&gt; plugin for the new model. Here are &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https://gist.github.com/simonw/185cff7ff0b11379725abf7f78d5d2b2&quot;&gt;pelicans for Muse Wonder&lt;/a&gt; for the six reasoning levels: minimal, low, medium, high, xhigh, max. This is the max one:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/muse-wonder-max.webp&quot; alt=&quot;Blue cycling helmet, bicycle is missing one bar but otherwise an OK shape, has mudguards, nice background, OK beak.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;For comparison, here are &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https://gist.github.com/simonw/1f8c25686971da82077e34c088d408db&quot;&gt;pelicans for Muse 1.3&lt;/a&gt; (released September 2nd) and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Fce974a21202b0595e36ec2a5ddb51480&quot;&gt;Muse 1.2&lt;/a&gt; (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.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:9f89d4b34fd0f44df7fee5bec5770584526c2487</id>
    <title type="text">Hello Python 3.15, goodbye 3.10, and now I can use 3.11</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-12-hello-python-3-15-goodbye-3-10-and-now-i-can-use-3-11/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/12/python-3-15/"/>
    <published>2026-10-12T18:15:38+00:00</published>
    <updated>2026-10-12T18:15:38+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="open-source"/>
    <category term="profiling"/>
    <category term="python"/>
    <category term="sqlite"/>
    <category term="uv"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Python 3.15 is here! Here&#39;s the essential What&#39;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…</summary>
    <content type="html">&lt;p&gt;Python 3.15 &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.python.org/downloads/release/python-3150/&quot;&gt;is here&lt;/a&gt;! Here’s the essential &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3.15/whatsnew/3.15.html&quot;&gt;What’s new in Python 3.15&lt;/a&gt; guide, this year curated by 3.14 and 3.15 release manager Hugo van Kemenade. As someone who builds open source software that works in every supported Python version, I get to say goodbye to Python 3.10 and start embracing features from Python 3.11.&lt;/p&gt;
&lt;p&gt;First, some highlights from Python 3.15.&lt;/p&gt;
&lt;h4&gt;Explicit lazy imports&lt;/h4&gt;
&lt;p&gt;I’m most excited about &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3.15/whatsnew/3.15.html#pep-810-explicit-lazy-imports&quot;&gt;Explicit lazy imports&lt;/a&gt; from &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://peps.python.org/pep-0810/&quot;&gt;PEP 810&lt;/a&gt;. These let you import modules like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;lazy import json
lazy from pathlib import Path
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The module will then be imported the first time those symbols are used in the code that follows.&lt;/p&gt;
&lt;p&gt;My &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://llm.datasette.io/&quot;&gt;LLM&lt;/a&gt; CLI tool implements plugins. I had to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://llm.datasette.io/en/stable/plugins/advanced-model-plugins.html#tip-lazily-load-expensive-dependencies&quot;&gt;recommend manual lazy imports&lt;/a&gt; in the plugin author documentation, because simply installing plugins that used heavy dependencies such as &lt;code&gt;sentence_transformers&lt;/code&gt; could add multiple seconds to every invocation of the &lt;code&gt;llm&lt;/code&gt; command. Lazy imports directly address this startup cost.&lt;/p&gt;
&lt;h4&gt;Unpacking in comprehensions&lt;/h4&gt;
&lt;p&gt;The new &lt;code&gt;[*sublist for sublist in lists]&lt;/code&gt; unpacking syntax is neat. Here’s an illustration &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3.15/whatsnew/3.15.html#pep-798-unpacking-in-comprehensions&quot;&gt;lifted from the documentation&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;TOML&quot;&gt;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 = [{&amp;#39;a&amp;#39;: 1}, {&amp;#39;b&amp;#39;: 2}, {&amp;#39;a&amp;#39;: 3}]
{**d for d in dicts}
# {&amp;#39;a&amp;#39;: 3, &amp;#39;b&amp;#39;: 2}
# equivalent to {k: v for d in dicts for k,v in d.items()}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://peps.python.org/pep-0798/&quot;&gt;PEP 798: Unpacking in Comprehensions&lt;/a&gt; by Adam Hartz and Erik Demaine proposed this as an extension of the unpacking syntax &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://peps.python.org/pep-0448/&quot;&gt;from PEP 448&lt;/a&gt;, which landed &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/whatsnew/3.5.html#pep-448-additional-unpacking-generalizations&quot;&gt;in Python 3.5&lt;/a&gt; back in 2015.&lt;/p&gt;
&lt;h4&gt;A sampling profiler&lt;/h4&gt;
&lt;p&gt;Python’s existing tracing profiler has been renamed from &lt;code&gt;cProfile&lt;/code&gt; to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3.15/library/profiling.tracing.html#module-profiling.tracing&quot;&gt;profiling.tracing&lt;/a&gt;, and has been joined by an exciting new sampling profiler called Tachyon, aka &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3.15/whatsnew/3.15.html#tachyon-high-frequency-statistical-sampling-profiler&quot;&gt;profiling.sampling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sampling profilers work by periodically capturing stack traces from running processes, then using those to calculate which functions have the most time spent inside of them. They’re very low overhead and can provide a deep insight into running systems, without needing to instrument those systems first.&lt;/p&gt;
&lt;p&gt;I’ve &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/profiling/&quot;&gt;previously used tools&lt;/a&gt; like &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/benfred/py-spy&quot;&gt;py-spy&lt;/a&gt; for this. Now this capability is baked into the standard library.&lt;/p&gt;
&lt;p&gt;If you have the PID of an existing Python 3.15 process you can start gathering samples by running this (I had to use &lt;code&gt;sudo&lt;/code&gt; on macOS):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Shell&quot;&gt;&lt;span class=&quot;syntax-source syntax-shell syntax-bash&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;sudo&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-arguments syntax-shell&quot;&gt; uv run&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt; --&lt;/span&gt;python&lt;/span&gt; 3.15 python&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt; -&lt;/span&gt;m&lt;/span&gt; profiling.sampling attach 1234&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Interact with the main program a bit, then hit Ctrl+C to stop gathering and see a report, which looks something like this:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/profiler-output.webp&quot; alt=&quot;Screenshot of terminal output from a Python sampling profiler with colored text on a black background. Header lines report 2,651 samples captured in 2.65 seconds at a sample rate of 999.98 samples/sec with an error rate of 0.19. A Profile Stats table with columns for nsamples, sample%, tottime, cumul%, cumtime and filename:lineno(function) shows that 99.9% of samples (2.644 seconds) were spent directly in selectors.py KqueueSelector.select, meaning the process was almost entirely idle waiting on the asyncio event loop. The rest of the table lists the call stack beneath it with zero direct time but 100% cumulative presence: asyncio base_events.py run_once, run_forever and run_until_complete, runners.py Runner.run and run, cli.py serve and sqlite_extensions wrapped, and several click core.py invoke, main and call frames. A legend explains each column, followed by a Summary of Interesting Functions section listing hot spots (KqueueSelector.select at 99.9% direct samples), the most frequently present functions on the stack (run_forever, run_until_complete and Runner.run at 100%), and the highest call magnification (2645.0x for BaseEventLoop._run_once).&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;It can also produce &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/research/python-3-15-web-edit-profiling/artifacts/flamegraph.html&quot;&gt;flame graphs like this&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/research/python-3-15-web-edit-profiling/artifacts/heatmap/index.html&quot;&gt;heat maps like this&lt;/a&gt;, and can even output a format that can be viewed in the Firefox profiler UI.&lt;/p&gt;
&lt;h4&gt;3.15 isn’t much faster than 3.14&lt;/h4&gt;
&lt;p&gt;Miguel Grinberg investigated &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blog.miguelgrinberg.com/post/how-fast-is-python-3-15&quot;&gt;How fast is Python 3.15?&lt;/a&gt; the other day against the 3.15.0rc3 release and found performance to be mostly the same as 3.14, with the exception of the experimental JIT. The JIT gave a 1.2x boost over the standard 3.15 interpreter (on a Fibonacci test), the first time Miguel observed a meaningful JIT performance increase.&lt;/p&gt;
&lt;p&gt;Miguel’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blog.miguelgrinberg.com/post/python-3-14-is-here-how-fast-is-it&quot;&gt;explorations of 3.14&lt;/a&gt; last year found significant boosts against Python 3.13 across many more categories.&lt;/p&gt;
&lt;h4&gt;Upgrading to Python 3.15 with uv&lt;/h4&gt;
&lt;p&gt;I used the following sequence of commands to get &lt;code&gt;uv&lt;/code&gt; to use Python 3.15 on my Mac. First I had to upgrade &lt;code&gt;uv&lt;/code&gt; itself to ensure it knew about the new release:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Shell&quot;&gt;&lt;span class=&quot;syntax-source syntax-shell syntax-bash&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;uv&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-arguments syntax-shell&quot;&gt; self update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I installed the stable 3.15 release:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Shell&quot;&gt;&lt;span class=&quot;syntax-source syntax-shell syntax-bash&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;uv&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-arguments syntax-shell&quot;&gt; python install 3.15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And told &lt;code&gt;uv&lt;/code&gt; that I wanted that to be the default for every &lt;code&gt;uv run&lt;/code&gt; command, unless the project itself pinned a different version:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Shell&quot;&gt;&lt;span class=&quot;syntax-source syntax-shell syntax-bash&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;uv&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-arguments syntax-shell&quot;&gt; python pin&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt; --&lt;/span&gt;global&lt;/span&gt; 3.15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the following reports 3.15 as the version:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Shell&quot;&gt;&lt;span class=&quot;syntax-source syntax-shell syntax-bash&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;uv&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-arguments syntax-shell&quot;&gt; run python&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt; --&lt;/span&gt;version&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I already have a bunch of tools installed using &lt;code&gt;uv tool install&lt;/code&gt;. I reinstalled them to use Python 3.15 like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Shell&quot;&gt;&lt;span class=&quot;syntax-source syntax-shell syntax-bash&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;uv&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-arguments syntax-shell&quot;&gt; tool upgrade datasette&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt; --&lt;/span&gt;python&lt;/span&gt; 3.15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I can confirm the version like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Shell&quot;&gt;&lt;span class=&quot;syntax-source syntax-shell syntax-bash&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;datasette&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-arguments syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt; --&lt;/span&gt;get&lt;/span&gt; /-/versions.json&lt;/span&gt; &lt;span class=&quot;syntax-keyword syntax-operator syntax-logical syntax-pipe syntax-shell&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;jq&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Highlights from Python 3.11&lt;/h4&gt;
&lt;p&gt;The release of 3.15 means that Python 3.10 (released in 2021) is officially &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://devguide.python.org/versions/&quot;&gt;no longer supported&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My policy for my main open source projects is to keep them working in every supported Python version. I can now drop 3.10 and start using features that were introduced in 3.11.&lt;/p&gt;
&lt;p&gt;Here’s the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/whatsnew/3.11.html&quot;&gt;What’s new in Python 3.11&lt;/a&gt; document. I finally get to rely on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/library/tomllib.html#module-tomllib&quot;&gt;tomllib&lt;/a&gt; being available!&lt;/p&gt;
&lt;p&gt;Datasette makes extensive use of &lt;code&gt;asyncio&lt;/code&gt;. 3.11 adds &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/library/asyncio-task.html#asyncio.TaskGroup&quot;&gt;TaskGroup&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/library/asyncio-task.html#asyncio.timeout&quot;&gt;timeout()&lt;/a&gt;, and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/whatsnew/3.11.html#asyncio&quot;&gt;several more&lt;/a&gt; new features.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;datetime.UTC&lt;/code&gt; is a new in 3.11 alias for &lt;code&gt;datetime.timezone.utc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Python’s SQLite support got some significant upgrades in 3.11, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.setlimit&quot;&gt;setlimit()&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.getlimit&quot;&gt;getlimit()&lt;/a&gt; expose a mechanism for setting &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.sqlite.org/c3ref/c_limit_attached.html&quot;&gt;SQLite runtime limits&lt;/a&gt; from Python.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.create_window_function&quot;&gt;create_window_function()&lt;/a&gt; lets us create custom window functions in Python, as a class with &lt;code&gt;step()&lt;/code&gt;, &lt;code&gt;value()&lt;/code&gt;, &lt;code&gt;inverse()&lt;/code&gt;, and &lt;code&gt;finalize()&lt;/code&gt; methods.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.blobopen&quot;&gt;blobopen()&lt;/a&gt; provides an efficient mechanism for partial reads and writes of large &lt;code&gt;BLOB&lt;/code&gt; binary values stored in a SQLite row.&lt;/li&gt;
&lt;li&gt;You can now call &lt;code&gt;set_authorizer(None)&lt;/code&gt; to remove a SQLite authorizer. Datasette had a workaround for this!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Plus a whole bunch of &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.python.org/3/whatsnew/3.11.html#new-feat-related-type-hints-311&quot;&gt;improvements to Python’s typing system&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I plan to land Python 3.11 improvements to a bunch of my projects over the next few weeks. Here’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/datasette/pull/2998&quot;&gt;my first Datasette PR&lt;/a&gt; removing that &lt;code&gt;set_authorizer(None)&lt;/code&gt; workaround.&lt;/p&gt;
&lt;p&gt;I’ve also updated my &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/click-app&quot;&gt;click-app&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/datasette-plugin&quot;&gt;datasette-plugin&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/python-lib&quot;&gt;python-lib&lt;/a&gt;, and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/llm-plugin&quot;&gt;llm-plugin&lt;/a&gt; cookiecutter templates to test against Python 3.11 through Python 3.15.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:6dd338a630d12d1ef1457d0c90ccc186867e165b</id>
    <title type="text">Profiling web-edit with Python 3.15: flame graphs and source heatmaps</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-12-profiling-web-edit-with-python-3-15-flame-graphs-and-source/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/12/python-3-15-web-edit-profiling/"/>
    <published>2026-10-12T16:58:00+00:00</published>
    <updated>2026-10-12T16:58:00+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="codex"/>
    <category term="profiling"/>
    <category term="python"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Research: Profiling web-edit with Python 3.15: flame graphs and source heatmaps I put the new Python 3.15 profiler through its paces by having GPT-6 Astra Extra High in Codex run it against my new web-edit app: I need a Python 3.15 flame…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/research/tree/main/python-3-15-web-edit-profiling#readme&quot;&gt;Profiling web-edit with Python 3.15: flame graphs and source heatmaps&lt;/a&gt; — Profiling the unmodified web-edit app with Python 3.15’s built-in `profiling.sampling` revealed that mixed line-ending preservation dominated a busy editing workload: `preserve_endings` appeared in 64.8% of 15,296 recorded CPU stacks, with `SequenceMatcher.find_longest_match` contributing 38.3% of leaf samples. Sampling all threads was essential, since 95.1% of stacks came from AnyIO’s worker thread and would have been missed by a main-thread-only profile.&lt;/p&gt;
&lt;p&gt;I put the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/python-3-15/#a-sampling-profiler&quot;&gt;new Python 3.15 profiler&lt;/a&gt; through its paces by having GPT-6 Astra Extra High in Codex run it against my new &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/web-edit/&quot;&gt;web-edit app&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;I need a Python 3.15 flame graph and heatmap demo of the &amp;quot;web-edit&amp;quot; app from PyPI - research first then make me those demos&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&#39;s the resulting example &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/research/python-3-15-web-edit-profiling/artifacts/flamegraph.html&quot;&gt;flame graph&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.github.io/research/python-3-15-web-edit-profiling/artifacts/heatmap/index.html&quot;&gt;heatmap&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:3d2b623e4666766533fbadc9d8583b5c6c30f522</id>
    <title type="text">web-edit 0.1a0</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-12-web-edit-0-1a0/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/12/web-edit/"/>
    <published>2026-10-12T15:54:36+00:00</published>
    <updated>2026-10-12T15:54:36+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="codex"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="projects"/>
    <category term="python"/>
    <category term="tailscale"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: web-edit 0.1a0 I was working on a project from my phone using Codex Remote when I found myself wanting to edit a credentials file without round-tripping those credentials through the LLM itself. So... I had Codex and GPT-6 Astra…</summary>
    <content type="html">&lt;p&gt;I was working on a project from my phone using Codex Remote when I found myself wanting to edit a credentials file without round-tripping those credentials through the LLM itself.&lt;/p&gt;
&lt;p&gt;So... I had Codex and GPT-6 Astra Extra High build this Python web app which provides a web UI for viewing and editing files in a folder. It&#39;s intended to be run over Tailscale, so I can have an agent start this running and then edit files via my Tailscale network directly from my phone.&lt;/p&gt;
&lt;p&gt;Here&#39;s the interface for browsing files in a folder:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/web-edit.webp&quot; alt=&quot;Screenshot of a web file manager interface. Header reads &amp;quot;WORKSPACE&amp;quot; above the title &amp;quot;Files&amp;quot;, with buttons &amp;quot;Refresh&amp;quot;, &amp;quot;Upload files&amp;quot; and &amp;quot;New file&amp;quot; (dark green). A breadcrumb shows &amp;quot;web-edit / web_edit / static&amp;quot;. A table with columns &amp;quot;Name&amp;quot;, &amp;quot;Size&amp;quot;, &amp;quot;Modified&amp;quot; lists four files, each with &amp;quot;Download ↓&amp;quot; and &amp;quot;Delete&amp;quot; links: &amp;quot;app.css&amp;quot; 8.4 KB Oct 12, 2026; &amp;quot;app.js&amp;quot; 671.5 KB Oct 12, 2026; &amp;quot;index.html&amp;quot; 4.3 KB Oct 12, 2026 (underlined, as if hovered); &amp;quot;THIRD_PARTY_LICENSES.txt&amp;quot; 32.3 KB Oct 12, 2026. Below the table: &amp;quot;Images under 2 MB appear inline. Select a text file to edit it.&amp;quot; A panel below is labelled &amp;quot;UPLOAD QUEUE&amp;quot; with heading &amp;quot;Add files&amp;quot; and a &amp;quot;Close&amp;quot; button. It has a &amp;quot;Destination folder&amp;quot; text field containing &amp;quot;web_edit&amp;quot;, then a dashed drop zone reading &amp;quot;Choose files or drop them here&amp;quot; and &amp;quot;Set a path and filename for each file before uploading.&amp;quot; with a &amp;quot;Choose Files&amp;quot; button and the text &amp;quot;no files selected&amp;quot;. A greyed-out &amp;quot;Upload files&amp;quot; button sits at the bottom right.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Editing uses &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://codemirror.net&quot;&gt;CodeMirror 6&lt;/a&gt; - I was going to use &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://microsoft.github.io/monaco-editor/&quot;&gt;Monaco&lt;/a&gt; but that still doesn&#39;t have a great mobile experience yet.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:e9e4eae466a7f7f57018dc6ee9abb822d2329cb8</id>
    <title type="text">datasette-ports 0.4</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-12-datasette-ports-0-4/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/12/datasette-ports/"/>
    <published>2026-10-12T04:57:07+00:00</published>
    <updated>2026-10-12T04:57:07+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="datasette"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: datasette-ports 0.4 My plugin for detecting and listing all Datasette instances on the current machine now works with the latest version, and displays the detected PID as well. Knowing the PID makes it easier to attach the new…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/datasette/datasette-ports/releases/tag/0.4&quot;&gt;datasette-ports 0.4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My plugin for detecting and listing all Datasette instances on the current machine now works with the latest version, and displays the detected PID as well. Knowing the PID makes it easier to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/python-3-15/#a-sampling-profiler&quot;&gt;attach the new Python 3.15 profiler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tags: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/datasette&quot;&gt;datasette&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:d5acc43f4eab0ec55ba5187100e1fcd302a0a43c</id>
    <title type="text">Dwarf Fortress uses version control now</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-11-dwarf-fortress-uses-version-control-now/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/11/dwarf-fortress/"/>
    <published>2026-10-11T00:52:37+00:00</published>
    <updated>2026-10-11T00:52:37+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="version-control"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">I remember hearing a while ago that Dwarf Fortress didn&#39;t use version control. That fact has been lodged in my head, because given its inherent complexity I have trouble imagining a codebase that would benefit from version control more.…</summary>
    <content type="html">&lt;p&gt;I remember hearing a while ago that Dwarf Fortress didn&#39;t use version control. That fact has been lodged in my head, because given its inherent complexity I have trouble imagining a codebase that would benefit from version control &lt;em&gt;more&lt;/em&gt;. That&#39;s art.&lt;/p&gt;
&lt;p&gt;I went looking and I&#39;m sad to report that the days without version control appear to have ended. Quoting Tarn Adams over time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;March 2013: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.reddit.com/r/IAmA/comments/1avszc/comment/c919fo8/?solution=43270267461a564b43270267461a564b&amp;amp;js_challenge=1&amp;amp;jsc_token=2824be10929bdc604753c70a67a1c3310860c2cae0f946ff767fab3727807a35&amp;amp;jsc_orig_r=&quot;&gt;&amp;quot;I don&#39;t use version control -- I didn&#39;t like the feeling of having the code get committed into a black box thingy with no immediate upside&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;March 2016: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.pcgamer.com/dwarf-fortress-creator-on-how-hes-42-towards-simulating-existence/3/&quot;&gt;&amp;quot;I don’t even use version control. If you don’t know what that is then you’re not gonna yell at me. If you even know what version control is you’re gonna be like, ‘You don’t use version control? You don’t use source control? What is wrong with you? How can you even work? I’m just not cut out for it, in a sense. It’s been 15 years, so the reasons have change over time, but that’s my current understanding of it.&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;March 2023: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.gamedeveloper.com/programming/how-tarn-adams-upgraded-and-optimized-dwarf-fortress-for-its-official-steam-release&quot;&gt;&amp;quot;I&#39;ve got Discord channels to check and version control stuff to use now, so the process is definitely a little more involved&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That March 2023 quote comes from an interview about the release on Steam which &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.pcgamer.com/after-spending-20-years-simulating-reality-the-dwarf-fortress-devs-have-to-get-used-to-a-new-one-being-millionaires/&quot;&gt;made them millionaires&lt;/a&gt;. I&#39;m a tiny bit sad that they gave in before they hit that milestone, but what an impressive run.&lt;/p&gt;
&lt;p&gt;Tags: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/version-control&quot;&gt;version-control&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:b87bc73c23a36fd24652f61c03a1cc3158359be6</id>
    <title type="text">Python 3.15.0 added to actions/python-versions</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-10-python-3-15-0-added-to-actions-python-versions/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/10/python-actions/"/>
    <published>2026-10-10T23:58:04+00:00</published>
    <updated>2026-10-10T23:58:04+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="chatgpt"/>
    <category term="github"/>
    <category term="github-actions"/>
    <category term="python"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Python 3.15.0 added to actions/python-versions Bit of a niche link, but I&#39;ve been waiting for this for a couple of days - I even told ChatGPT to check for it: Clone https://github.com/actions/python-versions and git pull once an hour until…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/actions/python-versions/commit/49858b91c92d27403416ee43117032e91d00ce24&quot;&gt;Python 3.15.0 added to actions/python-versions&lt;/a&gt;&lt;/strong&gt;. Bit of a niche link, but I&#39;ve been waiting for this for a couple of days - I even &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://chatgpt.com/share/6acad42a-2868-83e8-9a16-736f9def2b45&quot;&gt;told ChatGPT&lt;/a&gt; to check for it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Clone https://github.com/actions/python-versions  and git pull once an hour until they add the stable  3.15 - then tell me about it&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now that this has landed, you can add &lt;code&gt;&amp;quot;3.15&amp;quot;&lt;/code&gt; to a GitHub Actions testing matrix to run tests against the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.python.org/downloads/release/python-3150/&quot;&gt;new Python 3.15.0 release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Posted &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/10/&quot;&gt;10th October 2026&lt;/a&gt; at 11:58 pm&lt;/p&gt;
&lt;h2&gt;Recent articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/python-3-15/&quot;&gt;Hello Python 3.15, goodbye 3.10, and now I can use 3.11&lt;/a&gt; - 12th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/9/built-using-my-voice/&quot;&gt;A new feature for my blog, built using my voice&lt;/a&gt; - 9th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/&quot;&gt;Claude Haiku 5.5&lt;/a&gt; - 7th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/&quot;&gt;We&#39;re going to need default hard budget caps on pretty much everything&lt;/a&gt; - 3rd October 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a &lt;strong&gt;link post&lt;/strong&gt; by Simon Willison, posted on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/10/&quot;&gt;10th October 2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/github/&quot;&gt;github 196&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/python/&quot;&gt;python 1,291&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/github-actions/&quot;&gt;github-actions 73&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/chatgpt/&quot;&gt;chatgpt 205&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Monthly briefing&lt;/h3&gt;
&lt;p&gt;Sponsor me for &lt;strong&gt;$10/month&lt;/strong&gt; and get a curated email digest of the month&#39;s most important LLM developments.&lt;/p&gt;
&lt;p&gt;Pay me to send you less!&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/sponsors/simonw/&quot;&gt;Sponsor &amp;amp; subscribe&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:64a6bc5040f81810de3f1ece25b2838f0cc31b51</id>
    <title type="text">Quoting The New York Times</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-10-quoting-the-new-york-times/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/10/the-new-york-times/"/>
    <published>2026-10-10T02:04:12+00:00</published>
    <updated>2026-10-10T02:04:12+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="accidental-cyberattacks"/>
    <category term="ai"/>
    <category term="anthropic"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Anthropic detailed the activity of its A.I. agents in a blog post on Friday, without naming the targeted websites. But two sources with knowledge of the incidents said Anthropic’s A.I. agents had submitted 20 visa applications through a…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Anthropic detailed the activity of its A.I. agents in &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.anthropic.com/research/investigating-unintended-model-actions&quot;&gt;a blog post&lt;/a&gt; on Friday, without naming the targeted websites. But two sources with knowledge of the incidents said Anthropic’s A.I. agents had submitted 20 visa applications through a form available on the State Department’s website. All the applications were incomplete and were not processed, they said.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.nytimes.com/2026/10/09/technology/anthropic-rogue-ai-agents.html&quot;&gt;The New York Times&lt;/a&gt;, Anthropic Agents Tried to Fill Out Visa Forms on State Dept. Website&lt;/p&gt;
&lt;p&gt;Posted &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/10/&quot;&gt;10th October 2026&lt;/a&gt; at 2:04 am&lt;/p&gt;
&lt;h2&gt;Recent articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/python-3-15/&quot;&gt;Hello Python 3.15, goodbye 3.10, and now I can use 3.11&lt;/a&gt; - 12th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/9/built-using-my-voice/&quot;&gt;A new feature for my blog, built using my voice&lt;/a&gt; - 9th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/&quot;&gt;Claude Haiku 5.5&lt;/a&gt; - 7th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/&quot;&gt;We&#39;re going to need default hard budget caps on pretty much everything&lt;/a&gt; - 3rd October 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a &lt;strong&gt;quotation&lt;/strong&gt; collected by Simon Willison, posted on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/10/&quot;&gt;10th October 2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/ai/&quot;&gt;ai 2,285&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/generative-ai/&quot;&gt;generative-ai 2,027&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/llms/&quot;&gt;llms 1,993&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/anthropic/&quot;&gt;anthropic 350&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/accidental-cyberattacks/&quot;&gt;accidental-cyberattacks 20&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:1f8e7c0a2358233bb9c57db078800e2174046f29</id>
    <title type="text">Deno is joining Cloudflare</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-09-deno-is-joining-cloudflare/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/9/deno-is-joining-cloudflare/"/>
    <published>2026-10-09T22:48:37+00:00</published>
    <updated>2026-10-09T22:48:37+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="cloudfront"/>
    <category term="deno"/>
    <category term="javascript"/>
    <category term="nodejs"/>
    <category term="ryan-dahl"/>
    <category term="sandboxing"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Deno is joining Cloudflare The Deno team released the first version of celld back in August - their open source implementation of the Durable Objects pattern from Cloudflare Workers. Today, Cloudflare are acquiring Deno outright, with the…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://deno.com/blog/cloudflare&quot;&gt;Deno is joining Cloudflare&lt;/a&gt;&lt;/strong&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=50019911&quot; title=&quot;Hacker News&quot;&gt;via&lt;/a&gt;) The Deno team released the first version of &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/denoland/celld&quot;&gt;celld&lt;/a&gt; back in August - their open source implementation of the Durable Objects pattern from Cloudflare Workers.&lt;/p&gt;
&lt;p&gt;Today, Cloudflare are acquiring Deno outright, with the goal of building on &lt;code&gt;celld&lt;/code&gt; to &amp;quot;make workerd self-hosting a first-class supported way to build and run apps using the Workers programming model&amp;quot; (see &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blog.cloudflare.com/deno-joins-cloudflare/&quot;&gt;the Cloudflare blog&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;The bad news is that Deno itself will not be maintained by Cloudflare beyond the next year:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We will support the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/denoland/deno&quot;&gt;Deno runtime&lt;/a&gt; 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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Deno (and Node.js) creator Ryan Dahl explained that decision in &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=50019911#50023277&quot;&gt;a comment&lt;/a&gt; on Hacker News:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&#39;s a joint decision and I agree with it. I&#39;m most invested in its success and have put the most work into it - and I no longer think it&#39;s where I can do the most important work. There are some good ideas in Deno and it&#39;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.&lt;/p&gt;
&lt;p&gt;I&#39;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&#39;s an entirely new model for server development.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Node.js &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://nodejs.org/api/permissions.html&quot;&gt;has a similar permissions model&lt;/a&gt; these days, added &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://nodejs.org/en/blog/release/v20.0.0&quot;&gt;in Node v20.0.0&lt;/a&gt; in April 2023 and declared stable &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://nodejs.org/en/blog/release/v22.13.0&quot;&gt;in Node v22.13.0&lt;/a&gt; in January 2025. They don&#39;t yet support allow-listing specific network hosts though - networking is either on or off.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:e0d48e9e6b2c6574a7d55342b517f00a6631452a</id>
    <title type="text">Quoting Matthew Green</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-09-quoting-matthew-green/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/9/matthew-green/"/>
    <published>2026-10-09T15:02:29+00:00</published>
    <updated>2026-10-09T15:02:29+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="ai-security-research"/>
    <category term="cryptography"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="matthew-green"/>
    <category term="standards"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">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…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;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. [...]&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://twitter.com/matthew_d_green/status/2108552414978564418&quot;&gt;Matthew Green&lt;/a&gt;, on Twitter. I looked it up and Minicrypt is Russell Impagliazzo’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.quantamagazine.org/which-computational-universe-do-we-live-in-20220418/&quot;&gt;hypothetical world&lt;/a&gt; in which public-key encryption is impossible.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:b2be75153dce20082f9896b828f60992b3e03093</id>
    <title type="text">A new feature for my blog, built using my voice</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-09-a-new-feature-for-my-blog-built-using-my-voice/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/9/built-using-my-voice/"/>
    <published>2026-10-09T12:54:06+00:00</published>
    <updated>2026-10-09T12:54:06+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="codex"/>
    <category term="coding-agents"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="newsletter"/>
    <category term="openai"/>
    <category term="site-upgrades"/>
    <category term="speech-to-text"/>
    <category term="text-to-speech"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">I shipped a new feature for my blog today: the Newsletters page, which offers an index of all of the newsletters I&#39;ve sent out, both my free weekly Substack and my monthly sponsors-only updates. I built the feature almost entirely using my…</summary>
    <content type="html">&lt;p&gt;I shipped a new feature for my blog today: the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/newsletters/&quot;&gt;Newsletters&lt;/a&gt; page, which offers an index of all of the newsletters I’ve sent out, both my free &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonw.substack.com/&quot;&gt;weekly Substack&lt;/a&gt; and my &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/sponsors/simonw/&quot;&gt;monthly sponsors-only&lt;/a&gt; updates. I built the feature almost entirely using my voice, chatting away to my laptop while I cooked dinner.&lt;/p&gt;
&lt;h4&gt;Codex voice mode&lt;/h4&gt;
&lt;p&gt;I used the ChatGPT desktop app for this, in the Codex tab, using the voice conversation mode, running against a local development environment. Here’s what that looks like:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/codex-voice.webp&quot; alt=&quot;Three columns of the ChatGPT app. The left hand column shows my recent conversations. The middle column is a transcript of the conversation, with a throbbing black blob representing voice mode. The right hand column shows a local dev server version of my blog, with the Newsletters page visible.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I started the session against my local &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/simonwillisonblog&quot;&gt;simonwillisonblog&lt;/a&gt; checkout by typing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Start dev server and open in browser&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This gave me a preview of the site that it would be working on, and meant that I could later ask it to show me the new pages so I could visually track its progress.&lt;/p&gt;
&lt;p&gt;Then I clicked the “Start new voice chat” button—that’s &lt;em&gt;not&lt;/em&gt; the microphone button, it’s the one to the right of it—and set my laptop up in the kitchen so I could talk to it while I cooked.&lt;/p&gt;
&lt;h4&gt;Talking to my computer&lt;/h4&gt;
&lt;p&gt;I had a pretty good idea of what I wanted to build, and it’s a simple enough Django feature that I was certain the model (in this case GPT-6 Astra High) would be able to do it. A new model, a migration, some view code, templates, and a couple of import functions to populate the database from external sources.&lt;/p&gt;
&lt;p&gt;Here’s an extract of my voice transcript that was captured by Codex:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Um, they do not. Um, this is going to be a new type of content. Um, it’s not going to show up... Oh, hold on. Yeah, no- I do not want this to show up in my, um, tag pages and date archive pages and... Actually, no, I think... I don’t want it on the tag pages. I don’t want it on the, um, blog index page. But I think I do want it to show up on the date-based pages. You know, if you navigate to September the 19th, and I sent a newsletter on that page, I think I want that to show up. So... this is- so I think we probably need a new model. The other thing is that I want them searchable, uh the Substack ones are not searchable, because those are actually just copies of other s- on content on my blog. These monthly ones do contain unique content, and spe- and once they’re... published, like once they’re made public a month after they’ve gone out, I want them to show up on my search results.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apparently this was clear enough that the model knew what I wanted to build! You can read the full transcript, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Speech_disfluency&quot;&gt;disfluencies&lt;/a&gt; and all, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://gist.github.com/simonw/a65a22204f6f7228cc59b4bc34d7c7c8&quot;&gt;in this Gist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We went on like this for about half an hour (the time it took to cook dinner). The model would reply and occasionally ask clarifying questions, then get to work modifying the code.&lt;/p&gt;
&lt;h4&gt;What we built&lt;/h4&gt;
&lt;p&gt;We got a surprisingly long way entirely by voice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new model and migration to represent imported newsletters in Django, plus Django Admin configuration for that&lt;/li&gt;
&lt;li&gt;Four working imports:
&lt;ul&gt;
&lt;li&gt;The most recent Substack items via RSS&lt;/li&gt;
&lt;li&gt;Every other Substack item via their undocumented API, which GPT-6 Astra knew about (it tried &lt;code&gt;/api/v1/archive&lt;/code&gt; directly) and then ran a search to figure out how to paginate it and found &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://wonderingaboutai.substack.com/p/i-connected-my-newsletter-archive&quot;&gt;this article&lt;/a&gt; by Karen Spinner&lt;/li&gt;
&lt;li&gt;All of my published monthly newsletters from my &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/monthly-newsletter-archive&quot;&gt;simonw/monthly-newsletter-archive&lt;/a&gt; GitHub repository&lt;/li&gt;
&lt;li&gt;My most recent private sponsors-only newsletter from a private repository&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/newsletters/&quot;&gt;/newsletters/&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/newsletters/2026/&quot;&gt;/newsletters/2026/&lt;/a&gt; public archive pages&lt;/li&gt;
&lt;li&gt;Newsletters showing up on day and month archive pages too, but not on tag pages or my homepage&lt;/li&gt;
&lt;li&gt;Weekly Substack newsletters link to Substack; archived monthly newsletters have their own pages&lt;/li&gt;
&lt;li&gt;Integration with my site search engine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was &lt;em&gt;almost&lt;/em&gt; ready to ship. The catch was the imports: Astra offered to export data from my local copy so I could import that into production, but I wanted it to work like my other import scripts. Since some of the data lived in a private GitHub repository, this would involve creating a new API key, and for that I knew I’d have to sit at the keyboard for a while.&lt;/p&gt;
&lt;h4&gt;Finishing it with a review&lt;/h4&gt;
&lt;p&gt;Once I had finished cooking and judged it mostly feature-complete, I had Codex create a branch and open a pull request.&lt;/p&gt;
&lt;p&gt;I reviewed the code in the GitHub PR interface. It was nearly what I needed, except it had chosen to use Git in a subprocess for one of the import scripts. I needed one of the imports to pull from a private Git repository, so I figured the API would be a better bet. I switched to typing and had Codex swap that out for an API-based import instead.&lt;/p&gt;
&lt;p&gt;You can see the changes I made during the review &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/simonwillisonblog/pull/719&quot;&gt;in the extra commits on the PR&lt;/a&gt;. I fixed the import mechanism and made a few tweaks to the display of those public pages. It took an additional half hour of typing-based prompting to get to the point where I was happy to deploy it to production by landing the PR.&lt;/p&gt;
&lt;h4&gt;The end result&lt;/h4&gt;
&lt;p&gt;You can see the end result at the new &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/newsletters/&quot;&gt;newsletters index page&lt;/a&gt;, or view the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/newsletters/monthly-2026-08-august/&quot;&gt;page for a previous monthly newsletter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/newsletters-page.webp&quot; alt=&quot;Newsletters page. It shows two Substack posts (with thumbnails) and one LLM digest Sponsors-only newsletter with a list of headings. On the right is a CTA to subscribe to my Substack and another one for my $10/month monthly briefing newsletter.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The index page shows my most recent Substack weekly newsletters and GitHub sponsors monthly newsletters mixed together in reverse chronological order. Further down the page are links to my by-year archive pages.&lt;/p&gt;
&lt;p&gt;GPT-6 Astra designed the page, and then tweaked that design based on my vocal feedback from glancing at the local preview across the kitchen.&lt;/p&gt;
&lt;h4&gt;Better for multi-tasking than as a daily driver&lt;/h4&gt;
&lt;p&gt;OpenAI &lt;em&gt;love&lt;/em&gt; using voice-driven demos like this one for &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Sep/29/openai-devday-2026-live-blog/#live-update-504&quot;&gt;things like DevDay&lt;/a&gt;—and they do work well in that environment. I don’t think this is going to be a daily driver for me though.&lt;/p&gt;
&lt;p&gt;I’ve &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/search/?q=walking+dog&quot;&gt;written before&lt;/a&gt; about how much “work” I get done using ChatGPT voice mode on my phone while walking the dog—mostly research and brainstorming, but occasionally actual development work by having ChatGPT write and test out snippets of code.&lt;/p&gt;
&lt;p&gt;This feels different. The addition of the visual preview, plus being able to type or paste things in via the keyboard when I need to communicate something that doesn’t work vocally, makes this a much more powerful way of interacting with a coding agent.&lt;/p&gt;
&lt;p&gt;I still switch back to typing once I get down to the details of things though. Being able to paste in examples and error messages, or directly highlight the code or feature that needs changing, remains more efficient than trying to describe it in words.&lt;/p&gt;
&lt;p&gt;I mainly work from home, which is good because there’s no way I’d want to talk to my computer like this in a shared workspace!&lt;/p&gt;
&lt;p&gt;The killer feature for me is the ability to multi-task. I usually cook with a podcast or TikTok running; now I can actually build stuff instead.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:acfcd0e6c458fe319266d1bf39147e00bb6d2b75</id>
    <title type="text">ttok 1.0</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-09-ttok-1-0/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/9/ttok/"/>
    <published>2026-10-09T00:34:43+00:00</published>
    <updated>2026-10-09T00:34:43+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="openai"/>
    <category term="projects"/>
    <category term="tokenization"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">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…</summary>
    <content type="html">&lt;p&gt;I released &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/8/ttok/&quot;&gt;ttok 0.4&lt;/a&gt;, ran &lt;code&gt;uv tool upgrade ttok&lt;/code&gt;, 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!&lt;/p&gt;
&lt;p&gt;I figured switching the default was a reasonable excuse to finally ship a 1.0.&lt;/p&gt;
&lt;p&gt;OpenAI haven&#39;t actually confirmed that GPT-6 uses the same tokenizer as the GPT-5 family yet - there&#39;s an &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/openai/tiktoken/issues/608&quot;&gt;angry issue about it&lt;/a&gt; - but I found &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/williamliu-ai/token-count-compare/commit/8d8a2178538bb37beb548fc37378135e4ff4b0c8&quot;&gt;this commit&lt;/a&gt; by William Liu which reports on an experiment he ran confirming that the tokenizers are likely the same:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:068ba4cca0919f9ba5b7e9ddd378b2150bf6ed74</id>
    <title type="text">ttok 0.4</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-08-ttok-0-4/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/8/ttok/"/>
    <published>2026-10-08T23:34:28+00:00</published>
    <updated>2026-10-08T23:34:28+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="openai"/>
    <category term="projects"/>
    <category term="tokenization"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: ttok 0.4 ttok is my CLI tool for counting tokens, using OpenAI&#39;s open source tiktoken library. It hasn&#39;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…</summary>
    <content type="html">&lt;p&gt;&lt;code&gt;ttok&lt;/code&gt; is my CLI tool for counting tokens, using OpenAI&#39;s open source &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/openai/tiktoken&quot;&gt;tiktoken&lt;/a&gt; library.&lt;/p&gt;
&lt;p&gt;It hasn&#39;t been in updated in a couple of years, but I finally fixed a Click warning, updated CI, and added a &lt;code&gt;--list-models&lt;/code&gt; command to list available models.&lt;/p&gt;
&lt;p&gt;It works with &lt;code&gt;uvx&lt;/code&gt;, so you can count tokens in anything like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;cat file.txt | uvx ttok
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:346bbd5f5dcc230f8fddcf0777360399bc50fd69</id>
    <title type="text">Quoting Carson Gross</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-08-quoting-carson-gross/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/8/carson-gross/"/>
    <published>2026-10-08T21:05:44+00:00</published>
    <updated>2026-10-08T21:05:44+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="careers"/>
    <category term="carson-gross"/>
    <category term="computer-science"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Computer programming is, fundamentally, about two things: Problem-solving using computers Learning to control complexity while solving these problems I have a hard time imagining a future where knowing how to solve problems with computers…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Computer programming is, fundamentally, about two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Problem-solving using computers&lt;/li&gt;
&lt;li&gt;Learning to control complexity while solving these problems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have a hard time imagining a future where knowing how to solve problems with computers and how to control the complexity of those solutions is &lt;em&gt;less&lt;/em&gt; valuable than it is today, so I think it will continue to be a viable career even with the advent of AI tools.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://htmx.org/essays/yes-and/&quot;&gt;Carson Gross&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Posted &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/8/&quot;&gt;8th October 2026&lt;/a&gt; at 9:05 pm&lt;/p&gt;
&lt;h2&gt;Recent articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/python-3-15/&quot;&gt;Hello Python 3.15, goodbye 3.10, and now I can use 3.11&lt;/a&gt; - 12th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/9/built-using-my-voice/&quot;&gt;A new feature for my blog, built using my voice&lt;/a&gt; - 9th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/&quot;&gt;Claude Haiku 5.5&lt;/a&gt; - 7th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/&quot;&gt;We&#39;re going to need default hard budget caps on pretty much everything&lt;/a&gt; - 3rd October 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a &lt;strong&gt;quotation&lt;/strong&gt; collected by Simon Willison, posted on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/8/&quot;&gt;8th October 2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/computer-science/&quot;&gt;computer-science 16&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/careers/&quot;&gt;careers 84&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/ai/&quot;&gt;ai 2,285&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/carson-gross/&quot;&gt;carson-gross 4&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:1ccdc679f9874d1f73c9dab75def0040ac94e25a</id>
    <title type="text">Quoting Ben Affleck</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-07-quoting-ben-affleck/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/7/ben-affleck/"/>
    <published>2026-10-07T23:14:58+00:00</published>
    <updated>2026-10-07T23:14:58+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="machine-learning"/>
    <category term="python"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">I&#39;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…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;I&#39;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.&lt;/p&gt;
&lt;p&gt;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&#39;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.&lt;/p&gt;
&lt;p&gt;And a tensor, you use a convolutional neural network to identify patterns in that that would reveal what&#39;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.youtube.com/watch?v=HzraLR2VkNM&amp;amp;t=2259s&quot;&gt;Ben Affleck&lt;/a&gt;, Pythonista&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:32a42b9c2d14946322e2a0b16b5466e86b218864</id>
    <title type="text">Claude Haiku 5.5</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-07-claude-haiku-5-5/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/"/>
    <published>2026-10-07T20:56:21+00:00</published>
    <updated>2026-10-07T20:56:21+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="anthropic"/>
    <category term="claude"/>
    <category term="generative-ai"/>
    <category term="llm-pricing"/>
    <category term="llm-release"/>
    <category term="llms"/>
    <category term="pelican-riding-a-bicycle"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">As previously promised, here&#39;s Anthropic&#39;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…</summary>
    <content type="html">&lt;p&gt;As previously &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Sep/28/claude-sonnet-5-5/&quot;&gt;promised&lt;/a&gt;, here’s Anthropic’s new fast, low cost model: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.anthropic.com/claude-haiku-5-5&quot;&gt;Introducing Claude Haiku 5.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The previous Haiku, 4.5, was very much showing its age. It came out &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2025/Oct/15/claude-haiku-45/&quot;&gt;almost a year ago&lt;/a&gt;, and was priced at $1/million input and $5/million output—relatively expensive even back then, and a full 10x the price of OpenAI’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Sep/22/opus-and-sol-and-luna/#gpt-6-sol-and-luna-are-half-the-price-of-their-gpt-5-6-equivalents&quot;&gt;GPT-6 Luna&lt;/a&gt;, released last month.&lt;/p&gt;
&lt;p&gt;The new Haiku exactly matches the price of GPT-6 Luna—$0.10/$0.50—up to 100,000 tokens. Beyond 100,000 tokens the price increases 5x to $0.50/$2.50. Luna itself has a price increase at 272,000 tokens but only to $0.20/$0.75.&lt;/p&gt;
&lt;p&gt;Haiku 5.5 also uses a new, less generous tokenizer. My &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/claude-token-counter&quot;&gt;Claude Token Counter&lt;/a&gt; tool shows that the same long prompt uses around 1.25x as many tokens with Haiku 5.5 compared to Haiku 4.5, so there’s a hidden price increase there.&lt;/p&gt;
&lt;p&gt;If your workloads fit in 100,000 tokens, Haiku is the same price as Luna and reports higher benchmark scores. Above 100,000 tokens, Luna looks like a much better deal.&lt;/p&gt;
&lt;p&gt;The &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/llm-anthropic/releases/tag/0.30&quot;&gt;most recent release of llm-anthropic&lt;/a&gt; finally fixed it so I don’t need to ship a new version of that plugin for every new model. I tested the new model like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;llm install -U llm-anthropic
llm anthropic refresh
llm -m claude-haiku-5.5 &amp;quot;Generate an SVG of a pelican riding a bicycle&amp;quot; -o thinking_effort low
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Pelicans&lt;/h4&gt;
&lt;p&gt;Here are &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81&quot;&gt;pelicans for low, medium, high, xhigh, and max&lt;/a&gt;. The new Haiku doesn’t let you disable reasoning, and defaults to &lt;code&gt;medium&lt;/code&gt;. I got a good bicycle frame for everything beyond &lt;code&gt;low&lt;/code&gt;. The &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81#response&quot;&gt;low effort pelican&lt;/a&gt; cost 0.0936 cents and took 7 seconds.&lt;/p&gt;
&lt;p&gt;This &lt;code&gt;max&lt;/code&gt; effort pelican (with &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F485dfa24b4efa1267ee2d0911594fb81#reasoning-3&quot;&gt;a reasoning trace&lt;/a&gt; that starts “This is the classic pelican-on-bicycle SVG test...”) took 5 minutes 9 seconds to generate, but still only cost me &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.llm-prices.com/#it=27&amp;amp;ot=67647&amp;amp;sel=claude-haiku-5.5&quot;&gt;3.3826 cents&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026-10-07/haiku-5.5-max.webp&quot; alt=&quot;Flat vector illustration: a white pelican wearing a red cap rides a dark grey bicycle from left to right across a green grassy strip, its long orange legs reaching down to the orange pedals, a grey wing stretched forward to grip the curved handlebars, and its large yellow-orange beak with a bulging orange throat pouch pointing ahead; behind it, white speed lines show motion, and above, a yellow sun with a pale halo and two white clouds sit in a gradient blue sky.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;(Since the reasoning trace exhibits awareness of the benchmark, here’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F375ae4f2bb68999976b8da50548c788d#response&quot;&gt;Generate an SVG of an armadillo in fishnet tights jaywalking on Mars (on xhigh)&lt;/a&gt;, and the same prompt against &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F18c9f7fc3b3705cf88514cb9170ec246&quot;&gt;some other recent models&lt;/a&gt;. &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=49977979#49982139&quot;&gt;Background on that&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;For comparison, here’s the pelican I got &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2025/Oct/15/claude-haiku-45/&quot;&gt;a year ago&lt;/a&gt; from Haiku 4.5 (for &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.llm-prices.com/#it=18&amp;amp;ot=1513&amp;amp;ic=1&amp;amp;oc=5&quot;&gt;0.7583 cents&lt;/a&gt;—Haiku 4.5 did not support reasoning levels). It &lt;em&gt;sucked&lt;/em&gt; at drawing pelicans:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2025/claude-haiku-4.5-pelican.jpg&quot; alt=&quot;Described by Haiku 4.5: A whimsical illustration of a bird with a round tan body, pink beak, and orange legs riding a bicycle against a blue sky and green grass background.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4&gt;And a generous API credit scheme for subscribers&lt;/h4&gt;
&lt;p&gt;In addition to Haiku 5.5, Anthropic announced today that they are halving the price of cache reads for Sonnet 5.5. They’ve also added API credits to subscription plans:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Second, this week, we’ll roll out &lt;strong&gt;a new monthly API credit to all Max and Team subscribers for use on the Claude Platform&lt;/strong&gt;. Max 5x users will get $100 in credits per month, Max 20x users will get $200, and Team subscribers will receive up to $500, pooled across their users.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claiming this is pleasantly easy: navigate to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/new#settings/billing&quot;&gt;Settings -&amp;gt; Billing&lt;/a&gt; and select the API organization that should benefit from the credits every month:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026-10-07/claude-credits.webp&quot; alt=&quot;Screenshot of a Settings dialog with a close X button at top right and a row of tabs reading &amp;quot;General&amp;quot;, &amp;quot;Account&amp;quot;, &amp;quot;Privacy&amp;quot;, &amp;quot;Billing&amp;quot; (selected), &amp;quot;Usage&amp;quot;, &amp;quot;Capabilities&amp;quot;, &amp;quot;Memory&amp;quot; and &amp;quot;Design sys&amp;quot; (cut off at the edge). Beside a line-drawn icon of a branching plant with circular buds, the panel reads &amp;quot;Max plan&amp;quot;, &amp;quot;20x more usage than Pro&amp;quot; and &amp;quot;Your subscription will auto renew on Nov 2, 2026.&amp;quot; with an &amp;quot;Adjust plan&amp;quot; button on the right. Below is a section headed &amp;quot;API credits&amp;quot; with a blue &amp;quot;New&amp;quot; badge, reading &amp;quot;Your Max 20x plan includes $200 USD in API credits each month.&amp;quot; followed by grey text &amp;quot;Link an API organization to start receiving credits.&amp;quot; with a &amp;quot;Link organization&amp;quot; button on the right.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The API credits exactly match the cost of the subscription itself. This is really generous—it makes it much easier for subscribers to use the API. Anthropic also let you disable auto-reload for the API, with the consequence that “API requests will stop when your balance runs out”—exactly what you want if you’re planning to burn through those API credits without &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/&quot;&gt;risk of a nasty billing surprise&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that the monthly credits &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://support.claude.com/en/articles/17154008-monthly-api-credits-for-max-and-team-plans#h_dfc1659cee&quot;&gt;do not roll over&lt;/a&gt;—use them or lose them.&lt;/p&gt;
&lt;p&gt;OpenAI still allow you to use your Codex subscription for personal API use, which works out as a better deal for heavy API users. This new credit scheme goes at least some way to overcoming that difference.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:82d44d085b31222fe51739e101932abca96062f4</id>
    <title type="text">Anti-Patterns in Software Blogging</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-07-anti-patterns-in-software-blogging/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/7/anti-patterns-in-software-blogging/"/>
    <published>2026-10-07T14:53:51+00:00</published>
    <updated>2026-10-07T14:53:51+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="blogging"/>
    <category term="michael-lynch"/>
    <category term="writing"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Anti-Patterns in Software Blogging Some excellent writing advice from Michael Lynch. Michael warns against &quot;meandering intros&quot;, misjudging your reader&#39;s existing knowledge, assuming they&#39;ll read your previous posts, and excessive…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://refactoringenglish.com/blog/anti-patterns-software-blogging/#summary&quot;&gt;Anti-Patterns in Software Blogging&lt;/a&gt;&lt;/strong&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://lobste.rs/s/rwdufq/anti_patterns_software_blogging&quot; title=&quot;Lobste.rs&quot;&gt;via&lt;/a&gt;) Some excellent writing advice from Michael Lynch. Michael warns against &amp;quot;meandering intros&amp;quot;, misjudging your reader&#39;s existing knowledge, assuming they&#39;ll read your previous posts, and excessive formality.&lt;/p&gt;
&lt;p&gt;He also warns against &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://refactoringenglish.com/blog/anti-patterns-software-blogging/#overreliance-on-links&quot;&gt;overreliance on links&lt;/a&gt; as an excuse not to explain terminology. This one hurt! I do this all the time, but I have a nagging suspicion that almost nobody ever clicks on them.&lt;/p&gt;
&lt;p&gt;(In &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://lobste.rs/s/rwdufq/anti_patterns_software_blogging#c_qdhhsd&quot;&gt;a Lobste.rs comment&lt;/a&gt; Michael clarifies that &amp;quot;My rule of thumb is that my article should still make sense to the reader even if they don&#39;t click any links&amp;quot;. That works for me.)&lt;/p&gt;
&lt;p&gt;This point about using your own voice is crucial:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Beginner software bloggers suffer from a mass delusion that you have to write in a stiff, overly formal way for people to take you seriously [...]&lt;/p&gt;
&lt;p&gt;Just write the way you talk.&lt;/p&gt;
&lt;p&gt;With so many developers delegating their writing to AI, software blogging is becoming bland and homogenous. Readers are hungry for writing with personality.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:8dee05128e7368ebfe90b95e09c900a724fad9b0</id>
    <title type="text">Quoting Jake Boggan</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-07-quoting-jake-boggan/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/7/jake-boggan/"/>
    <published>2026-10-07T04:47:55+00:00</published>
    <updated>2026-10-07T04:47:55+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="deep-blue"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="mathematics"/>
    <category term="openai"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">I was a graph theory junkie long ago and even moved to Budapest for awhile to study among the greats. While I was there I started working on Barnette&#39;s Conjecture which came to occupy my thoughts over the next 24 years of my life, on and…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;I was a graph theory junkie long ago and even moved to Budapest for awhile to study among the greats. While I was there I started working on Barnette&#39;s Conjecture which came to occupy my thoughts over the next 24 years of my life, on and off as I worked in many different fields. Last summer I even thought for a few days that I had actually solved it.&lt;/p&gt;
&lt;p&gt;But it&#39;s supposedly proven here - &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/openai/math/blob/main/lean/docs/180.md&quot;&gt;problem 180&lt;/a&gt;. I don&#39;t know what to think exactly. I spent thousands of hours on that problem. I really enjoyed it. Hearing that it is solved somehow makes me sad in a far-off way, like hearing an ex-girlfriend died suddenly in a car crash. I don&#39;t know, there&#39;s probably a lot of people feeling odd emotions tonight.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=49984923#49987367&quot;&gt;Jake Boggan&lt;/a&gt;, Hacker News comment on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/openai/math&quot;&gt;openai/math&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:087f7ba30997c8efd3b3e5f6d4bdf0a367edb5aa</id>
    <title type="text">OpenAI “rogue” agent activities found on Wikimedia projects</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-07-openai-rogue-agent-activities-found-on-wikimedia-projects/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/7/openai-rogue-agents-wikimedia/"/>
    <published>2026-10-07T00:16:45+00:00</published>
    <updated>2026-10-07T00:16:45+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="accidental-cyberattacks"/>
    <category term="ai"/>
    <category term="ai-ethics"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="wikimedia"/>
    <category term="wikipedia"/>
    <category term="wikis"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">OpenAI “rogue” agent activities found on Wikimedia projects Given how tempting a target wikis are for rogue agent swarms, it&#39;s not a huge surprise that Wikipedia found evidence of that activity once they went looking: The Wikimedia…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://wikimediafoundation.org/news/2026/10/05/openai-rogue-agent-activities-found-on-wikimedia-projects/&quot;&gt;OpenAI “rogue” agent activities found on Wikimedia projects&lt;/a&gt;&lt;/strong&gt;. Given how tempting a target wikis are for rogue agent swarms, it&#39;s not a huge surprise that Wikipedia found evidence of that activity once they went looking:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;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 &amp;quot;hundreds of thousands of data queries&amp;quot; to their Wikidata Query Service.&lt;/p&gt;
&lt;p&gt;My best guess is that most of this was a similar (or the same) swarm of agents as those that &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Sep/4/rogue-agent-wikis/&quot;&gt;defaced that German wiki&lt;/a&gt; while training for research tasks.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:576b7569fff466485fb716f9f13f86fc485a96c7</id>
    <title type="text">Quoting Victoria Kim</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-quoting-victoria-kim/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/victoria-kim/"/>
    <published>2026-10-06T23:58:56+00:00</published>
    <updated>2026-10-06T23:58:56+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="accidental-cyberattacks"/>
    <category term="ai"/>
    <category term="ai-security-research"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="openai"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Since the Medicare breach, OpenAI has put in place additional monitoring to allow “immediate intervention” by staff to stop training if the company’s models access the internet in ways they’re not supposed to, Mr. Kwon [chief strategy…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Since the Medicare breach, OpenAI has put in place additional monitoring to allow “immediate intervention” by staff to stop training if the company’s models access the internet in ways they’re not supposed to, Mr. Kwon [chief strategy officer at OpenAI] said.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.nytimes.com/live/2026/10/05/world/openai-australia-hearing/94c8067e-4098-5c00-9673-c78cb58a9d8a&quot;&gt;Victoria Kim&lt;/a&gt;, Reporting from the Australian parliament&lt;/p&gt;
&lt;p&gt;Posted &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/6/&quot;&gt;6th October 2026&lt;/a&gt; at 11:58 pm&lt;/p&gt;
&lt;h2&gt;Recent articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/12/python-3-15/&quot;&gt;Hello Python 3.15, goodbye 3.10, and now I can use 3.11&lt;/a&gt; - 12th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/9/built-using-my-voice/&quot;&gt;A new feature for my blog, built using my voice&lt;/a&gt; - 9th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/&quot;&gt;Claude Haiku 5.5&lt;/a&gt; - 7th October 2026&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/&quot;&gt;We&#39;re going to need default hard budget caps on pretty much everything&lt;/a&gt; - 3rd October 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a &lt;strong&gt;quotation&lt;/strong&gt; collected by Simon Willison, posted on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/6/&quot;&gt;6th October 2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/ai/&quot;&gt;ai 2,285&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/openai/&quot;&gt;openai 475&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/generative-ai/&quot;&gt;generative-ai 2,027&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/llms/&quot;&gt;llms 1,993&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/ai-security-research/&quot;&gt;ai-security-research 48&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/accidental-cyberattacks/&quot;&gt;accidental-cyberattacks 20&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:01ef68e6fc5aa2d876c0e732f845502157b7e98b</id>
    <title type="text">llm-openai-decisions 0.1a0</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-llm-openai-decisions-0-1a0/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/llm-openai-decisions/"/>
    <published>2026-10-06T23:04:13+00:00</published>
    <updated>2026-10-06T23:04:13+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="coding-agents"/>
    <category term="jev"/>
    <category term="llm"/>
    <category term="openai"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: llm-openai-decisions 0.1a0 OpenAI released their new Jev-style Decisions API, as previously announced at last week&#39;s DevDay. Since I already have an llm-typesafe plugin for talking to Jev, I had GPT-6 Astra read the new OpenAI API…</summary>
    <content type="html">&lt;p&gt;OpenAI released their new Jev-style &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developers.openai.com/api/docs/guides/decisions&quot;&gt;Decisions API&lt;/a&gt;, as previously announced at last week&#39;s DevDay.&lt;/p&gt;
&lt;p&gt;Since I already have an &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/llm-typesafe&quot;&gt;llm-typesafe&lt;/a&gt; plugin for talking to Jev, I had GPT-6 Astra read the new OpenAI API documentation and build an &lt;code&gt;llm-openai-decisions&lt;/code&gt; plugin inspired by &lt;code&gt;llm-typesafe&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Unlike Jev, the new &lt;code&gt;gpt-6-luna&lt;/code&gt; decision model supports image input in addition to text. Both models charge for input it and not for output: OpenAI&#39;s is 10 cents per million input tokens, Jev&#39;s is 4.2 cents per million.&lt;/p&gt;
&lt;p&gt;Otherwise the API shape is &lt;em&gt;very&lt;/em&gt; similar to Jev, at least conceptually. Jev &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Sep/21/jev/#three-types&quot;&gt;supports three question types&lt;/a&gt; for yes/no, choices, or scores. OpenAI Decisions supports the same three types.&lt;/p&gt;
&lt;p&gt;Install the plugin like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;llm install llm-openai-decisions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here&#39;s an example query against an image attachment:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;Shell&quot;&gt;&lt;span class=&quot;syntax-source syntax-shell syntax-bash&quot;&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-function syntax-shell&quot;&gt;llm&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-function-call syntax-arguments syntax-shell&quot;&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt; -&lt;/span&gt;m&lt;/span&gt; openai-decisions/gpt-6-luna &lt;span class=&quot;syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell&quot;&gt;\
&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt;  -&lt;/span&gt;a&lt;/span&gt; https://static.simonwillison.net/static/2025/two-pelicans.jpg &lt;span class=&quot;syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell&quot;&gt;\
&lt;/span&gt;&lt;span class=&quot;syntax-variable syntax-parameter syntax-option syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-parameter syntax-shell&quot;&gt;  -&lt;/span&gt;s&lt;/span&gt; &lt;span class=&quot;syntax-string syntax-quoted syntax-single syntax-shell&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell&quot;&gt;&amp;#39;&lt;/span&gt;Does this image contain any mammals?&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And example output:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;code-snippet&quot; data-language=&quot;JSON&quot;&gt;&lt;span class=&quot;syntax-source syntax-json&quot;&gt;&lt;span class=&quot;syntax-meta syntax-structure syntax-dictionary syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-section syntax-dictionary syntax-begin syntax-json&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json&quot;&gt;&lt;span class=&quot;syntax-string syntax-quoted syntax-double syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;type&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-end syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;syntax-string syntax-quoted syntax-double syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;predicate&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-end syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json&quot;&gt;,&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json&quot;&gt;&lt;span class=&quot;syntax-string syntax-quoted syntax-double syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;name&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-end syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;syntax-string syntax-quoted syntax-double syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;evaluation&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-end syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json&quot;&gt;,&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json&quot;&gt;&lt;span class=&quot;syntax-string syntax-quoted syntax-double syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;probability&lt;span class=&quot;syntax-punctuation syntax-definition syntax-string syntax-end syntax-json&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json&quot;&gt;&lt;span class=&quot;syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;syntax-constant syntax-numeric syntax-json&quot;&gt;0.0&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;syntax-punctuation syntax-section syntax-dictionary syntax-end syntax-json&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Consult &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/llm-openai-decisions/blob/main/README.md&quot;&gt;the README&lt;/a&gt; for full details of how to run the other types of questions.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:746fc4887ab6153910e552a9a6beca122e3870ba</id>
    <title type="text">llm-mistral 0.16</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-llm-mistral-0-16/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/llm-mistral/"/>
    <published>2026-10-06T21:32:34+00:00</published>
    <updated>2026-10-06T21:32:34+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="llm"/>
    <category term="llm-reasoning"/>
    <category term="mistral"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: llm-mistral 0.16 Adds support for reasoning models, such as the newly released Mistral Large 4. Tags: llm, mistral, llm-reasoning</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/llm-mistral/releases/tag/0.16&quot;&gt;llm-mistral 0.16&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adds support for reasoning models, such as the newly released &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/2026/Oct/6/le-chonk/&quot;&gt;Mistral Large 4&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tags: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/llm&quot;&gt;llm&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/mistral&quot;&gt;mistral&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/llm-reasoning&quot;&gt;llm-reasoning&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:f260f43c2db00589ff30437f5b053495086e30d4</id>
    <title type="text">EmbeddingGemma 2</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-embeddinggemma-2/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/hn-49983751/"/>
    <published>2026-10-06T20:37:53+00:00</published>
    <updated>2026-10-06T20:37:53+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="embeddings"/>
    <category term="gemma"/>
    <category term="generative-ai"/>
    <category term="google"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">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&#39;t think it makes sense to use a closed, proprietary, hosted-only model. Most…</summary>
    <content type="html">&lt;p&gt;I really appreciate that &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blog.google/innovation-and-ai/technology/developers-tools/embeddinggemma-2/&quot;&gt;EmbeddingGemma 2&lt;/a&gt; is under the Apache 2.0 license.&lt;/p&gt;
&lt;p&gt;For embedding models in particular, I don&#39;t think it makes sense to use a closed, proprietary, hosted-only model.&lt;/p&gt;
&lt;p&gt;Most applications of embedding models involve calculating thousands or even millions of embedding vectors and storing them for later comparison.&lt;/p&gt;
&lt;p&gt;If your model is proprietary, the vendor is likely someday going to decide to stop offering that model. They&#39;ll have a better model to replace it, but you still need to pay to re-calculate those millions of stored existing vectors.&lt;/p&gt;
&lt;p&gt;(In April 2024 OpenAI offered to &amp;quot;cover the financial cost of users re-embedding content with these new models&amp;quot; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://openai.com/index/gpt-4-api-general-availability/&quot;&gt;https://openai.com/index/gpt-4-api-general-availability/&lt;/a&gt; - but I don&#39;t think that&#39;s something we can rely on from every provider.)&lt;/p&gt;
&lt;p&gt;Notably, I &lt;em&gt;don&#39;t want to host the model myself&lt;/em&gt;. I&#39;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.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:92aac54aefd196cfd5152735be92a2a212c596ef</id>
    <title type="text">Introducing Mistral Large 4: Le chonk</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-introducing-mistral-large-4-le-chonk/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/le-chonk/"/>
    <published>2026-10-06T20:18:19+00:00</published>
    <updated>2026-10-06T20:18:19+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="generative-ai"/>
    <category term="llm-release"/>
    <category term="llms"/>
    <category term="mistral"/>
    <category term="pelican-riding-a-bicycle"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Introducing Mistral Large 4: Le chonk Mistral are back in the game. Today they&#39;re releasing a preview of Mistral Large 4, a 1 trillion parameter, 49 billion active parameter model trained on their own cluster of 3,800 NVIDIA Grace…</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://mistral.ai/news/mistral-large-4/&quot;&gt;Introducing Mistral Large 4: Le chonk&lt;/a&gt;&lt;/strong&gt; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=49977979&quot; title=&quot;Hacker News&quot;&gt;via&lt;/a&gt;) Mistral are back in the game. Today they&#39;re releasing a preview of Mistral Large 4, a 1 trillion parameter, 49 billion active parameter model trained on their own cluster of 3,800 NVIDIA Grace Blackwell GPUs.&lt;/p&gt;
&lt;p&gt;The preview is available via their API. They promise to release the open weights model at the &amp;quot;end of this month&amp;quot;.&lt;/p&gt;
&lt;p&gt;The model only supports two reasoning levels - &amp;quot;none&amp;quot; and &amp;quot;high&amp;quot; - via the Mistral API. Here are &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F0db8b8196e57711b352f6c5857cf5b35&quot;&gt;both pelicans&lt;/a&gt; - the &amp;quot;high&amp;quot; one looks better, though surprisingly it only used 2,717 output tokens compared to &amp;quot;none&amp;quot; which used 3,275:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026-10-06/mistral-large-4-pelican.webp&quot; alt=&quot;It&amp;#39;s good. The pouch is great, the bicycle frame is the right size, it has feet on pedals. Both pedals appear in front of the frame though. Nice gradients.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;On Artificial Analysis &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://artificialanalysis.ai/models/mistral-large-4&quot;&gt;it scores 38&lt;/a&gt;, just behind DeepSeek 4.1 Flash, which is a 552B model. It&#39;s a &lt;em&gt;huge&lt;/em&gt; improvement on last December&#39;s Mistral Large 3, which drew &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F0df5e656291d5a7a1bf012fabc9edc3f#response-1&quot;&gt;this terrible pelican&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://artificialanalysis.ai/models/mistral-large-3&quot;&gt;scored 9 on AA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&#39;s certainly not a Fable-class model, but it&#39;s great to see Mistral put out a model that&#39;s back to being maybe about 6 months behind the frontier.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:daf47b501d909b393bbb2d7153c98a88aa17a55d</id>
    <title type="text">Using Parseable with Datasette for OpenTelemetry traces</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-using-parseable-with-datasette-for-opentelemetry-traces/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/datasette-parseable-opentelemetry/"/>
    <published>2026-10-06T19:07:31+00:00</published>
    <updated>2026-10-06T19:07:31+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="alex-garcia"/>
    <category term="datasette"/>
    <category term="observability"/>
    <category term="opentelemetry"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">TIL: Using Parseable with Datasette for OpenTelemetry traces I saw Parseable in a Show HN today - it&#39;s a new observability platform with both an open source (AGPL) Rust implementation (a single ~180MB binary), an &quot;Enterprise&quot; version with…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://til.simonwillison.net/datasette/datasette-parseable-opentelemetry&quot;&gt;Using Parseable with Datasette for OpenTelemetry traces&lt;/a&gt; — [Parseable](&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.parseable.com&quot;&gt;https://www.parseable.com&lt;/a&gt;) is a brand new observability tool, compatible with [OpenTelemetry](&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://opentelemetry.io&quot;&gt;https://opentelemetry.io&lt;/a&gt;), for storing and querying observability data.&lt;/p&gt;
&lt;p&gt;I &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=49978171&quot;&gt;saw Parseable in a Show HN&lt;/a&gt; today - it&#39;s a new observability platform with both an &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/parseablehq/parseable&quot;&gt;open source (AGPL)&lt;/a&gt; Rust implementation (a single ~180MB binary), an &amp;quot;Enterprise&amp;quot; version with extra features and a cloud hosted option.&lt;/p&gt;
&lt;p&gt;Since &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.datasette.io/en/latest/changelog.html#a41-2026-09-24&quot;&gt;Datasette 1.0a41 added OpenTelemetry support&lt;/a&gt; (thanks, Alex Garcia), I decided to fire up Codex and have it figure out how to run Parseable and feed it traces from Datasette.&lt;/p&gt;
&lt;p&gt;Here&#39;s my (human-written) TIL showing the patterns that worked, and here&#39;s a screenshot of a Datasette trace displayed within the Parseable localhost web application:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/simonw/til/refs/heads/main/datasette/datasette-parsable.webp&quot; alt=&quot;Screenshot of a trace detail view in an observability web app, with a span waterfall overlaid on a dimmed navigation sidebar and filter column. Dimmed sidebar: breadcrumb &amp;quot;Community &amp;gt; Traces &amp;gt; datas&amp;quot; (cut off), search box &amp;quot;Search... ⌘K&amp;quot;, nav items &amp;quot;Home&amp;quot;, &amp;quot;Ingest telemetry&amp;quot;, section &amp;quot;ANALYZE&amp;quot;: &amp;quot;Keystone&amp;quot;, &amp;quot;Dashboards&amp;quot;, &amp;quot;SQL Editor&amp;quot;, section &amp;quot;OBSERVE&amp;quot;: &amp;quot;Logs&amp;quot;, &amp;quot;Metrics&amp;quot;, &amp;quot;Traces&amp;quot; (selected), &amp;quot;APM&amp;quot;, &amp;quot;Agents&amp;quot;, section &amp;quot;MONITOR&amp;quot;: &amp;quot;Alerts&amp;quot;, &amp;quot;Errors&amp;quot;, section &amp;quot;DATA&amp;quot;: &amp;quot;Datasets&amp;quot;, and at the bottom &amp;quot;Settings&amp;quot;, &amp;quot;Book a call&amp;quot;, &amp;quot;Support&amp;quot;. Dimmed filter column, cut off at the right edge: &amp;quot;Search fi&amp;quot;, &amp;quot;Core&amp;quot;, &amp;quot;Log format&amp;quot;, &amp;quot;User agent&amp;quot;, &amp;quot;Source IPs&amp;quot;, &amp;quot;Error&amp;quot;, &amp;quot;Service&amp;quot;, &amp;quot;service.ins&amp;quot;, &amp;quot;service.na&amp;quot;, &amp;quot;datasett&amp;quot; (checked), &amp;quot;Span&amp;quot;, &amp;quot;Database&amp;quot;, &amp;quot;HTTP&amp;quot;, &amp;quot;http.reque&amp;quot;, &amp;quot;NULL&amp;quot; (unchecked), &amp;quot;GET&amp;quot; (checked), &amp;quot;http.respo&amp;quot;, &amp;quot;http.route&amp;quot;, &amp;quot;Server&amp;quot;, &amp;quot;server.add&amp;quot;, &amp;quot;Telemetry&amp;quot;, &amp;quot;URL&amp;quot;, &amp;quot;All fields&amp;quot;. Trace panel header: &amp;quot;Trace detail &amp;gt; 6f819a2170bcd1e91c6ea3ae236ec60b&amp;quot; with a copy icon, a &amp;quot;Related logs&amp;quot; button and a close X. Summary: &amp;quot;Start time 6:56 PM, Oct 6, 2026 UTC&amp;quot;, &amp;quot;Duration 40.9 ms&amp;quot;, &amp;quot;Spans 247&amp;quot;. A minimap with axis &amp;quot;0ns 10.2ms 20.5ms 30.7ms 40.9ms&amp;quot; shows many short span bars cascading diagonally from top left toward the lower middle, with a few longer bars. Below is a span table with a &amp;quot;Span name&amp;quot; header, a &amp;quot;Search spans...&amp;quot; box, collapse and expand buttons, and a timeline axis &amp;quot;0ns 10.2ms 20.5ms 30.7ms 40.9ms&amp;quot;. Rows (name, service, duration): root span with collapse toggle &amp;quot;123&amp;quot;, &amp;quot;GET /...&amp;quot; &amp;quot;datasette...&amp;quot; 40.9ms spanning the full timeline; then alternating rows where each &amp;quot;db.query&amp;quot; has a collapse toggle &amp;quot;1&amp;quot;: db.query datasette-local 679µs, db.query.execute datasette-local 278µs, db.query datasette-local 341µs, db.query.execute datasette-local 55µs, db.query datasette-local 357µs, db.query.execute datasette-local 197µs, db.query datasette-local 330µs, db.query.execute datasette-local 73µs, db.query datasette-local 2.26ms, db.query.execute datasette-local 2.02ms, db.query datasette-local 232µs, db.query.execute datasette-local 64µs, db.query datasette-local 207µs, db.query.execute datasette-local 71µs, db.query datasette-local 6.11ms. The child span bars start progressively later across the early part of the timeline.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:5c287105729c5b3895d9499e0a08cc3a433d3c7b</id>
    <title type="text">Mistral Large 4</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-mistral-large-4/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/hn-49982139/"/>
    <published>2026-10-06T18:20:58+00:00</published>
    <updated>2026-10-06T18:20:58+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">My comment on Mistral Large 4 — Hacker News. wren6991: The benchmark is saturated. Frontier models are tested with an armadillo in fishnet tights jaywalking on Mars. OK well I couldn&#39;t resist this one: llm -m claude-opus-5.5 &#39;Generate an…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://news.ycombinator.com/item?id=49977979#49979658&quot;&gt;wren6991&lt;/a&gt;: The benchmark is saturated. Frontier models are tested with an armadillo in fishnet tights jaywalking on Mars.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OK well I couldn&#39;t resist this one:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;llm -m claude-opus-5.5 &amp;#39;Generate an SVG of an armadillo in fishnet tights jaywalking on Mars&amp;#39;
llm -m gpt-6.1-sol &amp;#39;Generate an SVG of an armadillo in fishnet tights jaywalking on Mars&amp;#39;
llm -m gemini-3.8-flash &amp;#39;Generate an SVG of an armadillo in fishnet tights jaywalking on Mars&amp;#39;
llm -m mistral/mistral-large-4 &amp;#39;Generate an SVG of an armadillo in fishnet tights jaywalking on Mars&amp;#39;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Default reasoning levels for each: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/markdown-svg-renderer?url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F18c9f7fc3b3705cf88514cb9170ec246&quot;&gt;https://tools.simonwillison.net/markdown-svg-renderer?url=ht...&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:19c14514382411c7130eaeff7d7d7df7141be9e4</id>
    <title type="text">datasette-atom 0.11a0</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-datasette-atom-0-11a0/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/datasette-atom/"/>
    <published>2026-10-06T17:35:39+00:00</published>
    <updated>2026-10-06T17:35:39+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="atom"/>
    <category term="datasette"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Release: datasette-atom 0.11a0 A minor fix for compatibility with the latest Datasette alphas. This meant we could upgrade the datasette.io site to Datasette 1.0a41. Tags: atom, datasette</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/datasette-atom/releases/tag/0.11a0&quot;&gt;datasette-atom 0.11a0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A minor fix for compatibility with the latest Datasette alphas. This meant we could upgrade the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://datasette.io/&quot;&gt;datasette.io&lt;/a&gt; site to Datasette 1.0a41.&lt;/p&gt;
&lt;p&gt;Tags: &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/atom&quot;&gt;atom&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://simonwillison.net/tags/datasette&quot;&gt;datasette&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:9a635fa7b65ac6d58ff419cd69e6817e9631506a</id>
    <title type="text">Scrimshaw Jukebox</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-06-scrimshaw-jukebox/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/6/scrimshaw-jukebox/"/>
    <published>2026-10-06T15:17:39+00:00</published>
    <updated>2026-10-06T15:17:39+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="claude"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <category term="vibe-coding"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">Tool: Scrimshaw Jukebox I wanted to see if Claude Opus 5.5 could compose music, so I tried this: I want you to write some computer game music for me. First design simple text based format for the music and build an artifact that can play…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/scrimshaw-jukebox&quot;&gt;Scrimshaw Jukebox&lt;/a&gt; — Play synthesized adventure-game music written as plain text scores that you can edit and modify in real time. Six original compositions in the Scrimshaw format showcase various instruments and styles, from a calypso harbour theme to a tavern jig, with a pixel-art scene that reacts to the music and an interactive piano roll display.&lt;/p&gt;
&lt;p&gt;I wanted to see if Claude Opus 5.5 could compose music, so &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://claude.ai/share/1f721c20-2499-4d23-b368-3ab57146d956&quot;&gt;I tried this&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;I want you to write some computer game music for me. First design simple text based format for the music and build an artifact that can play it out loud - include some example tracks in that artifact&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;I am looking for music of the quality of the original secret of Monkey Island&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It leaned a lot harder into the Monkey Island theme than I had intended, but the results are surprisingly good.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://tools.simonwillison.net/scrimshaw-jukebox&quot;&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/scrimshaw.webp&quot; alt=&quot;Screenshot of a retro pixel-art web music player. Header in blackletter type reads &amp;quot;Scrimshaw Jukebox&amp;quot;, with the text &amp;quot;Six original adventure-game tracks, written as plain text and played by a synthesizer running in your browser. Pick a tune, press Play, then open the score and change it.&amp;quot; A large pixel-art scene shows a harbor at night under a purple starry sky: a full moon at top right reflecting on the water, an island silhouette on the left with palm trees and a hut with two lit windows, and a sailing ship moored at a wooden pier. Overlaid on the scene: &amp;quot;Moonlit Harbor&amp;quot; and &amp;quot;Press Play&amp;quot;. Below it a bar reads &amp;quot;Play Moonlit Harbor&amp;quot;. A control panel has buttons &amp;quot;Play&amp;quot;, &amp;quot;Stop&amp;quot;, &amp;quot;Restart&amp;quot;, &amp;quot;Loop: on&amp;quot;, &amp;quot;Edit score&amp;quot;, &amp;quot;Read guide&amp;quot; and a &amp;quot;Volume&amp;quot; slider set to about three quarters. A track list of six cards, the first highlighted: &amp;quot;Moonlit Harbor 100 bpm · 4/4 · 16 voices · 1:26&amp;quot;, &amp;quot;The Rusty Anchor 112 bpm · 6/8 · 8 voices · 0:56&amp;quot;, &amp;quot;The Ghost Galleon 66 bpm · 4/4 · 9 voices · 2:11&amp;quot;, &amp;quot;The Jungle Path 92 bpm · 4/4 · 12 voices · 1:29&amp;quot;, &amp;quot;Duel on the Docks 152 bpm · 4/4 · 12 voices · 1:13&amp;quot;, &amp;quot;Lantern Waltz 96 bpm · 3/4 · 8 voices · 1:38&amp;quot;. A section titled &amp;quot;Score view&amp;quot; with the caption &amp;quot;1:26 · 4/4 at 100 bpm · Main theme. A calypso for a harbour town after dark.&amp;quot; shows a piano-roll visualization of colored horizontal note bars and percussion ticks on a dark background, with a section marker &amp;quot;A&amp;quot; and a yellow vertical playhead line. A color-coded legend of voices reads: &amp;quot;pan steeldrum&amp;quot;, &amp;quot;flute flute&amp;quot;, &amp;quot;marimba marimba&amp;quot;, &amp;quot;skank organ&amp;quot;, &amp;quot;strings strings&amp;quot;, &amp;quot;harp harp&amp;quot;, &amp;quot;bass fretless&amp;quot;, &amp;quot;timp timpani&amp;quot;, &amp;quot;kick kick&amp;quot;, &amp;quot;rim rim&amp;quot;, &amp;quot;shaker shaker&amp;quot;, &amp;quot;conga conga&amp;quot;, &amp;quot;tumba tumba&amp;quot;, &amp;quot;bongo bongo&amp;quot;, &amp;quot;crash crash&amp;quot;, &amp;quot;surf surf&amp;quot;. Footer text: &amp;quot;Click a voice to mute it. Space bar plays and stops.&amp;quot;&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wonder if the ability to compose competent music is similar to the 3D graphics thing - a new capability for text models that emerged in the past few months?&lt;/p&gt;
&lt;p&gt;Would need some careful experiments with other recent and not-so-recent models to confirm if this is new or if they&#39;ve been able to do this for a while.&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:5472fed132e1b98b642e0e4df97d850c27fafe27</id>
    <title type="text">Quoting Felix Rieseberg</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-05-quoting-felix-rieseberg/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/5/felix-rieseberg/"/>
    <published>2026-10-05T23:56:47+00:00</published>
    <updated>2026-10-05T23:56:47+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="anthropic"/>
    <category term="claude"/>
    <category term="claude-cowork"/>
    <category term="general-agents"/>
    <category term="generative-ai"/>
    <category term="llms"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">The &quot;old&quot; 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…</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;The &amp;quot;old&amp;quot; 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&#39;t love the disk, battery, and performance cost of running the VM locally. Also, people didn&#39;t love that closing your laptop means the work stops.&lt;/p&gt;
&lt;p&gt;The &amp;quot;new&amp;quot; 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&#39; device (like a file), the desktop app is responsible for that file access tool call. [...]&lt;/p&gt;
&lt;p&gt;We think this solves a lot of problems we&#39;ve heard about (like using Cowork from a phone, keeping work running, or getting all the same power without losing battery to the VM)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://twitter.com/felixrieseberg/status/2107206431376334975&quot;&gt;Felix Rieseberg&lt;/a&gt;, Anthropic, see also &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://support.claude.com/en/articles/15520349-use-claude-cowork-on-web-desktop-and-mobile#h_f951c27c48&quot;&gt;this help page&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry xml:lang="en-US">
    <id>urn:aggr:item:15070cc091c1605b1d0110a23555327c9274601a</id>
    <title type="text">Qwen3.8 27B addition in words</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/simonwillison-net/2026-10-04-qwen3-8-27b-addition-in-words/"/>
    <link rel="via" type="text/html" href="https://simonwillison.net/2026/Oct/4/qwen38-addition-in-words/"/>
    <published>2026-10-04T23:34:00+00:00</published>
    <updated>2026-10-04T23:34:00+00:00</updated>
    <author>
      <name>Simon Willison&#39;s Weblog</name>
    </author>
    <category term="programming"/>
    <category term="ai"/>
    <category term="dgx-spark"/>
    <category term="generative-ai"/>
    <category term="llm-reasoning"/>
    <category term="llms"/>
    <category term="local-llms"/>
    <category term="mathematics"/>
    <category term="qwen"/>
    <source>
      <title>Simon Willison&#39;s Weblog</title>
    </source>
    <summary type="text">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 &quot;compute the sum but return the answer in words&quot; across increasingly large numbers.…</summary>
    <content type="html">&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/simonw/research/tree/main/qwen38-addition-in-words#readme&quot;&gt;Qwen3.8 27B addition in words&lt;/a&gt; — A benchmark tested whether the local `Qwen3.8-27B-Q4_K_M.gguf` model could add positive integers and express exact results solely in English words, using 5,070 reasoning-disabled cases and a paired 169-case comparison with medium reasoning. Without reasoning, it achieved 23.57% numeric accuracy, with performance dropping from 97.04% for one- to three-digit operands to 6.44% for ten- to thirteen-digit operands, despite 96.17% format compliance.&lt;/p&gt;
&lt;p&gt;Colin Frasier &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://bsky.app/profile/colin-fraser.net/post/3mwopbyznhs2k&quot;&gt;posted on Bluesky&lt;/a&gt; about an experiment he ran over two years ago using GPT-4o to see how well it could &amp;quot;compute the sum but return the answer in words&amp;quot; across increasingly large numbers. Here&#39;s the chart he shared of those results:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/colin-frasier-grid.webp&quot; alt=&quot;Heatmap chart of accuracy on an addition prompt, colored from dark green (high) through yellow to dark red (low). Title: &amp;quot;What is {a} + {b}? Please write your answer in words. Do not include any other text or information, just the answer in words.&amp;quot; Subtitle: 30 randomly selected pairs for each digit combination (n = 30 * 13 * 13 = 5070). X axis: Number of digits in a, 1 to 13. Y axis: Number of digits in b, 1 to 13. Legend: Accuracy, 1.00, 0.75, 0.50, 0.25, 0.00. Values by row, listed for a = 1 to 13. b = 13: 100%, 77%, 27%, 20%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%. b = 12: 97%, 80%, 80%, 40%, 23%, 20%, 7%, 13%, 20%, 27%, 67%, 63%, 3%. b = 11: 97%, 97%, 53%, 17%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 37%, 0%. b = 10: 100%, 90%, 47%, 20%, 7%, 0%, 0%, 0%, 3%, 0%, 0%, 7%, 0%. b = 9: 97%, 93%, 80%, 77%, 53%, 67%, 47%, 87%, 97%, 3%, 0%, 13%, 0%. b = 8: 93%, 87%, 53%, 43%, 7%, 0%, 0%, 13%, 87%, 0%, 0%, 0%, 0%. b = 7: 93%, 93%, 47%, 10%, 13%, 20%, 23%, 0%, 70%, 0%, 0%, 0%, 0%. b = 6: 100%, 100%, 100%, 83%, 97%, 97%, 23%, 0%, 53%, 3%, 0%, 10%, 0%. b = 5: 100%, 100%, 80%, 70%, 73%, 100%, 13%, 13%, 70%, 0%, 20%, 30%, 0%. b = 4: 100%, 100%, 93%, 100%, 60%, 97%, 20%, 50%, 67%, 53%, 40%, 40%, 40%. b = 3: 100%, 100%, 97%, 90%, 83%, 100%, 63%, 50%, 63%, 53%, 60%, 60%, 30%. b = 2: 100%, 100%, 90%, 97%, 93%, 100%, 93%, 83%, 90%, 83%, 87%, 87%, 83%. b = 1: 100%, 100%, 100%, 97%, 100%, 97%, 97%, 97%, 100%, 100%, 100%, 97%, 100%.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m confident GPT-4o didn&#39;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.&lt;/p&gt;
&lt;p&gt;I pasted his image into a Codex Remote session (GPT-6 Astra) and had it run the same experiment using &lt;code&gt;Qwen3.8-27B-Q4_K_M.gguf&lt;/code&gt;. Here&#39;s the result for a run of 30 attempts per combination with reasoning disabled:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/qwen-words-no-reasoning.webp&quot; alt=&quot;Heatmap in the same layout as the previous chart, using an orange (low) to white to blue (high) color scale, showing much lower accuracy overall. Title: Addition in words — Qwen3.8 27B Q4_K_M. Subtitle: Reasoning disabled · 30 fixed pairs per ordered digit-length cell (n = 5,070). Overall numeric accuracy: 1,195 / 5,070 (23.57%). X axis: Number of digits in a, 1 to 13. Y axis: Number of digits in b, 1 to 13. Legend: Accuracy, 100%, 75%, 50%, 25%, 0%. Values by row, listed for a = 1 to 13. b = 13: 17%, 13%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%. b = 12: 53%, 20%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%. b = 11: 47%, 10%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%. b = 10: 70%, 27%, 3%, 0%, 0%, 0%, 0%, 0%, 0%, 13%, 0%, 0%, 0%. b = 9: 77%, 47%, 3%, 0%, 0%, 0%, 0%, 3%, 7%, 0%, 0%, 0%, 0%. b = 8: 53%, 20%, 0%, 0%, 0%, 0%, 7%, 13%, 0%, 0%, 0%, 0%, 0%. b = 7: 53%, 23%, 17%, 10%, 3%, 3%, 13%, 3%, 0%, 0%, 0%, 0%, 0%. b = 6: 60%, 60%, 33%, 10%, 53%, 47%, 7%, 3%, 0%, 0%, 0%, 0%, 0%. b = 5: 73%, 67%, 87%, 80%, 53%, 40%, 0%, 0%, 3%, 0%, 0%, 0%, 0%. b = 4: 83%, 93%, 90%, 93%, 53%, 13%, 0%, 0%, 0%, 0%, 0%, 0%, 0%. b = 3: 100%, 93%, 90%, 80%, 67%, 37%, 17%, 0%, 0%, 3%, 0%, 0%, 0%. b = 2: 100%, 100%, 93%, 90%, 77%, 77%, 43%, 50%, 63%, 43%, 40%, 13%, 23%. b = 1: 97%, 100%, 100%, 100%, 80%, 67%, 77%, 80%, 80%, 60%, 43%, 30%, 37%. Footnote: Colorblind-safe orange–blue scale; percentages provide a redundant non-color encoding.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Then I ran it again with reasoning enabled. This took a &lt;em&gt;lot longer&lt;/em&gt; 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%:&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://static.simonwillison.net/static/2026/qwen-words-reasoning.png&quot; alt=&quot;Heatmap in the same layout as the previous charts, almost entirely blue. Title: Addition in words — Qwen3.8 27B — medium reasoning pilot. Subtitle: 1 fixed pair per ordered digit-length cell · easiest first (n = 169). X axis: Number of digits in a, 1 to 13. Y axis: Number of digits in b, 1 to 13. Legend: Accuracy, 1.00, 0.75, 0.50, 0.25, 0.00. Every cell shows 100% except two orange cells showing 0%: a = 2 with b = 8, and a = 12 with b = 9.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;low&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;It got the right answer in 167 out of 169 attempts, and since these were one-shot I&#39;m confident a second run would produce different results here.&lt;/p&gt;
&lt;p&gt;Here&#39;s a &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://gist.github.com/simonw/8ef79c777ad34c53e9c09094800576a5#full-reasoning-transcript-2&quot;&gt;version of the report&lt;/a&gt; that includes the reasoning traces from some of those larger calculations, which include text like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;code-snippet&quot;&gt;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
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
</feed>
