<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: Beats</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/atom/beats/" rel="self"/><id>http://simonwillison.net/</id><updated>2026-04-20T18:00:26+00:00</updated><author><name>Simon Willison</name></author><entry><title>llm-openrouter 0.6</title><link href="https://github.com/simonw/llm-openrouter/releases/tag/0.6" rel="alternate"/><published>2026-04-20T18:00:26+00:00</published><updated>2026-04-20T18:00:26+00:00</updated><id>https://github.com/simonw/llm-openrouter/releases/tag/0.6</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/llm-openrouter/releases/tag/0.6"&gt;llm-openrouter 0.6&lt;/a&gt;&lt;/p&gt;&lt;p&gt;LLM plugin for models hosted by OpenRouter&lt;/p&gt;</summary><category term="openrouter"/><category term="llm"/><category term="llm-release"/><category term="pelican-riding-a-bicycle"/><category term="kimi"/><category term="ai-in-china"/><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>Claude system prompts as a git timeline</title><link href="https://github.com/simonw/research/tree/main/extract-system-prompts#readme" rel="alternate"/><published>2026-04-18T12:25:00+00:00</published><updated>2026-04-18T12:25:00+00:00</updated><id>https://github.com/simonw/research/tree/main/extract-system-prompts#readme</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/research/tree/main/extract-system-prompts#readme"&gt;Claude system prompts as a git timeline&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Anthropic's published system prompt history for Claude is transformed into a git-based exploration tool, breaking up the monolithic markdown source into granular files and timestamped commits. By structuring extracted prompts per model, family, and revision, researchers can leverage `git log`, `diff`, and `blame` to trace prompt evolution, compare differences, and attribute changes to specific dates—all without manual parsing.&lt;/p&gt;</summary><category term="system-prompts"/><category term="anthropic"/><category term="claude"/><category term="generative-ai"/><category term="ai"/><category term="llms"/></entry><entry><title>datasette-public 0.4a1</title><link href="https://github.com/datasette/datasette-public/releases/tag/0.4a1" rel="alternate"/><published>2026-04-17T04:30:22+00:00</published><updated>2026-04-17T04:30:22+00:00</updated><id>https://github.com/datasette/datasette-public/releases/tag/0.4a1</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/datasette/datasette-public/releases/tag/0.4a1"&gt;datasette-public 0.4a1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Make selected Datasette databases and tables visible to the public&lt;/p&gt;</summary></entry><entry><title>datasette 1.0a28</title><link href="https://github.com/simonw/datasette/releases/tag/1.0a28" rel="alternate"/><published>2026-04-17T04:01:56+00:00</published><updated>2026-04-17T04:01:56+00:00</updated><id>https://github.com/simonw/datasette/releases/tag/1.0a28</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/datasette/releases/tag/1.0a28"&gt;datasette 1.0a28&lt;/a&gt;&lt;/p&gt;&lt;p&gt;An open source multi-tool for exploring and publishing data&lt;/p&gt;</summary><category term="datasette"/></entry><entry><title>llm-anthropic 0.25</title><link href="https://github.com/simonw/llm-anthropic/releases/tag/0.25" rel="alternate"/><published>2026-04-16T20:37:12+00:00</published><updated>2026-04-16T20:37:12+00:00</updated><id>https://github.com/simonw/llm-anthropic/releases/tag/0.25</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/llm-anthropic/releases/tag/0.25"&gt;llm-anthropic 0.25&lt;/a&gt;&lt;/p&gt;&lt;p&gt;LLM access to models by Anthropic, including the Claude series&lt;/p&gt;</summary><category term="llm"/><category term="anthropic"/><category term="claude"/></entry><entry><title>datasette.io news preview</title><link href="https://tools.simonwillison.net/datasette-io-preview" rel="alternate"/><published>2026-04-16T00:18:03+00:00</published><updated>2026-04-16T00:18:03+00:00</updated><id>https://tools.simonwillison.net/datasette-io-preview</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.simonwillison.net/datasette-io-preview"&gt;datasette.io news preview&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Preview and validate datasette.io news entries in YAML format with real-time rendering and markdown linting. The editor loads the current news.yaml file from GitHub and provides immediate feedback on formatting errors, link validation, and markdown syntax issues while displaying a styled preview of how entries will appear on the live site. Use the error badge to track validation issues and fix them directly in the editor pane.&lt;/p&gt;</summary><category term="vibe-coding"/><category term="claude"/><category term="tools"/><category term="datasette"/></entry><entry><title>datasette-export-database 0.3a1</title><link href="https://github.com/datasette/datasette-export-database/releases/tag/0.3a1" rel="alternate"/><published>2026-04-15T23:52:35+00:00</published><updated>2026-04-15T23:52:35+00:00</updated><id>https://github.com/datasette/datasette-export-database/releases/tag/0.3a1</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/datasette/datasette-export-database/releases/tag/0.3a1"&gt;datasette-export-database 0.3a1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Export a copy of a mutable SQLite database on demand&lt;/p&gt;</summary><category term="datasette"/></entry><entry><title>datasette 1.0a27</title><link href="https://github.com/simonw/datasette/releases/tag/1.0a27" rel="alternate"/><published>2026-04-15T23:16:34+00:00</published><updated>2026-04-15T23:16:34+00:00</updated><id>https://github.com/simonw/datasette/releases/tag/1.0a27</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/datasette/releases/tag/1.0a27"&gt;datasette 1.0a27&lt;/a&gt;&lt;/p&gt;&lt;p&gt;An open source multi-tool for exploring and publishing data&lt;/p&gt;</summary><category term="annotated-release-notes"/><category term="datasette"/><category term="python"/></entry><entry><title>Gemini 3.1 Flash TTS</title><link href="https://tools.simonwillison.net/gemini-flash-tts" rel="alternate"/><published>2026-04-15T16:41:46+00:00</published><updated>2026-04-15T16:41:46+00:00</updated><id>https://tools.simonwillison.net/gemini-flash-tts</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.simonwillison.net/gemini-flash-tts"&gt;Gemini 3.1 Flash TTS&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Convert text to natural-sounding speech using Google's Gemini 3.1 Flash TTS model with support for both single-speaker and multi-speaker conversation modes. The tool allows you to customize voice selection, apply directorial tags like `[whisper]` and `[short pause]` for dynamic delivery, and download the generated audio as a WAV file. Requires a valid Gemini API key to function.&lt;/p&gt;</summary><category term="gemini"/><category term="google"/></entry><entry><title>datasette-ports 0.3</title><link href="https://github.com/datasette/datasette-ports/releases/tag/0.3" rel="alternate"/><published>2026-04-15T02:50:57+00:00</published><updated>2026-04-15T02:50:57+00:00</updated><id>https://github.com/datasette/datasette-ports/releases/tag/0.3</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/datasette/datasette-ports/releases/tag/0.3"&gt;datasette-ports 0.3&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Find all currently running Datasette instances and list their ports&lt;/p&gt;</summary><category term="datasette"/></entry><entry><title>Exploring the new `servo` crate</title><link href="https://github.com/simonw/research/tree/main/servo-crate-exploration#readme" rel="alternate"/><published>2026-04-13T15:19:00+00:00</published><updated>2026-04-13T15:19:00+00:00</updated><id>https://github.com/simonw/research/tree/main/servo-crate-exploration#readme</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/research/tree/main/servo-crate-exploration#readme"&gt;Exploring the new `servo` crate&lt;/a&gt;&lt;/p&gt;&lt;p&gt;After the April 2026 release of the `servo` v0.1.0 crate (blog post), a concise investigation shows that Servo is now an embeddable browser engine for Rust, with a clear API centered on the `ServoBuilder`, `WebView`, and pixel readback methods. A headless CLI (`servo-shot`) successfully renders URLs or HTML files to PNG, building against stable Rust with a robust software-based rendering pipeline.&lt;/p&gt;</summary><category term="research"/><category term="browsers"/><category term="rust"/><category term="webassembly"/><category term="claude-code"/><category term="servo"/></entry><entry><title>QuickJS Python Sandbox — Investigation Report</title><link href="https://github.com/simonw/research/tree/main/quickjs-async-sandbox#readme" rel="alternate"/><published>2026-04-12T23:16:00+00:00</published><updated>2026-04-12T23:16:00+00:00</updated><id>https://github.com/simonw/research/tree/main/quickjs-async-sandbox#readme</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/research/tree/main/quickjs-async-sandbox#readme"&gt;QuickJS Python Sandbox — Investigation Report&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Exploring the `quickjs` Python package, this project implements an asyncio-compatible JavaScript sandbox with robust resource controls and seamless exposure of both synchronous and asynchronous Python functions (including async httpx fetches) to JavaScript code.&lt;/p&gt;</summary></entry><entry><title>SQLite Query Result Formatter Demo</title><link href="https://tools.simonwillison.net/sqlite-qrf" rel="alternate"/><published>2026-04-11T19:35:31+00:00</published><updated>2026-04-11T19:35:31+00:00</updated><id>https://tools.simonwillison.net/sqlite-qrf</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.simonwillison.net/sqlite-qrf"&gt;SQLite Query Result Formatter Demo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Format SQLite query results in 20 different styles including box-drawing tables, CSV, JSON, HTML, Markdown, and more using this interactive WebAssembly-based demonstration. Adjust formatting options like column headers, screen width, NULL display values, and border styles in real-time to see how your SQL queries render across all available output modes. The demo database includes sample tables for employees, products, and orders with pre-built example queries showcasing each formatting style.&lt;/p&gt;</summary><category term="tools"/><category term="sqlite"/></entry><entry><title>GitHub Repo Size</title><link href="https://tools.simonwillison.net/github-repo-size" rel="alternate"/><published>2026-04-09T21:31:50+00:00</published><updated>2026-04-09T21:31:50+00:00</updated><id>https://tools.simonwillison.net/github-repo-size</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.simonwillison.net/github-repo-size"&gt;GitHub Repo Size&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Check the size of any GitHub repository by entering the owner and repository name or pasting a GitHub URL. The tool fetches repository data from the GitHub API and displays the total size in kilobytes, megabytes, or gigabytes depending on the repository's scale. Results are automatically saved to the browser URL, allowing you to share or revisit repository size checks.&lt;/p&gt;</summary><category term="cors"/><category term="github"/></entry></feed>