Simon Willison’s Weblog

Subscribe

TILs

Filters: Sorted by date

TIL Running OpenClaw in Docker — I'm not brave enough to run [OpenClaw](https://openclaw.ai/) (aka Clawdbot aka Moltbot) directly on my Mac, so I decided to try running it in a Docker instead container.
TIL 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:
TIL Previewing Claude Code for web branches with GitHub Pages — I'm a big user of [Claude Code on the web](https://code.claude.com/docs/en/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.
TIL Taking Neon I at the Crucible — I took the Neon I intensive week-long evening class at [the Crucible](https://www.thecrucible.org/) 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.
TIL Downloading archived Git repositories from archive.softwareheritage.org — Last February I [blogged about](https://simonwillison.net/2025/Feb/7/sqlite-s3vfs/) a neat script called `sqlite-s3vfs` which was released as MIT licensed open source by the UK government's Department for Business and Trade.
TIL Subtests in pytest 9.0.0+ — [pytest 9.0.0](https://pypi.org/project/pytest/9.0.0/) was released on November 8th 2025. I just got around to looking at the [release notes](https://docs.pytest.org/en/stable/changelog.html#pytest-9-0-0-2025-11-05) and the biggest new feature is **subtests**, previously available as the separate [pytest-subtests](https://pypi.org/project/pytest-subtests/) plugin.
TIL 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](https://peps.python.org/pep-0735/) 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.
TIL Using Codex CLI with gpt-oss:120b on an NVIDIA DGX Spark via Tailscale — I've written about the [DGX Spark](https://simonwillison.net/2025/Oct/14/nvidia-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.
TIL Exploring OpenAI's deep research API model o4-mini-deep-research — I was reviewing some older PRs and landed [this one](https://github.com/simonw/llm-prices/pull/9) by Manuel Solorzano adding pricing for [o4-mini-deep-research](https://platform.openai.com/docs/models/o4-mini-deep-research) and [o3-deep-research](https://platform.openai.com/docs/models/o3-deep-research) to my [llm-prices.com](https://www.llm-prices.com/) site. I realized I hadn't tried those models yet so I decided to give one of them a go.
TIL Testing different Python versions with uv with-editable and uv-test — A quick `uv` recipe I figured out today, for running the tests for a project against multiple Python versions.
TIL Testing different Python versions with uv with-editable and uv-test — A quick `uv` recipe I figured out today, for running the tests for a project against multiple Python versions.
TIL Error 153 Video player configuration error on YouTube embeds — I recently noticed that almost every YouTube video on [my blog](https://simonwillison.net/) was displaying the same mysterious error message:
TIL Running a gpt-oss eval suite against LM Studio on a Mac — OpenAI's [gpt-oss models](https://github.com/openai/gpt-oss/) come with an eval suite, which is described in their [Verifying gpt-oss implementations](https://cookbook.openai.com/articles/gpt-oss/verifying-implementations) cookbook. I figured out how to run it on my Mac against their `gpt-oss-20b` model hosted locally using LM Studio, using [uv](https://github.com/astral-sh/uv).
TIL Configuring GitHub Codespaces using devcontainers — [GitHub Codespaces](https://github.com/features/codespaces) provides full development environments in your browser, and is free to use with anyone with a GitHub account. Each environment has a full Linux container and a browser-based UI using VS Code.
TIL Rate limiting by IP using Cloudflare's rate limiting rules — My [blog](https://simonwillison.net/) was showing poor performance, with some pages taking several seconds to load or even failing entirely.
TIL Using Playwright MCP with Claude Code — Inspired [by Armin](https://simonwillison.net/2025/Jun/29/agentic-coding/), I decided to figure out how to use the official [microsoft/playwright-mcp](https://github.com/microsoft/playwright-mcp) Playwright MCP server with Claude Code.
TIL Converting ORF raw files to JPEG on macOS — One of our cameras takes raw photos in ORF format, which I believe stands for "Olympus Raw Format". Here's a recipe I found for converting them to JPEG on macOS:
TIL Publishing a Docker container for Microsoft Edit to the GitHub Container Registry — Microsoft recently [released Edit](https://devblogs.microsoft.com/commandline/edit-is-now-open-source/), a new terminal text editor written in Rust. It's pretty nice - it's reminiscent of `nano` but with a retro MS DOS feel.
TIL Redirecting a domain using Cloudflare Pages — I wanted to redirect https://global-power-plants.datasettes.com/ to https://datasette.io/ - I decided to spin up a Cloudflare Pages site to do the work.
TIL A tip for debugging pytest-httpx — I use [pytest-httpx](https://colin-b.github.io/pytest_httpx/) in a bunch of my projects. Occasionally I run into test failures like this one, which can sometimes be really hard to figure out:
TIL SQLite triggers — I wrote a Python script, [triggers.py](https://github.com/simonw/til/blob/main/sqlite/triggers.py), to help me understand what data is available to SQLite triggers for which operations.
TIL Building and deploying a custom site using GitHub Actions and GitHub Pages — I figured out a minimal pattern for building a completely custom website using GitHub Actions and deploying the result to GitHub Pages.
TIL Styling an HTML dialog modal to take the full height of the viewport — I've been experimenting with the HTML [dialog element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog) recently, for example in my [Prompts.js](https://simonwillison.net/2024/Dec/7/prompts-js/) JavaScript library.
TIL Running jupyterlab via uv tool install — I tried to get [jupyterlab](https://jupyter.org/install) working via `uv tool install` today and ran into some sharp edges.
TIL Using a Tailscale exit node with GitHub Actions — For an (ethical) [scraping project](https://github.com/simonw/scrape-doge-gov) I found that my low-volume scraper was working from my laptop but was being blocked by Cloudflare when I attempted to run it in GitHub Actions, presumably because the GitHub Actions IP range was disallowed.
TIL Using S3 triggers to maintain a list of files in DynamoDB — This is a three-quarters-baked experiment that I ran this morning. I'm interested in efficiently tracking which new files have been added to an S3 bucket, where that bucket could potentially hold millions of items.
TIL Trying out Python packages with ipython and uvx — I figured out a really simple pattern for experimenting with new Python packages today:
TIL Running pytest against a specific Python version with uv run — While [working on this issue](https://github.com/simonw/datasette/issues/2461) I figured out a neat pattern for running the tests for my project locally against a specific Python version using [uv run](https://docs.astral.sh/uv/guides/scripts/):
TIL Running pytest against a specific Python version with uv run — While [working on this issue](https://github.com/simonw/datasette/issues/2461) I figured out a neat pattern for running the tests for my project locally against a specific Python version using [uv run](https://docs.astral.sh/uv/guides/scripts/):
TIL Geocoding from Python on macOS using pyobjc-framework-CoreLocation — Rhet Turnbull [shared](https://twitter.com/RhetTurnbull/status/1883559820541956605) this [short script](https://gist.github.com/RhetTbull/db70c113efd03029c6ff619f4699ce34) for looking up the named timezone for a given location from Python on macOS using `objc` and the `CoreLocation` framework. It uses the `objc` package and [pyobjc-framework-CoreLocation](https://pypi.org/project/pyobjc-framework-CoreLocation/).

Years