<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: TILs</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/atom/beats/til/" rel="self"/><id>http://simonwillison.net/</id><updated>2026-05-11T18:48:57+00:00</updated><author><name>Simon Willison</name></author><entry><title>Using LLM in the shebang line of a script</title><link href="https://til.simonwillison.net/llms/llm-shebang" rel="alternate"/><published>2026-05-11T18:48:57+00:00</published><updated>2026-05-11T18:48:57+00:00</updated><id>https://til.simonwillison.net/llms/llm-shebang</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/llms/llm-shebang"&gt;Using LLM in the shebang line of a script&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This comment on Hacker News inspired me to investigate patterns for using my LLM CLI tool in a shebang line:&lt;/p&gt;</summary><category term="llm"/><category term="llm-tool-use"/><category term="llms"/><category term="ai"/><category term="generative-ai"/></entry><entry><title>SQL functions in Google Sheets to fetch data from Datasette</title><link href="https://til.simonwillison.net/google-sheets/datasette-sql" rel="alternate"/><published>2026-04-20T02:33:58+00:00</published><updated>2026-04-20T02:33:58+00:00</updated><id>https://til.simonwillison.net/google-sheets/datasette-sql</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/google-sheets/datasette-sql"&gt;SQL functions in Google Sheets to fetch data from Datasette&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I've been experimenting with ways to fetch data from Datasette and display it in Google Sheets.&lt;/p&gt;</summary><category term="spreadsheets"/><category term="datasette"/><category term="google"/></entry><entry><title>Running OpenClaw in Docker</title><link href="https://til.simonwillison.net/llms/openclaw-docker" rel="alternate"/><published>2026-02-01T23:59:07+00:00</published><updated>2026-02-01T23:59:07+00:00</updated><id>https://til.simonwillison.net/llms/openclaw-docker</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/llms/openclaw-docker"&gt;Running OpenClaw in Docker&lt;/a&gt;&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;</summary></entry><entry><title>Cloudflare response header transform rules</title><link href="https://til.simonwillison.net/cloudflare/response-header-transform-rule" rel="alternate"/><published>2026-01-23T15:08:25+00:00</published><updated>2026-01-23T15:08:25+00:00</updated><id>https://til.simonwillison.net/cloudflare/response-header-transform-rule</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/cloudflare/response-header-transform-rule"&gt;Cloudflare response header transform rules&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I serve Python files from my `tools.simonwillison.net` subdomain, which is a GitHub Pages site that's served via Cloudflare. For example:&lt;/p&gt;</summary></entry><entry><title>Previewing Claude Code for web branches with GitHub Pages</title><link href="https://til.simonwillison.net/claude-code/preview-github-pages" rel="alternate"/><published>2026-01-22T16:43:41+00:00</published><updated>2026-01-22T16:43:41+00:00</updated><id>https://til.simonwillison.net/claude-code/preview-github-pages</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/claude-code/preview-github-pages"&gt;Previewing Claude Code for web branches with GitHub Pages&lt;/a&gt;&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;</summary></entry><entry><title>Taking Neon I at the Crucible</title><link href="https://til.simonwillison.net/neon/neon-1" rel="alternate"/><published>2026-01-11T17:34:29+00:00</published><updated>2026-01-11T17:34:29+00:00</updated><id>https://til.simonwillison.net/neon/neon-1</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/neon/neon-1"&gt;Taking Neon I at the Crucible&lt;/a&gt;&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;</summary></entry><entry><title>Downloading archived Git repositories from archive.softwareheritage.org</title><link href="https://til.simonwillison.net/github/software-archive-recovery" rel="alternate"/><published>2025-12-30T23:43:48+00:00</published><updated>2025-12-30T23:43:48+00:00</updated><id>https://til.simonwillison.net/github/software-archive-recovery</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/github/software-archive-recovery"&gt;Downloading archived Git repositories from archive.softwareheritage.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;</summary></entry><entry><title>Subtests in pytest 9.0.0+</title><link href="https://til.simonwillison.net/pytest/subtests" rel="alternate"/><published>2025-12-05T05:44:04+00:00</published><updated>2025-12-05T05:44:04+00:00</updated><id>https://til.simonwillison.net/pytest/subtests</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/pytest/subtests"&gt;Subtests in pytest 9.0.0+&lt;/a&gt;&lt;/p&gt;&lt;p&gt;[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.&lt;/p&gt;</summary></entry><entry><title>Dependency groups and uv run</title><link href="https://til.simonwillison.net/uv/dependency-groups" rel="alternate"/><published>2025-12-03T04:55:17+00:00</published><updated>2025-12-03T04:55:17+00:00</updated><id>https://til.simonwillison.net/uv/dependency-groups</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/uv/dependency-groups"&gt;Dependency groups and uv run&lt;/a&gt;&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;</summary></entry><entry><title>Using Codex CLI with gpt-oss:120b on an NVIDIA DGX Spark via Tailscale</title><link href="https://til.simonwillison.net/llms/codex-spark-gpt-oss" rel="alternate"/><published>2025-11-07T07:16:55+00:00</published><updated>2025-11-07T07:16:55+00:00</updated><id>https://til.simonwillison.net/llms/codex-spark-gpt-oss</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/llms/codex-spark-gpt-oss"&gt;Using Codex CLI with gpt-oss:120b on an NVIDIA DGX Spark via Tailscale&lt;/a&gt;&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;</summary></entry><entry><title>Exploring OpenAI's deep research API model o4-mini-deep-research</title><link href="https://til.simonwillison.net/llms/o4-mini-deep-research" rel="alternate"/><published>2025-10-18T18:46:03+00:00</published><updated>2025-10-18T18:46:03+00:00</updated><id>https://til.simonwillison.net/llms/o4-mini-deep-research</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/llms/o4-mini-deep-research"&gt;Exploring OpenAI's deep research API model o4-mini-deep-research&lt;/a&gt;&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;</summary></entry><entry><title>Testing different Python versions with uv with-editable and uv-test</title><link href="https://til.simonwillison.net/uv/uv-tests" rel="alternate"/><published>2025-10-09T02:47:48+00:00</published><updated>2025-10-09T02:47:48+00:00</updated><id>https://til.simonwillison.net/uv/uv-tests</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/uv/uv-tests"&gt;Testing different Python versions with uv with-editable and uv-test&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A quick `uv` recipe I figured out today, for running the tests for a project against multiple Python versions.&lt;/p&gt;</summary></entry><entry><title>Testing different Python versions with uv with-editable and uv-test</title><link href="https://til.simonwillison.net/python/uv-tests" rel="alternate"/><published>2025-10-09T02:47:48+00:00</published><updated>2025-10-09T02:47:48+00:00</updated><id>https://til.simonwillison.net/python/uv-tests</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/python/uv-tests"&gt;Testing different Python versions with uv with-editable and uv-test&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A quick `uv` recipe I figured out today, for running the tests for a project against multiple Python versions.&lt;/p&gt;</summary></entry><entry><title>Error 153 Video player configuration error on YouTube embeds</title><link href="https://til.simonwillison.net/youtube/fixing-153-embed" rel="alternate"/><published>2025-09-30T17:07:00+00:00</published><updated>2025-09-30T17:07:00+00:00</updated><id>https://til.simonwillison.net/youtube/fixing-153-embed</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/youtube/fixing-153-embed"&gt;Error 153 Video player configuration error on YouTube embeds&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I recently noticed that almost every YouTube video on [my blog](https://simonwillison.net/) was displaying the same mysterious error message:&lt;/p&gt;</summary></entry><entry><title>Running a gpt-oss eval suite against LM Studio on a Mac</title><link href="https://til.simonwillison.net/llms/gpt-oss-evals" rel="alternate"/><published>2025-08-17T03:38:16+00:00</published><updated>2025-08-17T03:38:16+00:00</updated><id>https://til.simonwillison.net/llms/gpt-oss-evals</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/llms/gpt-oss-evals"&gt;Running a gpt-oss eval suite against LM Studio on a Mac&lt;/a&gt;&lt;/p&gt;&lt;p&gt;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).&lt;/p&gt;</summary></entry></feed>