<?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-09-09T23:58:32+00:00</updated><author><name>Simon Willison</name></author><entry><title>.blend URL Viewer</title><link href="https://tools.simonwillison.net/blender-viewer" rel="alternate"/><published>2026-09-09T23:58:32+00:00</published><updated>2026-09-09T23:58:32+00:00</updated><id>https://tools.simonwillison.net/blender-viewer</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.simonwillison.net/blender-viewer"&gt;.blend URL Viewer&lt;/a&gt;&lt;/p&gt;&lt;p&gt;View Blender .blend files directly in your browser by pasting a URL to a CORS-accessible file or GitHub repository link. The viewer renders mesh geometry with materials, lighting, and optional saved camera positions from Blender 5.x files, and provides interactive orbit controls, wireframe mode, and model fitting capabilities.&lt;/p&gt;</summary><category term="3d"/><category term="javascript"/><category term="tools"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="blender"/><category term="coding-agents"/><category term="codex"/><category term="gpt-6-astra"/></entry><entry><title>llm 0.35</title><link href="https://github.com/simonw/llm/releases/tag/0.35" rel="alternate"/><published>2026-09-07T23:54:54+00:00</published><updated>2026-09-07T23:54:54+00:00</updated><id>https://github.com/simonw/llm/releases/tag/0.35</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/llm/releases/tag/0.35"&gt;llm 0.35&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Access large language models from the command-line&lt;/p&gt;</summary><category term="openai"/><category term="llm"/><category term="gpt-6-astra"/></entry><entry><title>Video compressor</title><link href="https://tools.simonwillison.net/video-compressor" rel="alternate"/><published>2026-09-07T18:29:07+00:00</published><updated>2026-09-07T18:29:07+00:00</updated><id>https://tools.simonwillison.net/video-compressor</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.simonwillison.net/video-compressor"&gt;Video compressor&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Compress videos in your browser using FFmpeg compiled to WebAssembly. Upload a video file to generate multiple encoded versions with different quality settings and output sizes, then compare and download the smallest file that meets your needs. All processing happens locally with no uploads to external servers.&lt;/p&gt;</summary><category term="ffmpeg"/><category term="video"/><category term="webassembly"/><category term="claude"/><category term="claude-code"/><category term="claude-mythos-fable"/></entry><entry><title>Mercator ↔ Equal Earth</title><link href="https://tools.simonwillison.net/equal-earth" rel="alternate"/><published>2026-09-07T16:24:16+00:00</published><updated>2026-09-07T16:24:16+00:00</updated><id>https://tools.simonwillison.net/equal-earth</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.simonwillison.net/equal-earth"&gt;Mercator ↔ Equal Earth&lt;/a&gt;&lt;/p&gt;&lt;p&gt;View an interactive animated map that morphs between Mercator and Equal Earth projections using a slider or play button. The visualization demonstrates how different map projections represent the world, with controls to blend between the two projection types and observe how they preserve different geographic properties.&lt;/p&gt;</summary><category term="geospatial"/><category term="d3"/><category term="vibe-coding"/><category term="gpt-6-astra"/></entry><entry><title>There's No Limit to How Bad Code Can Get</title><link href="https://lobste.rs/s/rfn2mn/there_s_no_limit_how_bad_code_can_get#c_8kdtaw" rel="alternate"/><published>2026-09-06T09:08:06+00:00</published><updated>2026-09-06T09:08:06+00:00</updated><id>https://lobste.rs/s/rfn2mn/there_s_no_limit_how_bad_code_can_get#c_8kdtaw</id><summary type="html">&lt;p&gt;&lt;a href="https://lobste.rs/s/rfn2mn/there_s_no_limit_how_bad_code_can_get#c_8kdtaw"&gt;My comment&lt;/a&gt; on &lt;a href="https://lobste.rs/s/rfn2mn/there_s_no_limit_how_bad_code_can_get"&gt;There&amp;#x27;s No Limit to How Bad Code Can Get&lt;/a&gt; &amp;mdash; Lobste.rs.&lt;/p&gt;&lt;p&gt;&lt;em&gt;[In reply to a comment about burning it down to start from scratch when technical debt becomes overwhelming]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In my experience it's &lt;em&gt;so rare&lt;/em&gt; for that to work.&lt;/p&gt;
&lt;p&gt;You announce the old thing is irrecoverably drowning in tech debt. You spin up a team to rewrite it from scratch. Work begins.&lt;/p&gt;
&lt;p&gt;Meanwhile the old thing remains a moving target: it's running the core business, so changes are still necessary. The developers working on it know that it's going to be made obsolete by the new thing soon, so they don't have any incentive to go beyond the smallest effort possible to add the new features. Technical debt continues to mount.&lt;/p&gt;
&lt;p&gt;Meanwhile, the team working on the new thing are ambitious and probably a little naive. They start out at a great pace - it's greenfield after all - but as time progresses it becomes apparent that nobody fully understands the behavior and scope of the thing they are replacing. If it was well documented and tested it wouldn't &lt;em&gt;need&lt;/em&gt; to be replaced, after all...&lt;/p&gt;
&lt;p&gt;After months (or even years) without delivering value, the pressure is on to "ship it", so the new system is launched to handle a subset of what the old system handled - or often for some new feature that was too hard to build with the now mostly unmaintained old system.&lt;/p&gt;
&lt;p&gt;... so now you have TWO systems in production - the janky old system that nobody wants to touch, and a new system which handles just a few production features and is 80% inactive code that is meant to replace the old system, eventually.&lt;/p&gt;
&lt;p&gt;If you're &lt;em&gt;really lucky&lt;/em&gt; the company won't have lost patience with the new system and will allow that work to continue. The longer this all takes, and the longer the old system stays in production and stubbornly continues to work, the higher the risk that "priorities have changed" and the new system total replacement work is abandoned, leaving you with two systems where you used to have one.&lt;/p&gt;
&lt;p&gt;The best article I've read about completing this process responsibly is &lt;a href="https://lethain.com/migrations/"&gt;Migrations: the sole scalable fix to tech debt&lt;/a&gt; by Will Larson.&lt;/p&gt;
&lt;p&gt;If I run into a situation like this in the future, my strong recommendation will be to shore up the old system with as much automated testing as possible and then seeing if targeted refactors can get it to the desired shape. My hunch is that in many cases that will have a much higher chance of success than the siren call of a greenfield replacement.&lt;/p&gt;</summary><category term="migrations"/><category term="technical-debt"/></entry><entry><title>Using Blender with coding agents on macOS</title><link href="https://til.simonwillison.net/llms/blender-coding-agents-macos" rel="alternate"/><published>2026-09-05T15:51:09+00:00</published><updated>2026-09-05T15:51:09+00:00</updated><id>https://til.simonwillison.net/llms/blender-coding-agents-macos</id><summary type="html">&lt;p&gt;&lt;a href="https://til.simonwillison.net/llms/blender-coding-agents-macos"&gt;Using Blender with coding agents on macOS&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Modern frontier models have got *really good* at using Blender. I've been having a lot of fun trying this out recently - models can produce `.blend` files you can edit in Blender itself, and can also render images and even movies (by rendering a sequence of images and combining them with `ffmpeg`).&lt;/p&gt;</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="blender"/><category term="pelican-riding-a-bicycle"/><category term="coding-agents"/><category term="gpt-6-astra"/></entry><entry><title>California Sea Lion</title><link href="https://simonwillison.net/2026/Sep/5/sighting-397339887/" rel="alternate"/><published>2026-09-05T03:24:30+00:00</published><updated>2026-09-05T03:24:30+00:00</updated><id>https://simonwillison.net/2026/Sep/5/sighting-397339887/</id><summary type="html">&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/728757324/large.jpg" alt="California Sea Lion"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/728757355/large.jpg" alt="California Sea Lion"&gt;&lt;/p&gt;&lt;p&gt;California Sea Lion, in Monterey Bay National Marine Sanctuary, CA, US, CA&lt;/p&gt;</summary></entry><entry><title>Osprey</title><link href="https://simonwillison.net/2026/Sep/3/sighting-396978774/" rel="alternate"/><published>2026-09-03T19:04:04+00:00</published><updated>2026-09-03T19:04:04+00:00</updated><id>https://simonwillison.net/2026/Sep/3/sighting-396978774/</id><summary type="html">&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/728047211/large.jpg" alt="Osprey"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/728047259/large.jpg" alt="Osprey"&gt;&lt;/p&gt;&lt;p&gt;Osprey, in Pillar Point Harbor, CA, US&lt;/p&gt;</summary></entry><entry><title>llm-openrouter 0.7.1</title><link href="https://github.com/simonw/llm-openrouter/releases/tag/0.7.1" rel="alternate"/><published>2026-09-02T20:23:26+00:00</published><updated>2026-09-02T20:23:26+00:00</updated><id>https://github.com/simonw/llm-openrouter/releases/tag/0.7.1</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/llm-openrouter/releases/tag/0.7.1"&gt;llm-openrouter 0.7.1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;LLM plugin for models hosted by OpenRouter&lt;/p&gt;</summary><category term="llm"/><category term="openrouter"/></entry><entry><title>llm 0.34</title><link href="https://github.com/simonw/llm/releases/tag/0.34" rel="alternate"/><published>2026-09-02T19:23:52+00:00</published><updated>2026-09-02T19:23:52+00:00</updated><id>https://github.com/simonw/llm/releases/tag/0.34</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/llm/releases/tag/0.34"&gt;llm 0.34&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Access large language models from the command-line&lt;/p&gt;</summary><category term="llm"/></entry><entry><title>llm-anthropic 0.28</title><link href="https://github.com/simonw/llm-anthropic/releases/tag/0.28" rel="alternate"/><published>2026-09-02T17:59:32+00:00</published><updated>2026-09-02T17:59:32+00:00</updated><id>https://github.com/simonw/llm-anthropic/releases/tag/0.28</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/llm-anthropic/releases/tag/0.28"&gt;llm-anthropic 0.28&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"/><category term="claude-mythos-fable"/></entry><entry><title>llm-gemini 0.34</title><link href="https://github.com/simonw/llm-gemini/releases/tag/0.34" rel="alternate"/><published>2026-09-02T16:39:38+00:00</published><updated>2026-09-02T16:39:38+00:00</updated><id>https://github.com/simonw/llm-gemini/releases/tag/0.34</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/simonw/llm-gemini/releases/tag/0.34"&gt;llm-gemini 0.34&lt;/a&gt;&lt;/p&gt;&lt;p&gt;LLM plugin to access Google's Gemini family of models&lt;/p&gt;</summary><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="llm"/><category term="gemini"/><category term="pelican-riding-a-bicycle"/><category term="llm-release"/></entry><entry><title>GeoJSON Map Viewer</title><link href="https://tools.simonwillison.net/geojson" rel="alternate"/><published>2026-09-01T18:05:45+00:00</published><updated>2026-09-01T18:05:45+00:00</updated><id>https://tools.simonwillison.net/geojson</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.simonwillison.net/geojson"&gt;GeoJSON Map Viewer&lt;/a&gt;&lt;/p&gt;&lt;p&gt;View and visualize GeoJSON data on an interactive OpenStreetMap with customizable styling options. Paste GeoJSON objects (Feature, FeatureCollection, or Geometry) into the editor, adjust fill color and opacity, and render the features directly on the map. Add multiple shapes with individual styling—each shape is numbered and can be removed, later shapes draw on top of earlier ones, and style changes apply live to the rendered map.&lt;/p&gt;</summary><category term="geospatial"/><category term="tools"/><category term="geojson"/><category term="chatgpt"/></entry><entry><title>datasette-mcp 0.2</title><link href="https://github.com/datasette/datasette-mcp/releases/tag/0.2" rel="alternate"/><published>2026-09-01T15:30:12+00:00</published><updated>2026-09-01T15:30:12+00:00</updated><id>https://github.com/datasette/datasette-mcp/releases/tag/0.2</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/datasette/datasette-mcp/releases/tag/0.2"&gt;datasette-mcp 0.2&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Adds a /-/mcp MCP server to any Datasette instance&lt;/p&gt;</summary><category term="datasette"/><category term="model-context-protocol"/></entry><entry><title>California Brown Pelican, House Sparrow</title><link href="https://simonwillison.net/2026/Aug/30/sighting-395988569/" rel="alternate"/><published>2026-08-30T23:59:38+00:00</published><updated>2026-08-30T23:59:38+00:00</updated><id>https://simonwillison.net/2026/Aug/30/sighting-395988569/</id><summary type="html">&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/726145345/large.jpg" alt="California Brown Pelican"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://static.inaturalist.org/photos/726145199/large.jpg" alt="House Sparrow"&gt;&lt;/p&gt;&lt;p&gt;California Brown Pelican, House Sparrow, in Monterey Bay National Marine Sanctuary, CA, US, CA&lt;/p&gt;</summary></entry></feed>