Sign up

Simon Willison's Weblog

Not verified No WebSub updates Supports Webmention Not yet validated

Author
Simon Willison
Public lists
Featured
Fetched

Simon Willison's Weblog Supports Webmention

How fast is 10 tokens per second really?

How fast is 10 tokens per second really?

Neat little HTML app by Mike Veerman (source code here) which simulates LLM token output speeds from 5/second to 800/second.

Useful if you see a model advertised as "30 tokens/second" and want to get a feel for what that actually looks like.

Via Hacker News

Tags: ai, generative-ai, llms

Simon Willison's Weblog Supports Webmention

Google I/O, Gemini Spark, Antigravity

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". I actually prefer to write about things that are in general availability, becau...

Simon Willison's Weblog Supports Webmention

llm-gemini 0.32

Release: llm-gemini 0.32

See also my notes on Gemini 3.5 Flash, and the pelican I drew using this upgrade to the plugin.

Tags: gemini, llm

Simon Willison's Weblog Supports Webmention

datasette-llm-accountant 0.1a4

Release: datasette-llm-accountant 0.1a4

Tags: llm, datasette

Simon Willison's Weblog Supports Webmention

llm-gemini 0.32a0

Release: llm-gemini 0.32a0

  • Compatible with llm>=0.32a0 alpha - adds the ability to stream reasoning tokens.

Tags: gemini, llm

Simon Willison's Weblog Supports Webmention

datasette-llm 0.1a8

Release: datasette-llm 0.1a8

  • Fix for bug where llm_prompt_context() hook did not fully collect chains of responses. #7

Simon Willison's Weblog Supports Webmention

Gemini 3.5 Flash: more expensive, but Google plan to use it for everything

Today at Google I/O, Google released Gemini 3.5 Flash. This one skipped the -preview modifier and went straight to general availability, and Google appear to be using it for a whole lot of their key products: 3.5 Flash is available today to billions of people globally: For...

Simon Willison's Weblog Supports Webmention

The last six months in LLMs in five minutes

I put together these annotated slides from my five minute lightning talk at PyCon US 2026, using the latest iteration of my annotated presentation tool. # I presented this lightning talk at PyCon US 2026, attempting to summarize the last six months of developments ...

Simon Willison's Weblog Supports Webmention

Glaucous-winged Gull, Brown Pelican, Snowy Egret, Canada Goose

Glaucous-winged Gull, Brown Pelican, Snowy Egret, Canada Goose, in Los Angeles River, CA, US 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.

Simon Willison's Weblog Supports Webmention

GDS weighs in on the NHS's decision to retreat from Open Source

GDS weighs in on the NHS's decision to retreat from Open Source Terence Eden continues his coverage of the NHS' poorly considered decision to close down access to their open source repositories in response to vulnerabilities reported to them as part of Project Glasswing. Now...

Simon Willison's Weblog Supports Webmention

Warelay -> OpenClaw

In preparation for a lightning talk I'm giving at PyCon US this afternoon I decided to figure out how many names OpenClaw has actually had since that first commit back in November. Thanks to this first_line_history.py tool (code here) the answer, according to the Git history...

Simon Willison's Weblog Supports Webmention

Quoting Julia Evans

[...] in the last 10 years I’ve learned to really love and respect CSS as a technology.

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!

Julia Evans, Moving away from Tailwind, and learning to structure my CSS

Tags: css, julia-evans

Simon Willison's Weblog Supports Webmention

Western Gull, Rock Pigeon

Western Gull, Rock Pigeon, in Los Angeles Area (custom), CA, US I went for a bird walk in the morning before PyCon, and we spotted a local seagull enjoying a Starbucks.

Simon Willison's Weblog Supports Webmention

inaturalist-clumper 0.1

Release: inaturalist-clumper 0.1

Part of the infrastructure I use for publishing my iNaturalist sightings on my blog. 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.

You can see an example of the output in this JSON file.

Tags: projects, inaturalist

Simon Willison's Weblog Supports Webmention

datasette-llm-limits 0.1a0

Release: datasette-llm-limits 0.1a0

This plugin works in conjunction with datasette-llm and datasette-llm-accountant to let you configure a per-user (or global) spending limit for LLM usage inside of Datasette. Configuration looks something like this:

plugins:
  datasette-llm-limits:
    limits:
      per-user-daily:
        scope: actor
        window: rolling-24h
        amount_usd: 1.00

Tags: llm, datasette

Simon Willison's Weblog Supports Webmention

QR code generator

Tool: QR code generator

Claude helped me build this tool for creating QR codes, for both text/URLs and for connecting to WiFi networks.

Screenshot of a QR code generator web form. Heading "QR code generator" with subtitle "Create a scannable code for a URL, text, or WiFi network." A segmented toggle shows "URL / text" and "WiFi" with WiFi selected. Below are fields: "Network name (SSID)" with placeholder "My WiFi"; "Password" with placeholder "Password" and a blue "Show" link; "Security" dropdown set to "WPA / WPA2 / WPA3 (most common)"; an unchecked "Hidden" checkbox; helper text "Not sure? Leave it on WPA / WPA2 / WPA3 — that covers almost every home WiFi network." Below that: "Style" dropdown set to "Square", an unchecked "Border" checkbox, "Size" dropdown set to "Medium", and a "Color" swatch showing black. At the bottom is a blue "Generate QR code" button.

Tags: vibe-coding, tools, generative-ai, ai, llms

Simon Willison's Weblog Supports Webmention

datasette-agent 0.1a2

Release: datasette-agent 0.1a2

  • Tool availability can now be attached to a required_permission. The default background agent tools now require the new datasette-agent-background permission. #10

Tags: datasette, datasette-agent

Simon Willison's Weblog Supports Webmention

Not so locked in any more

This Mitchell Hashimoto quote about Bun migrating from Zig to Rust reminded me of a similar conversation I had at a conference last week. I was talking to someone who worked for a medium sized technology company with a pair of legacy/legendary iPhone and Android apps. They t...

Simon Willison's Weblog Supports Webmention

Quoting Mitchell Hashimoto

[...] 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!

Mitchell Hashimoto, on Bun porting from Zig to Rust

Tags: zig, ai, mitchell-hashimoto, llms, rust, generative-ai, agentic-engineering, bun

Simon Willison's Weblog Supports Webmention

datasette-agent 0.1a1

Release: datasette-agent 0.1a1

  • Now uses the execute-sql permission when deciding which tables to list to the user. #8

Tags: datasette, datasette-agent

Simon Willison's Weblog Supports Webmention

datasette-ip-rate-limit 0.1a0

Release: datasette-ip-rate-limit 0.1a0

The datasette.io 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.

Here's the production configuration I'm using on that site for the new plugin:

  datasette-ip-rate-limit:
    header: Fly-Client-IP
    max_keys: 10000
    exempt_paths:
    - "/static/*"
    - "/-/turnstile*"
    rules:
    - name: public-demo-multi-parameter-table-pages
      paths:
      - "/global-power-plants/*"
      - "/legislators/*"
      window_seconds: 60
      max_requests: 60
      block_seconds: 20

Tags: datasette, rate-limiting, codex

Simon Willison's Weblog Supports Webmention

Welcome to the Datasette blog

Welcome to the Datasette blog

We have a bunch of neat Datasette announcements in the pipeline so we decided it was time the project grew an official blog.

I built this using OpenAI Codex desktop, which turns out to have the Markdown session transcript export feature I've always wanted. Here's the session that built the blog. See also issue 179.

Tags: ai, datasette, generative-ai, llms, ai-assisted-programming, codex-cli

Simon Willison's Weblog Supports Webmention

Quoting Boris Mann

“11 AI agents” is meaningless as a phrase.

If I said “I have 11 spreadsheets” or “I have 11 browser tabs” to do my work, it means about the same thing.

Boris Mann

Tags: ai-agents, ai, agent-definitions

Simon Willison's Weblog Supports Webmention

CSP Allow-list Experiment

Tool: CSP Allow-list Experiment

An experiment that shows that you can load an app in a CSP-protected sandboxed iframe (see previous note) and have a custom fetch() that intercepts CSP errors and passes them up to the parent window... which can then prompt the user to add that domain to an allow-list and then refresh the page.

Screenshot of a web tool titled "CSP Allow-list Experiment" with buttons Reset sample, Clear allow-list, Refresh preview. Left panel shows HTML source code starting with <!doctype html>. Right panel shows Preview with CSP header default-src 'none'; script-src 'unsafe-inline'; style-s... and heading "Sandbox fetch test". A modal dialog from tools.simonwillison.net is overlaid reading: "The sandbox tried to connect to: https://api.inaturalist.org   Add this origin to the CSP connect-src allow-list and refresh the page?" with an unchecked checkbox "Don't allow tools.simonwillison.net to prompt you again" and Cancel and OK buttons. Below is "Messages from sandbox" showing fetch-catch blocked https://api.inaturalist.org/v1/observations?per... connect-src · https://api.inaturalist.org. At the bottom left is "Allowed fetch() origins" with an input field containing https://api.github.com, an Add button, and a tag https://api.github.com x.

I built this one with GPT-5.5 xhigh running in the Codex desktop app.

Tags: content-security-policy, iframes, security

Simon Willison's Weblog Supports Webmention

datasette 1.0a29

Release: datasette 1.0a29 New TokenRestrictions.abbreviated(datasette) utility method for creating "_r" dictionaries. #2695 Table headers and column options are now visible even if a table contains zero rows. #2701 Fixed bug with display of column actions dialog ...

Simon Willison's Weblog Supports Webmention

llm 0.32a2

Release: llm 0.32a2

A bunch of useful stuff in this LLM alpha, but the most important detail is this one:

Most reasoning-capable OpenAI models now use the /v1/responses endpoint instead of /v1/chat/completions. This enables interleaved reasoning across tool calls for GPT-5 class models. #1435

This means you can now see the summarized reasoning tokens when you run prompts against an OpenAI model, displayed in a different color to standard error. Use the -R or --hide-reasoning flags if you don't want to see that.

Tags: llm, projects, openai, generative-ai, annotated-release-notes, ai, llms

Simon Willison's Weblog Supports Webmention

Quoting Mo Bitar

Now, if your CEO has never heard the phrase Ralph Loop, oh man, you are less than 30 days away from your next promotion. I'm not even exaggerating. Walk into his office, close the door, and say, hey chief, been experimenting with something. It's called Ralph Loops. And I th...

Simon Willison's Weblog Supports Webmention

Quoting Mitchell Hashimoto

The thing about 90% of TDMs [Technical Decision Makers] is that they're motivated primarily by NOT GETTING FIRED. These aren't people who browser Lobsters or push to GH on the weekend. These are people that work 9 to 5, get paid, go home, and NEVER THINK ABOUT WORK AGAIN. So to achieve all that, they follow secular trends supported by analysts and broad public sentiment. Oh, Gartner said that "AI strategy" is most important? McKinsey said "context" needs to be managed? Well, "Context Engine for AI Apps" is going to be defensible. Buy it.

Mitchell Hashimoto, in a conversation about the design of the Redis homepage

Tags: marketing, mitchell-hashimoto, redis

Simon Willison's Weblog Supports Webmention

Thoughts on GitLab's workforce reduction" and "structural and strategic decisions"

GitLab Act 2 There's a lot going on in this announcement from GitLab about the "workforce reduction" and "structural and strategic decisions" they are making with respect to the agentic era. They're "planning to reduce the number of countries by up to 30% where we have smal...

Simon Willison's Weblog Supports Webmention

Quoting James Shore

Your AI coding agent, the one you use to write code, needs to reduce your maintenance costs. Not by a little bit, either. You write code twice as quick now? Better hope you’ve halved your maintenance costs. Three times as productive? One third the maintenance costs. Otherwi...