RSSAmplifier

Blog

Simon Willison TIL

til.simonwillison.netRSS feed ↗15 posts

Latest posts

Adding a custom MCP server to Claude and ChatGPT

I've started exploring MCP in more detail. The web chat UIs for both Claude and ChatGPT can access MCP servers but it's not obvious how to set them up. Here's what I figured out. I'm using my new unauthenticated MCP for my blog - https://datasette.simonwillison.net/-/mcp - which uses https://github.com/datasette/datasette-mcp to allow the execution of read-only SQL queries against a copy of my…

Using uvx in GitHub Actions in a cache-friendly way

I often find myself wanting to run a quick Python tool inside of GitHub Actions using uvx name-of-tool - but I don't want that to result in a network request to PyPI every time the workflow runs. I want the tool to be fetched the first time and then reused from the GitHub Actions cache for subsequent runs. I've tried unsuccessfully to find patterns I like for this in the past, especially given the…

Cloudflare CAPTCHA on at least one ampersand

I use Cloudflare's CAPTCHA (they call it a "Managed Challenge") on simonwillison.net/search/ to prevent crawlers from following every single possible combination of my faceted search UI. This was getting pretty annoying, since I had to wait for the challenge every time I searched my own site. I don't particularly care about regular ?q=term searches. Where things get messy is if a crawler starts…

Setting a custom price for a model in AgentsView

I'm a recent convent to AgentsView , Wes McKinney's (previously of Pandas fame) Python toolkit for analyzing transcripts of coding agents from your own computer. AgentsView can calculate your token spending based on those transcripts, across multiple different coding agents (Claude Code, Codex, Pi and more.) You can run it via uvx like this to get as ASCII table of spending numbers in your…

Using LLM in the shebang line of a script

This comment on Hacker News inspired me to investigate patterns for using my LLM CLI tool in a shebang line: But seriously, you can put a shebang on an english text file now (if you're sufficiently brave) [...] LLM can end up installed in all sorts of unpredictable places so the best way to run it is via the #!/usr/bin/env pattern. Here's how to make English (or Spanish or any other language) text…

SQL functions in Google Sheets to fetch data from Datasette

I've been experimenting with ways to fetch data from Datasette and display it in Google Sheets. I've found three patterns that work so far. importdata() and "named functions" can only fetch from public Datasette instances. Apps Script can fetch from API key protected instances as well. Using IMPORTDATA() The easiest way to get this up and running doesn't involve any custom sheets functions at all.…

Running OpenClaw in Docker

I'm not brave enough to run OpenClaw (aka Clawdbot aka Moltbot) directly on my Mac, so I decided to try running it in a Docker instead container. OpenClaw has Docker support out of the box, described on this page of their documentation. Here's what worked for me. Use their Docker Compose configuration First, clone their GitHub repository: git clone https://github.com/openclaw/openclaw It contains…

Cloudflare response header transform rules

I serve Python files from my tools.simonwillison.net subdomain, which is a GitHub Pages site that's served via Cloudflare. For example: https://tools.simonwillison.net/python/q3_tts.py This is meant to be used with uv as described here : uv run https://tools.simonwillison.net/python/q3_tts.py \ 'I am a pirate, give me your gold!' \ -i 'gruff voice' -o pirate.wav By default files with .py…

Previewing Claude Code for web branches with GitHub Pages

I'm a big user of Claude Code on the web , Anthropic's poorly named cloud-based version of Claude Code which can be driven via the web or their native mobile and desktop applications. I mostly use it through the Claude iPhone app. The biggest downside of this way of working is that, beyond CLI tools or code libraries, it's difficult to preview its work while it is iterating on the code. I've…

Taking Neon I at the Crucible

I took the Neon I intensive week-long evening class at the Crucible in Oakland, with teachers Dan Kuppe and Kat. I learned to make a neon sign! It's still awaiting final infusion of gas, but I'll share photos here once it's finished. Here's much of what I learned, at least the parts that can be translated into text. At the Neon 1 level, the craft is almost entirely around making shapes out of…

Downloading archived Git repositories from archive.softwareheritage.org

Last February I blogged about a neat script called sqlite-s3vfs which was released as MIT licensed open source by the UK government's Department for Business and Trade. I went looking for it today and found that the github.com/uktrade/sqlite-s3vfs repository is now a 404. Since this is taxpayer-funded software and was released MIT I felt a moral obligation to try and restore the repository! My…

Subtests in pytest 9.0.0+

pytest 9.0.0 was released on November 8th 2025. I just got around to looking at the release notes and the biggest new feature is subtests , previously available as the separate pytest-subtests plugin. I copied the documentation into Claude Code and told it to find a good place to try them in the Datasette test suite. It suggested tests/test_docs.py , which currently make heavy use of the…

Dependency groups and uv run

I've adopted a new (to me) pattern for my Python projects to make them easier to hack on using uv run . I'm using a PEP 735 dependency group called dev to declare my development dependencies - in particular pytest - such that running uv run pytest executes the tests for my project without me having to even think about setting up a virtual environment first. Here's the pattern I'm using. I start by…

Using Codex CLI with gpt-oss:120b on an NVIDIA DGX Spark via Tailscale

I've written about the DGX Spark before. Here's how I got OpenAI's Codex CLI to run on my Mac against a gpt-oss:120b model running on the DGX Spark via a Tailscale network. Setting up Tailscale I installed Tailscale on the Spark a while ago and didn't make detailed notes. The Spark runs Ubuntu so I followed the Tailscale Linux installation instructions . My Mac is signed into Tailscale as well. I…

Exploring OpenAI's deep research API model o4-mini-deep-research

I was reviewing some older PRs and landed this one by Manuel Solorzano adding pricing for o4-mini-deep-research and o3-deep-research to my llm-prices.com site. I realized I hadn't tried those models yet so I decided to give one of them a go. o4-mini-deep-research is significantly cheaper than o3-deep-research - $2/$8 per million for input/output compared to $10/$40 - so I tried that one. These…