<?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://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/atom/everything/" rel="self"/><id>http://simonwillison.net/</id><updated>2026-08-28T22:12:02+00:00</updated><author><name>Simon Willison</name></author><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;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><entry><title>Markdown SVG upgrades</title><link href="https://simonwillison.net/2026/Aug/16/markdown-svg-upgrades/" rel="alternate"/><published>2026-08-16T23:59:37+00:00</published><updated>2026-08-16T23:59:37+00:00</updated><id>https://simonwillison.net/2026/Aug/16/markdown-svg-upgrades/</id><summary type="html">
    &lt;p&gt;I started building my &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer"&gt;markdown-svg-renderer&lt;/a&gt; tool &lt;a href="https://tools.simonwillison.net/colophon#markdown-svg-renderer.html"&gt;in May&lt;/a&gt;, but I've since added enough features to it that it's worth talking about here again.&lt;/p&gt;
&lt;p&gt;It's evolved into my ideal tool for sharing Markdown transcripts that include SVG documents. Given my &lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle/"&gt;proclivity for drawing pelicans riding bicycles&lt;/a&gt; this is a problem that I needed to solve!&lt;/p&gt;
&lt;p&gt;The tool is very simple. Navigate to &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer"&gt;markdown-svg-renderer&lt;/a&gt; in your browser and paste in some Markdown to see it rendered... or save that Markdown to a CORS-friendly URL or a GitHub Gist and paste in a URL to that document.&lt;/p&gt;
&lt;p&gt;The URL option will give you a bookmarkable page, for example &lt;a style="overflow-wrap: anywhere;" href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F6f9e48293be5c916652d29f0dc0b0657"&gt;https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F6f9e48293be5c916652d29f0dc0b0657&lt;/a&gt; - which bakes in the URL to &lt;a href="https://gist.github.com/simonw/6f9e48293be5c916652d29f0dc0b0657"&gt;this Gist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you visit &lt;a href="https://gist.github.com/simonw/6f9e48293be5c916652d29f0dc0b0657"&gt;the Gist&lt;/a&gt; you'll see raw SVG:&lt;/p&gt;
&lt;p&gt;&lt;img alt="beautiful-circle.md. Here's a self-contained SVG — a &amp;quot;compass study&amp;quot; of a circle with construction lines, a slowly rotating tick ring, and an orbiting accent dot: a block of SVG code" src="https://static.simonwillison.net/static/2026/raw-svg.webp" /&gt;&lt;/p&gt;
&lt;p&gt;In the rendered tool that &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F6f9e48293be5c916652d29f0dc0b0657"&gt;looks like this&lt;/a&gt; instead:&lt;/p&gt;
&lt;p&gt;&lt;img alt="The same text, but now the code block has been replaced by a tabbed panel. The selected tab reads &amp;quot;Rendered&amp;quot; and shows the rendered PNG. The other tabs are PNG, JPEG, MP4, and Code" src="https://static.simonwillison.net/static/2026/rendered-svg.webp" /&gt;&lt;/p&gt;
&lt;p&gt;As you can see, that SVG block in the Markdown has been transformed into a rendered SVG (in this case animated) plus several tabs.&lt;/p&gt;
&lt;p&gt;The tabs are the really fun bit. The PNG and JPEG tabs render that SVG to those image formats in the browser and lets you copy or download them - useful for sharing on platforms that don't support SVG directly.&lt;/p&gt;
&lt;p&gt;The MP4 tab is &lt;a href="https://github.com/simonw/tools/commit/73e0327f6df9887ba2a9f9f16a2d06a45451d248"&gt;new today&lt;/a&gt; - it examines the SVG to see if it contains any animations, attempts to guess how long the looped video should be, then renders a whole bunch of frames of the animation and loads 30+MB of &lt;a href="https://github.com/ffmpegwasm/ffmpeg.wasm"&gt;ffmpeg.wasm&lt;/a&gt; so it can compile those frames into an MP4 video using the full power of FFMPEG compiled to WebAssembly and running in the browser.&lt;/p&gt;
&lt;p&gt;Being able to turn an animated SVG into a MP4 again makes it easy to share on platforms that can't support SVG animation natively. It's a neat trick!&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/svg"&gt;svg&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/markdown"&gt;markdown&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tools"&gt;tools&lt;/a&gt;&lt;/p&gt;



</summary><category term="svg"/><category term="markdown"/><category term="tools"/></entry><entry><title>Qwen 3.8 27B is excellent, but it defaults to wildly overthinking things</title><link href="https://simonwillison.net/2026/Aug/16/qwen-38-27b/" rel="alternate"/><published>2026-08-16T22:00:39+00:00</published><updated>2026-08-16T22:00:39+00:00</updated><id>https://simonwillison.net/2026/Aug/16/qwen-38-27b/</id><summary type="html">
    &lt;p&gt;Friday's big release was &lt;a href="https://huggingface.co/Qwen/Qwen3.8-27B"&gt;Qwen 3.8 27B&lt;/a&gt;, an Apache 2 licensed 27B parameter vision-capable LLM from Alibaba's Qwen research lab. I've been looking forward to this one: 27B is an excellent size for running a model on a reasonably specced laptop, and its predecessor &lt;a href="https://simonwillison.net/2026/Apr/22/qwen36-27b/"&gt;Qwen 3.6 27B&lt;/a&gt; was impressive.&lt;/p&gt;
&lt;p&gt;Qwen's &lt;a href="https://huggingface.co/Qwen/Qwen3.8-27B#benchmark-results"&gt;self-reported benchmarks&lt;/a&gt; for this model are eye-opening. They show a boost from both Qwen 3.6 27B &lt;em&gt;and&lt;/em&gt; the closed-weight Qwen 3.7-Plus, which was one of Qwen's strongest models of any size as recently as &lt;a href="https://qwen.ai/blog?id=qwen3.7-plus"&gt;May this year&lt;/a&gt;. It will be interesting to hear what independent benchmarks have to say about the model.&lt;/p&gt;
&lt;p&gt;I've been running the model on two different machines: my 128GB M5 Max MacBook Pro, and an &lt;a href="https://simonwillison.net/2025/Oct/14/nvidia-dgx-spark/"&gt;NVIDIA DGX Spark&lt;/a&gt;. On both machines I'm running LM Studio and &lt;a href="https://lmstudio.ai/models/qwen3.8"&gt;their 17GB Q4_K_M quantized build&lt;/a&gt;. I also tried  using &lt;code&gt;llama-server&lt;/code&gt; directly on the Spark.&lt;/p&gt;
&lt;h4 id="the-default-of-extra-high-results-in-spectacular-over-thinking"&gt;The default of extra high results in spectacular over-thinking&lt;/h4&gt;
&lt;p&gt;Qwen's documentation describes the model as defaulting to &lt;code&gt;xhigh&lt;/code&gt; for the reasoning effort, and the LM Studio GGUF I've been trying preserves that default:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Qwen3.8 comes with official support for &lt;code&gt;reasoning_effort&lt;/code&gt;, which can be used to adjust reasoning depth and control cost:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xhigh&lt;/code&gt; (default): for complex tasks demanding thorough analysis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;medium&lt;/code&gt;: balancing accuracy and speed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;low&lt;/code&gt;: efficient reasoning optimizing for speed and cost&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a &lt;em&gt;hilarious&lt;/em&gt; default. It's absolutely not a good way to run the model, especially on consumer hardware. I've been finding the results extremely entertaining.&lt;/p&gt;
&lt;p&gt;I quickly ran into problems with LM Studio's default context limit of 8,192 tokens - Qwen was using them all up thinking about even the most mundane of problems. I loaded the model with the full 262,144 maximum context length and that problem went away.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Ffc909bea4fecf752c7bf9bad0e9dbf2a"&gt;the pelican riding a bicycle&lt;/a&gt; SVG I got from my first attempt with that increased context length. It took &lt;strong&gt;21 minutes&lt;/strong&gt; to generate, using 22,276 reasoning tokens to produce 3,223 tokens of output. You can read &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2Ffc909bea4fecf752c7bf9bad0e9dbf2a"&gt;the reasoning trace here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/qwen-thinking-bicycle-27b.jpg" alt="A very pleasing image of a pelican riding a bicycle. The bicycle is red and has the correct frame shape. The pelican looks like a pelican and has its wing extended to the handlebars." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;This is by far the best pelican SVG I've been able to generate with a model that runs on a local machine - and this Qwen is pretty small, just a 17GB file on disk. There's a lot to like about this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The bicycle frame is the right shape&lt;/li&gt;
&lt;li&gt;It has legs on each side of the bike - that's &lt;em&gt;very&lt;/em&gt; rare&lt;/li&gt;
&lt;li&gt;Good, clear pelican pouch&lt;/li&gt;
&lt;li&gt;The wings extend to touch the handlebars!&lt;/li&gt;
&lt;li&gt;The motion lines are behind, not in front&lt;/li&gt;
&lt;li&gt;It has a tasteful background - nice sun, clouds, hill, flowers and grass.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Was that worth waiting 21 minutes for? Absolutely not.&lt;/p&gt;
&lt;p&gt;Here's that same prompt run with reasoning turned off - &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F1265cfa8dce2f9ad5eb160792ff45a49"&gt;transcript here&lt;/a&gt;. This one produced &lt;strong&gt;3,715 tokens&lt;/strong&gt; and took 137s - just over two minutes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/qwen-3.8-27b-no-reasoning-pelican-2.png" alt="The bicycle frame is a bad shape now. The pelican remains recognizable but has a less obvious pouch. The feet miss the pedal, there is no attempt to hold the handlebars." style="max-width: 100%;" /&gt;
And just for completeness, I used OpenRouter to run the same prompt through the much larger Qwen 3.8 2.4T-A95B (released &lt;a href="https://huggingface.co/Qwen/Qwen3.8-2.4T-A95B"&gt;last week&lt;/a&gt;) and got this snazzy &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F557016f0895b2abb4b9957caec781734"&gt;animated SVG&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;video
    controls="controls" loop="loop•"
    preload="none"
    poster="https://static.simonwillison.net/static/2026/qwen-animated-first-frame.jpg"
    width="720"
    height="548"
    style="display: block; width: 100%; height: auto;"
  &gt;
    &lt;source src="https://static.simonwillison.net/static/2026/qwen-animated-small.mp4" type="video/mp4" /&gt;
    Your browser does not support HTML5 video.
  &lt;/video&gt;
&lt;/p&gt;
&lt;p&gt;I said Qwen at xhigh has a tendency to over-think things, but how bad really is it?&lt;/p&gt;
&lt;p&gt;I tried a much simpler prompt, again with that default extra high setting:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;draw an svg of a circle&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Qwen's reasoning trace started like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The user is asking for an SVG drawing of a circle. Simple request — but I want it to be a carefully crafted piece. Let me make something that goes beyond just &lt;code&gt;&amp;lt;circle&amp;gt;&lt;/code&gt;: a single self-contained SVG file with character — maybe a geometric "circle study," with subtle animation, layered rings, and a distinctive palette.&lt;/p&gt;
&lt;p&gt;Keep the scope right: they asked for an SVG of a circle. So the core is a circle. But I can add craft: concentric guide circles (like a compass/geometry drawing), tick marks, a soft gradient fill on the main circle, restrained ambient motion (a slowly rotating dashed ring, pulsing glow). Respect prefers-reduced-motion? That's more for CSS; SVG SMIL or CSS inside SVG will do.&lt;/p&gt;
&lt;p&gt;Palette options: deep teal ink on warm paper? Or bold vermilion circle on off-white with navy construction lines — Bauhaus/compass-drawing vibe. Let me go with a "geometric study" look: cool slate background, or bright paper white? Paper white is fine if it's not the cream-and-terracotta combo. [...]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Several minutes later it &lt;a href="https://tools.simonwillison.net/markdown-svg-renderer#url=https%3A%2F%2Fgist.github.com%2Fsimonw%2F6f9e48293be5c916652d29f0dc0b0657"&gt;produced&lt;/a&gt; this &lt;em&gt;absolutely beautiful&lt;/em&gt; animated circle, which was entirely not what I had asked for!&lt;/p&gt;
&lt;p&gt;&lt;video
    controls="controls" loop="loop"
    preload="none"
    poster="https://static.simonwillison.net/static/2026/circle-web-first-frame.jpg"
    width="1078"
    height="1080"
    style="display: block; width: 100%; height: auto;"
  &gt;
    &lt;source src="https://static.simonwillison.net/static/2026/circle-web.mp4" type="video/mp4" /&gt;
    Your browser does not support HTML5 video.
  &lt;/video&gt;
&lt;/p&gt;
My strong recommendation: ignore that default. Run Qwen 3.8 27B on low or even no reasoning levels at first. It's a great model, but wow that default setting is a bad place to start.
&lt;h4 id="it-s-very-good-at-bounding-boxes"&gt;It's very good at bounding boxes&lt;/h4&gt;
&lt;p&gt;A fun way to test a vision model is to see how well it can return bounding boxes around items in a photograph. I've seen previous Qwen models deal well with this, so I decided to put it to the test drawing bounding boxes around some pelicans.&lt;/p&gt;
&lt;p&gt;I've seen asking for 0-1000 scale produce good results in the past. I tried this:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;llm -a https://static.inaturalist.org/photos/714731804/large.jpg \
  -m lmstudio/qwen/qwen3.8-27b \
  &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;Return JSON bounding boxes for the pelicans in this photo, 0-1000 scale for each dimension&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here's &lt;a href="https://gist.github.com/simonw/a05cc78b2061555bd61d3bb9686e689f"&gt;the reasoning trace&lt;/a&gt;, which produced this:&lt;/p&gt;
&lt;div class="highlight highlight-source-json"&gt;&lt;pre&gt;[
  {&lt;span class="pl-ent"&gt;"bbox_2d"&lt;/span&gt;: [&lt;span class="pl-c1"&gt;195&lt;/span&gt;, &lt;span class="pl-c1"&gt;290&lt;/span&gt;, &lt;span class="pl-c1"&gt;370&lt;/span&gt;, &lt;span class="pl-c1"&gt;780&lt;/span&gt;], &lt;span class="pl-ent"&gt;"label"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;pelicans&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;},
  {&lt;span class="pl-ent"&gt;"bbox_2d"&lt;/span&gt;: [&lt;span class="pl-c1"&gt;445&lt;/span&gt;, &lt;span class="pl-c1"&gt;320&lt;/span&gt;, &lt;span class="pl-c1"&gt;675&lt;/span&gt;, &lt;span class="pl-c1"&gt;850&lt;/span&gt;], &lt;span class="pl-ent"&gt;"label"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;pelicans&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;}
]&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is &lt;em&gt;such a good match&lt;/em&gt;. Here are those boxes rendered on top of the photo:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/qwen-over-engineered-bbox.webp" alt="A photograph of two pelicans on a rocky outcrop, with three other smaller birds. The pelicans both have bounding boxes exactly surrounding them, each with a label that says pelican." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;h4 id="building-a-tool-to-label-bounding-boxes"&gt;Building a tool to label bounding boxes&lt;/h4&gt;
&lt;p&gt;That visualization of the bounding boxes was taken using a new custom tool that I had Qwen 3.8 27B build for me, running offline on my laptop.&lt;/p&gt;
&lt;p&gt;I forgot to dial down the thinking effort so it was &lt;em&gt;massively over-engineered&lt;/em&gt;, but it did manage to produce &lt;a href="https://static.simonwillison.net/static/2026/qwen-over-thinking-bbox.html"&gt;this full interface&lt;/a&gt; from &lt;a href="https://gist.github.com/simonw/121ad098860028b2fab603fa12da1fd9"&gt;this single prompt&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;[
   {"bbox_2d": [195, 290, 370, 780], "label": "pelicans"},
   {"bbox_2d": [445, 320, 675, 850], "label": "pelicans"}
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Build an HTML page which has an input box for accepting the URL to an image and a textarea for accepting the above style of JSON.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;It appends the image to the page, measures its width and height, then treats the coords in the bbox_2d as scaled from 0-1000 and scales them against the actual width and height, then it renders labelled boxes over the image.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This screenshot shows one of the features I did &lt;em&gt;not&lt;/em&gt; ask for - a demo scene, for if you don't have a photograph to test the tool with:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/qwen-full-ui-with-pelicans.webp" alt="Screenshot of bbox·lab, a dark-themed web tool that overlays object-detection bounding boxes on an image, with an input panel on the left and a stage on the right showing two labeled boxes around stylized pelicans in a sunset illustration. Header: bbox·lab — normalized 0–1000 coords → pixel overlay; status indicator: RENDERED · 2 BOXES. Panel 01 INPUT (URL + detections) contains an IMAGE URL field reading data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+, a DETECTIONS — JSON textarea reading  {&amp;quot;bbox_2d&amp;quot;: 195, 290, 370, 780, &amp;quot;label&amp;quot;: &amp;quot;pelicans&amp;quot;}, {&amp;quot;bbox_2d&amp;quot;: 445, 320, 675, 850, &amp;quot;label&amp;quot;: &amp;quot;pelicans&amp;quot;} , an orange RENDER BOXES button, and dashed boxes labeled DEMO SCENE and CLEAR. Panel 03 STAGE header: display 661 × 661 px · 1 unit = 0.661px x 0.661px · nat 1000×1000. The stage shows a flat-style illustration of two dark pelican silhouettes with orange beaks standing in calm water against an orange-to-purple sunset sky with a pale yellow sun and distant birds; an orange bounding box labeled 1 · pelicans surrounds the left pelican and a cyan bounding box labeled 2 · pelicans surrounds the right pelican. Footer: move the cursor over the image to read grid coords; boxes map 0–1000 → displayed px." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;Here's the relevant segment of the thinking trace, where it decided to draw its own pelicans purely because I had used the label "pelicans" in the example JSON I gave it in the prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Also a "load sample" that uses a known image? Can't depend on external images, but… the image URL input is user-provided; I could add a "try with sample" button [...] Hmm, I can draw a simple scene on canvas, export it as a data URL, and load it into the image — that's self-contained and demo-able! [...] But the user's coords are for an actual pelican image; a generated placeholder can still demo the scaling. Generate a 1000x1000 placeholder: gradient water + two blob-like "pelican" silhouettes placed at the given bboxes (using the same scale — cute: silhouettes at the exact 0-1000 positions, showing the boxes align). This makes for a fun, self-contained demo. Keep it simple: sky gradient, sun, water, two pelican-ish shapes (ellipse body, circle head, beak). Place at bbox centers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(I'm slightly nervous that models around the world might have a bias towards drawing pelicans at any chance they can get, brought on by nearly two years of exposure to my own stupid benchmark.)&lt;/p&gt;
&lt;p&gt;Is all that over-thinking necessary? Maybe it is, at least a bit. I tried with reasoning turned off and got &lt;a href="https://static.simonwillison.net/static/2026/qwen-no-thinking-bbox.html"&gt;this version&lt;/a&gt;, (&lt;a href="https://gist.github.com/simonw/8e78b1c64d9a56d08eedb954aa9445ee"&gt;transcript here&lt;/a&gt;), which nearly works but shows the boxes in the wrong place:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/qwen-no-reasoning-bug.webp" alt="BBox Studio screenshot - a solid UI but the yellow and green boxes do not cover the pelicans." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;So without reasoning it didn't quite one-shot a working tool. I'm sure it could get there with some follow-up prompts, but this is a good example of how reasoning can make a difference.&lt;/p&gt;
&lt;h4 id="yes-it-can-drive-coding-agents"&gt;Yes, it can drive coding agents&lt;/h4&gt;
&lt;p&gt;One of the biggest questions around local models is whether or not they have enough horsepower to successfully run a coding agent loop. Coding agents require long context, strong code generation support and reliable tool-calling. On paper Qwen 3.8 27B has all three of these, so is it up to the task?&lt;/p&gt;
&lt;p&gt;My initial experiments with &lt;a href="https://pi.dev/"&gt;Pi&lt;/a&gt; have been very promising. I chose Pi because it has a shorter system prompt than most other options, making it a better fit for trying out smaller models.&lt;/p&gt;
&lt;p&gt;I configured Pi to use Qwen 3.8 27B running in LM Studio on the Spark (shared via &lt;code&gt;tailscale serve&lt;/code&gt;) by adding this to &lt;code&gt;~/.pi/agent/models.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-json"&gt;&lt;pre&gt;{
  &lt;span class="pl-ent"&gt;"providers"&lt;/span&gt;: {
    &lt;span class="pl-ent"&gt;"spark"&lt;/span&gt;: {
      &lt;span class="pl-ent"&gt;"baseUrl"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;https://spark-18b3.tail68a31.ts.net/v1&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="pl-ent"&gt;"api"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;openai-responses&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="pl-ent"&gt;"apiKey"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;dummy&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="pl-ent"&gt;"models"&lt;/span&gt;: [
        {
          &lt;span class="pl-ent"&gt;"id"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;qwen3.8-27b&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
          &lt;span class="pl-ent"&gt;"reasoning"&lt;/span&gt;: &lt;span class="pl-c1"&gt;true&lt;/span&gt;
        }
      ]
    }
  }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then ran &lt;code&gt;pi --provider spark --model qwen3.8-27b&lt;/code&gt; in my &lt;code&gt;~/dev/datasette&lt;/code&gt; folder and prompted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;how does auth work?&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After a sequence of reasoning and tool calls that accessed a bunch of different files it produced &lt;a href="https://gist.github.com/simonw/6693d74a6bd45f641d43ceb9961dd95f#core-idea-actors--plugins-no-built-in-user-accounts"&gt;this reply&lt;/a&gt;, which is very solid.&lt;/p&gt;
&lt;p&gt;Just one problem: I wanted to share that transcript. So I pointed Pi and Qwen 3.8 27B at the JSONL transcript file in &lt;code&gt;~/.pi/agent/sessions/--Users-simon-Dropbox-dev-datasette--&lt;/code&gt; and prompted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Write Python code to convert this jsonl to markdown&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And it built and tested this &lt;a href="https://github.com/simonw/tools/blob/main/python/pi_jsonl_to_md.py"&gt;pi_jsonl_to_md.py&lt;/a&gt;, which did exactly what I needed. Here's &lt;a href="https://gist.github.com/simonw/491e55ac9d741202ea0af5d9d93775d4"&gt;that session transcript&lt;/a&gt;, published using the tool that it created.&lt;/p&gt;
&lt;h4 id="the-quest-for-speed"&gt;The quest for speed&lt;/h4&gt;
&lt;p&gt;So far this is all looking &lt;em&gt;very&lt;/em&gt; promising. We have a 17GB model that runs on high-end consumer hardware and can write code, drive tools, annotate images and generally do everything that I need from an LLM for getting real work done.&lt;/p&gt;
&lt;p&gt;There's one very significant catch: it feels slow - especially when it starts over-thinking, but even without that it's not particularly sprightly.&lt;/p&gt;
&lt;p&gt;I've been getting around 15-30 tokens a second from LM Studio. That's not terrible, but it's slow enough that it's going to be hard to win me away from hosted API models, which can return results a whole lot faster. Artificial Analysis &lt;a href="https://artificialanalysis.ai/models#speed"&gt;track token speed&lt;/a&gt; and show OpenAI 5.6 Sol at 74 tokens/second and 5.6 Luna at an impressive 184/second.&lt;/p&gt;
&lt;p&gt;The good news is that the community have been exploring ways to speed things up since the model was first released two days ago.&lt;/p&gt;
&lt;p&gt;One of the most promising optimizations is baked into the model itself. Qwen supports &lt;a href="https://sebastianraschka.com/llm-architecture-gallery/mtp/"&gt;Multi-Token Prediction&lt;/a&gt;, an architecture trick where a cheaper mechanism guesses several tokens ahead and the main model can then quickly verify if the guesses were correct. This can have quite a dramatic effect on inference performance.&lt;/p&gt;
&lt;p&gt;Based on &lt;a href="https://twitter.com/ggerganov/status/2088340681701925253"&gt;this tweet&lt;/a&gt; from &lt;code&gt;llama.cpp&lt;/code&gt; creator Georgi Gerganov I tried running the model with MTP like this on the Spark:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;llama serve \
 -hf  ggml-org/Qwen3.8-27B-GGUF:Q4_K_M \
 -hfd ggml-org/Qwen3.8-27B-GGUF:Q4_0 \
 --spec-default \
 --spec-type draft-mtp \
 --reasoning-preserve&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And sure enough, this gave me a significant boost. I had GPT-5.6 in Codex run &lt;a href="https://gist.github.com/simonw/b08c7eb9c126c806ba8987e269ea736b"&gt;a comparative benchmark on the Spark&lt;/a&gt; and the &lt;code&gt;--spec-type draft-mtp&lt;/code&gt; server outperformed the LM Studio default GGUF by around 72%.&lt;/p&gt;
&lt;p&gt;I expect we'll see a whole lot more innovation around serving this model faster over the next few weeks. The MLX community likely have some tricks brewing as well.&lt;/p&gt;
&lt;h4 id="some-observations"&gt;Some observations&lt;/h4&gt;
&lt;p&gt;The fact that a 17GB file can do all of this stuff on my home machines is a &lt;em&gt;miracle&lt;/em&gt;. Once again, I'm delighted and amazed at how much progress local models have made this year. A year ago this would have been competitive with the best and most expensive of the proprietary models - today it can run on a capable laptop.&lt;/p&gt;
&lt;p&gt;The only thing holding this back from being a daily driver is performance. It feels pretty slow on both the M5 Mac and the DGX Spark. That's the catch with these dense (non-Mixture-of-Experts) models - they require a whole lot of memory bandwidth to perform well, and neither of the machines I have access to are top performers in that regard.&lt;/p&gt;
&lt;p&gt;The most important thing about Qwen 3.8 27B is &lt;strong&gt;what it demonstrates&lt;/strong&gt;. We can have an open weights general purpose model with a long context, effective tool calling, strong vision ability, and competent code generation, and we can fit the whole thing in just a 17GB file.&lt;/p&gt;
&lt;p&gt;The models at this size continue to get better at an impressive rate. We don't need to spend half a million dollars on datacenter-class hardware just to run a competent model.&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/local-llms"&gt;local-llms&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/llm-reasoning"&gt;llm-reasoning&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llama-cpp"&gt;llama-cpp&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/coding-agents"&gt;coding-agents&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lm-studio"&gt;lm-studio&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;a href="https://simonwillison.net/tags/pi"&gt;pi&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ai"/><category term="generative-ai"/><category term="local-llms"/><category term="llms"/><category term="qwen"/><category term="pelican-riding-a-bicycle"/><category term="llm-reasoning"/><category term="llama-cpp"/><category term="llm-release"/><category term="coding-agents"/><category term="lm-studio"/><category term="ai-in-china"/><category term="nvidia-spark"/><category term="pi"/></entry><entry><title>Quoting Dario Amodei</title><link href="https://simonwillison.net/2026/Aug/16/dario-amodei/" rel="alternate"/><published>2026-08-16T15:05:36+00:00</published><updated>2026-08-16T15:05:36+00:00</updated><id>https://simonwillison.net/2026/Aug/16/dario-amodei/</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/darioamodei/status/2088758819304443967"&gt;&lt;p&gt;I do agree that the public has a negative view of AI (and that this is a big problem), but I don’t think it is primarily caused by me or any other AI leader warning about AI’s risks.  I think it is fundamentally a crisis of trust.  I think that ordinary people don’t trust companies, governments, or the tech industry and always suspect that we are cooking up some new way to screw them over.  The causes of this go back decades and AI is just the latest iteration of it.  I don’t think that a glitzy marketing campaign with a positive spin (which some have advocated that Anthropic do) is the way to win back that trust — at this point, saying that AI will cure cancer is more a cliche than it is inspiring, and most people think it is deceptive.  The thing that will work is &lt;em&gt;actually curing cancer&lt;/em&gt;.  I think by far the most accurate criticism of AI companies including Anthropic is that we haven’t yet delivered on our big promises to benefit the world.  That is totally on us, and I think it’s the criticism you should be making, instead of all this stuff about messaging and marketing.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/darioamodei/status/2088758819304443967"&gt;Dario Amodei&lt;/a&gt;&lt;/p&gt;

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



</summary><category term="anthropic"/><category term="ai"/><category term="ai-backlash"/></entry><entry><title>CORS Chat</title><link href="https://simonwillison.net/2026/Aug/15/cors-chat/" rel="alternate"/><published>2026-08-15T14:49:54+00:00</published><updated>2026-08-15T14:49:54+00:00</updated><id>https://simonwillison.net/2026/Aug/15/cors-chat/</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://tools.simonwillison.net/cors-chat"&gt;CORS Chat&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;I built this today (&lt;a href="https://gist.github.com/simonw/92a1d97773744b45bf259e003013cf36"&gt;with GPT-5.6-Sol xhigh&lt;/a&gt;) to help test Qwen 3.8 27B running in LM Studio on both my M5 MacBook Pro and an NVIDIA DGX Spark.&lt;/p&gt;
&lt;p&gt;It provides a web UI for exercising an OpenAI-Responses-compatible chat endpoint. I've tried it against LM Studio with the &lt;code&gt;--cors&lt;/code&gt; option and OpenRouter, and both work fine.&lt;/p&gt;
&lt;p&gt;Conversations are persisted in the browser and can be exported as copy-pasted JSON. One fun detail is that it notices SVG images that are being generated and progressively renders them in the chat while the tokens are still streaming in.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Alt text generated by Qwen-3.8 27B: Screenshot of the CORS Chat web interface. The left sidebar lists three saved conversations, with &amp;quot;render an svg of five intersecting squares&amp;quot; selected. The main panel shows a chat with the qwen3.8‑27b model: the user asked &amp;quot;render an svg of five intersecting squares. don't overthink this,&amp;quot; followed by the model's reasoning trace describing the design (five semi‑transparent squares rotated around a common center on a dark background). Below is an SVG preview pane displaying five overlapping, semi‑transparent colored squares—pink, blue, green, yellow, and purple—with white outlines, rotated at different angles to form a starburst pattern on a dark navy background. Top controls include endpoint/model selectors and a &amp;quot;New chat&amp;quot; button; the bottom has a message input and a &amp;quot;Send&amp;quot; button." src="https://static.simonwillison.net/static/2026/cors-chat.webp" /&gt;&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/svg"&gt;svg&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/cors"&gt;cors&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openrouter"&gt;openrouter&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lm-studio"&gt;lm-studio&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="svg"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="cors"/><category term="openrouter"/><category term="lm-studio"/></entry><entry><title>Northern Gannet</title><link href="https://simonwillison.net/2026/Aug/15/sighting-391300422/" rel="alternate"/><published>2026-08-15T03:22:00+00:00</published><updated>2026-08-15T03:22:00+00:00</updated><id>https://simonwillison.net/2026/Aug/15/sighting-391300422/</id><summary type="html">
    
        &lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/716984157/large.jpg" alt="Northern Gannet"&gt;&lt;/p&gt;&lt;p&gt;Northern Gannet, in Pillar Point Harbor, CA, US&lt;/p&gt;&lt;p&gt;This is Morris.&lt;/p&gt;
&lt;p&gt;Morris is a local celebrity: the only known Northern Gannet (&lt;em&gt;Morus bassanus&lt;/em&gt;) in the entire Pacific Ocean.&lt;/p&gt;
&lt;p&gt;They showed up in the Farallon Islands off the coast of San Francisco &lt;a href="https://baynature.org/magazine/spring2017/atlantic-bird-makes-home-california-maybe-melting-arctic-ice/"&gt;14 years ago&lt;/a&gt;. They have since made Pillar Point harbor their home, where they are quite easy to spot: the only white bird with a yellow head, usually hanging out with the smaller black Brandt’s cormorants near the harbor sign visible from the end of the commercial pier.&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/photography"&gt;photography&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/wildlife"&gt;wildlife&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/half-moon-bay"&gt;half-moon-bay&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="photography"/><category term="wildlife"/><category term="half-moon-bay"/></entry><entry><title>Don't classify. Hallucinate!</title><link href="https://simonwillison.net/2026/Aug/14/dont-classify-hallucinate/" rel="alternate"/><published>2026-08-14T21:54:35+00:00</published><updated>2026-08-14T21:54:35+00:00</updated><id>https://simonwillison.net/2026/Aug/14/dont-classify-hallucinate/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://softwaredoug.com/blog/2026/08/10/hypothetical-classifications"&gt;Don&amp;#x27;t classify. Hallucinate!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I still have quite a bit of older content on my blog that I never got round to tagging. My blog has &lt;a href="https://simonwillison.net/"&gt;1,856 tags&lt;/a&gt; - likely too many to feed to an LLM in one go and say "which of these tags match the following content".&lt;/p&gt;
&lt;p&gt;Doug Turnbull has a neat solution. Tell the model to output tags without any details of the existing vocabulary, then use vector embeddings against the existing corpus to find the concrete tags that are closest to the ones the model imagined might fit!&lt;/p&gt;
&lt;p&gt;His example prompt suggests including an example of the shape of your tags to help the model make a more useful guess:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Your task is to create novel, never seen before, furniture, home goods, or hardware classification that best fit a search query.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Product classifications might look like:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Furniture / Living Room Furniture / Coffee Tables &amp;amp; End Tables / Coffee Tables&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Décor &amp;amp; Pillows / Decorative Pillows &amp;amp; Blankets / Throw Pillows&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Furniture / Bedroom Furniture / Dressers &amp;amp; Chests&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Kitchen &amp;amp; Tabletop / Kitchen Organization / Food Storage &amp;amp; Canisters&lt;/code&gt;&lt;br&gt;
&lt;code&gt;School Furniture and Supplies / School Furniture / School Chairs &amp;amp; Seating / Stackable Chairs&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Baby &amp;amp; Kids / Toddler &amp;amp; Kids Bedroom Furniture / Kids Beds&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Here's the query to generate classifications for:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;brown coffee table&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/search"&gt;search&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/embeddings"&gt;embeddings&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/doug-turnbull"&gt;doug-turnbull&lt;/a&gt;&lt;/p&gt;



</summary><category term="search"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="embeddings"/><category term="doug-turnbull"/></entry></feed>