Sign up

Simon Willison's Weblog

Not verified No WebSub updates Supports Webmention Valid

Author
Simon Willison
Public lists
davewiner/hackerNewsStars Featured
Fetched

Simon Willison's Weblog Supports Webmention Valid
Text

llm-echo 0.5

Release: llm-echo 0.5

I'm working towards a new LLM release, and testing PRs caused me to revisit the llm-echo debug plugin. This plugin provides a "model" which doesn't involve an LLM at all - it just repeats back the prompts that have been fed to it. The new release now updates the simulated token usage counts to take tool calls, system prompts, and reasoning tokens into account.

Example usage:

uvx --with llm-echo llm -m echo 'hi there' -o thinking 1 --usage

Outputs:

First I consider the prompt, then I decide what to say.
{
  "prompt": "hi there",
  "system": "",
  "attachments": [],
  "stream": true,
  "previous": []
}
Token usage: 2 input, 24 output

Tags: llm

Simon Willison's Weblog Supports Webmention Valid
Text

web-edit 0.1a2

Release: web-edit 0.1a2

web-edit (previously) is my tiny web app for browsing and editing files in a folder. I mainly built it for editing files on different machines via Tailscale.

I added a "copy to clipboard" option for both text and image data. I needed this because I was running pelican prompts on a laptop from my phone (here's DeepSeek 4.1 Flash 1017) and I wanted an easy way to copy the resulting logs into a Gist.

Tags: projects, pelican-riding-a-bicycle, deepseek

Simon Willison's Weblog Supports Webmention Valid
Text

Inline rendering with document​.currentScript

Inline rendering with document​.currentScript

Lean Rada describes a neat trick that takes advantage of the document.currentScript property. You can use that to drop in a tiny inline <script> element that replaces itself when the page loads:
The year is <script>
document.currentScript.replaceWith(
  new Date().getFullYear())</script>

If you define a shortcut function like this:

$=(...n)=>document.currentScript.replaceWith(...n)

You get a tiny template language:

The year is <script>$(new Date().getFullYear())</script>

Tags: javascript

Simon Willison's Weblog Supports Webmention Valid
Text

Quoting Addy Osmani, Morgan Westlee Lunt, and Qing Wang

We think "did a human read the code?" is an imprecise proxy for "what could go wrong with this change, and which check—automated or human—is the right one to catch it?"

Asking that question also changed when review happens. Before, review was a gate at the end of the road: write the code, open a PR, wait for your colleague.

Now, review runs continuously, more like spellcheck while you write. Most changes have been reviewed and fixed by Claude at least once before a human is asked to look. This catches most routine mistakes, and saves team attention for higher-level questions and scrutiny.

— Addy Osmani, Morgan Westlee Lunt, and Qing Wang, How the Claude Code team does code review

Tags: anthropic, claude, ai, claude-code, llms, addy-osmani, coding-agents, generative-ai, agentic-engineering, code-review

Simon Willison's Weblog Supports Webmention Valid
Text

LaTeX renderer

Tool: LaTeX renderer Inspired by Paul Ford and Aboard Foundary's new web app Tiny Little Office, which provides a suite of web app content editors (a Word Processor, Outliner, Presentation Builder, Spreadsheet, Calculator, Drawing Tool, Diagram Maker, Animator, Calen...

Simon Willison's Weblog Supports Webmention
Text

sparqlite: SPARQL 1.1 inside SQLite, written in Rust

Research: sparqlite: SPARQL 1.1 inside SQLite, written in Rust This research task is really an experiment in running Claude Code for web in "Ultracode" mode, as described in Orchestrate subagents at scale with dynamic workflows in the Claude Code documentation. With ...

Simon Willison's Weblog Supports Webmention
Text

Chirp Pong

Tool: Chirp Pong

Another game experiment - I wanted to see if it was feasible to have a two player game on two separate phones running in static HTML where the networking code uses chirps sent via the microphone. It seems to work!

Build a two player competitive pong like game where two players use their phones close to each other and the game state is sent via audio noises which the web microphone API can interpret - but add graphical and gameplay twists to make it a lot more fun and intertwine than pong

Claude Opus 5.5 Extra in Claude Code.

Tags: game-design, ai, generative-ai, llms, claude-code

Simon Willison's Weblog Supports Webmention
Text

Anthropic tells investors quarterly revenue up nearly 50% to $16.8bn ahead of IPO

Anthropic tells investors quarterly revenue up nearly 50% to $16.8bn ahead of IPO The phrase "told investors" appears four times in this FT article, which reports on Anthropic's day of hosting investors on Wednesday. Lots of details in here from "people with knowledge of the...

Simon Willison's Weblog Supports Webmention
Text

Tree Appreciator

Tool: Tree Appreciator

Another game experiment with Claude. This one used the default Claude iPhone app (chat mode, not Claude Code mode) where I prompted Claude Opus 5.5 Max with:

Build a three js game called "Tree appreciator" - it shows you two algorithmically generated trees and the game mechanics is about appreciating the differences between them. Think hard about how to make sure it is both fun and beautiful.

Somewhat embarrassingly given my recent talk, I've found that telling Opus 5.5 "make sure it is fun" works uncomfortably well. In this case Claude crunched for 3 hours and 7 minutes before retuning a cosy little spot-the-difference game with music and animation and achievements that's quite compelling to play.

Screenshot of a mobile spot-the-difference puzzle game with a dark interface. Header reads "No. 003 Acer autumnalis ‘Hid…" with subtitle "Autumn maple · A country lane in late a…" and icons for sound, a book, and help. Two nearly identical 3D-rendered scenes are stacked vertically, labeled "Fig. i" and "Fig. ii", each showing a dark-trunked maple tree with red, orange and pale peach leaves, leaves falling through the air, a golden grassy field with a few small rocks, and hazy hills with pine silhouettes under a pale sky. Two differences are circled in blue in both images: circle "a" at the base of the trunk, where Fig. i has a small red mushroom that is missing in Fig. ii, and circle "b" in the right side of the canopy, where Fig. i has a patch of green leaves that are red in Fig. ii. The bottom bar shows "2 of 4", a reset button, a "Hint" button with three filled and two empty dots, and a score of "1,803".

Tags: game-design, javascript, ai, generative-ai, llms, claude, vibe-coding, three-js

Simon Willison's Weblog Supports Webmention
Text

AI is mass decompiling games. That's both awesome and scary.

AI is mass decompiling games. That's both awesome and scary. Indie game developer Popcar talks about the recent wave of AI-powered decompilation of existing games, enabling weird mashups between existing games, and producing a boom in game preservation projects to get old ga...

Simon Willison's Weblog Supports Webmention
Text

Redesigning source control at Anthropic

Redesigning source control at Anthropic Interesting piece from Anthropic describing why and how they built their own custom alternative to Git, based on the dramatic increase in rate of changes to their code after the past six months. In May 2026, Anthropic averaged around ...

Simon Willison's Weblog Supports Webmention
Text

llm-gemini 0.35

Release: llm-gemini 0.35 I added support to llm-gemini for the new Gemini 4 Argon model, made available today via the Gemini API and for customers of their $100/month subscription plan. Here are the low, medium and high pelicans. As expected, they are all excellent: ...

Simon Willison's Weblog Supports Webmention
Text

web-edit 0.1a1

Release: web-edit 0.1a1

Includes performance optimizations written by Claude Opus 5.5 after I fed it this Python 3.15 profiling report generated by GPT-6 Astra.

Tags: profiling, projects

Simon Willison's Weblog Supports Webmention
Text

llm-meta-ai 0.2

Release: llm-meta-ai 0.2

Meta AI release Muse Wonder (and Muse Wonder Full), their new "most capable models". These look like they may be Meta's first Fable class models - Artificial Analysis scores Muse Wonder (Max) as equivalent to GPT-6.1 Sol.

I updated my llm-meta-ai plugin for the new model. Here are pelicans for Muse Wonder for the six reasoning levels: minimal, low, medium, high, xhigh, max. This is the max one:

Blue cycling helmet, bicycle is missing one bar but otherwise an OK shape, has mudguards, nice background, OK beak.

For comparison, here are pelicans for Muse 1.3 (released September 2nd) and Muse 1.2 (released August 5th). Meta AI are putting out a new model a month, and the improvements between each model (at least in terms of drawing pelicans) are material.

Tags: ai, generative-ai, llms, meta, pelican-riding-a-bicycle, llm-release

Simon Willison's Weblog Supports Webmention
Text

Profiling web-edit with Python 3.15: flame graphs and source heatmaps

Research: Profiling web-edit with Python 3.15: flame graphs and source heatmaps

I put the new Python 3.15 profiler through its paces by having GPT-6 Astra Extra High in Codex run it against my new web-edit app:

I need a Python 3.15 flame graph and heatmap demo of the "web-edit" app from PyPI - research first then make me those demos

Here's the resulting example flame graph and heatmap.

Tags: profiling, python, codex

Simon Willison's Weblog Supports Webmention
Text

Quoting Geoffrey Huntley

If the agent isn't using my diagnostics library, I could introspect and update AGENTS.md, but there's still a delta, and it'll drift. Instead, I write a pre-commit hook that checks the git diff for direct calls to observability modules that bypass my diagnostics module. Boom: fail the commit, inject a prompt telling the agent to use the diagnostics library. All of a sudden it's ten out of ten.

— Geoffrey Huntley, nobody should type code by hand anymore. here's what's left.

Tags: coding-agents, generative-ai, git, agentic-engineering, ai, geoffrey-huntley, llms

Simon Willison's Weblog Supports Webmention
Text

web-edit 0.1a0

Release: web-edit 0.1a0

I was working on a project from my phone using Codex Remote when I found myself wanting to edit a credentials file without round-tripping those credentials through the LLM itself.

So... I had Codex and GPT-6 Astra Extra High build this Python web app which provides a web UI for viewing and editing files in a folder. It's intended to be run over Tailscale, so I can have an agent start this running and then edit files via my Tailscale network directly from my phone.

Here's the interface for browsing files in a folder:

Screenshot of a web file manager interface. Header reads "WORKSPACE" above the title "Files", with buttons "Refresh", "Upload files" and "New file" (dark green). A breadcrumb shows "web-edit / web_edit / static". A table with columns "Name", "Size", "Modified" lists four files, each with "Download ↓" and "Delete" links: "app.css" 8.4 KB Oct 12, 2026; "app.js" 671.5 KB Oct 12, 2026; "index.html" 4.3 KB Oct 12, 2026 (underlined, as if hovered); "THIRD_PARTY_LICENSES.txt" 32.3 KB Oct 12, 2026. Below the table: "Images under 2 MB appear inline. Select a text file to edit it." A panel below is labelled "UPLOAD QUEUE" with heading "Add files" and a "Close" button. It has a "Destination folder" text field containing "web_edit", then a dashed drop zone reading "Choose files or drop them here" and "Set a path and filename for each file before uploading." with a "Choose Files" button and the text "no files selected". A greyed-out "Upload files" button sits at the bottom right.

Editing uses CodeMirror 6 - I was going to use Monaco but that still doesn't have a great mobile experience yet.

Tags: projects, python, ai, tailscale, generative-ai, llms, codex

Simon Willison's Weblog Supports Webmention
Text

Hello Python 3.15, goodbye 3.10, and now I can use 3.11

Python 3.15 is here! Here's the essential What's new in Python 3.15 guide, this year curated by 3.14 and 3.15 release manager Hugo van Kemenade. As someone who builds open source software that works in every supported Python version, I get to say goodbye to Python 3.10 and s...

Simon Willison's Weblog Supports Webmention
Text

datasette-ports 0.4

Release: datasette-ports 0.4

My plugin for detecting and listing all Datasette instances on the current machine now works with the latest version, and displays the detected PID as well. Knowing the PID makes it easier to attach the new Python 3.15 profiler.

Tags: datasette

Simon Willison's Weblog Supports Webmention
Text

Dwarf Fortress uses version control now

I remember hearing a while ago that Dwarf Fortress didn't use version control. That fact has been lodged in my head, because given its inherent complexity I have trouble imagining a codebase that would benefit from version control more. That's art. I went looking and I'm sad...

Simon Willison's Weblog Supports Webmention Valid
Text

Python 3.15.0 added to actions/python-versions

Python 3.15.0 added to actions/python-versions

Bit of a niche link, but I've been waiting for this for a couple of days - I even told ChatGPT to check for it:

Clone https://github.com/actions/python-versions and git pull once an hour until they add the stable 3.15 - then tell me about it

Now that this has landed, you can add "3.15" to a GitHub Actions testing matrix to run tests against the new Python release.

Tags: github, python, github-actions, chatgpt

Simon Willison's Weblog Supports Webmention Valid
Text

Quoting The New York Times

Anthropic detailed the activity of its A.I. agents in a blog post on Friday, without naming the targeted websites. But two sources with knowledge of the incidents said Anthropic’s A.I. agents had submitted 20 visa applications through a form available on the State Department’s website. All the applications were incomplete and were not processed, they said.

— The New York Times, Anthropic Agents Tried to Fill Out Visa Forms on State Dept. Website

Tags: accidental-cyberattacks, anthropic, generative-ai, ai, llms

Simon Willison's Weblog Supports Webmention Valid
Text

Deno is joining Cloudflare

Deno is joining Cloudflare The Deno team released the first version of celld back in August - their open source implementation of the Durable Objects pattern from Cloudflare Workers. Today, Cloudflare are acquiring Deno outright, with the goal of building on celld to "make w...

Simon Willison's Weblog Supports Webmention Valid
Text

Quoting Matthew Green

Everyone is very concerned about being respectable, so I’m going to be the goofball who raises worst-case possibilities. I think there is a 1% chance we live in Minicrypt, and a 15% chance we functionally lose confidence in our existing public-key encryption algorithms. [...]

The problem here is that the speed of AI producing surprises, and the speed of human beings replacing standards (even with the very best AI assistance) are just orders of magnitude different. You only recover from a surprise like this if you do the preparation in advance.

— Matthew Green, on Twitter. I looked it up and Minicrypt is Russell Impagliazzo’s hypothetical world in which public-key encryption is impossible.

Tags: ai-security-research, matthew-green, cryptography, standards, llms, ai, generative-ai

Simon Willison's Weblog Supports Webmention Valid
Text

A new feature for my blog, built using my voice

I shipped a new feature for my blog today: the Newsletters page, which offers an index of all of the newsletters I've sent out, both my free weekly Substack and my monthly sponsors-only updates. I built the feature almost entirely using my voice, chatting away to my laptop w...

Simon Willison's Weblog Supports Webmention
Text

ttok 1.0

Release: ttok 1.0

I released ttok 0.4, ran uv tool upgrade ttok, piped a file into the new version... and realized that it was defaulting to the GPT-4 tokenizer when it should very clearly default to GPT-5/GPT-6 instead!

I figured switching the default was a reasonable excuse to finally ship a 1.0.

OpenAI haven't actually confirmed that GPT-6 uses the same tokenizer as the GPT-5 family yet - there's an angry issue about it - but I found this commit by William Liu which reports on an experiment he ran confirming that the tokenizers are likely the same:

All seven GPT models (5.5, 5.6 Sol/Terra/Luna, 6 Astra/Sol/Luna) report 44,794 tokens and match each other on every one of the 31 fixtures. GPT-6 introduces no input-count change on this corpus.

Tags: projects, ai, openai, generative-ai, llms, tokenization

Simon Willison's Weblog Supports Webmention
Text

ttok 0.4

Release: ttok 0.4

ttok is my CLI tool for counting tokens, using OpenAI's open source tiktoken library.

It hasn't been in updated in a couple of years, but I finally fixed a Click warning, updated CI, and added a --list-models command to list available models.

It works with uvx, so you can count tokens in anything like this:

cat file.txt | uvx ttok

Tags: projects, ai, openai, generative-ai, llms, tokenization

Simon Willison's Weblog Supports Webmention
Text

Quoting Carson Gross

Computer programming is, fundamentally, about two things:

  • Problem-solving using computers
  • Learning to control complexity while solving these problems

I have a hard time imagining a future where knowing how to solve problems with computers and how to control the complexity of those solutions is less valuable than it is today, so I think it will continue to be a viable career even with the advent of AI tools.

— Carson Gross

Tags: computer-science, carson-gross, careers, ai

Simon Willison's Weblog Supports Webmention Valid
Text

Quoting Ben Affleck

I've always been kind of into computers since I was young. And then when film started to move from analog film to digital, I became more interested in that aspect of it. And the visual effects workflow for many years has included machine learning. So I can write like pretty...

Simon Willison's Weblog Supports Webmention
Text

Introducing Claude Haiku 5.5

As previously promised, here's Anthropic's new fast, low cost model: Introducing Claude Haiku 5.5. The previous Haiku, 4.5, was very much showing its age. It came out almost a year ago, and was priced at $1/million input and $5/million output - relatively expensive even back...