<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog</title><link href="http://feeds.simonwillison.net/" rel="alternate"/><link href="http://feeds.simonwillison.net/atom/everything/" rel="self"/><id>http://feeds.simonwillison.net/</id><updated>2026-09-01T17:01:11+00:00</updated><author><name>Simon Willison</name></author><entry><title>Quoting Tarn Adams</title><link href="https://simonwillison.net/2026/Sep/1/tarn-adams/" rel="alternate"/><published>2026-09-01T17:01:11+00:00</published><updated>2026-09-01T17:01:11+00:00</updated><id>https://simonwillison.net/2026/Sep/1/tarn-adams/</id><summary type="html">
    &lt;blockquote cite="https://www.pcgamer.com/gaming-industry/dwarf-fortress-creator-says-the-industrys-in-shambles-over-ai-and-layoff-happy-ceos-everyone-i-know-their-bosses-are-slowly-getting-psychosis/"&gt;&lt;p&gt;They took the letters from me! I have to talk about &lt;em&gt;dwarf behavior&lt;/em&gt; now. I can't even talk about dwarf AI. It doesn't exist. It's &lt;em&gt;dwarf behavior&lt;/em&gt;, and they misbehave sometimes&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.pcgamer.com/gaming-industry/dwarf-fortress-creator-says-the-industrys-in-shambles-over-ai-and-layoff-happy-ceos-everyone-i-know-their-bosses-are-slowly-getting-psychosis/"&gt;Tarn Adams&lt;/a&gt;, co-creator of Dwarf Fortress&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/game-design"&gt;game-design&lt;/a&gt;&lt;/p&gt;



</summary><category term="ai"/><category term="game-design"/></entry><entry><title>Python 3.15.0 candidate 2 is here!</title><link href="https://simonwillison.net/2026/Sep/1/python-315-rc-2/" rel="alternate"/><published>2026-09-01T14:59:18+00:00</published><updated>2026-09-01T14:59:18+00:00</updated><id>https://simonwillison.net/2026/Sep/1/python-315-rc-2/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://discuss.python.org/t/python-3-15-0-candidate-2-is-here/108841"&gt;Python 3.15.0 candidate 2 is here!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Hugo van Kemenade (release manager for Python 3.14 and 3.15) announces the final release candidate for Python 3.15, scheduled for release in October:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Entering the release candidate phase, only reviewed code changes which are clear bug fixes are allowed between this release candidate and the final release. [...]&lt;/p&gt;
&lt;p&gt;We &lt;strong&gt;strongly encourage&lt;/strong&gt; maintainers of third-party Python projects to prepare their projects for 3.15 during this phase, and publish Python 3.15 wheels on PyPI to be ready for the final release of 3.15.0, and to help other projects do their own testing. Any binary wheels built against Python 3.15.0 release candidates &lt;strong&gt;will work&lt;/strong&gt; with future versions of Python 3.15.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Back in 2021 I &lt;a href="https://simonwillison.net/2021/Oct/9/finding-and-reporting-a-bug/"&gt;found a bug in Python 3.10&lt;/a&gt; by running my test suites against it... but I hadn't done this during the RC period, so that bug had already shipped! Since then I've always paid much closer attention to these RCs.&lt;/p&gt;
&lt;p&gt;The new RC isn't available for GitHub Actions just yet - keep an eye on &lt;a href="https://github.com/actions/python-versions/releases"&gt;actions/python-versions&lt;/a&gt; for that. For the moment though you can add this to a testing matrix:&lt;/p&gt;
&lt;div class="highlight highlight-source-yaml"&gt;&lt;pre&gt;&lt;span class="pl-ent"&gt;strategy&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;matrix&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;python-version&lt;/span&gt;: &lt;span class="pl-s"&gt;["3.14", "3.15"]&lt;/span&gt;

&lt;span class="pl-ent"&gt;steps&lt;/span&gt;:
  - &lt;span class="pl-ent"&gt;uses&lt;/span&gt;: &lt;span class="pl-s"&gt;actions/setup-python@v7&lt;/span&gt;
    &lt;span class="pl-ent"&gt;with&lt;/span&gt;:
      &lt;span class="pl-ent"&gt;python-version&lt;/span&gt;: &lt;span class="pl-s"&gt;${{ matrix.python-version }}&lt;/span&gt;
      &lt;span class="pl-ent"&gt;allow-prereleases&lt;/span&gt;: &lt;span class="pl-c1"&gt;true&lt;/span&gt;
      &lt;span class="pl-ent"&gt;check-latest&lt;/span&gt;: &lt;span class="pl-c1"&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://github.com/actions/setup-python/blob/main/docs/advanced-usage.md#allow-pre-releases"&gt;allow-prereleases&lt;/a&gt; and &lt;a href="https://github.com/actions/setup-python/blob/main/docs/advanced-usage.md#check-latest-version"&gt;check-latest&lt;/a&gt; flags mean that today this will test against RC1, and when RC2 lands it will automatically switch to that version (and then the stable version once that comes out.)

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://bsky.app/profile/hugovk.dev/post/3muhjndhw322i"&gt;@hugovk.dev&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-actions"&gt;github-actions&lt;/a&gt;&lt;/p&gt;



</summary><category term="open-source"/><category term="python"/><category term="github-actions"/></entry><entry><title>Introducing wrapture</title><link href="https://simonwillison.net/2026/Aug/31/introducing-wrapture/" rel="alternate"/><published>2026-08-31T23:59:36+00:00</published><updated>2026-08-31T23:59:36+00:00</updated><id>https://simonwillison.net/2026/Aug/31/introducing-wrapture/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://grahamdumpleton.me/posts/2026/08/introducing-wrapture/"&gt;Introducing wrapture&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New from Graham Dumpleton (of &lt;a href="https://pypi.org/project/wrapt/"&gt;wrapt&lt;/a&gt;, mod_wsgi, and New Relic's Python agent fame), who describes Wrapture as taking the monkeypatching ideas from wrapt and extending them to apply to testing and tracing at the same time.&lt;/p&gt;
&lt;p&gt;Wrapture (&lt;a href="https://wrapture.readthedocs.io/"&gt;full documentation here&lt;/a&gt;) makes it easy to wrap any function or method such that all access can be traced, or can be overridden to return a different value.&lt;/p&gt;
&lt;p&gt;It acts as both an alternative to &lt;code&gt;unittest.mock&lt;/code&gt; and a way to implement tracing against an existing project:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attaching observation to code you do not control, recording what flows through it, and doing so without disturbing the program being watched, is a problem I have never really stopped thinking about.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wrapture includes &lt;a href="https://wrapture.readthedocs.io/en/latest/otel-export.html"&gt;OpenTelemetry support&lt;/a&gt; and even has an entirely configuration-based mechanism for adding tracing to an existing Python project, which looks like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-toml"&gt;&lt;pre&gt;&lt;span class="pl-smi"&gt;capture&lt;/span&gt; = &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;summary&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

[[&lt;span class="pl-en"&gt;observe&lt;/span&gt;]]
&lt;span class="pl-smi"&gt;target&lt;/span&gt; = &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;domain:Calculator&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-smi"&gt;name&lt;/span&gt; = [&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;outer&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;inner&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;]

[[&lt;span class="pl-en"&gt;sink&lt;/span&gt;]]
&lt;span class="pl-smi"&gt;type&lt;/span&gt; = &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;jsonlines&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-smi"&gt;path&lt;/span&gt; = &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;trace.jsonl&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is still a very young project - just a few weeks old - but it's off to a very promising start.&lt;/p&gt;
&lt;p&gt;Interestingly, this is also Graham's first attempt at  large entirely agent-driven project:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every line of code and documentation in wrapture was written by an AI assistant working under my direction. I want to be upfront about that, and equally upfront about what it was not. This was not vibe coding, where a one-shot prompt produces a pile of generated code and the person driving hopes for the best because they lack the knowledge to judge what came back. Vibe coding has earned its bad reputation. I engineered wrapture carefully from the start. I have spent a long time in this particular corner of Python and knew exactly what the result needed to be, and the AI was the means of producing it rather than the source of the design.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a follow-up post, &lt;a href="https://grahamdumpleton.me/posts/2026/09/unit-testing-with-wrapture/"&gt;Unit testing with wrapture&lt;/a&gt;, Graham shows the testing patterns supported by the new library:&lt;/p&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;def&lt;/span&gt; &lt;span class="pl-en"&gt;test_stub_with_wrapture&lt;/span&gt;():
    &lt;span class="pl-k"&gt;with&lt;/span&gt; &lt;span class="pl-s1"&gt;wrapture&lt;/span&gt;.&lt;span class="pl-c1"&gt;binding&lt;/span&gt;(
        &lt;span class="pl-v"&gt;Gateway&lt;/span&gt;, &lt;span class="pl-s"&gt;"charge"&lt;/span&gt;
    ).&lt;span class="pl-c1"&gt;on_call&lt;/span&gt;.&lt;span class="pl-c1"&gt;returns&lt;/span&gt;({
        &lt;span class="pl-s"&gt;"id"&lt;/span&gt;: &lt;span class="pl-s"&gt;"stub"&lt;/span&gt;, &lt;span class="pl-s"&gt;"amount"&lt;/span&gt;: &lt;span class="pl-c1"&gt;0&lt;/span&gt;}
    ):
        &lt;span class="pl-k"&gt;assert&lt;/span&gt; &lt;span class="pl-en"&gt;OrderService&lt;/span&gt;().&lt;span class="pl-c1"&gt;place&lt;/span&gt;(
            &lt;span class="pl-c1"&gt;500&lt;/span&gt;
        )[&lt;span class="pl-s"&gt;"id"&lt;/span&gt;] &lt;span class="pl-c1"&gt;==&lt;/span&gt; &lt;span class="pl-s"&gt;"stub"&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;And this neat example of a test that calls and then modifies the return value from the original method:&lt;/p&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;def&lt;/span&gt; &lt;span class="pl-en"&gt;test_pinned_result_with_wrapture&lt;/span&gt;():
    &lt;span class="pl-s1"&gt;charge&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;wrapture&lt;/span&gt;.&lt;span class="pl-c1"&gt;binding&lt;/span&gt;(
        &lt;span class="pl-v"&gt;Gateway&lt;/span&gt;, &lt;span class="pl-s"&gt;"charge"&lt;/span&gt;
    )
    &lt;span class="pl-s1"&gt;charge&lt;/span&gt;.&lt;span class="pl-c1"&gt;on_call&lt;/span&gt;.&lt;span class="pl-c1"&gt;transforms_result&lt;/span&gt;(
        &lt;span class="pl-k"&gt;lambda&lt;/span&gt; &lt;span class="pl-s1"&gt;r&lt;/span&gt;: {&lt;span class="pl-c1"&gt;**&lt;/span&gt;&lt;span class="pl-s1"&gt;r&lt;/span&gt;, &lt;span class="pl-s"&gt;"id"&lt;/span&gt;: &lt;span class="pl-s"&gt;"ch_TEST"&lt;/span&gt;}
    )
    &lt;span class="pl-k"&gt;with&lt;/span&gt; &lt;span class="pl-s1"&gt;charge&lt;/span&gt;:
        &lt;span class="pl-k"&gt;assert&lt;/span&gt; &lt;span class="pl-en"&gt;OrderService&lt;/span&gt;().&lt;span class="pl-c1"&gt;place&lt;/span&gt;(
           &lt;span class="pl-c1"&gt;500&lt;/span&gt;
        ) &lt;span class="pl-c1"&gt;==&lt;/span&gt; {
            &lt;span class="pl-s"&gt;"id"&lt;/span&gt;: &lt;span class="pl-s"&gt;"ch_TEST"&lt;/span&gt;, &lt;span class="pl-s"&gt;"amount"&lt;/span&gt;: &lt;span class="pl-c1"&gt;500&lt;/span&gt;
        }&lt;/pre&gt;

&lt;p&gt;(In both of these examples the &lt;code&gt;OrderService().place(...)&lt;/code&gt; method calls &lt;code&gt;Gateway().charge(...)&lt;/code&gt;.)


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/graham-dumpleton"&gt;graham-dumpleton&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/monkey-patching"&gt;monkey-patching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/testing"&gt;testing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pytest"&gt;pytest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/observability"&gt;observability&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/agentic-engineering"&gt;agentic-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/opentelemetry"&gt;opentelemetry&lt;/a&gt;&lt;/p&gt;



</summary><category term="graham-dumpleton"/><category term="monkey-patching"/><category term="python"/><category term="testing"/><category term="pytest"/><category term="observability"/><category term="ai-assisted-programming"/><category term="agentic-engineering"/><category term="opentelemetry"/></entry><entry><title>Quoting Andrew Digby</title><link href="https://simonwillison.net/2026/Aug/31/andrew-digby/" rel="alternate"/><published>2026-08-31T22:25:02+00:00</published><updated>2026-08-31T22:25:02+00:00</updated><id>https://simonwillison.net/2026/Aug/31/andrew-digby/</id><summary type="html">
    &lt;blockquote cite="https://bsky.app/profile/digs.bsky.social/post/3mufrrsfhq22r"&gt;&lt;p&gt;325 #kakapo! The chicks from this year's record breeding season are now juveniles and so have been added to the population. In 1995 there were just 51 kākāpō left. Recovery of critically endangered species &lt;em&gt;is&lt;/em&gt; possible with sustained effort.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://bsky.app/profile/digs.bsky.social/post/3mufrrsfhq22r"&gt;Andrew Digby&lt;/a&gt;, providing the best news of the year&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/kakapo"&gt;kakapo&lt;/a&gt;&lt;/p&gt;



</summary><category term="kakapo"/></entry><entry><title>Understanding ChatGPT Work</title><link href="https://simonwillison.net/2026/Aug/30/understanding-chatgpt-work/" rel="alternate"/><published>2026-08-30T23:59:47+00:00</published><updated>2026-08-30T23:59:47+00:00</updated><id>https://simonwillison.net/2026/Aug/30/understanding-chatgpt-work/</id><summary type="html">
    &lt;p&gt;OpenAI &lt;a href="https://openai.com/index/chatgpt-for-your-most-ambitious-work/"&gt;announced ChatGPT Work&lt;/a&gt; on July 9th, and have been furiously iterating on it ever since. It is an extraordinarily confusing and very powerful product. Here's what I've figured out about it so far.&lt;/p&gt;
&lt;h4 id="two-products"&gt;ChatGPT Work is actually two products&lt;/h4&gt;
&lt;p&gt;The more interesting version of ChatGPT Work is the one that runs in the cloud. This can be accessed via &lt;a href="https://www.chatgpt.com/"&gt;chatgpt.com&lt;/a&gt; or through the ChatGPT mobile apps. Let's call it &lt;strong&gt;Work Cloud&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you install the ChatGPT desktop app - the app that used to be called Codex - you gain access to a thing called ChatGPT Work that can access files and run programs directly on your computer. Let's call that one &lt;strong&gt;Work Local&lt;/strong&gt;. This one feels more like regular Codex re-skinned to be less intimidating to non-software-developers.&lt;/p&gt;

&lt;p&gt;(&lt;strong&gt;Update&lt;/strong&gt;: Work Cloud is also available from the ChatGPT desktop app, via a &lt;a href="https://bsky.app/profile/jkwim.bsky.social/post/3mueurvkss52h"&gt;Where should this chat run?&lt;/a&gt; dropdown.)&lt;/p&gt;

&lt;p&gt;For the rest of this article I'm going to talk exclusively about Work Cloud.&lt;/p&gt;
&lt;h4 id="work-is-for-paid-subscribers-only"&gt;Work is for paid subscribers only&lt;/h4&gt;
&lt;p&gt;Right now, ChatGPT Work (in both flavors) is available only to $20/month and up subscribers. Free users and $8/month Go users do not have access.&lt;/p&gt;
&lt;h4 id="work-has-features-that-aren-t-available-in-chat"&gt;Work has features that aren't available in Chat&lt;/h4&gt;
&lt;p&gt;The interface for accessing Work is a tab selector, which presents it as an alternative to Chat:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026-08-30/IMG_7741.jpeg" alt="ChatGPT app header with a Chat and a Work tab" style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;The obvious question is &lt;em&gt;when should I use Chat, and when should I use Work?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;OpenAI's &lt;a href="https://learn.chatgpt.com/docs/get-started-with-work"&gt;official answer&lt;/a&gt; to that question is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Use Chat when you want an answer, explanation, brainstorm, or short draft. Use ChatGPT Work when you want ChatGPT to complete a task with a clear outcome, such as a brief, deck, analysis, recurring update, workflow, or file you can review and use.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I find that almost entirely useless, because I've been using regular ChatGPT Chat for all of those task categories for years!&lt;/p&gt;
&lt;p&gt;The better question then is &lt;em&gt;what features does Work have that are missing from Chat?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After extensive experimentation I think I've mostly figured that out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#model-selection"&gt;Options to use Luna and Terra in place of Sol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#code-execution-with-internet-access-"&gt;A code execution environment with Internet access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-full-headless-chrome-browser"&gt;A headless Chrome browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-persistent-shared-filesystem"&gt;A persistent filesystem shared between sessions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#chatgpt-sites"&gt;The ability to publish ChatGPT Sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sub-agents-with-sol-luna-and-terra"&gt;The ability to run sub-agent sessions with Sol, Luna, and Terra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#scheduled-prompt-automations"&gt;Scheduled prompt automations&lt;/a&gt; (may be in ChatGPT Chat too)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="model-selection"&gt;Model selection&lt;/h4&gt;
&lt;p&gt;In Work, you get the option to pick GPT-5.6 Sol, Luna, or Terra, each with Light, Medium, High, Extra High, Max, or Ultra reasoning levels. You can also pick GPT-5.5 at Light, Medium, High, or Extra High.&lt;/p&gt;
&lt;p&gt;These look to be the same models that are available through the OpenAI API.&lt;/p&gt;
&lt;p&gt;Chat offers a different selection: 5.6 Instant, Medium, High, Extra High, and Pro (actually Extra High and Pro are only available for $100/month+ subscribers - $20/month subscribers cap out at High). It doesn't explain if those are Luna or Terra or Sol (I'm assuming Sol?). 5.6 Pro appears to be exclusive to Chat, with no equivalent in Work.&lt;/p&gt;
&lt;p&gt;My current understanding from using Codex is that Ultra is a special mode that more eagerly delegates to sub-agents.&lt;/p&gt;
&lt;p&gt;I believe ChatGPT Work sessions are billed against your Codex allowance, while ChatGPT Chat Sessions get their own, separate allowance. This may help explain the model availability differences.&lt;/p&gt;
&lt;h4 id="code-execution-with-internet-access-"&gt;Code execution with Internet access!&lt;/h4&gt;
&lt;p&gt;As a long-time fan of the &lt;a href="https://simonwillison.net/tags/code-interpreter/"&gt;Code Interpreter pattern&lt;/a&gt; - pioneered by OpenAI in 2023 - this is by far the most exciting feature of ChatGPT Work (Cloud) for me.&lt;/p&gt;
&lt;p&gt;The code execution environment can now talk to the rest of the internet!&lt;/p&gt;
&lt;p&gt;ChatGPT Chat can't do this - if you ask it to install additional software packages or interact with websites or APIs that access will be blocked by the container proxy.&lt;/p&gt;
&lt;p&gt;(Weirdly, back in January it &lt;a href="https://simonwillison.net/2026/Jan/26/chatgpt-containers/"&gt;grew the ability to install packages&lt;/a&gt;, but that doesn't seem to work any more. I wish they had better changelogs!)&lt;/p&gt;
&lt;p&gt;Claude's equivalent container has allowed restricted internet access since it launched &lt;a href="https://simonwillison.net/2025/Sep/9/claude-code-interpreter/"&gt;last September&lt;/a&gt;. Claude can install packages from PYPI and NPM and clone repositories from GitHub. But that is about it: the allowlist of domains is very short.&lt;/p&gt;
&lt;p&gt;ChatGPT Work allows a whole lot more than that. It can be configured with a specific list of allowed domains, but the default appears to be open to all.&lt;/p&gt;
&lt;p&gt;This makes Work an incredibly useful tool. You can have it clone GitHub repositories, install their dependencies, then use them to interact with the rest of the web!&lt;/p&gt;
&lt;h4 id="a-full-headless-chrome-browser"&gt;A full, headless Chrome browser&lt;/h4&gt;
&lt;p&gt;Another killer feature of ChatGPT Work is &lt;a href="https://learn.chatgpt.com/docs/browser?surface=web"&gt;the browser tool&lt;/a&gt;. ChatGPT Work can launch a full Chrome instance, load websites, fill out forms, and take screenshots.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/chatgpt-work-card.jpg" alt="Screenshot of a ChatGPT conversation. A user message in a black rounded bubble reads: Visit https://london-pelicans-in-her-piety.simonw.chatgpt.site/ and take a screenshot with you browser. Below it a collapsed status line reads &amp;quot;Worked for 1m 18s &amp;gt;&amp;quot;, followed by the reply &amp;quot;Here's the screenshot of the live site:&amp;quot; and an embedded screenshot of a website." style="max-width: 100%" /&gt;&lt;/p&gt;

&lt;p&gt;If a site requires sign in the browser can prompt you to take over and enter both passwords and 2FA codes, without round-tripping those credentials through the model itself.&lt;/p&gt;

&lt;p&gt;It can even run JavaScript against the DOM of loaded pages. I prompted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Load simonwillison.net in your browser and extract the headings using JavaScript&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ChatGPT Work fired up a browser instance and ran the code:&lt;/p&gt;
&lt;div class="highlight highlight-source-js"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;await&lt;/span&gt; &lt;span class="pl-s1"&gt;tab&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;playwright&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;evaluate&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-v"&gt;Array&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;from&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-smi"&gt;document&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;querySelectorAll&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;"h1,h2,h3,h4,h5,h6"&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s1"&gt;heading&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-c1"&gt;level&lt;/span&gt;: &lt;span class="pl-s1"&gt;heading&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;tagName&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;toLowerCase&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-c1"&gt;text&lt;/span&gt;: &lt;span class="pl-s1"&gt;heading&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;innerText&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;trim&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;replace&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-pds"&gt;&lt;span class="pl-c1"&gt;/&lt;/span&gt;&lt;span class="pl-cce"&gt;\s&lt;/span&gt;&lt;span class="pl-c1"&gt;+&lt;/span&gt;&lt;span class="pl-c1"&gt;/&lt;/span&gt;g&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s"&gt;" "&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-c1"&gt;id&lt;/span&gt;: &lt;span class="pl-s1"&gt;heading&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;id&lt;/span&gt; &lt;span class="pl-c1"&gt;||&lt;/span&gt; &lt;span class="pl-c1"&gt;null&lt;/span&gt;
  &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This feels a lot like my &lt;a href="https://shot-scraper.datasette.io/en/stable/javascript.html"&gt;shot-scraper javascript&lt;/a&gt; tool, only now I can access it on my phone!&lt;/p&gt;
&lt;h4 id="a-persistent-shared-filesystem"&gt;A persistent, shared filesystem&lt;/h4&gt;
&lt;p&gt;ChatGPT Chat gets a fresh filesystem for each chat session. These cannot be accessed from any other session.&lt;/p&gt;
&lt;p&gt;In ChatGPT Work each session gets its own scratch folder - named something like &lt;code&gt;/workspace/scratch/e00a0a017944&lt;/code&gt; - but each of those are persisted across sessions, so you can access files from previous chats. I have 171 folders in &lt;code&gt;/workspace/scratch&lt;/code&gt; right now!&lt;/p&gt;
&lt;p&gt;As far as I can tell that &lt;code&gt;/workspace&lt;/code&gt; volume is mounted to all Work sessions that are currently running - file edits from one can be instantly seen by the others. They don't seem to share the same process space though, and localhost servers running in one can't be accessed from another.&lt;/p&gt;
&lt;h4 id="chatgpt-sites"&gt;ChatGPT Sites&lt;/h4&gt;
&lt;p&gt;ChatGPT Work has the ability to build &lt;em&gt;and deploy&lt;/em&gt; entire websites, using Cloudflare Workers. These can have HTML and JavaScript and can run server-side features too, including stateful features on top of Cloudflare D1 and R2.&lt;/p&gt;
&lt;p&gt;Here's a simple site I built with this feature:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://london-pelicans-in-her-piety.simonw.chatgpt.site/"&gt;london-pelicans-in-her-piety.simonw.chatgpt.site&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/pelicans-in-her-piety.webp" alt="Screenshot of a website homepage on a cream background. Top navigation bar: a circular logo reading &amp;quot;P/P&amp;quot; on the left, the links &amp;quot;THE CENSUS&amp;quot;, &amp;quot;COLLECTIONS&amp;quot; and &amp;quot;METHOD&amp;quot; in the center, and &amp;quot;JSON ↓&amp;quot; on the right. The left half is a hero section with small red capitals reading &amp;quot;AN ICONOGRAPHIC CENSUS · GREATER LONDON&amp;quot; above a large serif heading &amp;quot;Pelicans in her piety&amp;quot;, with &amp;quot;piety&amp;quot; set in red italics. Below it: &amp;quot;Across London, an impossible bird bleeds for her young—in limewood, marble, mosaic, metal and glass. This is an evidence-backed census of where to find her.&amp;quot; Two buttons follow: a solid black &amp;quot;EXPLORE ALL 28&amp;quot; and an outlined &amp;quot;DOWNLOAD THE DATA&amp;quot;. The right half is a photograph of an ornate dark carved wooden reredos in a church, with gilded urns and a crest on top, Corinthian columns, a gilded pelican with outspread wings at its center above inscribed panels, an altar with a brass cross and red flowers, embroidered banners on either side, and a black-and-white checkerboard floor with red carpet. Vertical text along the photo's right edge reads &amp;quot;ST MARY ABCHURCH&amp;quot; and a caption at its bottom reads &amp;quot;Grinling Gibbons's reredos, St Mary Abchurch. Photograph: Diliff, CC BY-SA 3.0, via SPAB ↗&amp;quot;. A statistics strip along the bottom shows &amp;quot;28 FIXED SITES&amp;quot;, &amp;quot;4 COLLECTIONS&amp;quot;, &amp;quot;3 OPEN LEADS&amp;quot; and &amp;quot;2 KNOWN LOSSES&amp;quot;." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;My prompt was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Figure out all of the places in London with a pelican in her piety, then turn that into a JSON file and build a ChatGPT sites site about them&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(A pelican in her piety is a fascinating piece of &lt;a href="https://devonchurchland.co.uk/blog/pelican-in-her-piety/#What-is-a-Pelican-In-Her-Piety"&gt;medieval Christian imagery&lt;/a&gt; - once you know about them you'll find them all over the place.)&lt;/p&gt;
&lt;p&gt;These sites default to being private to the user that created them, but you can make them public and (on team plans) share them with other specific individuals.&lt;/p&gt;
&lt;h4 id="sub-agents-with-sol-luna-and-terra"&gt;Sub-agents with Sol, Luna, and Terra&lt;/h4&gt;
&lt;p&gt;There's not much to say about this one. ChatGPT Chat can't run sub-agents. ChatGPT Work can. This is very much a power-user feature: if you are running a complex project that can benefit from multiple parallel agents working together, Work can do that.&lt;/p&gt;
&lt;h4 id="scheduled-prompt-automations"&gt;Scheduled prompt automations&lt;/h4&gt;
&lt;p&gt;Another feature that seems to have migrated from regular ChatGPT to ChatGPT Work at some point. You can prompt ChatGPT Work like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;run a search to see if Waymo have announced a launch date for Half Moon Bay every day at 8am&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This will schedule a prompt to run on that frequency. These prompts can decide that nothing interesting has happened, or they can decide to notify you of some new information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Actually this seems to work in ChatGPT Chat as well.&lt;/p&gt;
&lt;p&gt;It's still worth noting here though, as it can be used in conjunction with other ChatGPT Work exclusive features. You can set a scheduled task to update a ChatGPT Site on an hourly basis, for example.&lt;/p&gt;
&lt;h4 id="is-this-safe-"&gt;Is this safe?&lt;/h4&gt;
&lt;p&gt;An open question for me right now is how &lt;em&gt;safe&lt;/em&gt; all of this stuff is.&lt;/p&gt;
&lt;p&gt;My &lt;a href="https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/"&gt;lethal trifecta model&lt;/a&gt; warns about the risks inherent in any agent system that combines access to private data with exposure to untrusted content and a way to communicate stolen information back to an attacker.&lt;/p&gt;
&lt;p&gt;ChatGPT Work combines all three!&lt;/p&gt;
&lt;p&gt;I'd love to hear more from OpenAI about how they protect ChatGPT Work sessions against prompt injection attacks. I expect their answer is the same &lt;a href="https://learn.chatgpt.com/docs/sandboxing/auto-review"&gt;auto-review mechanism&lt;/a&gt; as Codex.&lt;/p&gt;
&lt;h4 id="openai-could-make-this-a-lot-less-confusing"&gt;OpenAI could make this a lot less confusing&lt;/h4&gt;
&lt;p&gt;Figuring this all out took way more work than it should have.&lt;/p&gt;
&lt;p&gt;I think there are two key problems here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;OpenAI explain Work in terms of what it's for, not what it actually does&lt;/li&gt;
&lt;li&gt;OpenAI still insist on hiding their system prompts and tools descriptions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the ChatGPT Work documentation included the exact system prompt and tool descriptions used by the agent I wouldn't have needed to write this post.&lt;/p&gt;
&lt;h4 id="all-the-tools"&gt;A list of all the tools&lt;/h4&gt;
&lt;p&gt;Shortly after publishing this article I had an idea. I started a fresh Work session and prompted:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;Build a site that lists every one of your tools - nearly grouped into categories - and for each one explain what it does. Try to exactly duplicate arguments and tool descriptions where possible. Design aesthetic should be technical docs, minimal flare&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://codex-tool-reference.simonw.chatgpt.site/"&gt;Here's the site it built&lt;/a&gt;, which includes details of 223 registered tools - though 6 of those are from my own personal MCPs served via &lt;a href="https://simonwillison.net/2026/Jul/31/stateless-mcp/#datasette-mcp"&gt;datasette-mcp&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="and-a-whole-lot-of-skills"&gt;And a whole lot of Skills&lt;/h4&gt;
&lt;p&gt;I noticed that the only browser-related tool in the list was &lt;a href="https://codex-tool-reference.simonw.chatgpt.site/#tool-web-run"&gt;web.run&lt;/a&gt;, which has methods for running searches, opening URLs, and clicking links, but didn't look like the full story in regards to headless browser automation.&lt;/p&gt;
&lt;p&gt;This made me suspicious that something was missing, so I told the ChatGPT Work session that built that tools reference site:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Add full copies of every skill to the website (separate pages linked to from the homepage)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It turns out ChatGPT Work uses &lt;a href="https://codex-tool-reference.simonw.chatgpt.site/#skills"&gt;a lot of skills&lt;/a&gt; - 44 in fact!&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/control-browser"&gt;control-browser skill&lt;/a&gt; explains how the browser works:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Run browser setup code through the Node REPL &lt;code&gt;js&lt;/code&gt; tool. In this environment the callable tool id typically appears as &lt;code&gt;mcp__node_repl__js&lt;/code&gt;. [...]&lt;/p&gt;
&lt;p&gt;The ability to interact directly with the browser is exposed through the &lt;code&gt;browser-client&lt;/code&gt; runtime via the &lt;code&gt;agent.browsers.*&lt;/code&gt; API. Before trying to interact with it, you MUST emit and read the complete documentation returned by &lt;code&gt;await browser.documentation()&lt;/code&gt; in one go.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So I told Work:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Add the full output of await browser.documentation() to the bottom of the /skills/control-browser page&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And now you can read that &lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/control-browser#browser-documentation"&gt;on /skills/control-browser&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;A few more interesting Skills:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/documents"&gt;documents&lt;/a&gt; for creating &lt;code&gt;.docx&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/imagegen"&gt;imagegen&lt;/a&gt; with tips on creating images with the &lt;code&gt;image_gen&lt;/code&gt; tool&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/pdf"&gt;pdf&lt;/a&gt; for both reading and rendering PDFs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/spreadsheets"&gt;Spreadsheets&lt;/a&gt; for manipulating &lt;code&gt;.xlsx&lt;/code&gt;, &lt;code&gt;.xls&lt;/code&gt;, &lt;code&gt;.csv&lt;/code&gt;, &lt;code&gt;.tsv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/sites-sites-building"&gt;sites:sites-building&lt;/a&gt; for creating ChatGPT Sites&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/openai-docs"&gt;openai-docs&lt;/a&gt; for answering questions about itself&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codex-tool-reference.simonw.chatgpt.site/skills/data-analytics-build-dashboard"&gt;data-analytics:build-dashboard&lt;/a&gt; for building data dashboards&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openai"&gt;openai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chatgpt"&gt;chatgpt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/code-interpreter"&gt;code-interpreter&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lethal-trifecta"&gt;lethal-trifecta&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/skills"&gt;skills&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/general-agents"&gt;general-agents&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ai"/><category term="openai"/><category term="generative-ai"/><category term="chatgpt"/><category term="llms"/><category term="code-interpreter"/><category term="lethal-trifecta"/><category term="skills"/><category term="general-agents"/></entry><entry><title>Introducing Hy4 Preview</title><link href="https://simonwillison.net/2026/Aug/29/hy4/" rel="alternate"/><published>2026-08-29T23:53:13+00:00</published><updated>2026-08-29T23:53:13+00:00</updated><id>https://simonwillison.net/2026/Aug/29/hy4/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://hy.tencent.ai/research/hy4-preview"&gt;Introducing Hy4 Preview&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New open weight text input (no vision)  LLM from Chinese company Tencent today: 770B total parameters, 49B active parameters, 1M token context window, &lt;a href="https://huggingface.co/tencent/Hy4-preview"&gt;1.56TB on Hugging Face&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a big size increase from their previous &lt;a href="https://huggingface.co/tencent/Hy3"&gt;Hy3&lt;/a&gt; in July, which was 295B, 21B active, 256,000 context, 598GB.&lt;/p&gt;
&lt;p&gt;I recently started using model chat templates to better understand their capabilities. Here's Hy4's  &lt;a href="https://huggingface.co/tencent/Hy4-preview/blob/main/chat_template.jinja"&gt;chat_template.jinja&lt;/a&gt; on Hugging Face, which includes this section:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-django"&gt;&lt;pre&gt;&lt;span class="pl-e"&gt;{%&lt;/span&gt;- &lt;span class="pl-k"&gt;if&lt;/span&gt; &lt;span class="pl-k"&gt;not&lt;/span&gt; &lt;span class="pl-s"&gt;reasoning_effort&lt;/span&gt; &lt;span class="pl-s"&gt;is&lt;/span&gt; &lt;span class="pl-s"&gt;defined&lt;/span&gt; &lt;span class="pl-e"&gt;%}&lt;/span&gt;
    &lt;span class="pl-e"&gt;{%&lt;/span&gt;- &lt;span class="pl-s"&gt;set&lt;/span&gt; &lt;span class="pl-s"&gt;reasoning_effort&lt;/span&gt; = &lt;span class="pl-s"&gt;'high'&lt;/span&gt; &lt;span class="pl-e"&gt;%}&lt;/span&gt;
&lt;span class="pl-e"&gt;{%&lt;/span&gt;- &lt;span class="pl-s"&gt;elif&lt;/span&gt; &lt;span class="pl-s"&gt;reasoning_effort&lt;/span&gt; &lt;span class="pl-k"&gt;not&lt;/span&gt; &lt;span class="pl-k"&gt;in&lt;/span&gt; [&lt;span class="pl-s"&gt;'high'&lt;/span&gt;, &lt;span class="pl-s"&gt;'no_think'&lt;/span&gt;] &lt;span class="pl-e"&gt;%}&lt;/span&gt;
    &lt;span class="pl-e"&gt;{%&lt;/span&gt;- &lt;span class="pl-k"&gt;if&lt;/span&gt; &lt;span class="pl-s"&gt;reasoning_effort&lt;/span&gt; &lt;span class="pl-s"&gt;is&lt;/span&gt; &lt;span class="pl-s"&gt;none&lt;/span&gt; &lt;span class="pl-e"&gt;%}&lt;/span&gt;
        {{- raise_exception('reasoning_effort error : None, should be no_think/high') }}
    &lt;span class="pl-e"&gt;{%&lt;/span&gt;- &lt;span class="pl-k"&gt;else&lt;/span&gt; &lt;span class="pl-e"&gt;%}&lt;/span&gt;
        {{- raise_exception('reasoning_effort error : ' + reasoning_effort + ', should be no_think/high') }}
    &lt;span class="pl-e"&gt;{%&lt;/span&gt;- &lt;span class="pl-k"&gt;endif&lt;/span&gt; &lt;span class="pl-e"&gt;%}&lt;/span&gt;
&lt;span class="pl-e"&gt;{%&lt;/span&gt;- &lt;span class="pl-k"&gt;endif&lt;/span&gt; &lt;span class="pl-e"&gt;%}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So it looks like there are just two reasoning effort levels: "high" (the default) and "no_think" (reason by disabled).&lt;/p&gt;
&lt;p&gt;I tried my "Generate an SVG of a pelican riding a bicycle" prompt with the default high reasoning &lt;a href="https://openrouter.ai/tencent/hy4-preview#apps"&gt;via OpenRouter&lt;/a&gt; and &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Fcb69816b3fb940f2782569a82a523af1"&gt;got this&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Flat vector cartoon illustration of a white pelican with a large orange bill riding a red bicycle to the right along a grey road with a dashed white centre line, its orange webbed feet on the pedals and grey tail feathers fanned out behind, against a pale blue sky with a yellow sun, white clouds and horizontal white motion lines suggesting speed" src="https://static.simonwillison.net/static/2026-08-29/IMG_7725.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;Quoting the reasoning trace:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[...] Let's maybe add a helmet? It could improve riding theme, but may obscure head. Maybe a small cycling cap or helmet? The user didn't ask; can add red helmet? Might be cute. But pelican with big beak; a helmet might obscure. Better maybe no.&lt;/p&gt;
&lt;p&gt;Maybe add sunglasses? no.&lt;/p&gt;
&lt;p&gt;Maybe add water? no.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's interesting how the reasoning trace uses slightly truncated English, presumably because perfect grammar isn't useful or token efficient for hidden reasoning text.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle"&gt;pelican-riding-a-bicycle&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm-reasoning"&gt;llm-reasoning&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm-release"&gt;llm-release&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-in-china"&gt;ai-in-china&lt;/a&gt;&lt;/p&gt;



</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="pelican-riding-a-bicycle"/><category term="llm-reasoning"/><category term="llm-release"/><category term="ai-in-china"/></entry><entry><title>Just a rumour of a bug is enough to find a security exploit these days</title><link href="https://simonwillison.net/2026/Aug/28/just-a-rumour-of-a-bug/" rel="alternate"/><published>2026-08-28T22:12:02+00:00</published><updated>2026-08-28T22:12:02+00:00</updated><id>https://simonwillison.net/2026/Aug/28/just-a-rumour-of-a-bug/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://anil.recoil.org/notes/rumour-is-the-exploit"&gt;Just a rumour of a bug is enough to find a security exploit these days&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Anil Madhavapeddy is a professor of computer science at Cambridge and a core maintainer of the OCaml compiler. In this somewhat alarming post he reports that security issues in OCaml projects are seeing evidence of attempted exploits within minutes of patches being shared for discussion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This normally takes a few days and a release within a week or two is reasonable. Within about ten minutes (!) this website was fielding probes for percent-encoded traversal sequences, indicating that automated watchers are keeping an eye on public repositories.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Modern coding agents have become so effective at finding flaws that the slightest hint at a new bug can be enough information for them to find it, something Anil has been able to demonstrate using his own agents, switching to DeepSeek V4 Pro⁠ when Claude Fable refused the task.&lt;/p&gt;
&lt;p&gt;Anil points out that this rate of discovery appears incompatible with existing open source embargo practices for new issues. If an issue can become an exploit this fast, we need to figure out new processes for keeping our communities safe.&lt;/p&gt;
&lt;p&gt;rclone maintainer Nick Craig-Wood &lt;a href="https://news.ycombinator.com/item?id=49480466#49480777"&gt;confirms in the Hacker News comments&lt;/a&gt; that his project is seeing this problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the first 10 years of the rclone project we received about 20 security disclosures through GitHub. We had to deal with over 40 in the last month! That has taken a huge amount of my time, even using AI tools to triage and come up with fixes for review.&lt;/p&gt;
&lt;p&gt;The hit rate for those security disclosures is pretty good - about 75% of them have a nugget of something which needs looking at. [...]&lt;/p&gt;
&lt;p&gt;GitHub assigns CVEs for the advisories. Before the AI apocalypse they took 2-3 days for an assignment but now it they are running at 3-4 weeks so I have to send the point releases out with CVE-PENDING in the changelog which isn't ideal.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=49480466"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ocaml"&gt;ocaml&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-security-research"&gt;ai-security-research&lt;/a&gt;&lt;/p&gt;



</summary><category term="open-source"/><category term="security"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="coding-agents"/><category term="ocaml"/><category term="ai-security-research"/></entry><entry><title>Breaking Claude Code Opus 5 Auto Mode</title><link href="https://simonwillison.net/2026/Aug/27/breaking-claude-code-opus-5-auto-mode/" rel="alternate"/><published>2026-08-27T22:50:25+00:00</published><updated>2026-08-27T22:50:25+00:00</updated><id>https://simonwillison.net/2026/Aug/27/breaking-claude-code-opus-5-auto-mode/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://embracethered.com/blog/posts/2026/breaking-claude-code-opus-5-and-automode/"&gt;Breaking Claude Code Opus 5 Auto Mode&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Anthropic are putting a great deal of faith in Claude Code's auto mode for protecting their coding agent users against prompt injection attacks. They recently &lt;a href="https://simonwillison.net/2026/Aug/8/auto-mode/"&gt;made that the default&lt;/a&gt; and have made bold claims about its effectiveness.&lt;/p&gt;
&lt;p&gt;Johann Rehberger is one of the most credible prompt injection researchers active today. He found an attack against auto mode which he claims works 80% of the time, by tricking Claude Code into downloading and uncompressing a zip archive, then executing code that imports &lt;code&gt;base64&lt;/code&gt; without noticing that this will import and execute a local &lt;code&gt;struct.py&lt;/code&gt; file extracted from the archive.&lt;/p&gt;
&lt;p&gt;In a few cases auto mode directly prevented the agent from preventing harmful code from continuing to execute!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In a few runs Claude tried to terminate the malware process once it noticed the compromise, but Auto Mode denied the cleanup command.&lt;/p&gt;
&lt;p&gt;Claude detects the compromise, but &lt;strong&gt;Auto Mode blocks its cleanup command&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The safety mechanism itself can become part of the failure. The classifier allowed the creation of the malware process, but then it blocked the command intended to stop it!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I agree with Johann's conclusion here: the only safe way to run agents if there's any risk of attracting the attention of an adversarial attack is with a sandbox:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Run unattended coding agents in a container, VM or OS sandbox.&lt;/li&gt;
&lt;li&gt;Restrict network egress.&lt;/li&gt;
&lt;li&gt;Monitor your agents.&lt;/li&gt;
&lt;li&gt;Do not expose home directories, SSH keys, cloud credentials,… to the agent runtime. [...]&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update 30th August 2026&lt;/strong&gt;: On Lobste.rs &lt;a href="https://lobste.rs/s/ktbweg/prompt_injection_claude_code_opus_5_auto#c_gi7eqj"&gt;hyperpape points out&lt;/a&gt; that this doesn't fit the bill of a classic prompt injection attack because at no point are malicious instructions from the website accidentally followed by the LLM. They're right: this is more of a confused environment attack where the nature of the environment that the agent is exposed to results in an exploit.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/sandboxing"&gt;sandboxing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-injection"&gt;prompt-injection&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/anthropic"&gt;anthropic&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude"&gt;claude&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/johann-rehberger"&gt;johann-rehberger&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-code"&gt;claude-code&lt;/a&gt;&lt;/p&gt;



</summary><category term="sandboxing"/><category term="security"/><category term="ai"/><category term="prompt-injection"/><category term="generative-ai"/><category term="llms"/><category term="anthropic"/><category term="claude"/><category term="johann-rehberger"/><category term="claude-code"/></entry><entry><title>Qwen3.8-Flash-Next</title><link href="https://simonwillison.net/2026/Aug/26/qwen38-flash-next/" rel="alternate"/><published>2026-08-26T23:52:58+00:00</published><updated>2026-08-26T23:52:58+00:00</updated><id>https://simonwillison.net/2026/Aug/26/qwen38-flash-next/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://qwen.ai/blog?id=qwen3.8-flash-next"&gt;Qwen3.8-Flash-Next&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Another open weights model from Qwen. This one is "a multimodal MoE model that also serves as an early preview of the architecture used in Qwen4".&lt;/p&gt;
&lt;p&gt;It's pretty big: 125B tokens, but only 6B active which means it gets a significant performance boost.&lt;/p&gt;
&lt;p&gt;I've been trying it out on a DGX Spark using &lt;a href="https://huggingface.co/unsloth/Qwen3.8-Flash-Next-GGUF"&gt;these Unsloth quantized models&lt;/a&gt;. I'm still exploring the model - so far I've tried the 72.5GB UD-IQ1_S one (producing &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Ff9c69ebdab90d8a45b8de4742cc7b840"&gt;these pelicans&lt;/a&gt;) and the 78.9GB UD-Q2_K_XL (producing &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F6ba7cbfc1a9336986703b41f7fccd73a"&gt;these&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;My favorite so far was this xhigh reasoning effort one from UD-Q2_K_XL:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Flat vector illustration: a white pelican with an orange beak and orange legs rides a red bicycle along a sandy path, a wicker basket on the handlebars holding a blue fish, with green rolling hills, a small tree and bushes, white clouds and a bright yellow sun in a blue sky behind it" src="https://static.simonwillison.net/static/2026-08-27/IMG_7667.png" /&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=49448210"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/qwen"&gt;qwen&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle"&gt;pelican-riding-a-bicycle&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-in-china"&gt;ai-in-china&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nvidia-spark"&gt;nvidia-spark&lt;/a&gt;&lt;/p&gt;



</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="qwen"/><category term="pelican-riding-a-bicycle"/><category term="ai-in-china"/><category term="nvidia-spark"/></entry><entry><title>Quoting Paul Dix</title><link href="https://simonwillison.net/2026/Aug/26/paul-dix/" rel="alternate"/><published>2026-08-26T08:07:55+00:00</published><updated>2026-08-26T08:07:55+00:00</updated><id>https://simonwillison.net/2026/Aug/26/paul-dix/</id><summary type="html">
    &lt;blockquote cite="https://pauldix.com/the-end-of-programming"&gt;&lt;p&gt;The fact that AI wrote 1M LOC and then refined it over the course of the next couple of months to produce a reliable piece of software that is currently running on millions of developer machines is absolutely mind blowing. And you can say, “well it’s not that impressive because they had an oracle to compare against, so it was simple to go from one language to another”, but I think that’s selling this entire thing short. If you can build a verification system and give proper direction, AI can produce a highly complex, highly sophisticated piece of software and it can continue to refine it until it just works.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://pauldix.com/the-end-of-programming"&gt;Paul Dix&lt;/a&gt;, The end of programming&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/bun"&gt;bun&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;&lt;/p&gt;



</summary><category term="coding-agents"/><category term="ai-assisted-programming"/><category term="generative-ai"/><category term="bun"/><category term="ai"/><category term="llms"/></entry><entry><title>EVE Online: The Move to Python 3 Begins!</title><link href="https://simonwillison.net/2026/Aug/25/eve-online-move-to-python-3/" rel="alternate"/><published>2026-08-25T22:59:30+00:00</published><updated>2026-08-25T22:59:30+00:00</updated><id>https://simonwillison.net/2026/Aug/25/eve-online-move-to-python-3/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.eveonline.com/news/view/the-move-to-python-3-begins"&gt;EVE Online: The Move to Python 3 Begins!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
EVE Online has been one of the most interesting case studies in Python at scale for over twenty years now.&lt;/p&gt;
&lt;p&gt;They've been running on &lt;a href="https://github.com/stackless-dev/stackless/wiki/"&gt;Stackless Python&lt;/a&gt; since their launch in 2003, and their last major upgrade was 16 years ago, to Stackless Python 2.7 &lt;a href="https://www.eveonline.com/news/view/stackless-python-2.7"&gt;in 2010&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Their upgrade to Python 3 will start using the &lt;a href="https://python-future.org/futurize.html"&gt;futurize&lt;/a&gt; script against 2.4 million lines of code, followed by careful manual review of the ~20,000 places where Python 2 and 3 behavior differ - for example &lt;code&gt;1 / 2&lt;/code&gt; is &lt;code&gt;0&lt;/code&gt; in Python 2 but is &lt;code&gt;0.5&lt;/code&gt; in Python 3.&lt;/p&gt;
&lt;p&gt;There's nothing in this announcement about how they plan to replace Stackless, but at their conference last year they presented &lt;a href="https://youtu.be/-x299qHLQs0"&gt;Scheduling in Carbon: Leaving Stackless Python Behind&lt;/a&gt; describing how they replaced Stackless in the Carbon engine for their more recent game EVE Frontier, using their (now open source) &lt;a href="https://github.com/carbonengine/scheduler"&gt;carbonengine/scheduler&lt;/a&gt; library.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://lobste.rs/s/e1oalq/move_python_3_begins"&gt;Lobster.rs&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/eve-online"&gt;eve-online&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/migrations"&gt;migrations&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python3"&gt;python3&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/stackless"&gt;stackless&lt;/a&gt;&lt;/p&gt;



</summary><category term="eve-online"/><category term="migrations"/><category term="python"/><category term="python3"/><category term="stackless"/></entry><entry><title>llm-anthropic 0.27</title><link href="https://simonwillison.net/2026/Aug/24/llm-anthropic/" rel="alternate"/><published>2026-08-24T16:27:04+00:00</published><updated>2026-08-24T16:27:04+00:00</updated><id>https://simonwillison.net/2026/Aug/24/llm-anthropic/</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/simonw/llm-anthropic/releases/tag/0.27"&gt;llm-anthropic 0.27&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;This release of the Anthropic plugin for &lt;a href="https://llm.datasette.io/"&gt;LLM&lt;/a&gt; mainly provides compatibility with the recently released &lt;a href="https://github.com/anthropics/anthropic-sdk-python/releases/tag/v1.0.0"&gt;anthropic v1.0.0&lt;/a&gt; Python library, which switches from &lt;code&gt;httpx&lt;/code&gt; to &lt;a href="https://github.com/pydantic/httpx2"&gt;httpx2&lt;/a&gt;. OpenAI made the same change in their &lt;a href="https://github.com/openai/openai-python/releases/tag/v3.0.0"&gt;v3.0.0 release&lt;/a&gt; two weeks ago.&lt;/p&gt;
&lt;p&gt;Anthropic provide this &lt;a href="https://github.com/anthropics/anthropic-sdk-python/blob/v1.0.0/MIGRATION.md"&gt;migration guide&lt;/a&gt; for upgrading to 1.0, so I prompted Fable 5 in Claude Code with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Upgrade to anthropic&amp;gt;=1 - read https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/refs/heads/main/MIGRATION.md and get the tests passing&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's &lt;a href="https://github.com/simonw/llm-anthropic/pull/84"&gt;the resulting PR&lt;/a&gt;.&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/httpx"&gt;httpx&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/anthropic"&gt;anthropic&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude"&gt;claude&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="python"/><category term="httpx"/><category term="llm"/><category term="anthropic"/><category term="claude"/></entry><entry><title>Your executable is a SQLite database</title><link href="https://simonwillison.net/2026/Aug/24/your-executable-is-a-sqlite-database/" rel="alternate"/><published>2026-08-24T11:38:15+00:00</published><updated>2026-08-24T11:38:15+00:00</updated><id>https://simonwillison.net/2026/Aug/24/your-executable-is-a-sqlite-database/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fzakaria.com/2026/08/23/your-executable-is-a-sqlite-database"&gt;Your executable is a SQLite database&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Farid Zakaria describes a neat Linux pattern for creating a SQLite database file that can be directly used as an executable binary.&lt;/p&gt;
&lt;p&gt;The trick sets the SQLite file format's 4-byte application ID (68 bytes into the file) to SELF, standing for Structured Executable &amp;amp; Linkable Format.  The various components of the ELF executable format are then arranged into a number of different SQLite tables, using &lt;a href="https://github.com/fzakaria/selfdb/blob/main/schema/self.sql"&gt;this schema&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Their &lt;code&gt;self-exec&lt;/code&gt; interpreter (&lt;a href="https://github.com/fzakaria/selfdb/blob/main/loader/self-exec.c"&gt;C code here&lt;/a&gt;) can then extract and execute the necessary pieces.&lt;/p&gt;
&lt;p&gt;You can additionally use a Linux mechanism called &lt;a href="https://docs.kernel.org/admin-guide/binfmt-misc.html"&gt;binfmt_misc&lt;/a&gt; to teach the kernel to execute that any time it encounters an executable matching that binary pattern. Farid uses NixOS here, but without NixOS I think registration looks something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;printf '%s\n' ':self:M:68:SELF::/usr/local/bin/self-exec:' \
  &amp;gt; /proc/sys/fs/binfmt_misc/register
&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=49415271"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/c"&gt;c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;&lt;/p&gt;



</summary><category term="c"/><category term="linux"/><category term="sqlite"/></entry><entry><title>Anthropic’s best AI model struggles to attract users as cheaper tools thrive</title><link href="https://simonwillison.net/2026/Aug/23/anthropics-best-ai-model-struggles-to-attract-users-as-cheaper-t/" rel="alternate"/><published>2026-08-23T20:24:52+00:00</published><updated>2026-08-23T20:24:52+00:00</updated><id>https://simonwillison.net/2026/Aug/23/anthropics-best-ai-model-struggles-to-attract-users-as-cheaper-t/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.ft.com/content/5ee49718-c258-4f01-aa32-7e5b76ae5245"&gt;Anthropic’s best AI model struggles to attract users as cheaper tools thrive&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A few interesting numbers in this FT story gathered from "people with knowledge of the matter":&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Anthropic's "annualized revenue" for July is up to $65bn - it was $47bn in May, and I collected &lt;a href="https://simonwillison.net/2026/May/29/anthropic/"&gt;more historic numbers here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Anthropic expect Q3 to be profitable according to the same model they used to declare Q2 profitable. "It also told investors that it had 6,000 customers that spend $100,000 annually or more."&lt;/li&gt;
&lt;li&gt;As for OpenAI, "annualised revenue has jumped 35 per cent in the quarter to date and is now over $40bn, with the launch of GPT 5.6 in July jolting the company’s performance after a sluggish start to the year".&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article also introduced me to the &lt;a href="https://ramp.com/data/ai-index"&gt;Ramp AI index&lt;/a&gt;, which uses billing data from 70,000 Ramp credit card using companies to estimate model adoption.&lt;/p&gt;
&lt;p&gt;Here's Ramp's breakdown of Anthropic model spend for July 2026, which looks reasonable given that Opus 5 was only released on July 24th, and supports the idea that Fable's cost has made it a less popular model:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Opus 4.8: 28.0%&lt;/li&gt;
&lt;li&gt;Sonnet 4.6: 8.3%&lt;/li&gt;
&lt;li&gt;Fable 5: 8.0%&lt;/li&gt;
&lt;li&gt;Opus 4.6: 6.9%&lt;/li&gt;
&lt;li&gt;Sonnet 5: 3.6%&lt;/li&gt;
&lt;li&gt;Opus 5: 3.5%&lt;/li&gt;
&lt;li&gt;Opus 4.7: 1.7%&lt;/li&gt;
&lt;li&gt;Sonnet 4.5: 1.3%&lt;/li&gt;
&lt;li&gt;Haiku 4.5: 1.0%&lt;/li&gt;
&lt;li&gt;Opus 4.5: 0.7%&lt;/li&gt;
&lt;/ol&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=49411102"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openai"&gt;openai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/anthropic"&gt;anthropic&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude"&gt;claude&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-mythos-fable"&gt;claude-mythos-fable&lt;/a&gt;&lt;/p&gt;



</summary><category term="ai"/><category term="openai"/><category term="generative-ai"/><category term="llms"/><category term="anthropic"/><category term="claude"/><category term="claude-mythos-fable"/></entry><entry><title>Quoting Drew Breunig</title><link href="https://simonwillison.net/2026/Aug/23/drew-breunig/" rel="alternate"/><published>2026-08-23T19:55:30+00:00</published><updated>2026-08-23T19:55:30+00:00</updated><id>https://simonwillison.net/2026/Aug/23/drew-breunig/</id><summary type="html">
    &lt;blockquote cite="https://www.dbreunig.com/2026/08/23/fable-the-end-of-moore-s-law.html"&gt;&lt;p&gt;Prior to Fable, it felt silly to waste &lt;em&gt;too&lt;/em&gt; much time improving your coding harness or context strategies. A new model would arrive at the same price (or cheaper!) and paper over most of your problems.&lt;/p&gt;
&lt;p&gt;But then Fable landed. It was (and still is!) &lt;em&gt;incredible&lt;/em&gt;. But the cost was so high and Opus was &lt;em&gt;good enough&lt;/em&gt; (as was 5.6, K3, and even GLM) for &lt;em&gt;most&lt;/em&gt; of the code we needed.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;So we started to think about what work went where.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.dbreunig.com/2026/08/23/fable-the-end-of-moore-s-law.html"&gt;Drew Breunig&lt;/a&gt;, Fable &amp;amp; The End of the Free Lunch&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/drew-breunig"&gt;drew-breunig&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/anthropic"&gt;anthropic&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude"&gt;claude&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm-pricing"&gt;llm-pricing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-mythos-fable"&gt;claude-mythos-fable&lt;/a&gt;&lt;/p&gt;



</summary><category term="drew-breunig"/><category term="anthropic"/><category term="claude"/><category term="llm-pricing"/><category term="ai"/><category term="llms"/><category term="generative-ai"/><category term="claude-mythos-fable"/></entry><entry><title>Quoting Linus Torvalds</title><link href="https://simonwillison.net/2026/Aug/22/linus-torvalds/" rel="alternate"/><published>2026-08-22T21:04:26+00:00</published><updated>2026-08-22T21:04:26+00:00</updated><id>https://simonwillison.net/2026/Aug/22/linus-torvalds/</id><summary type="html">
    &lt;blockquote cite="https://github.com/torvalds/linux/commit/818bebeb63dd6bf5f4e07e145f6cdbace520a34c"&gt;&lt;p&gt;And this was a debug session from hell, enormously helped by an AI doing much of the grunt-work.&lt;/p&gt;
&lt;p&gt;I'd like to call it my tireless helper, but the AI several times stated flat out that this was impossible and unsolvable and that we should just write a report about it.&lt;/p&gt;
&lt;p&gt;I suspect those things have been trained by people who may not be quite as stubborn as I am.&lt;/p&gt;
&lt;p&gt;But while the AI was ready to give up several times, it did keep adding debug code and analyzing it faithfully when I pushed. So credit where credit is due and I let the AI write the commit message above.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://github.com/torvalds/linux/commit/818bebeb63dd6bf5f4e07e145f6cdbace520a34c"&gt;Linus Torvalds&lt;/a&gt;, drm/xe: Don't hand out the flat CCS storage as usable VRAM&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linus-torvalds"&gt;linus-torvalds&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;&lt;/p&gt;



</summary><category term="linus-torvalds"/><category term="linux"/><category term="generative-ai"/><category term="ai-assisted-programming"/><category term="ai"/><category term="llms"/></entry><entry><title>llm 0.33</title><link href="https://simonwillison.net/2026/Aug/22/llm/" rel="alternate"/><published>2026-08-22T17:01:16+00:00</published><updated>2026-08-22T17:01:16+00:00</updated><id>https://simonwillison.net/2026/Aug/22/llm/</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/simonw/llm/releases/tag/0.33"&gt;llm 0.33&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;My highlights from this release:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Upgraded to the OpenAI Python library 3.x and switched the HTTP client dependency from &lt;code&gt;httpx&lt;/code&gt; to &lt;code&gt;httpx2&lt;/code&gt;. &lt;a href="https://github.com/simonw/llm/issues/1608"&gt;#1608&lt;/a&gt;, &lt;a href="https://github.com/simonw/llm/pull/1631"&gt;#1631&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I shipped a quick &lt;a href="https://simonwillison.net/2026/Aug/21/llm/"&gt;0.32.1 fix&lt;/a&gt; for this yesterday, but this is the more comprehensive fix.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;llm embed&lt;/code&gt; and &lt;code&gt;llm embed-multi&lt;/code&gt; now accept &lt;code&gt;--key&lt;/code&gt;. The Python &lt;code&gt;EmbeddingModel.embed()&lt;/code&gt;, &lt;code&gt;EmbeddingModel.embed_multi()&lt;/code&gt;, &lt;code&gt;Collection.embed()&lt;/code&gt; and &lt;code&gt;Collection.embed_multi()&lt;/code&gt; methods accept &lt;code&gt;key=&lt;/code&gt; too, passing the resolved per-call key to embedding plugins without changing shared model state. Existing plugins that read &lt;code&gt;self.key&lt;/code&gt; continue to work through a compatibility fallback. Thanks, &lt;a href="https://github.com/ChrisJr404"&gt;ChrisJr404&lt;/a&gt;. &lt;a href="https://github.com/simonw/llm/issues/757"&gt;#757&lt;/a&gt;, &lt;a href="https://github.com/simonw/llm/pull/1620"&gt;#1620&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The embedding models now use the same pattern for keys that regular LLM models do.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;llm prompt -t/--template&lt;/code&gt; can now be repeated to combine templates in order. This allows model configuration and options from one template to be used with a prompt from another.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This unlocks a neat pattern where you can create templates that package a model with a set of default options:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;llm -m gpt-5.6-luna -o reasoning_effort high --save lhigh
llm "Generate an SVG of a pelican riding a bicycle" --save pelican
# Combine and run the templates
llm -t lhigh -t pelican
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Reasoning-capable Responses API models now support a &lt;code&gt;reasoning_summary&lt;/code&gt; option with &lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;concise&lt;/code&gt;, and &lt;code&gt;detailed&lt;/code&gt; values. This can be used with &lt;a href="https://llm.datasette.io/en/stable/other-models.html#openai-endpoint"&gt;llm openai endpoint --responses&lt;/a&gt;. &lt;a href="https://github.com/simonw/llm/issues/1600"&gt;#1600&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is particularly useful for exercising different models that provide their own imitation of the OpenAI Responses API.&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/annotated-release-notes"&gt;annotated-release-notes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="annotated-release-notes"/><category term="llm"/></entry><entry><title>More than just code review</title><link href="https://simonwillison.net/2026/Aug/22/more-than-just-code-review/" rel="alternate"/><published>2026-08-22T15:56:54+00:00</published><updated>2026-08-22T15:56:54+00:00</updated><id>https://simonwillison.net/2026/Aug/22/more-than-just-code-review/</id><summary type="html">
    &lt;p&gt;The key skill required to make productive use of coding agents is being able to confidently instruct them on how to make changes and then confidently verify that those changes have been applied in the correct way.&lt;/p&gt;
&lt;p&gt;Sometimes this involves reviewing every line of code they have written, but there are other ways to achieve that goal. Eyeballing every line of code has never been the most effective way to validate a change to a piece of software.&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/code-review"&gt;code-review&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/agentic-engineering"&gt;agentic-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;&lt;/p&gt;



</summary><category term="code-review"/><category term="coding-agents"/><category term="generative-ai"/><category term="agentic-engineering"/><category term="ai"/><category term="llms"/></entry><entry><title>llm 0.32.1</title><link href="https://simonwillison.net/2026/Aug/21/llm/" rel="alternate"/><published>2026-08-21T17:16:13+00:00</published><updated>2026-08-21T17:16:13+00:00</updated><id>https://simonwillison.net/2026/Aug/21/llm/</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/simonw/llm/releases/tag/0.32.1"&gt;llm 0.32.1&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;Fresh installs of LLM stopped working the other day because the OpenAI Python library dropped its usage of &lt;code&gt;httpx&lt;/code&gt;, and it turned out LLM depended on that library but only installed it via a transitive &lt;code&gt;openai&lt;/code&gt; dependency.&lt;/p&gt;
&lt;p&gt;This dot-release fixes that for the moment by pinning to &lt;code&gt;openai&amp;lt;3&lt;/code&gt;, and a soon-to-drop 0.33 release will switch from &lt;code&gt;httpx&lt;/code&gt; to &lt;a href="https://github.com/pydantic/httpx2"&gt;httpx2&lt;/a&gt;.&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/httpx"&gt;httpx&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openai"&gt;openai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="httpx"/><category term="openai"/><category term="llm"/></entry><entry><title>llm-openrouter 0.7</title><link href="https://simonwillison.net/2026/Aug/21/llm-openrouter/" rel="alternate"/><published>2026-08-21T16:58:19+00:00</published><updated>2026-08-21T16:58:19+00:00</updated><id>https://simonwillison.net/2026/Aug/21/llm-openrouter/</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/simonw/llm-openrouter/releases/tag/0.7"&gt;llm-openrouter 0.7&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;Now that this plugin is compatible with &lt;a href="https://simonwillison.net/2026/Aug/4/new-release-of-llm/"&gt;LLM 0.32&lt;/a&gt; it can display the reasoning traces for LLMs available through OpenRouter.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Updated for compatibility with &lt;a href="https://llm.datasette.io/en/stable/changelog.html#v0-32"&gt;LLM 0.32&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Models now use OpenRouter's implementation of the &lt;a href="https://openrouter.ai/docs/api_reference/responses/overview"&gt;Responses API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Three new server-side tools: &lt;a href="https://github.com/simonw/llm-openrouter#shell"&gt;Shell&lt;/a&gt;, &lt;a href="https://github.com/simonw/llm-openrouter#web-fetch"&gt;WebFetch&lt;/a&gt;, and &lt;a href="https://github.com/simonw/llm-openrouter#web-search"&gt;WebSearch&lt;/a&gt;. Enable these with options like &lt;code&gt;-T WebSearch&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openrouter"&gt;openrouter&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="llm"/><category term="openrouter"/></entry><entry><title>Stop Making TUIs</title><link href="https://simonwillison.net/2026/Aug/21/stop-making-tuis/" rel="alternate"/><published>2026-08-21T16:07:32+00:00</published><updated>2026-08-21T16:07:32+00:00</updated><id>https://simonwillison.net/2026/Aug/21/stop-making-tuis/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://sockpuppet.org/blog/2026/08/20/stop-making-tuis/"&gt;Stop Making TUIs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Thomas Ptacek advocates for building real native user interfaces for even the smallest of personal tools, because coding agents have reduced the cost of getting a usable-enough GUI up and running to almost nothing.&lt;/p&gt;
&lt;p&gt;I wrote about my vibe-coded bandwidth and GPU monitoring macOS task bar apps &lt;a href="https://simonwillison.net/2026/Mar/27/vibe-coding-swiftui/"&gt;back in March&lt;/a&gt;, and I'm still using both of those on a daily basis.&lt;/p&gt;
&lt;p&gt;I'm not habitually knocking out real UIs for my other projects yet, but I'm running out of excuses!&lt;/p&gt;
&lt;p&gt;Thomas:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you haven’t tried your hand at turning one of your 500 throwaway CLIs into a native app, you’re doing yourself a disservice. Go build a native UI. It’ll probably change the way you think.&lt;/p&gt;
&lt;/blockquote&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/thomas-ptacek"&gt;thomas-ptacek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vibe-coding"&gt;vibe-coding&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;&lt;/p&gt;



</summary><category term="thomas-ptacek"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="vibe-coding"/><category term="coding-agents"/></entry><entry><title>Quoting Matt Webb</title><link href="https://simonwillison.net/2026/Aug/21/matt-webb/" rel="alternate"/><published>2026-08-21T15:06:26+00:00</published><updated>2026-08-21T15:06:26+00:00</updated><id>https://simonwillison.net/2026/Aug/21/matt-webb/</id><summary type="html">
    &lt;blockquote cite="https://interconnected.org/home/2026/08/21/galactic"&gt;&lt;p&gt;After I released version 1.0, I figured I would have to do the rotations myself. So I sat down with ChatGPT and I didn’t get it to write the code, but I got it to educate me. With a patient, interactive tutor, I was able to finally do what I hadn’t by reading books and asking mathematician friends – I learnt how to use quaternions just enough to make the app work.&lt;/p&gt;
&lt;p&gt;So learning doesn’t stop just because I outsource a bunch of thinking to AI. It pushes me to learn more. I like that as an outcome.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://interconnected.org/home/2026/08/21/galactic"&gt;Matt Webb&lt;/a&gt;, Galactic Compass 2: now with new augmented reality mode&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/matt-webb"&gt;matt-webb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chatgpt"&gt;chatgpt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/education"&gt;education&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;&lt;/p&gt;



</summary><category term="matt-webb"/><category term="generative-ai"/><category term="chatgpt"/><category term="education"/><category term="ai"/><category term="llms"/></entry><entry><title>ChatGPT search now uses the site:operator at scale</title><link href="https://simonwillison.net/2026/Aug/20/chatgpt-search-now-uses-the-siteoperator-at-scale/" rel="alternate"/><published>2026-08-20T23:57:32+00:00</published><updated>2026-08-20T23:57:32+00:00</updated><id>https://simonwillison.net/2026/Aug/20/chatgpt-search-now-uses-the-siteoperator-at-scale/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://promptwatch.com/data/chatgpt-site-operator-fanouts"&gt;ChatGPT search now uses the site:operator at scale&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Promptwatch is part of the emerging "GEO" space, for Generative Engine Optimization - the chatbot version of SEO, where companies offer tools and consulting to help your site increase its presence in replies to prompts inside tools like ChatGPT.&lt;/p&gt;
&lt;p&gt;The Promptwatch product uses automation to track responses to prompts across end-user chat products like ChatGPT, Claude, and Gemini. They publish aggregate reports on this as part of their own content marketing strategy, which do seem to provide credible hints as to otherwise invisible design changes to those products.&lt;/p&gt;
&lt;p&gt;Their own tracking shows a notable change aligned with the GPT-5.6 rollout earlier this month:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The percentage of all ChatGPT Search fanout queries that contain the site:operator, per day. The share hovered between 0.3% and 0.5% for weeks, dipped briefly to 0.15% on August 3 to 5 (consistent with a staged rollout or pre-launch experiment), then jumped to 16-17% on August 8.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It's important to note that these figures only reflect the prompts for which they have automated tracking enabled.&lt;/p&gt;
&lt;p&gt;This corresponds to OpenAI's somewhat vague &lt;a href="https://openai.com/index/improving-gpt-5-6-sol-in-chatgpt/"&gt;August 6th announcement&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For Plus and Pro users, we’re updating GPT‑5.6 Sol in Chat to be more reliable with facts and provide more focused answers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once again I am hampered by OpenAI's decision to actively obscure their system prompts, but from poking at ChatGPT I believe their latest search tool has a shape like &lt;code&gt;search(query, recency, domains)&lt;/code&gt; rather than encouraging a &lt;code&gt;site:&lt;/code&gt; operator directly.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://promptwatch.com/data/reddit-citations-are-dropping-in-chatgpt"&gt;a follow-up&lt;/a&gt; on August 18th Promptwatch reported that ChatGPT appeared to have greatly reduced the likelihood of Reddit being used in those searches. My own attempts to ascertain if the system prompt has been updated to discourage Reddit sourcing have been unsuccessful - the &lt;a href="https://github.com/asgeirtj/system_prompts_leaks/commits/main/OpenAI"&gt;most thorough leaked system prompt&lt;/a&gt; collection I know of doesn't yet show any relevant changes.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/reddit"&gt;reddit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/seo"&gt;seo&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openai"&gt;openai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chatgpt"&gt;chatgpt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-search"&gt;ai-assisted-search&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/system-prompts"&gt;system-prompts&lt;/a&gt;&lt;/p&gt;



</summary><category term="reddit"/><category term="seo"/><category term="openai"/><category term="chatgpt"/><category term="ai-assisted-search"/><category term="system-prompts"/></entry><entry><title>A shot-scraper-style JSON API on Bun 1.4's new Bun.WebView</title><link href="https://simonwillison.net/2026/Aug/20/bun-webview-json-api/" rel="alternate"/><published>2026-08-20T15:37:00+00:00</published><updated>2026-08-20T15:37:00+00:00</updated><id>https://simonwillison.net/2026/Aug/20/bun-webview-json-api/</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Research:&lt;/strong&gt; &lt;a href="https://github.com/simonw/research/tree/main/bun-webview-json-api#readme"&gt;A shot-scraper-style JSON API on Bun 1.4&amp;#x27;s new Bun.WebView&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;Today saw the long awaited &lt;a href="https://bun.com/blog/bun-v1.4"&gt;release of Bun 1.4&lt;/a&gt;, the first stable version since the infamous Rust rewrite &lt;a href="https://simonwillison.net/2026/Jul/8/rewriting-bun-in-rust/"&gt;a few months ago&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Interestingly, the Rust rewrite was downplayed in the release notes, which introduced a bewildering array of new features and claimed 2,900 additional bug fixes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bun 1.4 adds +1,517 tests from the Node.js test suite - our biggest jump in Node.js compatibility since Bun 1.0. Bun v1.4 also fixes over 2,900 issues. It reduces idle CPU usage by 5x, reduces memory usage by up to 35%, and starts 50% faster on Linux. It adds &lt;a href="https://bun.com/blog/bun-v1.4#bun-image"&gt;&lt;code&gt;Bun.Image&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://bun.com/blog/bun-v1.4#bun-webview"&gt;&lt;code&gt;Bun.WebView&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://bun.com/blog/bun-v1.4#bun-markdown"&gt;&lt;code&gt;Bun.markdown&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://bun.com/blog/bun-v1.4#bun-cron"&gt;&lt;code&gt;Bun.cron()&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://bun.com/blog/bun-v1.4#bun-terminal"&gt;&lt;code&gt;Bun.Terminal&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://bun.com/blog/bun-v1.4#bun-run-parallel"&gt;&lt;code&gt;bun run --parallel&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://bun.com/blog/bun-v1.4#bun-test-parallel"&gt;&lt;code&gt;bun test --parallel&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://bun.com/blog/bun-v1.4#bun-audit-fix"&gt;&lt;code&gt;bun audit fix&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://bun.com/blog/bun-v1.4#bun-dedupe"&gt;&lt;code&gt;bun dedupe&lt;/code&gt;&lt;/a&gt;, and &lt;a href="https://bun.com/blog/bun-v1.4#bun-prune"&gt;&lt;code&gt;bun prune&lt;/code&gt;&lt;/a&gt;. And it rewrites Bun from Zig to Rust.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of these the one that most caught my eye was &lt;code&gt;Bun.WebView&lt;/code&gt;, which adds first class support for browser automation to Bun core using either macOS WebKit or control of a local Chromium process via the Chrome DevTools Protocol (CDP).&lt;/p&gt;
&lt;p&gt;I had Claude Code for web build a prototype of a web API providing the ability to load a web page and then execute JavaScript against it, inspired by my &lt;a href="https://shot-scraper.datasette.io/en/stable/javascript.html"&gt;shot-scraper javascript&lt;/a&gt; CLI tool - partly to see how much RAM would be needed by such a service.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://github.com/simonw/research/blob/main/bun-webview-json-api/server.ts"&gt;that TypeScript server implementation&lt;/a&gt;, which appears to need a 192MB-256MB container to run a full Chrome against complex web pages - tested using cgroups.&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rust"&gt;rust&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/typescript"&gt;typescript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/bun"&gt;bun&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="browsers"/><category term="javascript"/><category term="ai"/><category term="rust"/><category term="typescript"/><category term="generative-ai"/><category term="llms"/><category term="coding-agents"/><category term="bun"/></entry><entry><title>smolmachines / smolvm as a sandbox for untrusted Python &amp; JavaScript</title><link href="https://simonwillison.net/2026/Aug/19/smolmachines-untrusted-sandbox/" rel="alternate"/><published>2026-08-19T23:16:00+00:00</published><updated>2026-08-19T23:16:00+00:00</updated><id>https://simonwillison.net/2026/Aug/19/smolmachines-untrusted-sandbox/</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Research:&lt;/strong&gt; &lt;a href="https://github.com/simonw/research/tree/main/smolmachines-untrusted-sandbox#readme"&gt;smolmachines / smolvm as a sandbox for untrusted Python &amp;amp; JavaScript&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;I tasked Claude Fable 5 running in Claude Code for web with the following research task:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Put https://smolmachines.com through its paces as a fast secure sandbox. Explore what it would take to use this to run untrusted Python and JavaScript code in a way that is limited in what RAM and CPU time it can take up (protection against "while true") with no network access and filesystem access only to designated files&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Goal is to be able to use this to execute user-provided tasks for things like data transformations&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It quickly ran into a problem: the Claude Code for web environment can't run &lt;a href="https://smolmachines.com"&gt;smol machines&lt;/a&gt;. Quoting the &lt;a href="https://github.com/simonw/research/blob/5e6861e54441472d194de96b49b901fd99ebc153/smolmachines-untrusted-sandbox/notes.md#environment-check"&gt;notes it wrote&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;This Claude Code container: Linux 6.18.5-fc-v20 (itself a Firecracker guest), 4 vCPU, 15GB RAM. &lt;strong&gt;No /dev/kvm, no vmx/svm CPU flags&lt;/strong&gt; → no nested virt.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smolvm machine run&lt;/code&gt; fails as expected: "kvm not available".&lt;/li&gt;
&lt;li&gt;Plan B: GitHub Actions ubuntu runners DO expose /dev/kvm → run the real test battery via a temporary workflow on this branch, collect logs, remove workflow in final commit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;And Plan B is &lt;a href="https://github.com/simonw/research/blob/5e6861e54441472d194de96b49b901fd99ebc153/.github/workflows/smolvm-sandbox-test.yml"&gt;what it did&lt;/a&gt;, installing smolvm and running &lt;a href="https://github.com/simonw/research/blob/5e6861e54441472d194de96b49b901fd99ebc153/smolmachines-untrusted-sandbox/run-tests.sh"&gt;these tests&lt;/a&gt; directly in a GitHub Actions runner against that branch.&lt;/p&gt;
&lt;p&gt;That was a creative solution to the environmental limits posed by Claude Code for web. Another example of Fable being &lt;a href="https://simonwillison.net/2026/Jun/11/fable-is-relentlessly-proactive/"&gt;relentlessly proactive&lt;/a&gt;.&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/research"&gt;research&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sandboxing"&gt;sandboxing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-actions"&gt;github-actions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-mythos-fable"&gt;claude-mythos-fable&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="research"/><category term="sandboxing"/><category term="ai"/><category term="github-actions"/><category term="generative-ai"/><category term="llms"/><category term="coding-agents"/><category term="claude-mythos-fable"/></entry><entry><title>Quoting Jeremy Morrell</title><link href="https://simonwillison.net/2026/Aug/19/jeremy-morrell/" rel="alternate"/><published>2026-08-19T22:56:31+00:00</published><updated>2026-08-19T22:56:31+00:00</updated><id>https://simonwillison.net/2026/Aug/19/jeremy-morrell/</id><summary type="html">
    &lt;blockquote cite="https://jeremymorrell.dev/blog/extensible-software-in-the-age-of-llms/"&gt;&lt;p&gt;My hypothesis is that &lt;strong&gt;there is a new opportunity for Extensible Software on the web&lt;/strong&gt;. LLMs radically lower the cost of authoring extensions, and modern sandbox primitives lower the deployment cost and provide good security boundaries. We can build our app as a solid, accountable core, and allow users to safely extend it in many directions by having LLMs fill in the missing pieces. &lt;strong&gt;We can give our users super powers.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://jeremymorrell.dev/blog/extensible-software-in-the-age-of-llms/"&gt;Jeremy Morrell&lt;/a&gt;, Extensible Software in the age of LLMs&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/sandboxing"&gt;sandboxing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;&lt;/p&gt;



</summary><category term="sandboxing"/><category term="llms"/><category term="ai"/><category term="generative-ai"/></entry><entry><title>Conceptual integrity and counting lines of code</title><link href="https://simonwillison.net/2026/Aug/19/conceptual-integrity-and-counting-lines-of-code/" rel="alternate"/><published>2026-08-19T22:46:07+00:00</published><updated>2026-08-19T22:46:07+00:00</updated><id>https://simonwillison.net/2026/Aug/19/conceptual-integrity-and-counting-lines-of-code/</id><summary type="html">
    &lt;p&gt;Last week I recorded &lt;a href="https://talkingpostgres.com/episodes/how-ai-is-changing-software-development-with-simon-willison"&gt;an episode of the Talking Postgres podcast&lt;/a&gt; with Claire Giordano on the subject of "How AI is changing software development". We had a really great conversation. Here are a couple of my highlights from a lightly edited transcript (prompt to Claude: "very minor edits to remove disfluencies").&lt;/p&gt;
&lt;p&gt;This is the latest version of an argument I've been trying to build about why sometimes it &lt;em&gt;does&lt;/em&gt; make sense to talk about lines of code as an indicator of productivity with coding agents, at &lt;a href="https://talkingpostgres.com/episodes/how-ai-is-changing-software-development-with-simon-willison#t=35m1s"&gt;35:01&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A lot of people will tell you it makes no sense to measure productivity in lines of code. I’d actually disagree, because there’s a hard limit. In the before-times, a software engineer could produce a few hundred lines of production-ready code per day — and 200 lines of working, debugged, production-level code is an incredibly good day. Most days you’d produce 50 or 60.&lt;/p&gt;
&lt;p&gt;If agents let you produce a thousand lines of debugged code, that really is a very meaningful improvement — as long as the code is the same quality: maintainable, tested, all of that. You can get to that point with agents, but it takes a huge amount of skill and knowledge and experience. That’s what senior engineers are made of.&lt;/p&gt;
&lt;p&gt;I can do way more work as a single engineer than I could without agents. So you could argue, why should a company have more than one engineer? Beyond the obvious bus factor thing — a team of one is a very badly designed team — the answer is that the new limiting factor is cognitive capacity. I can churn out code a hundred times faster. I don’t have the cognitive capacity to stay on top of 100 times the amount of code. So you still need a team of engineers, so you can load balance that cognitive capacity across the team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And this section on conceptual integrity at &lt;a href="https://talkingpostgres.com/episodes/how-ai-is-changing-software-development-with-simon-willison#t=46m3s"&gt;46:03&lt;/a&gt;, which Claire equated to the &lt;a href="https://en.wikipedia.org/wiki/Winchester_Mystery_House"&gt;Winchester Mystery House&lt;/a&gt;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Simon&lt;/strong&gt;: There’s a concept in &lt;em&gt;The Mythical Man-Month&lt;/em&gt; — conceptual integrity — where well-designed software has an integrity to it: there are no surprises in it, it covers exactly the right domain of things, everything fits together and makes sense. That’s so much harder with coding agents, where you can have an idea for a feature, run a prompt, and five minuteslater you’ve got the feature. Your software grows little weird bumps in funny different directions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Claire&lt;/strong&gt;: You know my analogy for that? The Winchester Mystery House.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simon&lt;/strong&gt;: It’s got 140 rooms, because the woman who built it was the widow of the guy who invented the Winchester rifle, and her psychic told her she’d be haunted by the ghosts of everyone killed with that rifle unless she kept building the house forever. So for 40 years she kept adding new rooms.

That’s exactly the problem with coding agents and software: it’s very easy to keep adding new rooms, because the cost of adding those rooms is so much cheaper. What you end up with is something where the conceptual integrity falls apart — and then it’s harder to make decisions about it.&lt;/p&gt;
&lt;p&gt;It all keeps coming back to discipline. It used to be that the discipline was enforced on you by the amount of time it took. You’d come up with an idea for a crazy feature and think “yeah, but that would take me a week — I cannot justify that, so I’ll forget about it.” If it takes an hour, it’s so much easier to justify.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(Side-note: the Wikipedia article includes credible sources that dispute the story about the psychic.)&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/podcast-appearances"&gt;podcast-appearances&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="podcast-appearances"/><category term="coding-agents"/></entry><entry><title>Mojo🔥 is now open source</title><link href="https://simonwillison.net/2026/Aug/18/mojo-is-now-open-source/" rel="alternate"/><published>2026-08-18T21:39:20+00:00</published><updated>2026-08-18T21:39:20+00:00</updated><id>https://simonwillison.net/2026/Aug/18/mojo-is-now-open-source/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.modular.com/blog/mojo-open-source"&gt;Mojo🔥 is now open source&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The Mojo programming language has been promising an open source release &lt;a href="https://simonwillison.net/2023/May/4/mojo/"&gt;since May 2023&lt;/a&gt;. Last week they &lt;a href="https://www.modular.com/blog/modular-26-5-mojo-1-0-is-here"&gt;shipped their 1.0&lt;/a&gt; and today they have followed through on that original promise, releasing the compiler and toolchain under an Apache 2 license.&lt;/p&gt;
&lt;p&gt;When Mojo first launched the stated goal was to produce a superset of Python, so existing Python code could be used to bootstrap their own ecosystem. That plan changed &lt;a href="https://forum.modular.com/t/mojo-vision-document-and-roadmap/2187"&gt;around August 2025&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mojo may or may not evolve into a full superset of Python, and it’s okay if it doesn’t.&lt;/p&gt;
&lt;p&gt;We’re encouraged by how well AI-assisted coding tools already help migrate Python to Mojo today, and we’re confident that future tooling and ecosystem maturity will make this evolution even smoother.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today Mojo is its own language, optimized to make GPU programming as painless as possible using syntax inspired by Python, if not 100% compatible with existing code.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://lobste.rs/s/01lxuf/mojo_is_now_open_source"&gt;Lobste.rs&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mojo"&gt;mojo&lt;/a&gt;&lt;/p&gt;



</summary><category term="open-source"/><category term="python"/><category term="mojo"/></entry><entry><title>Qwen 3.8 27B scores 52 on the Artificial Analysis Intelligence Index</title><link href="https://simonwillison.net/2026/Aug/17/qwen-38-27b-scores-52/" rel="alternate"/><published>2026-08-17T23:58:14+00:00</published><updated>2026-08-17T23:58:14+00:00</updated><id>https://simonwillison.net/2026/Aug/17/qwen-38-27b-scores-52/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://artificialanalysis.ai/models/qwen3-8-27b"&gt;Qwen 3.8 27B scores 52 on the Artificial Analysis Intelligence Index&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
That's the same score as GPT-5.6 Luna (max), and just one point behind GLM-5.2 (max) and DeepSeek V4 Pro 0813 (max) - that GLM is &lt;a href="https://huggingface.co/zai-org/GLM-5.2"&gt;753B&lt;/a&gt; and that DeepSeek is &lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro-0813"&gt;1.7T parameters&lt;/a&gt;, and Luna is size unknown but presumably a whole lot bigger than 27B.&lt;/p&gt;
&lt;p&gt;Qwen 3.8 27B is &lt;a href="https://simonwillison.net/2026/Aug/16/qwen-38-27b/"&gt;a truly astonishing model&lt;/a&gt;.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=49334544"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/qwen"&gt;qwen&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-in-china"&gt;ai-in-china&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/artificial-analysis"&gt;artificial-analysis&lt;/a&gt;&lt;/p&gt;



</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="qwen"/><category term="ai-in-china"/><category term="artificial-analysis"/></entry><entry><title>We Tracked a Shipment of Rare Books. It Ended at an Amazon AI Training Facility</title><link href="https://simonwillison.net/2026/Aug/17/we-tracked-a-shipment-of-rare-books-it-ended-at-an-amazon-ai-tra/" rel="alternate"/><published>2026-08-17T15:21:29+00:00</published><updated>2026-08-17T15:21:29+00:00</updated><id>https://simonwillison.net/2026/Aug/17/we-tracked-a-shipment-of-rare-books-it-ended-at-an-amazon-ai-tra/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.404media.co/we-tracked-a-shipment-of-rare-books-it-ended-at-an-amazon-ai-training-facility/"&gt;We Tracked a Shipment of Rare Books. It Ended at an Amazon AI Training Facility&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Excellent piece of reporting from 404 Media. For a while now there have been stories of book dealers receiving orders for large volumes of books from apparently price-insensitive anonymous customers, widely suspected to be companies looking to scan them for AI training (see &lt;a href="https://simonwillison.net/2025/Jun/24/anthropic-training/"&gt;my previous coverage&lt;/a&gt; of Anthropic's book scanning from June 2025.)&lt;/p&gt;
&lt;p&gt;404 Media investigated with an AirTag!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In July, one bookseller told me they received a very large order of around 1,000 books on Biblio, one of these marketplaces. The seller agreed to put an Apple AirTag provided by 404 Media in one of the books included in this order so we could see where the book was going. And by extension, which company, AI or otherwise, was behind this massive order.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The book ended up delivered to the VGT3 corner of the &lt;a href="https://maps.app.goo.gl/2hMqbHrovTSZxh1U9"&gt;LAS8 Amazon facility&lt;/a&gt; in the north east of Las Vegas, where the entrance carried this on-the-nose logo of a dinosaur with a book!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Photo of an office entrance. A logo in the window shows a red tyrannosaurus with a book, its claws clearly digging in and with a hint that it is more interested in destruction than reading." src="https://static.simonwillison.net/static/2026-08-17/IMG_7418.jpeg" /&gt;&lt;/p&gt;
&lt;p style="margin-top: -1em"&gt;&lt;small&gt;Photo credit: 404 Media&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Online forum discussions between Amazon workers confirmed that VGT3 destructively scans large volumes of books.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/amazon"&gt;amazon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/journalism"&gt;journalism&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/training-data"&gt;training-data&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-ethics"&gt;ai-ethics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/404-media"&gt;404-media&lt;/a&gt;&lt;/p&gt;



</summary><category term="amazon"/><category term="journalism"/><category term="ai"/><category term="training-data"/><category term="ai-ethics"/><category term="404-media"/></entry></feed>