<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog</title><link href="http://feeds.simonwillison.net/" rel="alternate"/><link href="http://feeds.simonwillison.net/atom/everything/" rel="self"/><id>http://feeds.simonwillison.net/</id><updated>2026-05-22T04:48:32+00:00</updated><author><name>Simon Willison</name></author><entry><title>FTC to Require Cox Media Group, Two Other Firms to Pay Nearly $1 Million to Settle Charges They Deceived Customers About “Active Listening” AI-Powered Marketing Service</title><link href="https://simonwillison.net/2026/May/22/ftc-active-listening/#atom-everything" rel="alternate"/><published>2026-05-22T04:48:32+00:00</published><updated>2026-05-22T04:48:32+00:00</updated><id>https://simonwillison.net/2026/May/22/ftc-active-listening/#atom-everything</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.ftc.gov/news-events/news/press-releases/2026/05/ftc-require-cox-media-group-two-other-firms-pay-nearly-1-million-settle-charges-they-deceived"&gt;FTC to Require Cox Media Group, Two Other Firms to Pay Nearly $1 Million to Settle Charges They Deceived Customers About “Active Listening” AI-Powered Marketing Service&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Back in 2024 Cox Media Group were caught trying to sell advertisers packages based on "active listening", with &lt;a href="https://www.documentcloud.org/documents/25051283-cmg-pitch-deck-on-voice-data-advertising-active-listening/"&gt;this deck&lt;/a&gt; which claimed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Smart devices capture real-time intent data by listening to our conversations&lt;/li&gt;
&lt;li&gt;Advertisers can pair this voice-data with behavioral data to target in-market consumers&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wrote about this &lt;a href="https://simonwillison.net/2024/Sep/2/facebook-cmg/"&gt;in September 2024&lt;/a&gt;. My theory:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think &lt;strong&gt;active listening&lt;/strong&gt; is the term that the team came up with for “something that sounds fancy but really just means the way ad targeting platforms work already”. Then they got over-excited about the new metaphor and added that first couple of slides that talk about “voice data”, without really understanding how the tech works or what kind of a shitstorm that could kick off when people who DID understand technology started paying attention to their marketing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This FTC press release appears to confirm that's pretty much what happened:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CMG, MindSift and 1010 Digital Works claimed their “Active Listening” branded marketing service listened in on consumers’ conversations overheard by smart devices, in real time, to target advertising [...]&lt;/p&gt;
&lt;p&gt;According to the complaints, this service did not, in fact, listen in on consumers’ conversations or use voice data at all—nor did the service accurately place ads in customers’ desired locations. Instead, the service the companies provided consisted of reselling—at a significant markup—email lists obtained from other data brokers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The FTC also clarify that hiding an "opt-in" to using voice data in terms of service would not be acceptable, as tricks like that do not constitute "adequate consent":&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The FTC also alleged that all three companies deceived potential customers by claiming that consumers had opted into the Active Listening service. The company, however, did not seek or obtain consumers’ consent, according to the complaints. Instead, the companies claimed that consumers had “opted in” by agreeing to the terms of service that people have to accept when downloading and using apps. Clicking through mandatory terms of service does not constitute “opt-in consent” for such an invasive service or for use of consumers’ voice data from inside their homes. If the Active Listening service had functioned as advertised, this collection and use of consumers’ voice data without adequate consent would itself violate Section 5 of the FTC Act.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Attempting to myth bust &lt;a href="https://simonwillison.net/tags/microphone-ads-conspiracy/"&gt;the conspiracy theory&lt;/a&gt; that our mobile devices target ads to us based on spying through the microphones continues to be my least rewarding niche online hobby. It's nice to have a new piece of ammunition.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/nydiatisdale/status/2057657844321705993"&gt;@nydiatisdale&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/privacy"&gt;privacy&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microphone-ads-conspiracy"&gt;microphone-ads-conspiracy&lt;/a&gt;&lt;/p&gt;



</summary><category term="privacy"/><category term="microphone-ads-conspiracy"/></entry><entry><title>Datasette Agent</title><link href="https://simonwillison.net/2026/May/21/datasette-agent/#atom-everything" rel="alternate"/><published>2026-05-21T19:52:19+00:00</published><updated>2026-05-21T19:52:19+00:00</updated><id>https://simonwillison.net/2026/May/21/datasette-agent/#atom-everything</id><summary type="html">
    &lt;p&gt;We just &lt;a href="https://datasette.io/blog/2026/datasette-agent/"&gt;announced the first release of Datasette Agent&lt;/a&gt;, a new extensible AI assistant for Datasette. I've been working on my &lt;a href="https://llm.datasette.io/"&gt;LLM&lt;/a&gt; Python library for just over three years now, and Datasette Agent represents the moment that LLM and &lt;a href="https://datasette.io/"&gt;Datasette&lt;/a&gt; finally come together. I'm really excited about it!&lt;/p&gt;
&lt;p&gt;Datasette Agent provides a conversational interface for asking questions of the data you have stored in Datasette. Add the &lt;a href="https://github.com/datasette/datasette-agent-charts"&gt;datasette-agent-charts&lt;/a&gt; plugin and it can generate charts of your data as well.&lt;/p&gt;
&lt;h4 id="the-demo"&gt;The demo&lt;/h4&gt;
&lt;p&gt;The &lt;a href=""&gt;announcement post&lt;/a&gt; (on the new Datasette project blog) includes this &lt;a href="https://www.youtube.com/watch?v=AFZKp6hbFjI"&gt;demo video&lt;/a&gt;:&lt;/p&gt;

&lt;iframe style="margin-bottom: 1.5em;" width="560" height="315" src="https://www.youtube-nocookie.com/embed/AFZKp6hbFjI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"&gt; &lt;/iframe&gt;


&lt;p&gt;I recorded the video against the new &lt;a href="https://agent.datasette.io/"&gt;agent.datasette.io&lt;/a&gt; live demo instance, which runs Datasette Agent against example databases including the classic &lt;a href="https://datasette.io/global-power-plants"&gt;global-power-plants&lt;/a&gt; by &lt;a href="https://www.wri.org/research/global-database-power-plants"&gt;WRI&lt;/a&gt;, and a copy of the &lt;a href="https://datasette.simonwillison.net/"&gt;Datasette backup&lt;/a&gt; of my blog.&lt;/p&gt;
&lt;p&gt;The live demo runs on &lt;a href="https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite"&gt;Gemini 3.1 Flash-Lite&lt;/a&gt; - it's cheap, fast and has no trouble writing SQLite queries.&lt;/p&gt;
&lt;p&gt;A question I asked in the demo was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;when did Simon most recently see a pelican?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Which ran &lt;a href="https://datasette.simonwillison.net/simonwillisonblog?sql=SELECT+title%2C+commentary%2C+created+FROM+blog_beat+WHERE+beat_type+%3D+%27sighting%27+AND+%28title+LIKE+%27%25pelican%25%27+OR+commentary+LIKE+%27%25pelican%25%27%29+ORDER+BY+created+DESC+LIMIT+5"&gt;this SQL query&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-sql"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;SELECT&lt;/span&gt;
  title, commentary, created
&lt;span class="pl-k"&gt;FROM&lt;/span&gt;
  blog_beat
&lt;span class="pl-k"&gt;WHERE&lt;/span&gt;
  beat_type &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;sighting&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
  &lt;span class="pl-k"&gt;AND&lt;/span&gt; (title &lt;span class="pl-k"&gt;LIKE&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;%pelican%&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;OR&lt;/span&gt; commentary &lt;span class="pl-k"&gt;LIKE&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;%pelican%&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;span class="pl-k"&gt;ORDER BY&lt;/span&gt;
  created &lt;span class="pl-k"&gt;DESC&lt;/span&gt;
&lt;span class="pl-k"&gt;LIMIT&lt;/span&gt;
  &lt;span class="pl-c1"&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And replied:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The most recent sighting of a pelican by Simon was recorded on &lt;strong&gt;May 20, 2026&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The observation included a California Brown Pelican, along with a Common Loon, Canada Goose, Striped Shore Crab, and a California Sea Lion.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here's &lt;a href="https://simonwillison.net/2026/May/20/sighting-363395265/"&gt;that sighting on my blog&lt;/a&gt;, and the &lt;a href="https://gist.github.com/simonw/a46d17b69659a4866adb1d868280091d"&gt;Markdown export&lt;/a&gt; of the full conversation transcript.&lt;/p&gt;
&lt;h4 id="the-plugins"&gt;The plugins&lt;/h4&gt;
&lt;p&gt;My favorite feature of Datasette Agent is that, like the rest of Datasette, it's extensible using plugins.&lt;/p&gt;
&lt;p&gt;We've shipped three plugins so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/datasette/datasette-agent-charts"&gt;datasette-agent-charts&lt;/a&gt;, shown in the video, adds charts to Datasette Agent, powered by &lt;a href="https://observablehq.com/plot/"&gt;Observable Plot&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/datasette/datasette-agent-openai-imagegen"&gt;datasette-agent-openai-imagegen&lt;/a&gt; adds an image generation tool to Datasette Agent using &lt;a href="https://openai.com/index/introducing-chatgpt-images-2-0/"&gt;ChatGPT Images 2.0&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/datasette/datasette-agent-sprites"&gt;datasette-agent-sprites&lt;/a&gt; provides tools for executing code in a &lt;a href="https://sprites.dev/"&gt;Fly Sprites&lt;/a&gt; persistent sandbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Building plugins is &lt;em&gt;really fun&lt;/em&gt;. I have a bunch more prototypes that aren't quite alpha-quality yet.&lt;/p&gt;
&lt;p&gt;Claude Code and OpenAI Codex are both proving excellent at writing plugins - just point them at a checkout of the &lt;a href="https://github.com/datasette/datasette-agent"&gt;datasette-agent repo&lt;/a&gt; for reference and tell them what you want to build!&lt;/p&gt;
&lt;h4 id="running-it-against-local-models"&gt;Running it against local models&lt;/h4&gt;
&lt;p&gt;I've also been having fun running the new plugin against local models. Here's a &lt;code&gt;uv&lt;/code&gt; one-liner to run the plugin against &lt;a href="https://huggingface.co/google/gemma-4-26B-A4B"&gt;gemma-4-26b-a4b&lt;/a&gt; in &lt;a href="https://lmstudio.ai"&gt;LM Studio&lt;/a&gt; on a Mac:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell"&gt;&lt;pre&gt;uvx --prerelease=allow \
  --with datasette-agent --with llm-lmstudio \
  datasette --internal internal.db --root \
  -s plugins.datasette-llm.default_model lmstudio/google/gemma-4-26b-a4b \
  data.db&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Datasette Agent needs reliable tool calls and the ability for a model to produce SQL queries that run against SQLite. The open weight models released in the past six months are increasingly able to handle that.&lt;/p&gt;
&lt;h4 id="what-s-next"&gt;What's next&lt;/h4&gt;
&lt;p&gt;Datasette Agent opens up &lt;em&gt;so many&lt;/em&gt; opportunities for the LLM and Datasette ecosystem in general.&lt;/p&gt;
&lt;p&gt;It's already informed &lt;a href="https://simonwillison.net/2026/Apr/29/llm/"&gt;the major LLM 0.32a0 refactor&lt;/a&gt; which I'm nearly ready to roll into a stable release, maybe with some additional "LLM agent" abstractions extracte from Datasette Agent itself.&lt;/p&gt;
&lt;p&gt;I've been exploring my own take on the Claude Artifacts, which is shaping up nicely as a plugin.&lt;/p&gt;
&lt;p&gt;I'm excited to use Datasette Agent to build my own &lt;a href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.013.jpeg"&gt;Claw&lt;/a&gt; - a personal AI assistant built around data imported from different parts of my digital life, which is a neat excuse to revisit my older &lt;a href="https://dogsheep.github.io"&gt;Dogsheep&lt;/a&gt; family of tools.&lt;/p&gt;
&lt;p&gt;We'll also be rolling out Datasette Agent for users of &lt;a href="https://datasette.cloud/"&gt;Datasette Cloud&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Join our &lt;a href="https://discord.gg/hdxyusUFv"&gt;#datasette-agent Discord channel&lt;/a&gt; if you'd like to talk about the project.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&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/llm"&gt;llm&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/uv"&gt;uv&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette-agent"&gt;datasette-agent&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="projects"/><category term="sqlite"/><category term="ai"/><category term="datasette"/><category term="generative-ai"/><category term="llms"/><category term="llm"/><category term="uv"/><category term="datasette-agent"/></entry><entry><title>datasette-agent-sprites 0.1a0</title><link href="https://simonwillison.net/2026/May/21/datasette-agent-sprites/#atom-everything" rel="alternate"/><published>2026-05-21T18:21:07+00:00</published><updated>2026-05-21T18:21:07+00:00</updated><id>https://simonwillison.net/2026/May/21/datasette-agent-sprites/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-agent-sprites/releases/tag/0.1a0"&gt;datasette-agent-sprites 0.1a0&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;A Datasette Agent plugin for running commands in a &lt;a href="https://sprites.dev"&gt;Fly Sprites&lt;/a&gt; sandbox.&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/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fly"&gt;fly&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette-agent"&gt;datasette-agent&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="sandboxing"/><category term="datasette"/><category term="fly"/><category term="datasette-agent"/></entry><entry><title>datasette-agent-charts 0.1a2</title><link href="https://simonwillison.net/2026/May/21/datasette-agent-charts/#atom-everything" rel="alternate"/><published>2026-05-21T15:15:58+00:00</published><updated>2026-05-21T15:15:58+00:00</updated><id>https://simonwillison.net/2026/May/21/datasette-agent-charts/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-agent-charts/releases/tag/0.1a2"&gt;datasette-agent-charts 0.1a2&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;"View SQL query" buttons below rendered charts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette-agent"&gt;datasette-agent&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="datasette"/><category term="datasette-agent"/></entry><entry><title>datasette-agent 0.1a3</title><link href="https://simonwillison.net/2026/May/21/datasette-agent-2/#atom-everything" rel="alternate"/><published>2026-05-21T15:04:09+00:00</published><updated>2026-05-21T15:04:09+00:00</updated><id>https://simonwillison.net/2026/May/21/datasette-agent-2/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-agent/releases/tag/0.1a3"&gt;datasette-agent 0.1a3&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;"View SQL query" buttons for both visible tables and collapsed SQL result tool calls.&lt;/li&gt;
&lt;li&gt;Don't display empty reasoning chunks&lt;/li&gt;
&lt;li&gt;Improved handling of truncated responses - table still displays to the user even if the SQL results were truncated when showing the agent.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;See &lt;a href="https://datasette.io/blog/2026/datasette-agent/"&gt;Datasette Agent, an extensible AI assistant for Datasette&lt;/a&gt;.&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette-agent"&gt;datasette-agent&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="datasette"/><category term="datasette-agent"/></entry><entry><title>Quoting SpaceX S-1</title><link href="https://simonwillison.net/2026/May/20/spacex-s1/#atom-everything" rel="alternate"/><published>2026-05-20T22:26:36+00:00</published><updated>2026-05-20T22:26:36+00:00</updated><id>https://simonwillison.net/2026/May/20/spacex-s1/#atom-everything</id><summary type="html">
    &lt;blockquote cite="https://www.sec.gov/Archives/edgar/data/1181412/000162828026036936/spaceexplorationtechnologi.htm"&gt;&lt;p&gt;We have the ability to use compute resources to support our proprietary AI applications (such as Grok 5, which is currently being trained at COLOSSUS II), while also providing access to select compute capacity to third-party customers. For example, in May 2026, we entered into &lt;strong&gt;Cloud Services Agreements with Anthropic PBC&lt;/strong&gt; (“Anthropic”), an AI research and development public benefit corporation, with respect to access to &lt;strong&gt;compute capacity across COLOSSUS and COLOSSUS II&lt;/strong&gt;. Pursuant to these agreements, the customer &lt;strong&gt;has agreed to pay us $1.25 billion per month&lt;/strong&gt; through May 2029, with capacity ramping in May and June 2026 at a reduced fee. The agreements may be terminated by either party upon 90 days’ notice.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.sec.gov/Archives/edgar/data/1181412/000162828026036936/spaceexplorationtechnologi.htm"&gt;SpaceX S-1&lt;/a&gt;, highlights mine&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/grok"&gt;grok&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"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;&lt;/p&gt;



</summary><category term="anthropic"/><category term="grok"/><category term="generative-ai"/><category term="ai"/><category term="llms"/></entry><entry><title>How fast is 10 tokens per second really?</title><link href="https://simonwillison.net/2026/May/20/tokens-per-second/#atom-everything" rel="alternate"/><published>2026-05-20T17:57:45+00:00</published><updated>2026-05-20T17:57:45+00:00</updated><id>https://simonwillison.net/2026/May/20/tokens-per-second/#atom-everything</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://mikeveerman.github.io/tokenspeed/"&gt;How fast is 10 tokens per second really?&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Neat little HTML app by Mike Veerman (&lt;a href="https://github.com/MikeVeerman/tokenspeed/blob/master/index.html"&gt;source code here&lt;/a&gt;) which simulates LLM token output speeds from 5/second to 800/second.&lt;/p&gt;
&lt;p&gt;Useful if you see a model advertised as "30 tokens/second" and want to get a feel for what that actually looks like.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=48174920"&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;/p&gt;



</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/></entry><entry><title>Google I/O, Gemini Spark, Antigravity</title><link href="https://simonwillison.net/2026/May/20/google-io/#atom-everything" rel="alternate"/><published>2026-05-20T15:32:17+00:00</published><updated>2026-05-20T15:32:17+00:00</updated><id>https://simonwillison.net/2026/May/20/google-io/#atom-everything</id><summary type="html">
    &lt;p&gt;It's hard to find much to write about Google I/O this year because I have a policy of not writing about anything that I can't try out myself, and a lot of the big announcements are "coming soon".&lt;/p&gt;
&lt;p&gt;I actually prefer to write about things that are in general availability, because I've had instances in the past where the previews didn't match what was released to the general public later on.&lt;/p&gt;
&lt;p&gt;Aside from &lt;a href="https://simonwillison.net/2026/May/19/gemini-35-flash/"&gt;Gemini 3.5 Flash&lt;/a&gt; the most interesting announcement looks to be Google's upcoming OpenClaw competitor &lt;a href="https://gemini.google/overview/agent/spark/"&gt;Gemini Spark&lt;/a&gt;, described as "your personal AI agent" which can "connect natively with your favorite Google apps like Gmail, Calendar, Drive, Docs, Sheets, Slides, YouTube, and Google Maps". The FAQ for that also includes this confusing detail:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What Gemini model does Gemini Spark run on?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Gemini Spark runs on Gemini 3.5 Flash and Antigravity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;a href="https://antigravity.google/"&gt;antigravity.google&lt;/a&gt; website currently lists Antigravity as a desktop app, a CLI agent tool (written in Go), the &lt;a href="https://github.com/google-antigravity/antigravity-sdk-python"&gt;Antigravity SDK&lt;/a&gt; (an open source Python wrapper around a bundled closed source Go binary), and the original Antigravity IDE (a VS Code fork).&lt;/p&gt;
&lt;p&gt;I guess Gemini Spark, the user-facing hosted agent product, might be running on that Go binary, but I'm not sure why that's worth mentioning in the FAQ!&lt;/p&gt;
&lt;p&gt;Naturally I went looking for notes on how Gemini Spark intends to handle the risk of prompt injection. The best information I could find on that was in the &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/innovations-from-google-io-26-on-google-cloud"&gt;Everything Google Cloud customers need to know coming out of Google I/O&lt;/a&gt; post aimed at enterprise customers, which includes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Spark operates in a fully managed, secure runtime on Google Cloud, meaning you get enterprise-grade security without ever having to manage the underlying infrastructure. Every task executes in a fresh, strictly isolated, ephemeral VM to help ensure data never overlaps between sessions. To protect your enterprise, all traffic routes through our secure Agent Gateway that enforces Data Loss Prevention (DLP) policies, while user credentials remain fully encrypted and are never exposed directly to the agent.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Given how many people are going to be piping &lt;em&gt;very&lt;/em&gt; sensitive data through Gemini Spark in the near future I hope they've made this bullet-proof, or this could be a top candidate for the agent security &lt;a href="https://simonwillison.net/2026/Jan/8/llm-predictions-for-2026/#1-year-a-challenger-disaster-for-coding-agent-security"&gt;challenger disaster&lt;/a&gt; that we still haven't seen.&lt;/p&gt;
&lt;p&gt;Also of note: in &lt;a href="https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli/"&gt;Transitioning Gemini CLI to Antigravity CLI&lt;/a&gt; Google announce that the &lt;a href="https://github.com/google-gemini/gemini-cli"&gt;open source Gemini CLI&lt;/a&gt; tool (Apache 2.0 licensed TypeScript) will stop working with their AI subscription plans on June 18th, replaced by the new closed source &lt;a href="https://github.com/google-antigravity/antigravity-cli"&gt;Antigravity CLI&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gemini"&gt;gemini&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&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"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-io"&gt;google-io&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-injection"&gt;prompt-injection&lt;/a&gt;&lt;/p&gt;



</summary><category term="gemini"/><category term="google"/><category term="generative-ai"/><category term="ai"/><category term="google-io"/><category term="llms"/><category term="prompt-injection"/></entry><entry><title>datasette-agent-charts 0.1a1</title><link href="https://simonwillison.net/2026/May/20/datasette-agent-charts/#atom-everything" rel="alternate"/><published>2026-05-20T14:52:16+00:00</published><updated>2026-05-20T14:52:16+00:00</updated><id>https://simonwillison.net/2026/May/20/datasette-agent-charts/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-agent-charts/releases/tag/0.1a1"&gt;datasette-agent-charts 0.1a1&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;More color! Bar and waffle charts without a color column are shaded by magnitude with a sequential color scheme; color columns holding text values use the &lt;code&gt;observable10&lt;/code&gt; categorical scheme. #2&lt;/li&gt;
&lt;li&gt;Now checks &lt;code&gt;execute-sql&lt;/code&gt; permission before running the query to find the column names.&lt;/li&gt;
&lt;li&gt;Charts now display interactive tooltips.&lt;/li&gt;
&lt;li&gt;Fixed a bug where &lt;code&gt;waffleY&lt;/code&gt; charts were not described to the agent.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette-agent"&gt;datasette-agent&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="datasette"/><category term="datasette-agent"/></entry><entry><title>llm-gemini 0.32</title><link href="https://simonwillison.net/2026/May/19/llm-gemini-2/#atom-everything" rel="alternate"/><published>2026-05-19T23:46:27+00:00</published><updated>2026-05-19T23:46:27+00:00</updated><id>https://simonwillison.net/2026/May/19/llm-gemini-2/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/simonw/llm-gemini/releases/tag/0.32"&gt;llm-gemini 0.32&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;New model &lt;code&gt;gemini-3.5-flash&lt;/code&gt; for &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-5/"&gt;Gemini 3.5 Flash&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;See also my &lt;a href="https://simonwillison.net/2026/May/19/gemini-35-flash/"&gt;notes on Gemini 3.5 Flash&lt;/a&gt;, and &lt;a href="https://simonwillison.net/2026/May/19/gemini-35-flash/#a-pelican-on-a-bicycle"&gt;the pelican&lt;/a&gt; I drew using this upgrade to the plugin.&lt;/p&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/gemini"&gt;gemini&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="llm"/><category term="gemini"/></entry><entry><title>Gemini 3.5 Flash: more expensive, but Google plan to use it for everything</title><link href="https://simonwillison.net/2026/May/19/gemini-35-flash/#atom-everything" rel="alternate"/><published>2026-05-19T22:40:25+00:00</published><updated>2026-05-19T22:40:25+00:00</updated><id>https://simonwillison.net/2026/May/19/gemini-35-flash/#atom-everything</id><summary type="html">
    &lt;p&gt;Today at Google I/O, Google &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-5/"&gt;released Gemini 3.5 Flash&lt;/a&gt;. This one skipped the &lt;code&gt;-preview&lt;/code&gt; modifier and went straight to general availability, and Google appear to be using it for a whole lot of their key products:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3.5 Flash is available today to billions of people globally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For everyone via the Gemini app and AI Mode in &lt;a href="https://blog.google/products-and-platforms/products/search/search-io-2026"&gt;Google Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;For developers in our agent-first development platform Google Antigravity and Gemini API in Google AI Studio and Android Studio&lt;/li&gt;
&lt;li&gt;For enterprises in Gemini Enterprise Agent Platform and Gemini Enterprise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;As usual with Gemini, the most interesting details are tucked away in the &lt;a href="https://ai.google.dev/gemini-api/docs/whats-new-gemini-3.5"&gt;What's new in Gemini 3.5 Flash&lt;/a&gt; developer documentation. It mostly has the same set of platform features as the previous Gemini 3.x series, albeit with no &lt;a href="https://ai.google.dev/gemini-api/docs/computer-use"&gt;computer use&lt;/a&gt;. The model ID is &lt;code&gt;gemini-3.5-flash&lt;/code&gt;. The knowledge cut-off is January 2025, and it supports 1,048,576 input tokens and 65,536 maximum output tokens.&lt;/p&gt;
&lt;p&gt;Google are also pushing a new &lt;a href="https://ai.google.dev/gemini-api/docs/interactions"&gt;Interactions API&lt;/a&gt;, currently in beta, which looks to me like their version of the patterns introduced by &lt;a href="https://developers.openai.com/api/reference/responses/overview"&gt;OpenAI Responses&lt;/a&gt; - in particular server-side history management.&lt;/p&gt;
&lt;h4 id="the-price-has-gone-up"&gt;The price has gone up&lt;/h4&gt;
&lt;p&gt;Gemini 3.5 Flash is accompanied by a notable price bump. The previous models in the "Flash" family were &lt;a href="https://ai.google.dev/gemini-api/docs/models/gemini-3-flash-preview"&gt;Gemini 3 Flash Preview&lt;/a&gt; and &lt;a href="https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite"&gt;Gemini 3.1 Flash-Lite&lt;/a&gt;. The new 3.5 Flash is 3x the price of 3 Flash Preview and 6x the price of 3.1 Flash-Lite (see &lt;a href="https://www.llm-prices.com/#sel=gemini-3-flash-preview%2Cgemini-3.5-flash%2Cgemini-3.1-flash-lite-preview"&gt;price comparison here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;At $1.50/million input and $9/million output it's getting close in price to Google's Gemini 3.1 Pro, which is $2 and $12.&lt;/p&gt;
&lt;p&gt;The Gemini team promise that 3.5 Pro will roll out "next month" - presumably at an even higher price.&lt;/p&gt;
&lt;p&gt;This fits a trend: OpenAI's GPT-5.5 was 2x the price of GPT-5.4, and Claude Opus 4.7 is around 1.46x the price of 4.6 when you take the &lt;a href="https://simonwillison.net/2026/Apr/20/claude-token-counts/"&gt;new tokenizer into account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Given the price increase it's interesting to see Google roll it out for so many of their own free-to-consumer products. It feels like all three of the major AI labs are starting to probe the price tolerance of their API customers.&lt;/p&gt;
&lt;p&gt;Artificial Analysis publish the cost to run their proprietary benchmark against models, which is a useful way to take things like tokenization and increased volume of reasoning tokens into account. Some numbers worth comparing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/models/gemini-3-5-flash"&gt;Gemini 3.5 Flash (high)&lt;/a&gt;: $1,551.60&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/models/gemini-3-1-pro-preview"&gt;Gemini 3.1 Pro Preview&lt;/a&gt;: $892.28&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/models/gemini-3-flash-reasoning"&gt;Gemini 3 Flash Preview (Reasoning)&lt;/a&gt;: $278.26&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/models/gemini-3-1-flash-lite-preview"&gt;Gemini 3.1 Flash-Lite Preview&lt;/a&gt;: $93.60&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Running the benchmark for 3.5 Flash (high) cost significantly more than 3.1 Pro Preview!&lt;/p&gt;
&lt;p&gt;Here are some numbers from other vendors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/models/claude-opus-4-7"&gt;Claude Opus 4.7 (Adaptive Reasoning, Max Effort)&lt;/a&gt;: $5,117.14&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/models/claude-opus-4-7-non-reasoning"&gt;Claude Opus 4.7 (Non-reasoning, High Effort)&lt;/a&gt;: $1,217.23&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/models/gpt-5-5"&gt;GPT-5.5 (xhigh)&lt;/a&gt;: $3,357.00&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/models/gpt-5-5-medium"&gt;GPT-5.5 (medium)&lt;/a&gt;: $1,199.14&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="a-pelican-on-a-bicycle"&gt;A pelican on a bicycle&lt;/h4&gt;
&lt;p&gt;I ran "Generate an SVG of a pelican riding a bicycle" &lt;a href="https://gist.github.com/simonw/09cc5a5545d7e75b33b75ffa92a34601"&gt;against the Gemini API&lt;/a&gt; and got back this pelican, which is a &lt;em&gt;lot&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2026/gemini-3.5-flash.png" alt="Black background, bats in the sky against a stylized moon. Pelican is funky looking. Very good beak. Bicycle frame is a bit twisted, and the bar from pedals to back wheel is missing. Bike lamp illuminates the road in front. Quite stylish." style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;From the code comments: &lt;code&gt;&amp;lt;!-- Pelican Eye / Sunglasses (Cool Retro Aviators) --&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=48196570#48198275"&gt;hedgehog on Hacker News&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That pelican looks like it's in Miami for a crypto conference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That one cost me 11 input tokens and 14,403 output tokens, for a total cost of &lt;a href="https://www.llm-prices.com/#it=11&amp;amp;ot=14403&amp;amp;sel=gemini-3.5-flash"&gt;just under 13 cents&lt;/a&gt;.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/google"&gt;google&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/gemini"&gt;gemini&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/pelican-riding-a-bicycle"&gt;pelican-riding-a-bicycle&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm-release"&gt;llm-release&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="google"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="gemini"/><category term="llm-pricing"/><category term="pelican-riding-a-bicycle"/><category term="llm-release"/></entry><entry><title>datasette-llm-accountant 0.1a4</title><link href="https://simonwillison.net/2026/May/19/datasette-llm-accountant/#atom-everything" rel="alternate"/><published>2026-05-19T20:45:43+00:00</published><updated>2026-05-19T20:45:43+00:00</updated><id>https://simonwillison.net/2026/May/19/datasette-llm-accountant/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-llm-accountant/releases/tag/0.1a4"&gt;datasette-llm-accountant 0.1a4&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Fixed bug tracking chains of responses. Refs &lt;a href="https://github.com/datasette/datasette-llm/issues/7"&gt;datasette-llm#7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="datasette"/><category term="llm"/></entry><entry><title>llm-gemini 0.32a0</title><link href="https://simonwillison.net/2026/May/19/llm-gemini/#atom-everything" rel="alternate"/><published>2026-05-19T20:36:23+00:00</published><updated>2026-05-19T20:36:23+00:00</updated><id>https://simonwillison.net/2026/May/19/llm-gemini/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/simonw/llm-gemini/releases/tag/0.32a0"&gt;llm-gemini 0.32a0&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Compatible with &lt;code&gt;llm&amp;gt;=0.32a0&lt;/code&gt; alpha - adds the ability to stream reasoning tokens.&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/gemini"&gt;gemini&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="llm"/><category term="gemini"/></entry><entry><title>datasette-llm 0.1a8</title><link href="https://simonwillison.net/2026/May/19/datasette-llm/#atom-everything" rel="alternate"/><published>2026-05-19T20:28:16+00:00</published><updated>2026-05-19T20:28:16+00:00</updated><id>https://simonwillison.net/2026/May/19/datasette-llm/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-llm/releases/tag/0.1a8"&gt;datasette-llm 0.1a8&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Fix for bug where &lt;code&gt;llm_prompt_context()&lt;/code&gt; hook did not fully collect chains of responses. #7&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    

</summary></entry><entry><title>The last six months in LLMs in five minutes</title><link href="https://simonwillison.net/2026/May/19/5-minute-llms/#atom-everything" rel="alternate"/><published>2026-05-19T01:09:44+00:00</published><updated>2026-05-19T01:09:44+00:00</updated><id>https://simonwillison.net/2026/May/19/5-minute-llms/#atom-everything</id><summary type="html">
    &lt;p&gt;I put together these annotated slides from my five minute lightning talk at PyCon US 2026, using the &lt;a href="https://tools.simonwillison.net/annotated-presentations"&gt;latest iteration&lt;/a&gt; of my &lt;a href="https://simonwillison.net/2023/Aug/6/annotated-presentations/"&gt;annotated presentation tool&lt;/a&gt;.&lt;/p&gt;

&lt;div class="slide" id="5-minutes-llms.001.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.001.jpeg" alt="The last six months in LLMs in
five minutes

Simon Willison - simonwillison.net

PyCon US 2026 Lightning Talk
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.001.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;I presented this lightning talk at PyCon US 2026, attempting to summarize the last six months of developments in LLMs in five minutes.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.002.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.002.jpeg" alt="The November inflection point
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.002.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Six months is a pretty convenient time period to cover, because it captures what I've been calling the &lt;a href="https://simonwillison.net/tags/november-2025-inflection/"&gt;November 2025 inflection point&lt;/a&gt;. November was a critical month in LLMs, especially for coding.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.003.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.003.jpeg" alt="The “best” model changed hands 5 times
between Anthropic, OpenAl and Google
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.003.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;For one thing, the supposedly "best" model (depending mostly on vibes) changed hands five times between the three big providers.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.004.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.004.jpeg" alt="Generate an SVG of a
pelican riding a bicycle
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.004.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;As always, I'm using my &lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle/"&gt;Generate an SVG of a pelican riding a bicycle&lt;/a&gt; test to help illustrate the differences between the models.&lt;/p&gt;
&lt;p&gt;Why this test? Because pelicans are hard to draw, bicycles are hard to draw, pelicans &lt;em&gt;can't ride bicycles&lt;/em&gt;... and there's zero chance any AI lab would train a model for such a ridiculous task.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.005.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.005.jpeg" alt="Five pelicans, one for each of the following models. Varying qualities!" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.005.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;At the start of November the widely acknowledged "best" model was Claude Sonnet 4.5, released on &lt;a href="https://simonwillison.net/2025/Sep/29/claude-sonnet-4-5/"&gt;29th September&lt;/a&gt;. It drew me this pelican.&lt;/p&gt;
&lt;p&gt;In November it was overtaken by &lt;a href="https://simonwillison.net/2025/Nov/13/gpt-51/"&gt;GPT-5.1&lt;/a&gt;, then &lt;a href="https://simonwillison.net/2025/Nov/18/gemini-3/"&gt;Gemini 3&lt;/a&gt;, then &lt;a href="https://simonwillison.net/2025/Nov/19/gpt-51-codex-max/"&gt;GPT-5.1 Codex Max&lt;/a&gt;, and then Anthropic took the crown back again with &lt;a href="https://simonwillison.net/2025/Nov/24/claude-opus/"&gt;Claude Opus 4.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think Gemini 3 drew the best pelican out of this lot, but pelicans aren't everything. Most practitioners will agree that Opus 4.5 held the crown for the next couple of months.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.006.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.006.jpeg" alt="The coding agents got good
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.006.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;It took a little while for this to become clear, but the real news from November was that the coding agents got &lt;em&gt;good&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI and Anthropic had spent most of 2025 running &lt;a href="https://simonwillison.net/2025/Dec/19/andrej-karpathy/"&gt;Reinforcement Learning from Verifiable Rewards&lt;/a&gt; to increase the quality of code written by their models, especially when paired up with their Codex and Claude Code agent harnesses.&lt;/p&gt;
&lt;p&gt;In November the results of this work became apparent. Coding agents went from often-work to mostly-work, crossing a quality barrier where you could use them as a daily-driver to get real work done, without needing to spend most of your time fixing their stupid mistakes.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.007.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.007.jpeg" alt="Screenshot of &amp;quot;Initial commit&amp;quot; on GitHub to steipete/Warelay, commit f6dd362, steipete authored on Nov 24, 2025

It&amp;#39;s a copy of the MIT license" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.007.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Also in November, this happened - the first commit to an obscure (back then) repo called "Warelay" by some guy called Pete.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.008.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.008.jpeg" alt="December/January
(A little bit of LLM psychosis)
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.008.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Over the holiday period, from December to January, a whole lot of us took advantage of the break to have a poke at these new models and coding agents and see what they could do.&lt;/p&gt;
&lt;p&gt;They could do a lot! Some of us got a little bit over-excited. I had my own short-lived bout of a form of LLM psychosis as I started spinning up wildly ambitious projects to see how far I could push them.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.009.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.009.jpeg" alt="micro-javascript playground
Execute JavaScript code in a sandboxed micro-javascript environment powered by Pyodide

var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var doubled = numbers.map(n =&amp;gt; n * 2);
console.log(&amp;#39;Doubled: &amp;quot;&amp;#39;, doubled);
var evens = numbers.filter(n =&amp;gt; n % 2 === 0);
console.log(&amp;#39;Evens: &amp;#39;, evens);
var sum = numbers.reduce((a, b) =&amp;gt; a + b, @);
console.log(&amp;#39;Sum:&amp;quot;, sum);

Output 27
Doubled: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Evens: [2, 4, 6, 8, 10]
Sum: 55
Execution time: 8.00ms
About: micro-javascript is a pure Python JavaScript interpreter with configurable memory and time limits. This playground runs entirely in your browser using
Pyodide (Python compiled to WebAssembly). View on GitHub" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.009.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;One of my projects was a vibe-coded implementation of JavaScript in Python - a loose port of &lt;a href="https://github.com/bellard/mquickjs"&gt;MicroQuickJS&lt;/a&gt; - which I called &lt;a href="https://github.com/simonw/micro-javascript"&gt;micro-javascript&lt;/a&gt;. You can try it out in your browser in &lt;a href="https://simonw.github.io/micro-javascript/playground.html"&gt;this playground&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.010.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.010.jpeg" alt="JavaScript running in Python running in Pyodide running in WebAssembly running in JavaScript" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.010.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;That playground demo shows JavaScript code run using my micro-javascript library, in Python, running inside Pyodide, running in WebAssembly, running in JavaScript, running in a browser!&lt;/p&gt;
&lt;p&gt;It's pretty cool! But did anyone out there &lt;em&gt;need&lt;/em&gt; a buggy, slow, insecure half-baked implementation of JavaScript in Python?&lt;/p&gt;
&lt;p&gt;They did not. I have quite a few other projects from that holiday period that I have since quietly retired!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.011.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.011.jpeg" alt="February 2026
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.011.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;On to February. Remember that Warelay project that had its first commit at the end of November?&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.012.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.012.jpeg" alt="Warelay → CLAWDIS → CLAWDBOT →
Clawdbot → Moltbot →🦞 OpenClaw" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.012.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;In December and January it had gone through &lt;a href="https://simonwillison.net/2026/May/16/openclaw-names/"&gt;quite a few name changes&lt;/a&gt;... and by February it was taking the world by storm under its final name, &lt;a href="https://openclaw.ai/"&gt;OpenClaw&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The amount of attention it got is pretty astonishing for a project that was less than three months old.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.013.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.013.jpeg" alt="Generic term: Claw
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.013.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;OpenClaw is a "personal AI assistant", and we actually got a generic term for these, based on NanoClaw and ZeroClaw and suchlike... they're called &lt;strong&gt;Claws&lt;/strong&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.014.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.014.jpeg" alt="An aquarium for your Claw
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.014.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Mac Minis started to sell out around Silicon Valley, because people were buying them to run their Claws.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.dbreunig.com/"&gt;Drew Breunig&lt;/a&gt; joked to me that this is because they're the new digital pets, and a Mac Mini is the perfect aquarium for your Claw.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.015.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.015.jpeg" alt="Alfred Molina&amp;#39;s Doc Ock in Spider-Man 2, tearing apart a New York subway train with his four claws." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.015.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;My favourite metaphor for Claws is Alfred Molina's Doc Ock in the 2004 movie Spider-Man 2. His claws were powered by AI, and were perfectly safe provided nothing damaged his inhibitor chip... after which they turned evil and took over.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.016.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.016.jpeg" alt="Gemini 3.1 Pro

A really good illustration of a pelican riding a bicycle.
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.016.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Also in February: Gemini 3.1 Pro came out, and drew me a &lt;em&gt;really good pelican riding a bicycle&lt;/em&gt;. Look at this! It's even got a fish in its basket.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.017.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.017.jpeg" alt="Gemini 3 Pro pelican contrasted with Gemini 3.1 Pro, as animated SVGs" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.017.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;And then Google's Jeff Dean &lt;a href="https://simonwillison.net/2026/Feb/19/gemini-31-pro/#jeff-dean"&gt;tweeted this video&lt;/a&gt; of an animated pelican riding a bicycle, plus a frog on a penny-farthing and a giraffe driving a tiny car and an ostrich on roller skates and a turtle kickflipping a skateboard and a dachshund driving a stretch limousine.&lt;/p&gt;
&lt;p&gt;So maybe the AI labs have been paying attention after all!&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.018.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.018.jpeg" alt="April 2026
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.018.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;A lot of stuff happened just in the past month.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.019.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.019.jpeg" alt="Gemma 4 26B-A4B (17.99GB)

A pretty decent pelican riding a bicycle, though the bike is a bit mis-shapen." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.019.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Google released the &lt;a href="https://simonwillison.net/2026/Apr/2/gemma-4/"&gt;Gemma 4&lt;/a&gt; series of models, which are the most capable open weight models I've seen from a US company.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.020.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.020.jpeg" alt="GLM-5.1
MIT, 754B parameter, 1.51TB!
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.020.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Also last month, Chinese AI lab GLM came out with &lt;a href="https://simonwillison.net/2026/Apr/7/glm-51/"&gt;GLM-5.1&lt;/a&gt; - an open weight 1.5TB monster! This is a very effective model... if you can afford the hardware to run it.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.021.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.021.jpeg" alt="" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.021.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;GLM-5.1 drew me this very competent pelican on a bicycle.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.022.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.022.jpeg" alt="The bike is wonky, the pelican is floating." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.022.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;... though when it &lt;a href="https://gisthost.github.io/?73bb6808b18c2482f66e5f082c75f36e"&gt;tried to animate it&lt;/a&gt; the bicycle bounced off into the top and the bicycle got warped.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.023.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.023.jpeg" alt="Screenshot of Bluesky

Charles
‪@charles.capps.me‬
I think you should pester it with another animal using another method of locomotion. 

Something tells me it was trained for this. I can&amp;#39;t quite put my finger on it. /s

NORTH VIRGINIA OPOSSUM ON AN E-SCOOTER!!" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.023.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Charles &lt;a href="https://bsky.app/profile/charles.capps.me/post/3miwrn42mjc2t"&gt;on Bluesky&lt;/a&gt; suggested I try it with a North Virginia Opossum on an E-scooter&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.024.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.024.jpeg" alt="NORTH VIRGINIA OPOSSUM
CRUISING THE COMMONWEALTH SINCE DUSK

And a really cool illustration of a possum." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.024.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;And it did this! I've tried this on other models and they don't even come close. "Cruising the commonwealth since dusk" is perfect. It's &lt;a href="https://static.simonwillison.net/static/2026/glm-possum-escooter.html"&gt;animated too&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.025.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.025.jpeg" alt="Qwen3.6-35B-A3B is a 20.9GB file that runs on my laptop

It drew a better pelican on a bicycle than Opus 4.7, which messed up the bicycle frame." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.025.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;The other neat Chinese open weight models in April came from Qwen. &lt;a href="https://simonwillison.net/2026/Apr/16/qwen-beats-opus/"&gt;Qwen3.6-35B-A3B on my laptop drew me a better pelican than Claude Opus 4.7&lt;/a&gt;. That's a 20.9GB open weights model that runs on my laptop!&lt;/p&gt;
&lt;p&gt;(I think this mainly demonstrates that the pelican on the bicycle has firmly exceeded its limits as a useful benchmark.)&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.026.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.026.jpeg" alt="Claude Sonnet 4.5 pelican for comparison." style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.026.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;Here's that Claude Sonnet 4.5 pelican from September for comparison. &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="slide" id="5-minutes-llms.027.jpeg"&gt;
  &lt;img loading="lazy" src="https://static.simonwillison.net/static/2026/5-minutes-llms/5-minutes-llms.027.jpeg" alt="The themes of the past 6 months:
Coding agents got really good
Local models wildly outperform expectations
" style="max-width: 100%" /&gt;
  &lt;div&gt;&lt;a style="float: right; text-decoration: none; border-bottom: none; padding-left: 1em;" href="https://simonwillison.net/2026/May/19/5-minute-llms/#5-minutes-llms.027.jpeg"&gt;#&lt;/a&gt;
  &lt;p&gt;So those were the two main themes of the past six months. The coding agents got really good... and the laptop-available models, while a lot weaker than the frontier, have started wildly outperforming expectations.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/lightning-talks"&gt;lightning-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pycon"&gt;pycon&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/speaking"&gt;speaking&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/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/annotated-talks"&gt;annotated-talks&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/coding-agents"&gt;coding-agents&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="lightning-talks"/><category term="pycon"/><category term="speaking"/><category term="ai"/><category term="generative-ai"/><category term="local-llms"/><category term="llms"/><category term="annotated-talks"/><category term="pelican-riding-a-bicycle"/><category term="coding-agents"/></entry><entry><title>Glaucous-winged Gull, Brown Pelican, Snowy Egret, Canada Goose</title><link href="https://simonwillison.net/2026/May/18/sighting-362781627/#atom-everything" rel="alternate"/><published>2026-05-18T14:51:00+00:00</published><updated>2026-05-18T14:51:00+00:00</updated><id>https://simonwillison.net/2026/May/18/sighting-362781627/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/662161673/large.jpg" alt="Glaucous-winged Gull"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/662161721/large.jpg" alt="Glaucous-winged Gull"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/662161937/large.jpg" alt="Brown Pelican"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/662161148/large.jpg" alt="Snowy Egret"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/662161189/large.jpg" alt="Snowy Egret"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/662160828/large.jpg" alt="Canada Goose"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/662160866/large.jpg" alt="Canada Goose"&gt;&lt;/p&gt;&lt;p&gt;Glaucous-winged Gull, Brown Pelican, Snowy Egret, Canada Goose, in Los Angeles River, CA, US&lt;/p&gt;&lt;p&gt;I'm heading home from PyCon US today so I went on a last morning walk to try and spot a pelican. I saw one! Didn't get a great photo of that, but I did see some goslings down by the swan boat lake.&lt;/p&gt;
    
    

</summary></entry><entry><title>GDS weighs in on the NHS's decision to retreat from Open Source</title><link href="https://simonwillison.net/2026/May/17/gds-weighs-in/#atom-everything" rel="alternate"/><published>2026-05-17T15:59:41+00:00</published><updated>2026-05-17T15:59:41+00:00</updated><id>https://simonwillison.net/2026/May/17/gds-weighs-in/#atom-everything</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://shkspr.mobi/blog/2026/05/gds-weighs-in-on-the-nhss-decision-to-retreat-from-open-source/"&gt;GDS weighs in on the NHS&amp;#x27;s decision to retreat from Open Source&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Terence Eden continues his coverage of the NHS' &lt;a href="https://shkspr.mobi/blog/2026/05/nhs-goes-to-war-against-open-source/"&gt;poorly considered decision&lt;/a&gt; to close down access to their open source repositories in response to vulnerabilities reported to them as part of &lt;a href="https://simonwillison.net/2026/Apr/7/project-glasswing/"&gt;Project Glasswing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now the Government Digital Service have joined the conversation with &lt;a href="https://www.gov.uk/guidance/ai-open-code-and-vulnerability-risk-in-the-public-sector"&gt;AI, open code and vulnerability risk in the public sector&lt;/a&gt;, published May 14th. Their key recommendation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Keep open by default. Making everything private adds additional delivery and policy costs, and can reduce reuse and scrutiny. Openness should remain the default posture, with closure used sparingly and deliberately. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While they don't mention the NHS by name, Terence speaks the language of the civil service and interprets this as a major escalation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Within the UK's Civil Service you occasionally hear the expression "being invited to a meeting &lt;em&gt;without biscuits&lt;/em&gt;". It implies a rather frosty discussion without any of the polite niceties of a normal meeting. In general though, even when people have severe disagreements, it is rare for tempers to fray. It is even rarer for those internal disagreements to spill over into public.&lt;/p&gt;
&lt;/blockquote&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/gov-uk"&gt;gov-uk&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/terence-eden"&gt;terence-eden&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/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="gov-uk"/><category term="terence-eden"/><category term="ai-ethics"/><category term="ai-security-research"/></entry><entry><title>Warelay -&gt; OpenClaw</title><link href="https://simonwillison.net/2026/May/16/openclaw-names/#atom-everything" rel="alternate"/><published>2026-05-16T20:23:30+00:00</published><updated>2026-05-16T20:23:30+00:00</updated><id>https://simonwillison.net/2026/May/16/openclaw-names/#atom-everything</id><summary type="html">
    &lt;p&gt;In preparation for a lightning talk I'm giving at PyCon US &lt;a href="https://us.pycon.org/2026/schedule/presentation/175/"&gt;this afternoon&lt;/a&gt; I decided to figure out how many names OpenClaw has &lt;em&gt;actually&lt;/em&gt; had since that &lt;a href="https://github.com/openclaw/openclaw/commit/f6dd362d39b8e30bd79ef7560aab9575712ccc11"&gt;first commit&lt;/a&gt; back in November.&lt;/p&gt;
&lt;p&gt;Thanks to this &lt;a href="https://tools.simonwillison.net/python/#first_line_historypy"&gt;first_line_history.py tool&lt;/a&gt; (&lt;a href="https://github.com/simonw/tools/blob/main/python/first_line_history.py"&gt;code here&lt;/a&gt;) the answer, according to the Git history of the OpenClaw README, is:&lt;/p&gt;
&lt;p&gt;Warelay → CLAWDIS → CLAWDBOT → Clawdbot → Moltbot →🦞 OpenClaw&lt;/p&gt;
&lt;p&gt;Or in detail (the output from the tool):&lt;/p&gt;
&lt;pre&gt;
2025-11-24T11:23:15+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/16dfc1a"&gt;16dfc1a&lt;/a&gt; # Warelay — WhatsApp Relay CLI (Twilio)
2025-11-24T11:41:37+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/d4153da"&gt;d4153da&lt;/a&gt; # 📡 Warelay — WhatsApp Relay CLI (Twilio)
2025-11-24T17:47:57+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/343ef9b"&gt;343ef9b&lt;/a&gt; # 📡 warelay — WhatsApp Relay CLI (Twilio)
2025-11-25T04:44:10+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/14b3c6f"&gt;14b3c6f&lt;/a&gt; # 📡 warelay — WhatsApp Relay CLI
2025-11-25T12:48:40+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/4814021"&gt;4814021&lt;/a&gt; # 📡 warelay — Send, receive, and auto-reply on WhatsApp—Twilio-backed or QR-linked.
2025-11-25T13:50:18+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/d51a3e9"&gt;d51a3e9&lt;/a&gt; # warelay 📡 - Send, receive, and auto-reply on WhatsApp via Twilio or QR-linked WhatsApp Web; webhook setup in one command
2025-11-25T13:51:13+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/4d2a8a8"&gt;4d2a8a8&lt;/a&gt; # 📡 warelay — Send, receive, and auto-reply on WhatsApp—Twilio-backed or QR-linked.
2025-11-25T14:52:43+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/1ef7f4d"&gt;1ef7f4d&lt;/a&gt; # 📡 warelay — Send, receive, and auto-reply on WhatsApp.
2025-12-03T15:45:32+00:00 &lt;a href="https://github.com/openclaw/openclaw/commit/a27ee23"&gt;a27ee23&lt;/a&gt; # 🦞 CLAWDIS — WhatsApp Gateway for AI Agents
2025-12-08T12:43:13+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/17fa2f4"&gt;17fa2f4&lt;/a&gt; # 🦞 CLAWDIS — WhatsApp &amp;amp; Telegram Gateway for AI Agents
2025-12-19T18:41:17+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/7710439"&gt;7710439&lt;/a&gt; # 🦞 CLAWDIS — Personal AI Assistant
2026-01-04T14:32:47+00:00 &lt;a href="https://github.com/openclaw/openclaw/commit/246adaa"&gt;246adaa&lt;/a&gt; # 🦞 CLAWDBOT — Personal AI Assistant
2026-01-10T05:14:09+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/cdb915d"&gt;cdb915d&lt;/a&gt; # 🦞 Clawdbot — Personal AI Assistant
2026-01-27T13:37:47-05:00 &lt;a href="https://github.com/openclaw/openclaw/commit/3fe4b25"&gt;3fe4b25&lt;/a&gt; # 🦞 Moltbot — Personal AI Assistant
2026-01-30T03:15:10+01:00 &lt;a href="https://github.com/openclaw/openclaw/commit/9a71607"&gt;9a71607&lt;/a&gt; # 🦞 OpenClaw — Personal AI Assistant
&lt;/pre&gt;

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



</summary><category term="openclaw"/><category term="git"/><category term="tools"/></entry><entry><title>Quoting Julia Evans</title><link href="https://simonwillison.net/2026/May/16/julia-evans/#atom-everything" rel="alternate"/><published>2026-05-16T16:45:37+00:00</published><updated>2026-05-16T16:45:37+00:00</updated><id>https://simonwillison.net/2026/May/16/julia-evans/#atom-everything</id><summary type="html">
    &lt;blockquote cite="https://jvns.ca/blog/2026/05/15/moving-away-from-tailwind--and-learning-to-structure-my-css-/"&gt;&lt;p&gt;[...] in the last 10 years I’ve learned to really love and respect CSS as a technology.&lt;/p&gt;
&lt;p&gt;So I decided years ago that I wanted to react to “CSS is hard” by getting better at CSS and taking it seriously as a technology, instead of devaluing it. Doing that changed everything for me: I learned that so many of my frustrations (“centering is impossible”) had been addressed in CSS a long time ago, and that also what “centering” means is not always straightforward and it makes sense that there are many ways to do it. CSS is hard because it’s solving a hard problem!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://jvns.ca/blog/2026/05/15/moving-away-from-tailwind--and-learning-to-structure-my-css-/"&gt;Julia Evans&lt;/a&gt;, Moving away from Tailwind, and learning to structure my CSS&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/julia-evans"&gt;julia-evans&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="julia-evans"/></entry><entry><title>inaturalist-clumper 0.1</title><link href="https://simonwillison.net/2026/May/15/inaturalist-clumper/#atom-everything" rel="alternate"/><published>2026-05-15T23:53:11+00:00</published><updated>2026-05-15T23:53:11+00:00</updated><id>https://simonwillison.net/2026/May/15/inaturalist-clumper/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/simonw/inaturalist-clumper/releases/tag/0.1"&gt;inaturalist-clumper 0.1&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;Part of the infrastructure I use for &lt;a href="https://simonwillison.net/2026/May/1/inat-sightings/"&gt;publishing my iNaturalist sightings on my blog&lt;/a&gt;. I've been running this in production for a few weeks now, inspiring some iterations on how it works, so I decided to ship a 0.1 release.&lt;/p&gt;
&lt;p&gt;You can see an example of the output &lt;a href="https://github.com/simonw/inaturalist-clumps/blob/main/clumps.json"&gt;in this JSON file&lt;/a&gt;.&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/inaturalist"&gt;inaturalist&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="projects"/><category term="inaturalist"/></entry><entry><title>Western Gull, Rock Pigeon</title><link href="https://simonwillison.net/2026/May/15/sighting-361818285/#atom-everything" rel="alternate"/><published>2026-05-15T14:42:00+00:00</published><updated>2026-05-15T14:42:00+00:00</updated><id>https://simonwillison.net/2026/May/15/sighting-361818285/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/660343826/large.jpg" alt="Western Gull"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/660344126/large.jpg" alt="Rock Pigeon"&gt;&lt;/p&gt;&lt;p&gt;Western Gull, Rock Pigeon, in Los Angeles Area (custom), CA, US&lt;/p&gt;&lt;p&gt;I went for a bird walk in the morning before PyCon, and we spotted a local seagull enjoying a Starbucks.&lt;/p&gt;
    
    

</summary></entry><entry><title>QR code generator</title><link href="https://simonwillison.net/2026/May/15/qr-code-generator/#atom-everything" rel="alternate"/><published>2026-05-15T04:00:49+00:00</published><updated>2026-05-15T04:00:49+00:00</updated><id>https://simonwillison.net/2026/May/15/qr-code-generator/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Tool:&lt;/strong&gt; &lt;a href="https://tools.simonwillison.net/qr-code-generator"&gt;QR code generator&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;Claude helped me build this tool for creating QR codes, for both text/URLs and for connecting to WiFi networks.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of a QR code generator web form. Heading &amp;quot;QR code generator&amp;quot; with subtitle &amp;quot;Create a scannable code for a URL, text, or WiFi network.&amp;quot; A segmented toggle shows &amp;quot;URL / text&amp;quot; and &amp;quot;WiFi&amp;quot; with WiFi selected. Below are fields: &amp;quot;Network name (SSID)&amp;quot; with placeholder &amp;quot;My WiFi&amp;quot;; &amp;quot;Password&amp;quot; with placeholder &amp;quot;Password&amp;quot; and a blue &amp;quot;Show&amp;quot; link; &amp;quot;Security&amp;quot; dropdown set to &amp;quot;WPA / WPA2 / WPA3 (most common)&amp;quot;; an unchecked &amp;quot;Hidden&amp;quot; checkbox; helper text &amp;quot;Not sure? Leave it on WPA / WPA2 / WPA3 — that covers almost every home WiFi network.&amp;quot; Below that: &amp;quot;Style&amp;quot; dropdown set to &amp;quot;Square&amp;quot;, an unchecked &amp;quot;Border&amp;quot; checkbox, &amp;quot;Size&amp;quot; dropdown set to &amp;quot;Medium&amp;quot;, and a &amp;quot;Color&amp;quot; swatch showing black. At the bottom is a blue &amp;quot;Generate QR code&amp;quot; button." src="https://static.simonwillison.net/static/2026/qr-code-generate.jpg" /&gt;&lt;/p&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/tools"&gt;tools&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;/p&gt;
    

</summary><category term="tools"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="vibe-coding"/></entry><entry><title>datasette-llm-limits 0.1a0</title><link href="https://simonwillison.net/2026/May/15/datasette-llm-limits/#atom-everything" rel="alternate"/><published>2026-05-15T00:42:09+00:00</published><updated>2026-05-15T00:42:09+00:00</updated><id>https://simonwillison.net/2026/May/15/datasette-llm-limits/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-llm-limits/releases/tag/0.1a0"&gt;datasette-llm-limits 0.1a0&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;This plugin works in conjunction with &lt;a href="https://github.com/datasette/datasette-llm"&gt;datasette-llm&lt;/a&gt; and &lt;a href="https://github.com/datasette/datasette-llm-accountant"&gt;datasette-llm-accountant&lt;/a&gt; to let you configure a per-user (or global) spending limit for LLM usage inside of Datasette. Configuration looks something like this:&lt;/p&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;plugins&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;datasette-llm-limits&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;limits&lt;/span&gt;:
      &lt;span class="pl-ent"&gt;per-user-daily&lt;/span&gt;:
        &lt;span class="pl-ent"&gt;scope&lt;/span&gt;: &lt;span class="pl-s"&gt;actor&lt;/span&gt;
        &lt;span class="pl-ent"&gt;window&lt;/span&gt;: &lt;span class="pl-s"&gt;rolling-24h&lt;/span&gt;
        &lt;span class="pl-ent"&gt;amount_usd&lt;/span&gt;: &lt;span class="pl-c1"&gt;1.00&lt;/span&gt;
&lt;/pre&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="datasette"/><category term="llm"/></entry><entry><title>datasette-agent 0.1a2</title><link href="https://simonwillison.net/2026/May/15/datasette-agent/#atom-everything" rel="alternate"/><published>2026-05-15T00:03:00+00:00</published><updated>2026-05-15T00:03:00+00:00</updated><id>https://simonwillison.net/2026/May/15/datasette-agent/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-agent/releases/tag/0.1a2"&gt;datasette-agent 0.1a2&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Tool availability can now be attached to a &lt;code&gt;required_permission&lt;/code&gt;. The default background agent tools now require the new &lt;code&gt;datasette-agent-background&lt;/code&gt; permission. #10&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette-agent"&gt;datasette-agent&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="datasette"/><category term="datasette-agent"/></entry><entry><title>Not so locked in any more</title><link href="https://simonwillison.net/2026/May/14/not-so-locked-in/#atom-everything" rel="alternate"/><published>2026-05-14T22:53:49+00:00</published><updated>2026-05-14T22:53:49+00:00</updated><id>https://simonwillison.net/2026/May/14/not-so-locked-in/#atom-everything</id><summary type="html">
    &lt;p&gt;This &lt;a href="https://simonwillison.net/2026/May/14/mitchell-hashimoto/"&gt;Mitchell Hashimoto quote&lt;/a&gt; about Bun migrating from Zig to Rust reminded me of a similar conversation I had at a conference last week.&lt;/p&gt;
&lt;p&gt;I was talking to someone who worked for a medium sized technology company with a pair of legacy/&lt;a href="https://simonwillison.net/2018/Jul/17/mark-norman-francis/"&gt;legendary&lt;/a&gt; iPhone and Android apps.&lt;/p&gt;
&lt;p&gt;They told me they had just completed a coding-agent driven rewrite of both apps to React Native.&lt;/p&gt;
&lt;p&gt;I asked why they chose that, given that coding agents presumably drive down the cost of maintaining separate iPhone and Android apps.&lt;/p&gt;
&lt;p&gt;They said that React Native has improved a lot over the past few years and covered everything their apps needed to do.&lt;/p&gt;
&lt;p&gt;And... if it turned out to be the wrong decision, they could &lt;strong&gt;just port back to native&lt;/strong&gt; in the future.&lt;/p&gt;
&lt;p&gt;Like Mitchell said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Programming languages used to be LOCK IN, and they're increasingly not so.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/react"&gt;react&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/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/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="react"/><category term="coding-agents"/><category term="ai-assisted-programming"/><category term="generative-ai"/><category term="ai"/><category term="llms"/></entry><entry><title>Quoting Mitchell Hashimoto</title><link href="https://simonwillison.net/2026/May/14/mitchell-hashimoto/#atom-everything" rel="alternate"/><published>2026-05-14T22:31:20+00:00</published><updated>2026-05-14T22:31:20+00:00</updated><id>https://simonwillison.net/2026/May/14/mitchell-hashimoto/#atom-everything</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/mitchellh/status/2055039647924007222"&gt;&lt;p&gt;[...] On the interesting side is how fungible programming languages are nowadays. Programming languages used to be LOCK IN, and they're increasingly not so. You think the Bun rewrite in Rust is good for Rust? Bun has shown they can be in probably any language they want in roughly a week or two. Rust is expendable. Its useful until its not then it can be thrown out. That's interesting!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/mitchellh/status/2055039647924007222"&gt;Mitchell Hashimoto&lt;/a&gt;, on Bun porting from Zig to Rust&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/zig"&gt;zig&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mitchell-hashimoto"&gt;mitchell-hashimoto&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rust"&gt;rust&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/bun"&gt;bun&lt;/a&gt;&lt;/p&gt;



</summary><category term="zig"/><category term="ai"/><category term="mitchell-hashimoto"/><category term="llms"/><category term="rust"/><category term="generative-ai"/><category term="agentic-engineering"/><category term="bun"/></entry><entry><title>datasette-agent 0.1a1</title><link href="https://simonwillison.net/2026/May/14/datasette-agent/#atom-everything" rel="alternate"/><published>2026-05-14T22:01:42+00:00</published><updated>2026-05-14T22:01:42+00:00</updated><id>https://simonwillison.net/2026/May/14/datasette-agent/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-agent/releases/tag/0.1a1"&gt;datasette-agent 0.1a1&lt;/a&gt;&lt;/p&gt;
        &lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Now uses the &lt;code&gt;execute-sql&lt;/code&gt; permission when deciding which tables to list to the user. #8&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette-agent"&gt;datasette-agent&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="datasette"/><category term="datasette-agent"/></entry><entry><title>datasette-ip-rate-limit 0.1a0</title><link href="https://simonwillison.net/2026/May/14/datasette-ip-rate-limit/#atom-everything" rel="alternate"/><published>2026-05-14T04:10:23+00:00</published><updated>2026-05-14T04:10:23+00:00</updated><id>https://simonwillison.net/2026/May/14/datasette-ip-rate-limit/#atom-everything</id><summary type="html">
    
        &lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; &lt;a href="https://github.com/datasette/datasette-ip-rate-limit/releases/tag/0.1a0"&gt;datasette-ip-rate-limit 0.1a0&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;The &lt;a href="https://datasette.io/"&gt;datasette.io&lt;/a&gt; site was being hammered by poorly-behaved crawlers, so I had Codex (GPT-5.5 xhigh) build a configurable rate limiting plugin to block IPs that were hammering specific areas of the site too quickly.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://github.com/simonw/datasette.io/blob/b6022bf9987661b94a26d3143028193a6cabfdcf/datasette.yml#L103-L116"&gt;the production configuration&lt;/a&gt; I'm using on that site for the new plugin:&lt;/p&gt;
&lt;pre&gt;  &lt;span class="pl-ent"&gt;datasette-ip-rate-limit&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;header&lt;/span&gt;: &lt;span class="pl-s"&gt;Fly-Client-IP&lt;/span&gt;
    &lt;span class="pl-ent"&gt;max_keys&lt;/span&gt;: &lt;span class="pl-c1"&gt;10000&lt;/span&gt;
    &lt;span class="pl-ent"&gt;exempt_paths&lt;/span&gt;:
    - &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/static/*&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
    - &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/-/turnstile*&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
    &lt;span class="pl-ent"&gt;rules&lt;/span&gt;:
    - &lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;demo-databases&lt;/span&gt;
      &lt;span class="pl-ent"&gt;paths&lt;/span&gt;:
      - &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/global-power-plants/*&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
      - &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/legislators/*&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
      &lt;span class="pl-ent"&gt;window_seconds&lt;/span&gt;: &lt;span class="pl-c1"&gt;60&lt;/span&gt;
      &lt;span class="pl-ent"&gt;max_requests&lt;/span&gt;: &lt;span class="pl-c1"&gt;60&lt;/span&gt;
      &lt;span class="pl-ent"&gt;block_seconds&lt;/span&gt;: &lt;span class="pl-c1"&gt;20&lt;/span&gt;&lt;/pre&gt;
    
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/rate-limiting"&gt;rate-limiting&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/codex"&gt;codex&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="rate-limiting"/><category term="datasette"/><category term="codex"/></entry><entry><title>Welcome to the Datasette blog</title><link href="https://simonwillison.net/2026/May/13/welcome-to-the-datasette-blog/#atom-everything" rel="alternate"/><published>2026-05-13T23:59:39+00:00</published><updated>2026-05-13T23:59:39+00:00</updated><id>https://simonwillison.net/2026/May/13/welcome-to-the-datasette-blog/#atom-everything</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://datasette.io/blog/2026/new-blog/"&gt;Welcome to the Datasette blog&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
We have a bunch of neat Datasette announcements in the pipeline so we decided it was time the project grew an official blog.&lt;/p&gt;
&lt;p&gt;I built this using OpenAI Codex desktop, which turns out to have the Markdown session transcript export feature I've always wanted. Here's &lt;a href="https://gist.github.com/simonw/885b11eee46822622b8031a1f4e5f3a3"&gt;the session that built the blog&lt;/a&gt;. See also &lt;a href="https://github.com/simonw/datasette.io/issues/179"&gt;issue 179&lt;/a&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/datasette"&gt;datasette&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/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/codex"&gt;codex&lt;/a&gt;&lt;/p&gt;



</summary><category term="ai"/><category term="datasette"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="codex"/></entry><entry><title>Quoting Boris Mann</title><link href="https://simonwillison.net/2026/May/13/boris-mann/#atom-everything" rel="alternate"/><published>2026-05-13T16:15:50+00:00</published><updated>2026-05-13T16:15:50+00:00</updated><id>https://simonwillison.net/2026/May/13/boris-mann/#atom-everything</id><summary type="html">
    &lt;blockquote cite="https://bsky.app/profile/bmann.ca/post/3mlp2ipupv22z"&gt;&lt;p&gt;“11 AI agents” is meaningless as a phrase. &lt;/p&gt;
&lt;p&gt;If I said “I have 11 spreadsheets” or “I have 11 browser tabs” to do my work, it means about the same thing.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://bsky.app/profile/bmann.ca/post/3mlp2ipupv22z"&gt;Boris Mann&lt;/a&gt;&lt;/p&gt;

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



</summary><category term="ai-agents"/><category term="ai"/><category term="agent-definitions"/></entry></feed>