<?xml version="1.0" encoding="utf-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom"
  xml:lang="en-us"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:posse="https://posseparty.com/2024/Feed"
  xsi:schemaLocation="
    http://www.w3.org/2005/Atom https://raw.githubusercontent.com/docjason/XmlValidate/refs/heads/master/schemas/atom.xsd
    https://posseparty.com/2024/Feed https://posseparty.com/2024/Feed.xsd">
  <id>https://justin.searls.co/digest.xml</id>
    <title>justin․searls․co - Digest</title>
  <updated>2026-04-01T16:16:03+00:00</updated>
  <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
  </author>
  <link href="https://justin.searls.co/" rel="alternate" type="text/html" title="HTML" />
  <link href="https://justin.searls.co/digest.xml" rel="self" type="application/atom+xml" title="Digest" />
  <category term="Software"/>
  <generator uri="https://gohugo.io/" version="0.153.4">Hugo</generator>
  <icon>https://justin.searls.co/favicon.ico</icon>
  <logo>https://justin.searls.co/img/wide_logo.png</logo>
  <rights>Copyright Justin Searls. All rights reserved.</rights>
  <subtitle>Where Justin Searls is content to post content.</subtitle>
  
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v53-pod-freeze/</id>
      <title type="text">🎙️ Breaking Change podcast v53 - Pod Freeze</title>
      <link href="https://justin.searls.co/casts/breaking-change-v53-pod-freeze/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-03-20T18:38:37+00:00</published>
    <updated>2026-03-21T01:54:55+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v53.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v53.mp3">Direct link to podcast audio file</a>
</p><p>The promise of Breaking Change is that with every major version (this being the 60th episode of the program, but only the 53rd such release), I will <em>break something</em>. Well, I finally did it. I think I broke the show. Find out how by listening for yourself!</p>
<p>Want to be my friend? Drop me a line at <a href="mailto:justin@searls.co">justin@searls.co</a>. Want to file a complaint with my supervisor? Forward your concerns to <a href="mailto:podcast@searls.co">podcast@searls.co</a>.</p>
<p>These links may rot, but alas—death comes for us all:</p>
<ul>
<li><a href="https://tonal.com">Tonal</a> (<a href="https://youtu.be/OQdavZ5C5BA?si=W4jiGWt7R4M9l4lL">without a subscription</a>)</li>
<li><a href="https://www.betterwithbecky.com">Better with Becky</a></li>
<li>My appearance on <a href="https://justin.searls.co/casts/merge-commits-freecodecamp-which-devs-are-screwed/">the freeCodeCamp podcast</a></li>
<li><a href="https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/">Dual-loop BDD is the new Red-green TDD</a></li>
<li><a href="https://justin.searls.co/links/2026-03-16-models-are-commodities-harnesses-are-differentiators/">Models are commodities, harnesses are differentiators</a></li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://www.washingtonpost.com/travel/2026/03/05/united-airlines-headphones/">United Airlines can now boot passengers who refuse to use headphones with their devices</a> (<a href="https://apple.news/AZMSe5CmfT86vyyzFXR5EAg">News+</a>)</li>
<li><a href="https://www.svd.se/a/K8nrV4/metas-ai-smart-glasses-and-data-privacy-concerns-workers-say-we-see-everything">Your Meta glasses are watching you pee</a> (<a href="https://9to5mac.com/2026/03/03/meta-ray-ban-smart-glasses-send-sensitive-videos-to-human-data-annotators/">9to5mac's summary</a>)</li>
<li><a href="https://tunaformac.com">Tuna for Mac</a> by friend of the show, <a href="https://mikkelmalmberg.com">Mikkel Malmberg</a></li>
<li><a href="https://www.apple.com/macbook-neo/">MacBook Neo</a></li>
<li><a href="https://www.notebookcheck.net/Apple-toys-with-the-competition-MacBook-Neo-offers-more-single-core-performance-than-any-mobile-processor-from-AMD-Intel-or-Qualcomm.1248134.0.html">MacBook Neo offers more single-core performance than any mobile processor from AMD, Intel or Qualcomm</a></li>
<li>Apple + Nvidia's CloudXR &amp; Foveated streaming partnership: <a href="https://www.tomsguide.com/computing/virtual-reality/nvidia-is-bringing-a-killer-app-to-the-apple-vision-pro-and-its-good-news-for-sim-racers">1</a>, <a href="https://www.reddit.com/r/VisionPro/comments/1rqx3yu/did_apple_just_open_the_door_to_real_vr_gaming_on/">2</a>, <a href="https://blogs.nvidia.com/blog/nvidia-cloudxr-apple-vision-pro/">3</a>, <a href="https://developer.nvidia.com/topics/ai/xr/cloudxr/apple-platforms">4</a>, <a href="https://developer.apple.com/documentation/foveatedstreaming">5</a></li>
<li><a href="https://news.xbox.com/en-us/2026/03/11/project-helix-building-next-generation-of-xbox/">Xbox's Project Helix</a></li>
<li><a href="https://www.theverge.com/games/892875/microsoft-xbox-mode-windows-11-gdc">Microsoft's 'Xbox mode' is coming to every Windows 11 PC</a> (<a href="https://apple.news/A-oYwg3eUQOOXn4kdE4f-hg">News+</a>)</li>
<li><a href="https://blogs.windows.com/windowsdeveloper/2026/03/11/gdc-2026-announcing-new-tools-and-platform-updates-for-windows-pc-game-developers/">Windows: Announcing new tools and platform updates for Windows PC game developers</a></li>
<li><a href="https://psprices.com/news/sony-ab-testing-prices/">Sony is testing dynamic pricing in the PlayStation Store</a></li>
<li>DLSS 5 should make you excited and/or outraged: <a href="https://youtube.com/watch?v=4ZlwTtgbgVA&amp;si=cRFis5-zn3uDqjDr">video</a>, <a href="https://www.videogameschronicle.com/news/this-is-just-a-garbage-ai-filter-nvidia-met-with-criticism-for-dlss-5s-photoreal-graphics-alterations/">backlash</a></li>
<li><a href="https://www.timesofisrael.com/gamblers-trying-to-win-a-bet-on-polymarket-are-vowing-to-kill-me-if-i-dont-rewrite-an-iran-missile-story/">Gamblers trying to win a bet on Polymarket are vowing to kill me if I don't rewrite an Iran missile story</a></li>
<li><a href="https://gizmodo.com/south-korean-police-lose-seized-crypto-by-posting-password-online-2000728191">South Korean Police Lose Seized Crypto By Posting Password Online</a></li>
<li><a href="https://restofworld.org/2026/china-ai-one-person-companies-incentives/">China mobilizes &quot;one-person company&quot; AI startups</a></li>
<li><a href="https://www.imdb.com/title/tt40197357/">Scrubs</a> is back!</li>
<li><a href="https://en.wikipedia.org/wiki/Mickey_17">Mickey 17</a> is not about a cartoon mouse</li>
<li><a href="https://en.wikipedia.org/wiki/The_Expanse_(TV_series)">The Expanse</a></li>
<li><a href="https://marathonthegame.com">Marathon</a> - and how sickos like me <a href="https://aftermath.site/marathon-bungie-extraction-shooter-durandal/">can't stop thinking about it</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>The promise of Breaking Change is that with every major version (this being the 60th episode of the program, but only the 53rd such release), I will <em>break something</em>. Well, I finally did it. I think I broke the show. Find out how by listening for yourself!</p>
<p>Want to be my friend? Drop me a line at <a href="mailto:justin@searls.co">justin@searls.co</a>. Want to file a complaint with my supervisor? Forward your concerns to <a href="mailto:podcast@searls.co">podcast@searls.co</a>.</p>
<p>These links may rot, but alas—death comes for us all:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v53-pod-freeze/","append_url_label":"Hear 🎙","content":"\u003cp\u003eThe promise of Breaking Change is that with every major version (this being the 60th episode of the program, but only the 53rd such release), I will \u003cem\u003ebreak something\u003c/em\u003e. Well, I finally did it. I think I broke the show. Find out how by listening for yourself!\u003c/p\u003e\n\u003cp\u003eWant to be my friend? Drop me a line at \u003ca href=\"mailto:justin@searls.co\"\u003ejustin@searls.co\u003c/a\u003e. Want to file a complaint with my supervisor? Forward your concerns to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThese links may rot, but alas—death comes for us all:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://tonal.com\"\u003eTonal\u003c/a\u003e (\u003ca href=\"https://youtu.be/OQdavZ5C5BA?si=W4jiGWt7R4M9l4lL\"\u003ewithout a subscription\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.betterwithbecky.com\"\u003eBetter with Becky\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMy appearance on \u003ca href=\"https://justin.searls.co/casts/merge-commits-freecodecamp-which-devs-are-screwed/\"\u003ethe freeCodeCamp podcast\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/\"\u003eDual-loop BDD is the new Red-green TDD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/links/2026-03-16-models-are-commodities-harnesses-are-differentiators/\"\u003eModels are commodities, harnesses are differentiators\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.washingtonpost.com/travel/2026/03/05/united-airlines-headphones/\"\u003eUnited Airlines can now boot passengers who refuse to use headphones with their devices\u003c/a\u003e (\u003ca href=\"https://apple.news/AZMSe5CmfT86vyyzFXR5EAg\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.svd.se/a/K8nrV4/metas-ai-smart-glasses-and-data-privacy-concerns-workers-say-we-see-everything\"\u003eYour Meta glasses are watching you pee\u003c/a\u003e (\u003ca href=\"https://9to5mac.com/2026/03/03/meta-ray-ban-smart-glasses-send-sensitive-videos-to-human-data-annotators/\"\u003e9to5mac's summary\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://tunaformac.com\"\u003eTuna for Mac\u003c/a\u003e by friend of the show, \u003ca href=\"https://mikkelmalmberg.com\"\u003eMikkel Malmberg\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.apple.com/macbook-neo/\"\u003eMacBook Neo\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.notebookcheck.net/Apple-toys-with-the-competition-MacBook-Neo-offers-more-single-core-performance-than-any-mobile-processor-from-AMD-Intel-or-Qualcomm.1248134.0.html\"\u003eMacBook Neo offers more single-core performance than any mobile processor from AMD, Intel or Qualcomm\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eApple + Nvidia's CloudXR \u0026amp; Foveated streaming partnership: \u003ca href=\"https://www.tomsguide.com/computing/virtual-reality/nvidia-is-bringing-a-killer-app-to-the-apple-vision-pro-and-its-good-news-for-sim-racers\"\u003e1\u003c/a\u003e, \u003ca href=\"https://www.reddit.com/r/VisionPro/comments/1rqx3yu/did_apple_just_open_the_door_to_real_vr_gaming_on/\"\u003e2\u003c/a\u003e, \u003ca href=\"https://blogs.nvidia.com/blog/nvidia-cloudxr-apple-vision-pro/\"\u003e3\u003c/a\u003e, \u003ca href=\"https://developer.nvidia.com/topics/ai/xr/cloudxr/apple-platforms\"\u003e4\u003c/a\u003e, \u003ca href=\"https://developer.apple.com/documentation/foveatedstreaming\"\u003e5\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://news.xbox.com/en-us/2026/03/11/project-helix-building-next-generation-of-xbox/\"\u003eXbox's Project Helix\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/games/892875/microsoft-xbox-mode-windows-11-gdc\"\u003eMicrosoft's 'Xbox mode' is coming to every Windows 11 PC\u003c/a\u003e (\u003ca href=\"https://apple.news/A-oYwg3eUQOOXn4kdE4f-hg\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blogs.windows.com/windowsdeveloper/2026/03/11/gdc-2026-announcing-new-tools-and-platform-updates-for-windows-pc-game-developers/\"\u003eWindows: Announcing new tools and platform updates for Windows PC game developers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://psprices.com/news/sony-ab-testing-prices/\"\u003eSony is testing dynamic pricing in the PlayStation Store\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDLSS 5 should make you excited and/or outraged: \u003ca href=\"https://youtube.com/watch?v=4ZlwTtgbgVA\u0026amp;si=cRFis5-zn3uDqjDr\"\u003evideo\u003c/a\u003e, \u003ca href=\"https://www.videogameschronicle.com/news/this-is-just-a-garbage-ai-filter-nvidia-met-with-criticism-for-dlss-5s-photoreal-graphics-alterations/\"\u003ebacklash\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.timesofisrael.com/gamblers-trying-to-win-a-bet-on-polymarket-are-vowing-to-kill-me-if-i-dont-rewrite-an-iran-missile-story/\"\u003eGamblers trying to win a bet on Polymarket are vowing to kill me if I don't rewrite an Iran missile story\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gizmodo.com/south-korean-police-lose-seized-crypto-by-posting-password-online-2000728191\"\u003eSouth Korean Police Lose Seized Crypto By Posting Password Online\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://restofworld.org/2026/china-ai-one-person-companies-incentives/\"\u003eChina mobilizes \u0026quot;one-person company\u0026quot; AI startups\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.imdb.com/title/tt40197357/\"\u003eScrubs\u003c/a\u003e is back!\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Mickey_17\"\u003eMickey 17\u003c/a\u003e is not about a cartoon mouse\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Expanse_(TV_series)\"\u003eThe Expanse\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://marathonthegame.com\"\u003eMarathon\u003c/a\u003e - and how sickos like me \u003ca href=\"https://aftermath.site/marathon-bungie-extraction-shooter-durandal/\"\u003ecan't stop thinking about it\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Pod Freeze","id":"https://justin.searls.co/casts/breaking-change-v53-pod-freeze/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v53-pod-freeze.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-03-20T18:38:37Z","title":"Pod Freeze","updated_at":"2026-03-21T01:54:55Z","url":"https://justin.searls.co/casts/breaking-change-v53-pod-freeze/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/merge-commits-freecodecamp-which-devs-are-screwed/</id>
      <title type="text">🎙️ Merge Commits podcast - freeCodeCamp: Which Devs Are Screwed?</title>
      <link href="https://justin.searls.co/casts/merge-commits-freecodecamp-which-devs-are-screwed/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-03-17T12:00:00+00:00</published>
    <updated>2026-03-17T13:22:47-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/merge-commits/2026-03-17.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/merge-commits/2026-03-17.mp3">Direct link to podcast audio file</a>
</p><p><a href="https://www.freecodecamp.org/news/author/quincy/">Quincy Larson</a> over at <a href="https://www.freecodecamp.org">freeCodeCamp</a> had me on their podcast to discuss how the rapidly changing software industry is impacting junior developers and what they can do about it. I don't normally spend time talking about this stuff, because I started programming in the 90s and can't claim to know anything about what it's like to just be starting now. I've also always discouraged people from getting into software development unless they're super passionate about it, which has been out of step with the &quot;learn to code&quot; hype train that gathered steam over the last fifteen years only to run into a brick wall recently.</p>
<p>His audience is way larger and composed of quite different people than those who follow my stuff, so I strongly recommend you read every last <a href="https://www.youtube.com/watch?v=hP931079TMw">YouTube comment</a>. Some pretty crazy shit, if I'm being honest. Makes me glad I don't have 11 million subscribers.</p>
<p><strong>Appearing on:</strong> <a href="https://www.freecodecamp.org/news/podcast/">freeCodeCamp Podcast</a><br/>
<strong>Published on:</strong> <code>2026-03-17</code><br/>
<strong>Original URL:</strong> <a href="https://www.freecodecamp.org/news/there-are-2-kinds-of-devs-one-of-them-is-screwed-justin-searls-interview-podcast-210/">https://www.freecodecamp.org/news/there-are-2-kinds-of-devs-one-of-them-is-screwed-justin-searls-interview-podcast-210/</a></p>
<p>Comments? Questions? Suggestion of a podcast I should guest on? <a href="mailto:podcast@searls.co">podcast@searls.co</a></p>

]]></content>
    <summary type="html"><![CDATA[<p><a href="https://www.freecodecamp.org/news/author/quincy/">Quincy Larson</a> over at <a href="https://www.freecodecamp.org">freeCodeCamp</a> had me on their podcast to discuss how the rapidly changing software industry is impacting junior developers and what they can do about it. I don't normally spend time talking about this stuff, because I started programming in the 90s and can't claim to know anything about what it's like to just be starting now. I've also always discouraged people from getting into software development unless they're super passionate about it, which has been out of step with the &quot;learn to code&quot; hype train that gathered steam over the last fifteen years only to run into a brick wall recently.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/merge-commits-freecodecamp-which-devs-are-screwed/","append_url_label":"Hear 🎙","content":"\u003cp\u003e\u003ca href=\"https://www.freecodecamp.org/news/author/quincy/\"\u003eQuincy Larson\u003c/a\u003e over at \u003ca href=\"https://www.freecodecamp.org\"\u003efreeCodeCamp\u003c/a\u003e had me on their podcast to discuss how the rapidly changing software industry is impacting junior developers and what they can do about it. I don't normally spend time talking about this stuff, because I started programming in the 90s and can't claim to know anything about what it's like to just be starting now. I've also always discouraged people from getting into software development unless they're super passionate about it, which has been out of step with the \u0026quot;learn to code\u0026quot; hype train that gathered steam over the last fifteen years only to run into a brick wall recently.\u003c/p\u003e\n\u003cp\u003eHis audience is way larger and composed of quite different people than those who follow my stuff, so I strongly recommend you read every last \u003ca href=\"https://www.youtube.com/watch?v=hP931079TMw\"\u003eYouTube comment\u003c/a\u003e. Some pretty crazy shit, if I'm being honest. Makes me glad I don't have 11 million subscribers.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAppearing on:\u003c/strong\u003e \u003ca href=\"https://www.freecodecamp.org/news/podcast/\"\u003efreeCodeCamp Podcast\u003c/a\u003e\u003cbr/\u003e\n\u003cstrong\u003ePublished on:\u003c/strong\u003e \u003ccode\u003e2026-03-17\u003c/code\u003e\u003cbr/\u003e\n\u003cstrong\u003eOriginal URL:\u003c/strong\u003e \u003ca href=\"https://www.freecodecamp.org/news/there-are-2-kinds-of-devs-one-of-them-is-screwed-justin-searls-interview-podcast-210/\"\u003ehttps://www.freecodecamp.org/news/there-are-2-kinds-of-devs-one-of-them-is-screwed-justin-searls-interview-podcast-210/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eComments? Questions? Suggestion of a podcast I should guest on? \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e\u003c/p\u003e\n","format_string":"New episode of Merge Commits is live! freeCodeCamp: Which Devs Are Screwed?","id":"https://justin.searls.co/casts/merge-commits-freecodecamp-which-devs-are-screwed/","og_image":"https://justin.searls.co/img/podcast/merge-commits-freecodecamp.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-03-17T12:00:00Z","title":"freeCodeCamp: Which Devs Are Screwed?","updated_at":"2026-03-17T13:22:47-04:00","url":"https://justin.searls.co/casts/merge-commits-freecodecamp-which-devs-are-screwed/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2026-03-16-models-are-commodities-harnesses-are-differentiators/</id>
      <title type="text">🔗 Models are commodities, harnesses are differentiators</title>
        <link href="https://stratechery.com/2026/agents-over-bubbles/" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2026-03-16-models-are-commodities-harnesses-are-differentiators/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-03-16T17:03:58+00:00</published>
    <updated>2026-03-16T18:38:16+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p><a href="https://stratechery.com/2026/agents-over-bubbles/">Ben Thompson's latest</a> rests on a single load-bearing assumption: that the harness and the model are tightly coupled, the way Apple's hardware and software are.</p>
<blockquote>
<p>It follows, then, that if agents require integration between model and harness, that the companies building that integration—specifically Anthropic and OpenAI—are actually poised to be significantly more profitable than it might have seemed as recently as late last year.</p>
</blockquote>
<p>This assumption is incorrect. To date, agents have not clearly benefited from proprietary integration to their favored model. I thought this was obvious, but I sometimes forget that not everybody else has made it their full-time hobby to mix and match various coding agents with various large language models for the past year.</p>
<p>Here's how I see it.</p>
<p>The API surface of a frontier model is text in, text out. Images in, images out. Audio in, audio out. AI models are among the most immediately pluggable and therefore commoditizable innovations in the history of software—right up there with UNIX pipes and their simple promise of text in, text out. <a href="https://github.com/Aider-AI/aider">Countless</a> <a href="https://github.com/just-every/code">forks</a> <a href="https://github.com/opencode-ai/opencode">and</a> <a href="https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent">TUIs</a> <a href="https://github.com/plandex-ai/plandex">have</a> <a href="https://github.com/NousResearch/hermes-agent">already</a> <a href="https://github.com/block/goose">demonstrated</a> that swapping the underlying model is a marginal concern, not a structural one. The harness doesn't integrate <em>with</em> the model. It integrates with <em>the user's world</em>—files, tools, workflows, intent—and calls the model as one resource among many.</p>
<p>This distinction matters enormously. A high-quality harness paired with a mediocre model can accomplish incredible things. A frontier model paired with a poorly-considered harness can barely get out of the gate. If model-harness integration were truly the differentiator, the model would indeed be irreplaceable and invaluable. But in practice, models have turned out to be the most replaceable part of the stack. And every recent advance in tool use, verification, and orchestration has only made this clearer—the harness gets more valuable while the specific model behind it gets more interchangeable. As long as multiple companies are credibly in the frontier model game, there will be cutthroat competition and relentless downward pressure on price. And while it may not happen soon, models and hardware will eventually advance to the point that a local open model is good enough—and then the frontier labs won't just be commoditized, they'll be cut out entirely.</p>
<p>Thompson brings up <a href="https://www.microsoft.com/en-us/microsoft-365/blog/2026/03/09/copilot-cowork-a-new-way-of-getting-work-done/">Microsoft's new Copilot Cowork bundling initiative</a> as evidence that model-harness integration is where value accrues:</p>
<blockquote>
<p>Fast forward to last week, however, when Microsoft revealed how they will handle the potential business impact of AI reducing seats, which is a bit of a problem for their seat-based business model: the company is going to bundle AI into a new higher-tiered enterprise offering, E7, which is going to cost twice as much — $99 per seat per month — as the formerly top-of-the-line E5. That's a big increase, which Microsoft needs to justify with AI that actually makes those seats more productive, and the product they launched with the new bundle was Copilot Cowork.</p>
</blockquote>
<p>Microsoft is indeed in a tight spot, but not because the model makers have a monopoly on harnesses. Instead, blame their outlandish investments in somebody else's model, their piss-poor track record for delivering a single worthwhile Copilot-branded piece of software outside the GitHub org, and their over-reliance on per-seat licensing that is existentially at odds with a strategy that, if successful, would drastically reduce the number of seats its customers need. None of that tells us anything about whether models and harnesses are structurally coupled. It only tells us what we already know: that Microsoft has put itself in a strategically weak position—a strategy that presupposed they would somehow stop sucking at building software people actually want to use.</p>
<p>Apple's situation is a cleaner test of the thesis. <a href="https://asymco.com/2026/03/10/the-most-brilliant-move-in-corporate-history/">Dediu is probably right</a> that Apple has a tremendous opportunity precisely <em>because</em> they can build a harness and swap the underlying model. Will they build an incredible harness? No—they'll build one that's just good enough to keep customers buying their hardware. But the strategic logic is sound: focus on the human interface and the real-world problems it can solve, and don't cede the narrative to implementation details like which model is running underneath. The truly great harnesses will probably come from smaller, more nimble startups who understand that the opportunity isn't in training the next frontier model—it's in connecting the horsepower of <em>any</em> capable model to the thousand different domains waiting to be served.</p>
<p>The frontier labs attracted an outsized share of attention and funding because OpenAI happened to hit one out of the park with ChatGPT as a product, and this conflation continues to produce analyses that make the same mistake Thompson is making. ChatGPT went so mainstream that it's treated as a blockbuster product, but I suspect we'll look back on it merely as a (historically impactful) proof of concept. The work of building a chatbot and the work of training a frontier model are only incidentally related. The thousands of chatbot systems that have sprung up since ChatGPT's release should be all the evidence we need that building a great chatbot never required building a great model—OpenAI just happened to do both.</p>
<p>At the end of the day, the utility of models is owed to the fact that they are black boxes with simple interfaces. Text in, text out. Audio in, audio out. Increasingly, video in, video out. But that simplicity is also what makes them commodities. And leads don't last long enough for anyone to establish a moat—the underlying research unlocks improvements in the open, and ubiquitous access to everyone's models facilitates distillation of competing ones.</p>
<p>Harnesses couldn't be more different. Harnesses are the gooey, ever-shifting integration of human-computer interface. They connect people's needs to implementations designed to meet them. With a little <a href="https://github.com/searlsco/prove_it">cleverness and elbow grease</a>, they can be dispatched to verify that those implementations work. They can be assigned to orchestrate other agents across systems in separate geographies, and over sessions conducted at different times.</p>
<p>The model is the engine. The harness is the car. And history has shown—over and over—that you don't need to manufacture your own engine to build a great car.</p>

<p>🔗 <a href="https://stratechery.com/2026/agents-over-bubbles/" title="Original Article">stratechery.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2026-03-16-models-are-commodities-harnesses-are-differentiators/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p><a href="https://stratechery.com/2026/agents-over-bubbles/">Ben Thompson's latest</a> rests on a single load-bearing assumption: that the harness and the model are tightly coupled, the way Apple's hardware and software are.</p>
<blockquote>
<p>It follows, then, that if agents require integration between model and harness, that the companies building that integration—specifically Anthropic and OpenAI—are actually poised to be significantly more profitable than it might have seemed as recently as late last year.</p>
</blockquote>
<p>This assumption is incorrect. To date, agents have not clearly benefited from proprietary integration to their favored model. I thought this was obvious, but I sometimes forget that not everybody else has made it their full-time hobby to mix and match various coding agents with various large language models for the past year.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2026-03-16-models-are-commodities-harnesses-are-differentiators/","append_url_label":"Click 🔗","content":"\u003cp\u003e\u003ca href=\"https://stratechery.com/2026/agents-over-bubbles/\"\u003eBen Thompson's latest\u003c/a\u003e rests on a single load-bearing assumption: that the harness and the model are tightly coupled, the way Apple's hardware and software are.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIt follows, then, that if agents require integration between model and harness, that the companies building that integration—specifically Anthropic and OpenAI—are actually poised to be significantly more profitable than it might have seemed as recently as late last year.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis assumption is incorrect. To date, agents have not clearly benefited from proprietary integration to their favored model. I thought this was obvious, but I sometimes forget that not everybody else has made it their full-time hobby to mix and match various coding agents with various large language models for the past year.\u003c/p\u003e\n\u003cp\u003eHere's how I see it.\u003c/p\u003e\n\u003cp\u003eThe API surface of a frontier model is text in, text out. Images in, images out. Audio in, audio out. AI models are among the most immediately pluggable and therefore commoditizable innovations in the history of software—right up there with UNIX pipes and their simple promise of text in, text out. \u003ca href=\"https://github.com/Aider-AI/aider\"\u003eCountless\u003c/a\u003e \u003ca href=\"https://github.com/just-every/code\"\u003eforks\u003c/a\u003e \u003ca href=\"https://github.com/opencode-ai/opencode\"\u003eand\u003c/a\u003e \u003ca href=\"https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent\"\u003eTUIs\u003c/a\u003e \u003ca href=\"https://github.com/plandex-ai/plandex\"\u003ehave\u003c/a\u003e \u003ca href=\"https://github.com/NousResearch/hermes-agent\"\u003ealready\u003c/a\u003e \u003ca href=\"https://github.com/block/goose\"\u003edemonstrated\u003c/a\u003e that swapping the underlying model is a marginal concern, not a structural one. The harness doesn't integrate \u003cem\u003ewith\u003c/em\u003e the model. It integrates with \u003cem\u003ethe user's world\u003c/em\u003e—files, tools, workflows, intent—and calls the model as one resource among many.\u003c/p\u003e\n\u003cp\u003eThis distinction matters enormously. A high-quality harness paired with a mediocre model can accomplish incredible things. A frontier model paired with a poorly-considered harness can barely get out of the gate. If model-harness integration were truly the differentiator, the model would indeed be irreplaceable and invaluable. But in practice, models have turned out to be the most replaceable part of the stack. And every recent advance in tool use, verification, and orchestration has only made this clearer—the harness gets more valuable while the specific model behind it gets more interchangeable. As long as multiple companies are credibly in the frontier model game, there will be cutthroat competition and relentless downward pressure on price. And while it may not happen soon, models and hardware will eventually advance to the point that a local open model is good enough—and then the frontier labs won't just be commoditized, they'll be cut out entirely.\u003c/p\u003e\n\u003cp\u003eThompson brings up \u003ca href=\"https://www.microsoft.com/en-us/microsoft-365/blog/2026/03/09/copilot-cowork-a-new-way-of-getting-work-done/\"\u003eMicrosoft's new Copilot Cowork bundling initiative\u003c/a\u003e as evidence that model-harness integration is where value accrues:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFast forward to last week, however, when Microsoft revealed how they will handle the potential business impact of AI reducing seats, which is a bit of a problem for their seat-based business model: the company is going to bundle AI into a new higher-tiered enterprise offering, E7, which is going to cost twice as much — $99 per seat per month — as the formerly top-of-the-line E5. That's a big increase, which Microsoft needs to justify with AI that actually makes those seats more productive, and the product they launched with the new bundle was Copilot Cowork.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eMicrosoft is indeed in a tight spot, but not because the model makers have a monopoly on harnesses. Instead, blame their outlandish investments in somebody else's model, their piss-poor track record for delivering a single worthwhile Copilot-branded piece of software outside the GitHub org, and their over-reliance on per-seat licensing that is existentially at odds with a strategy that, if successful, would drastically reduce the number of seats its customers need. None of that tells us anything about whether models and harnesses are structurally coupled. It only tells us what we already know: that Microsoft has put itself in a strategically weak position—a strategy that presupposed they would somehow stop sucking at building software people actually want to use.\u003c/p\u003e\n\u003cp\u003eApple's situation is a cleaner test of the thesis. \u003ca href=\"https://asymco.com/2026/03/10/the-most-brilliant-move-in-corporate-history/\"\u003eDediu is probably right\u003c/a\u003e that Apple has a tremendous opportunity precisely \u003cem\u003ebecause\u003c/em\u003e they can build a harness and swap the underlying model. Will they build an incredible harness? No—they'll build one that's just good enough to keep customers buying their hardware. But the strategic logic is sound: focus on the human interface and the real-world problems it can solve, and don't cede the narrative to implementation details like which model is running underneath. The truly great harnesses will probably come from smaller, more nimble startups who understand that the opportunity isn't in training the next frontier model—it's in connecting the horsepower of \u003cem\u003eany\u003c/em\u003e capable model to the thousand different domains waiting to be served.\u003c/p\u003e\n\u003cp\u003eThe frontier labs attracted an outsized share of attention and funding because OpenAI happened to hit one out of the park with ChatGPT as a product, and this conflation continues to produce analyses that make the same mistake Thompson is making. ChatGPT went so mainstream that it's treated as a blockbuster product, but I suspect we'll look back on it merely as a (historically impactful) proof of concept. The work of building a chatbot and the work of training a frontier model are only incidentally related. The thousands of chatbot systems that have sprung up since ChatGPT's release should be all the evidence we need that building a great chatbot never required building a great model—OpenAI just happened to do both.\u003c/p\u003e\n\u003cp\u003eAt the end of the day, the utility of models is owed to the fact that they are black boxes with simple interfaces. Text in, text out. Audio in, audio out. Increasingly, video in, video out. But that simplicity is also what makes them commodities. And leads don't last long enough for anyone to establish a moat—the underlying research unlocks improvements in the open, and ubiquitous access to everyone's models facilitates distillation of competing ones.\u003c/p\u003e\n\u003cp\u003eHarnesses couldn't be more different. Harnesses are the gooey, ever-shifting integration of human-computer interface. They connect people's needs to implementations designed to meet them. With a little \u003ca href=\"https://github.com/searlsco/prove_it\"\u003ecleverness and elbow grease\u003c/a\u003e, they can be dispatched to verify that those implementations work. They can be assigned to orchestrate other agents across systems in separate geographies, and over sessions conducted at different times.\u003c/p\u003e\n\u003cp\u003eThe model is the engine. The harness is the car. And history has shown—over and over—that you don't need to manufacture your own engine to build a great car.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2026-03-16-models-are-commodities-harnesses-are-differentiators/","og_image":"https://justin.searls.co/img/social/links/2026-03-16-models-are-commodities-harnesses-are-differentiators.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-03-16T17:03:58Z","related_url":"https://stratechery.com/2026/agents-over-bubbles/","title":"Models are commodities, harnesses are differentiators","updated_at":"2026-03-16T18:38:16Z","url":"https://justin.searls.co/links/2026-03-16-models-are-commodities-harnesses-are-differentiators/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/</id>
      <title type="text">📄 Dual-loop BDD is the new Red-green TDD</title>
      <link href="https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-03-15T12:00:00+00:00</published>
    <updated>2026-03-15T12:49:53-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>This one goes out to all the testing neophytes who <a href="https://simonwillison.net/guides/agentic-engineering-patterns/red-green-tdd/">only recently realized</a> that it's useful to have an automated means of verifying their code does what it claims to do.</p>
<p>For the last month, I've been working on <a href="https://github.com/searlsco/prove_it">prove_it</a>, a framework for building quality harnesses for <a href="https://claude.com/product/claude-code">Claude Code</a>—primarily via its <a href="https://code.claude.com/docs/en/hooks">hooks system</a>. In a recent release, I added TDD enforcement to its default configuration. First, it injects a test-first development approach into every plan Claude generates. Then, a <code>PreToolUse</code> hook follows up with <code>permissionDecisionReason</code> reminders whenever the agent deviates from the one true path (e.g., repeatedly edits source files without touching any tests, never runs a test to see it fail, etc.).</p>
<p>And just like real life, <strong>nagging developers works</strong>. My current side project is having no problem maintaining 100% (not 99%, not 99.9%, but 100%) code coverage.</p>
<p>My initial prompt simply told the agent to practice &quot;red-green TDD&quot; (a phrase I had never heard of until it was discovered that LLMs apparently interpret it as &quot;real TDD&quot;). This approach turned out to be woefully insufficient. Why? Because agents follow the path of least resistance and will invariably write a shitload of unit tests chasing the local maximum of code coverage without any regard for the global maximum of <em>making sure shit actually works</em>. After finishing each feature, all the code would have real unit tests with real assertions, but each time I tried running the fully-integrated app, the agent would find a novel way to miss the forest for the trees.</p>
<p>So yesterday I updated the prompt with the more sophisticated dual-loop approach developed by folks like <a href="https://dannorth.net">Dan North</a> and other adherents of <a href="https://en.wikipedia.org/wiki/Behavior-driven_development">behavior-driven development</a> in the late aughts. It is best illustrated by two concentric circles: you begin each feature with a failing integration test, then dive into an inner loop for numerous red-green-refactor iterations of unit tests, then pop back out again once the outer loop's integration test passes.</p>
<p>Honestly, I hadn't taken this practice off the shelf in a while, but since updating the prompt that gets injected into every Claude Code plan, it's been working out great:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">## Development approach
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Follow BDD dual-loop TDD. Every feature increment starts from a failing integration
</span></span><span class="line"><span class="cl">test and is driven inward through unit-level red-green-refactor cycles.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Outer loop (integration)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1. Red (integration) — Write one integration/acceptance test that describes the
</span></span><span class="line"><span class="cl">next observable behavior from the outside in. Run it. Confirm it fails for the
</span></span><span class="line"><span class="cl">reason you expect. Do not proceed until the failure message matches your intent.
</span></span><span class="line"><span class="cl">2. Inner loop (unit) — repeat until the integration test can pass:
</span></span><span class="line"><span class="cl">  - Red — Write the smallest unit test that expresses the next missing piece of
</span></span><span class="line"><span class="cl">implementation the integration test needs.
</span></span><span class="line"><span class="cl">  - Green — Write the minimum production code to make that unit test pass.
</span></span><span class="line"><span class="cl">Run it in isolation and confirm. No speculative code.
</span></span><span class="line"><span class="cl">  - Refactor — Clean up the code you just wrote (duplication, naming, structure)
</span></span><span class="line"><span class="cl">while all unit tests stay green. Only touch code covered by passing tests.
</span></span><span class="line"><span class="cl">3. Green (integration) — When enough unit-level pieces exist, re-run the
</span></span><span class="line"><span class="cl">integration test. If it still fails, diagnose which piece is missing and drop back
</span></span><span class="line"><span class="cl">into the inner loop. Do not add code without a failing test driving it.
</span></span><span class="line"><span class="cl">4. Refactor (integration) — With the integration test green, refactor across
</span></span><span class="line"><span class="cl">module boundaries if needed. All tests — unit and integration — must stay green.
</span></span><span class="line"><span class="cl">5. Repeat from step 1 with the next slice of behavior until the task is complete.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">### Discipline rules
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- Never skip the red step. If you cannot articulate why a test fails, you do not yet
</span></span><span class="line"><span class="cl">understand the requirement.
</span></span><span class="line"><span class="cl">- One logical change per cycle. If you are changing more than one behavior at a
</span></span><span class="line"><span class="cl">time,
</span></span><span class="line"><span class="cl">split it.
</span></span><span class="line"><span class="cl">- Run only the relevant test after each green step, then the full suite before each
</span></span><span class="line"><span class="cl">commit-worthy checkpoint.
</span></span><span class="line"><span class="cl">- If a refactor breaks a test, revert the refactor — do not fix forward.
</span></span><span class="line"><span class="cl">- Treat a surprise failure (wrong message, wrong location) as information: re-read
</span></span><span class="line"><span class="cl">it,
</span></span><span class="line"><span class="cl"> adjust your understanding, then proceed.
</span></span></code></pre></div><p>I imagine most people reading this will just copy-paste it into an AGENTS.md file or something, but if you're actually interested in learning more about this topic, my favorite articulation of this concept can be found in the edition of <a href="https://www.amazon.com/RSpec-Book-Behaviour-Development-Cucumber/dp/1934356379">The RSpec Book that Zach Dennis worked on</a>.</p>

<h2 id="now-for-just-a-touch-of-resentment">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/#now-for-just-a-touch-of-resentment">Now for just a <em>touch</em> of resentment</a>
</h2>
<p>Not for nothing, but a friend of mine asked why it was that so many programmers who had previously rejected test-driven development and related practices are suddenly embracing it. I genuinely believe some people interpret the suggestion that their code isn't good enough as a personal affront. They feel that being told to write tests, much less orient their workflow around verifying the quality of their work product, is somehow an indictment of their programming skills. So fragile is the ego of many programmers. I witnessed this defensive reaction firsthand on countless training and coaching engagements, so I'm speaking from experience here.</p>
<p>Of course, in 2026, the same people are suddenly huge fans of the same practices they once dismissed, because now we're talking about verifying <em>some dipshit AI agent's work</em>. The key difference is that any such tests exist not as a condemnation of themselves, but of the code written by some external thing.</p>
<p>What's funny about this, of course, is that nothing has really changed. If you zoom out, it's still just some doofus staring at a computer screen in silence all day. But yeah, a lot more people are suddenly really interested in TDD than there used to be.</p>
]]></content>
    <summary type="html"><![CDATA[<p>This one goes out to all the testing neophytes who <a href="https://simonwillison.net/guides/agentic-engineering-patterns/red-green-tdd/">only recently realized</a> that it's useful to have an automated means of verifying their code does what it claims to do.</p>
<p>For the last month, I've been working on <a href="https://github.com/searlsco/prove_it">prove_it</a>, a framework for building quality harnesses for <a href="https://claude.com/product/claude-code">Claude Code</a>—primarily via its <a href="https://code.claude.com/docs/en/hooks">hooks system</a>. In a recent release, I added TDD enforcement to its default configuration. First, it injects a test-first development approach into every plan Claude generates. Then, a <code>PreToolUse</code> hook follows up with <code>permissionDecisionReason</code> reminders whenever the agent deviates from the one true path (e.g., repeatedly edits source files without touching any tests, never runs a test to see it fail, etc.).</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/","append_url_label":"Read 📄","content":"\u003cp\u003eThis one goes out to all the testing neophytes who \u003ca href=\"https://simonwillison.net/guides/agentic-engineering-patterns/red-green-tdd/\"\u003eonly recently realized\u003c/a\u003e that it's useful to have an automated means of verifying their code does what it claims to do.\u003c/p\u003e\n\u003cp\u003eFor the last month, I've been working on \u003ca href=\"https://github.com/searlsco/prove_it\"\u003eprove_it\u003c/a\u003e, a framework for building quality harnesses for \u003ca href=\"https://claude.com/product/claude-code\"\u003eClaude Code\u003c/a\u003e—primarily via its \u003ca href=\"https://code.claude.com/docs/en/hooks\"\u003ehooks system\u003c/a\u003e. In a recent release, I added TDD enforcement to its default configuration. First, it injects a test-first development approach into every plan Claude generates. Then, a \u003ccode\u003ePreToolUse\u003c/code\u003e hook follows up with \u003ccode\u003epermissionDecisionReason\u003c/code\u003e reminders whenever the agent deviates from the one true path (e.g., repeatedly edits source files without touching any tests, never runs a test to see it fail, etc.).\u003c/p\u003e\n\u003cp\u003eAnd just like real life, \u003cstrong\u003enagging developers works\u003c/strong\u003e. My current side project is having no problem maintaining 100% (not 99%, not 99.9%, but 100%) code coverage.\u003c/p\u003e\n\u003cp\u003eMy initial prompt simply told the agent to practice \u0026quot;red-green TDD\u0026quot; (a phrase I had never heard of until it was discovered that LLMs apparently interpret it as \u0026quot;real TDD\u0026quot;). This approach turned out to be woefully insufficient. Why? Because agents follow the path of least resistance and will invariably write a shitload of unit tests chasing the local maximum of code coverage without any regard for the global maximum of \u003cem\u003emaking sure shit actually works\u003c/em\u003e. After finishing each feature, all the code would have real unit tests with real assertions, but each time I tried running the fully-integrated app, the agent would find a novel way to miss the forest for the trees.\u003c/p\u003e\n\u003cp\u003eSo yesterday I updated the prompt with the more sophisticated dual-loop approach developed by folks like \u003ca href=\"https://dannorth.net\"\u003eDan North\u003c/a\u003e and other adherents of \u003ca href=\"https://en.wikipedia.org/wiki/Behavior-driven_development\"\u003ebehavior-driven development\u003c/a\u003e in the late aughts. It is best illustrated by two concentric circles: you begin each feature with a failing integration test, then dive into an inner loop for numerous red-green-refactor iterations of unit tests, then pop back out again once the outer loop's integration test passes.\u003c/p\u003e\n\u003cp\u003eHonestly, I hadn't taken this practice off the shelf in a while, but since updating the prompt that gets injected into every Claude Code plan, it's been working out great:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e## Development approach\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFollow BDD dual-loop TDD. Every feature increment starts from a failing integration\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etest and is driven inward through unit-level red-green-refactor cycles.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e### Outer loop (integration)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1. Red (integration) — Write one integration/acceptance test that describes the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enext observable behavior from the outside in. Run it. Confirm it fails for the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ereason you expect. Do not proceed until the failure message matches your intent.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2. Inner loop (unit) — repeat until the integration test can pass:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - Red — Write the smallest unit test that expresses the next missing piece of\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eimplementation the integration test needs.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - Green — Write the minimum production code to make that unit test pass.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRun it in isolation and confirm. No speculative code.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - Refactor — Clean up the code you just wrote (duplication, naming, structure)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewhile all unit tests stay green. Only touch code covered by passing tests.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3. Green (integration) — When enough unit-level pieces exist, re-run the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eintegration test. If it still fails, diagnose which piece is missing and drop back\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einto the inner loop. Do not add code without a failing test driving it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e4. Refactor (integration) — With the integration test green, refactor across\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodule boundaries if needed. All tests — unit and integration — must stay green.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5. Repeat from step 1 with the next slice of behavior until the task is complete.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e### Discipline rules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- Never skip the red step. If you cannot articulate why a test fails, you do not yet\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunderstand the requirement.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- One logical change per cycle. If you are changing more than one behavior at a\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etime,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esplit it.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- Run only the relevant test after each green step, then the full suite before each\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecommit-worthy checkpoint.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- If a refactor breaks a test, revert the refactor — do not fix forward.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- Treat a surprise failure (wrong message, wrong location) as information: re-read\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eit,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e adjust your understanding, then proceed.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI imagine most people reading this will just copy-paste it into an AGENTS.md file or something, but if you're actually interested in learning more about this topic, my favorite articulation of this concept can be found in the edition of \u003ca href=\"https://www.amazon.com/RSpec-Book-Behaviour-Development-Cucumber/dp/1934356379\"\u003eThe RSpec Book that Zach Dennis worked on\u003c/a\u003e.\u003c/p\u003e\n\n\u003ch2 id=\"now-for-just-a-touch-of-resentment\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/#now-for-just-a-touch-of-resentment\"\u003eNow for just a \u003cem\u003etouch\u003c/em\u003e of resentment\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eNot for nothing, but a friend of mine asked why it was that so many programmers who had previously rejected test-driven development and related practices are suddenly embracing it. I genuinely believe some people interpret the suggestion that their code isn't good enough as a personal affront. They feel that being told to write tests, much less orient their workflow around verifying the quality of their work product, is somehow an indictment of their programming skills. So fragile is the ego of many programmers. I witnessed this defensive reaction firsthand on countless training and coaching engagements, so I'm speaking from experience here.\u003c/p\u003e\n\u003cp\u003eOf course, in 2026, the same people are suddenly huge fans of the same practices they once dismissed, because now we're talking about verifying \u003cem\u003esome dipshit AI agent's work\u003c/em\u003e. The key difference is that any such tests exist not as a condemnation of themselves, but of the code written by some external thing.\u003c/p\u003e\n\u003cp\u003eWhat's funny about this, of course, is that nothing has really changed. If you zoom out, it's still just some doofus staring at a computer screen in silence all day. But yeah, a lot more people are suddenly really interested in TDD than there used to be.\u003c/p\u003e\n","id":"https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/","og_image":"https://justin.searls.co/img/social/posts/dual-loop-bdd-is-the-new-red-green-tdd.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-03-15T12:00:00Z","title":"Dual-loop BDD is the new Red-green TDD","updated_at":"2026-03-15T12:49:53-04:00","url":"https://justin.searls.co/posts/dual-loop-bdd-is-the-new-red-green-tdd/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2026-03-14-08h55m56s/</id>
      <title type="text">📸 Red-green rally</title>
      <link href="https://justin.searls.co/shots/2026-03-14-08h55m56s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-03-14T12:55:56+00:00</published>
    <updated>2026-03-14T09:12:06-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2026-03-14-08h55m56s_r79p4w.mp4"/>
</div><p>I'm still iterating on my experimental Claude Code verification harness, <a href="https://github.com/searlsco/prove_it">prove_it</a>. This week my focus has been on nudging agents to practice test-driven development. Traditionally, we called this &quot;TDD&quot;, but which has recently been renamed to &quot;red-green TDD&quot; as it has been discovered that this is what LLMs interpret as &quot;real TDD&quot;.</p>
<p>Anyway, so that I could watch it steer an agent in a fresh codebase in real time, I opened a new directory and asked Claude Code to one-shot a terminal-based tennis game, replete with scoring and an AI that I couldn't beat. In OCaml. And it worked! It actually test-drove everything. Neat!</p>

]]></content>
    <summary type="html"><![CDATA[<p>I'm still iterating on my experimental Claude Code verification harness, <a href="https://github.com/searlsco/prove_it">prove_it</a>. This week my focus has been on nudging agents to practice test-driven development. Traditionally, we called this &quot;TDD&quot;, but which has recently been renamed to &quot;red-green TDD&quot; as it has been discovered that this is what LLMs interpret as &quot;real TDD&quot;.</p>
<p>Anyway, so that I could watch it steer an agent in a fresh codebase in real time, I opened a new directory and asked Claude Code to one-shot a terminal-based tennis game, replete with scoring and an AI that I couldn't beat. In OCaml. And it worked! It actually test-drove everything. Neat!</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2026-03-14-08h55m56s/","append_url_label":"View 📸","content":"\u003cp\u003eI'm still iterating on my experimental Claude Code verification harness, \u003ca href=\"https://github.com/searlsco/prove_it\"\u003eprove_it\u003c/a\u003e. This week my focus has been on nudging agents to practice test-driven development. Traditionally, we called this \u0026quot;TDD\u0026quot;, but which has recently been renamed to \u0026quot;red-green TDD\u0026quot; as it has been discovered that this is what LLMs interpret as \u0026quot;real TDD\u0026quot;.\u003c/p\u003e\n\u003cp\u003eAnyway, so that I could watch it steer an agent in a fresh codebase in real time, I opened a new directory and asked Claude Code to one-shot a terminal-based tennis game, replete with scoring and an AI that I couldn't beat. In OCaml. And it worked! It actually test-drove everything. Neat!\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2026-03-14-08h55m56s/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/shots/2026-03-14-08h55m56s_r79p4w.mp4"}],"og_image":"https://justin.searls.co/img/social/shots/2026-03-14-08h55m56s.jpg","platform_overrides":{},"published_at":"2026-03-14T12:55:56Z","title":"Red-green rally","updated_at":"2026-03-14T09:12:06-04:00","url":"https://justin.searls.co/shots/2026-03-14-08h55m56s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v52.0.1-len-testa-bring-back-the-starcruiser/</id>
      <title type="text">🎙️ Breaking Change podcast v52.0.1 - Len Testa: Bring back the Starcruiser</title>
      <link href="https://justin.searls.co/casts/breaking-change-v52.0.1-len-testa-bring-back-the-starcruiser/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-03-07T18:44:29+00:00</published>
    <updated>2026-03-07T15:46:46-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v52.0.1.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v52.0.1.mp3">Direct link to podcast audio file</a>
</p><p>Today, we're joined by a very special guest, <a href="https://bsky.app/profile/lentesta.bsky.social">Len Testa</a>! You might know him from <a href="https://podcasts.jimhillmedia.com/show/the-disney-dish-with-jim-hill/">The Disney Dish podcast</a> or from his excellent theme park travel planning app <a href="https://touringplans.com">Touring Plans</a>. Or you might not know him at all! No wrong answers.</p>
<p>This episode is all about Disney's ill-fated <a href="https://en.wikipedia.org/wiki/Star_Wars:_Galactic_Starcruiser">Star Wars: Galactic Starcruiser</a> live action role-playing hotel—which we both had the opportunity to experience right when it first launched. It was a life-changing experience for both of us, so why did it fail? Is it true that the top Disney brass learned all the wrong lessons from that failure? And will the CEO-in-waiting Josh D'Amaro ever have the courage to attempt something so ambitious again? Listen to this episode, in which we speak with an unearned confidence that suggests we have all of these answers!</p>
<p>You can reach out to Len at <a href="mailto:len@touringplans.com">len@touringplans.com</a> and you can write into the show at <a href="mailto:podcast@searls.co">podcast@searls.co</a>. He'll read your e-mail and reply to it, but I may only skim it.</p>
]]></content>
    <summary type="html"><![CDATA[<p>Today, we're joined by a very special guest, <a href="https://bsky.app/profile/lentesta.bsky.social">Len Testa</a>! You might know him from <a href="https://podcasts.jimhillmedia.com/show/the-disney-dish-with-jim-hill/">The Disney Dish podcast</a> or from his excellent theme park travel planning app <a href="https://touringplans.com">Touring Plans</a>. Or you might not know him at all! No wrong answers.</p>
<p>This episode is all about Disney's ill-fated <a href="https://en.wikipedia.org/wiki/Star_Wars:_Galactic_Starcruiser">Star Wars: Galactic Starcruiser</a> live action role-playing hotel—which we both had the opportunity to experience right when it first launched. It was a life-changing experience for both of us, so why did it fail? Is it true that the top Disney brass learned all the wrong lessons from that failure? And will the CEO-in-waiting Josh D'Amaro ever have the courage to attempt something so ambitious again? Listen to this episode, in which we speak with an unearned confidence that suggests we have all of these answers!</p>
<p>You can reach out to Len at <a href="mailto:len@touringplans.com">len@touringplans.com</a> and you can write into the show at <a href="mailto:podcast@searls.co">podcast@searls.co</a>. He'll read your e-mail and reply to it, but I may only skim it.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v52.0.1-len-testa-bring-back-the-starcruiser/","append_url_label":"Hear 🎙","content":"\u003cp\u003eToday, we're joined by a very special guest, \u003ca href=\"https://bsky.app/profile/lentesta.bsky.social\"\u003eLen Testa\u003c/a\u003e! You might know him from \u003ca href=\"https://podcasts.jimhillmedia.com/show/the-disney-dish-with-jim-hill/\"\u003eThe Disney Dish podcast\u003c/a\u003e or from his excellent theme park travel planning app \u003ca href=\"https://touringplans.com\"\u003eTouring Plans\u003c/a\u003e. Or you might not know him at all! No wrong answers.\u003c/p\u003e\n\u003cp\u003eThis episode is all about Disney's ill-fated \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars:_Galactic_Starcruiser\"\u003eStar Wars: Galactic Starcruiser\u003c/a\u003e live action role-playing hotel—which we both had the opportunity to experience right when it first launched. It was a life-changing experience for both of us, so why did it fail? Is it true that the top Disney brass learned all the wrong lessons from that failure? And will the CEO-in-waiting Josh D'Amaro ever have the courage to attempt something so ambitious again? Listen to this episode, in which we speak with an unearned confidence that suggests we have all of these answers!\u003c/p\u003e\n\u003cp\u003eYou can reach out to Len at \u003ca href=\"mailto:len@touringplans.com\"\u003elen@touringplans.com\u003c/a\u003e and you can write into the show at \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e. He'll read your e-mail and reply to it, but I may only skim it.\u003c/p\u003e","format_string":"Hotfix deployed! Len Testa joins for a Galactic Starcruiser tell-all: What was the Star Wars hotel actually like? Why did Disney's executives learn all the wrong lessons? What's Justin's hourly rate and does it include foot stuff? Listen and find out!","id":"https://justin.searls.co/casts/breaking-change-v52.0.1-len-testa-bring-back-the-starcruiser/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v52.0.1-len-testa-bring-back-the-starcruiser.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-03-07T18:44:29Z","title":"Len Testa: Bring back the Starcruiser","updated_at":"2026-03-07T15:46:46-05:00","url":"https://justin.searls.co/casts/breaking-change-v52.0.1-len-testa-bring-back-the-starcruiser/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v52-skynet-anypercent/</id>
      <title type="text">🎙️ Breaking Change podcast v52 - Skynet any%</title>
      <link href="https://justin.searls.co/casts/breaking-change-v52-skynet-anypercent/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-03-01T18:06:30+00:00</published>
    <updated>2026-03-01T21:10:30-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v52.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v52.mp3">Direct link to podcast audio file</a>
</p><p>Sure feels like some combination of AI, the US military, and the AI military could bring an end to the world any day now, so I figured I'd better record one last show for posterity. Welcome me on this version's speedrun to the apocalypse!</p>
<p>So long as the EMP blasts don't nuke all our ham radios, write in to  <a href="mailto:podcast@searls.co">podcast@searls.co</a> and I'll read it on the next release of the program. Over.</p>
<p>Be sure to click all these links while the clickin's good:</p>
<ul>
<li><a href="https://www.amazon.com/Ninja-NC501-Milkshakes-Programs-Containers/dp/B0B9CZ6XBQ">Ninja Creami Deluxe</a></li>
<li><a href="https://github.com/searlsco/prove_it">prove_it</a></li>
<li><a href="https://justin.searls.co/posts/agents-are-ushering-in-the-antisocial-coding-era/">Agents are ushering in the Antisocial Era</a></li>
<li><a href="https://justin.searls.co/posts/brace-for-the-fuckening/">Brace for the Fuckening</a></li>
<li><a href="https://www.citriniresearch.com/p/2028gic">Citrini Research fanfic</a></li>
<li><a href="https://seanrichey.substack.com/p/even-the-fed-has-caught-the-singularity">Would you like your AI singularity benign or extinction-level?</a>
<ul>
<li><a href="https://www.dallasfed.org/research/economics/2025/0624">Original post by the Dallas Fed</a></li>
</ul>
</li>
<li><a href="https://www.anthropic.com/news/statement-comments-secretary-war">Anthropic's Statement on the comments from Secretary of War Pete Hegseth</a></li>
<li><a href="https://openai.com/index/our-agreement-with-the-department-of-war/">OpenAI's agreement with the Department of War</a></li>
<li><a href="https://www.wsj.com/livecoverage/iran-strikes-2026/card/u-s-strikes-in-middle-east-use-anthropic-hours-after-trump-ban-ozNO0iClZpfpL7K7ElJ2">U.S. Strikes in Middle East Use Anthropic, Hours After Trump Ban</a></li>
<li><a href="https://www.newscientist.com/article/2517389-human-brain-cells-on-a-chip-learned-to-play-doom-in-a-week/">Human brain cells on a chip learned to play Doom in a week</a></li>
<li><a href="https://www.apple.com/newsroom/2026/02/apple-introduces-a-new-video-podcast-experience-on-apple-podcasts/">Apple introduces a new video podcast experience on Apple Podcasts</a></li>
<li><a href="https://developer.apple.com/documentation/foveatedstreaming">Foveated Streaming for Apple Vision Pro</a></li>
<li><a href="https://www.videogameschronicle.com/news/huge-xbox-shakeup-phil-spencer-retiring-sarah-bond-resigns-microsoft-ai-boss-becomes-new-microsoft-gaming-ceo/">Huge Xbox shakeup: Phil Spencer retiring, Sarah Bond resigns, Microsoft AI boss becomes new Microsoft Gaming CEO</a></li>
<li><a href="https://www.videogameschronicle.com/news/xcoms-jake-solomon-announces-his-new-studio-is-closing-reveals-now-cancelled-ai-driven-narrative-game/">XCOM's Jake Solomon announces his new studio is closing, reveals now-cancelled AI-driven narrative game</a></li>
<li><a href="https://www.videogameschronicle.com/news/fan-group-makes-unreal-tournament-2004-available-to-play-for-free-and-in-4k-with-epics-permission/">Fan group makes Unreal Tournament 2004 available to play for free and in 4K</a></li>
<li><a href="https://www.vice.com/en/article/video-games-are-losing-a-brain-rot-race-to-gambling-and-porn/">Video Games Are Losing a Brain Rot Race to Gambling and Porn</a> (<a href="https://apple.news/A4xASLoo8TsOfxD0c0VkOLQ">News+</a>)</li>
<li><a href="https://www.theverge.com/streaming/885753/netflix-exit-warner-bros-discovery-deal-paramount">Netflix walks away from its deal to buy Warner Bros. after Paramount came back with a better offer</a> (<a href="https://apple.news/Abi9G2sydTnW9nSNGF5WfOg">News+</a>)</li>
<li><a href="https://www.wsj.com/business/media/netflix-deal-warner-bros-discover-3b33b02c?st=CphU5i&amp;reflink=desktopwebshare_permalink">Why Netflix Actually Won Even Though It Lost Warner Deal</a> (<a href="https://apple.news/As6QY6sWdRiKQ6bS5uN9mjQ">News+</a>)</li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://en.wikipedia.org/wiki/Your_Friends_%26_Neighbors_(TV_series)">Your Friends &amp; Neighbors</a></li>
<li><a href="https://en.wikipedia.org/wiki/Rental_Family">Rental Family</a></li>
<li><a href="https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(TV_series)">Halt and Catch Fire</a> (again)</li>
<li><a href="https://www.hulu.com/guides/paradise">Paradise: Season 2</a></li>
<li><a href="https://store.steampowered.com/app/2643390/Star_Trek_Voyager__Across_the_Unknown/">Star Trek: Voyager - Across the Unknown</a></li>
<li><a href="https://github.com/cpisciotta/xcbeautify">xcbeautify</a></li>
<li><a href="https://github.com/searlsco/turbocommit">turbocommit</a></li>
<li><a href="https://testdouble.com/insights/youre-holding-it-wrong-the-double-loop-model-for-agentic-coding">The double loop model for agentic coding</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>Sure feels like some combination of AI, the US military, and the AI military could bring an end to the world any day now, so I figured I'd better record one last show for posterity. Welcome me on this version's speedrun to the apocalypse!</p>
<p>So long as the EMP blasts don't nuke all our ham radios, write in to  <a href="mailto:podcast@searls.co">podcast@searls.co</a> and I'll read it on the next release of the program. Over.</p>
<p>Be sure to click all these links while the clickin's good:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v52-skynet-anypercent/","append_url_label":"Hear 🎙","content":"\u003cp\u003eSure feels like some combination of AI, the US military, and the AI military could bring an end to the world any day now, so I figured I'd better record one last show for posterity. Welcome me on this version's speedrun to the apocalypse!\u003c/p\u003e\n\u003cp\u003eSo long as the EMP blasts don't nuke all our ham radios, write in to  \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e and I'll read it on the next release of the program. Over.\u003c/p\u003e\n\u003cp\u003eBe sure to click all these links while the clickin's good:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.amazon.com/Ninja-NC501-Milkshakes-Programs-Containers/dp/B0B9CZ6XBQ\"\u003eNinja Creami Deluxe\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/searlsco/prove_it\"\u003eprove_it\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/posts/agents-are-ushering-in-the-antisocial-coding-era/\"\u003eAgents are ushering in the Antisocial Era\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/posts/brace-for-the-fuckening/\"\u003eBrace for the Fuckening\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.citriniresearch.com/p/2028gic\"\u003eCitrini Research fanfic\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://seanrichey.substack.com/p/even-the-fed-has-caught-the-singularity\"\u003eWould you like your AI singularity benign or extinction-level?\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.dallasfed.org/research/economics/2025/0624\"\u003eOriginal post by the Dallas Fed\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.anthropic.com/news/statement-comments-secretary-war\"\u003eAnthropic's Statement on the comments from Secretary of War Pete Hegseth\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openai.com/index/our-agreement-with-the-department-of-war/\"\u003eOpenAI's agreement with the Department of War\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.wsj.com/livecoverage/iran-strikes-2026/card/u-s-strikes-in-middle-east-use-anthropic-hours-after-trump-ban-ozNO0iClZpfpL7K7ElJ2\"\u003eU.S. Strikes in Middle East Use Anthropic, Hours After Trump Ban\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.newscientist.com/article/2517389-human-brain-cells-on-a-chip-learned-to-play-doom-in-a-week/\"\u003eHuman brain cells on a chip learned to play Doom in a week\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.apple.com/newsroom/2026/02/apple-introduces-a-new-video-podcast-experience-on-apple-podcasts/\"\u003eApple introduces a new video podcast experience on Apple Podcasts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developer.apple.com/documentation/foveatedstreaming\"\u003eFoveated Streaming for Apple Vision Pro\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/huge-xbox-shakeup-phil-spencer-retiring-sarah-bond-resigns-microsoft-ai-boss-becomes-new-microsoft-gaming-ceo/\"\u003eHuge Xbox shakeup: Phil Spencer retiring, Sarah Bond resigns, Microsoft AI boss becomes new Microsoft Gaming CEO\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/xcoms-jake-solomon-announces-his-new-studio-is-closing-reveals-now-cancelled-ai-driven-narrative-game/\"\u003eXCOM's Jake Solomon announces his new studio is closing, reveals now-cancelled AI-driven narrative game\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/fan-group-makes-unreal-tournament-2004-available-to-play-for-free-and-in-4k-with-epics-permission/\"\u003eFan group makes Unreal Tournament 2004 available to play for free and in 4K\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.vice.com/en/article/video-games-are-losing-a-brain-rot-race-to-gambling-and-porn/\"\u003eVideo Games Are Losing a Brain Rot Race to Gambling and Porn\u003c/a\u003e (\u003ca href=\"https://apple.news/A4xASLoo8TsOfxD0c0VkOLQ\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/streaming/885753/netflix-exit-warner-bros-discovery-deal-paramount\"\u003eNetflix walks away from its deal to buy Warner Bros. after Paramount came back with a better offer\u003c/a\u003e (\u003ca href=\"https://apple.news/Abi9G2sydTnW9nSNGF5WfOg\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.wsj.com/business/media/netflix-deal-warner-bros-discover-3b33b02c?st=CphU5i\u0026amp;reflink=desktopwebshare_permalink\"\u003eWhy Netflix Actually Won Even Though It Lost Warner Deal\u003c/a\u003e (\u003ca href=\"https://apple.news/As6QY6sWdRiKQ6bS5uN9mjQ\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Your_Friends_%26_Neighbors_(TV_series)\"\u003eYour Friends \u0026amp; Neighbors\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Rental_Family\"\u003eRental Family\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(TV_series)\"\u003eHalt and Catch Fire\u003c/a\u003e (again)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.hulu.com/guides/paradise\"\u003eParadise: Season 2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://store.steampowered.com/app/2643390/Star_Trek_Voyager__Across_the_Unknown/\"\u003eStar Trek: Voyager - Across the Unknown\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/cpisciotta/xcbeautify\"\u003excbeautify\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/searlsco/turbocommit\"\u003eturbocommit\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://testdouble.com/insights/youre-holding-it-wrong-the-double-loop-model-for-agentic-coding\"\u003eThe double loop model for agentic coding\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Skynet any%","id":"https://justin.searls.co/casts/breaking-change-v52-skynet-anypercent/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v52-skynet-anypercent.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-03-01T18:06:30Z","title":"Skynet any%","updated_at":"2026-03-01T21:10:30-05:00","url":"https://justin.searls.co/casts/breaking-change-v52-skynet-anypercent/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/agents-are-ushering-in-the-antisocial-coding-era/</id>
      <title type="text">📄 Agents are ushering in the Antisocial Coding era</title>
      <link href="https://justin.searls.co/posts/agents-are-ushering-in-the-antisocial-coding-era/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-26T16:26:27+00:00</published>
    <updated>2026-02-26T11:35:28-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>The first time I visited GitHub's HQ2 in 2012, they had a TV showing off their first animations of <a href="https://brand.github.com/graphic-elements/mascots#mona">Mona</a> and were using it to push their new tagline: <strong>Social Coding</strong>. The phrase certainly captured the moment we were living in, so in 2014, I borrowed it for the title of one of my more popular conference talks, <a href="https://www.youtube.com/watch?v=HFRU6eQKp4Y">The Social Coding Contract</a>. The goal of that presentation was to warn audiences of the long-term risks of all these tools making it so trivially easy to publish and consume open source dependencies. Sure enough, what followed was a decade defined by the productive and destructive chaos of a ceaseless deluge of useful, but poorly-understood and under-maintained dependencies.</p>
<p>Thanks to the upheaval being caused by coding agents, I believe we've entered a new era without realizing it, one that might be called <strong>Antisocial Coding</strong>.</p>
<p>Three things I've been chewing on lately:</p>
<ul>
<li>
<p><strong>Agents blow out team communication costs.</strong> Last year, <a href="https://worksonmymachine.ai/p/the-parallel-lives-of-an-ai-engineer">Scott Werner</a> compared a developer orchestrating agents to an octopus with 8 autonomous arms and I replied to point out how this creates a <a href="/links/2025-08-03-there-is-no-ai-in-team/">hub-and-spoke communication crisis</a> that would prove unwieldy for traditional multi-developer collaboration. Since then, I've been advising startups to stay single-developer for as long as possible and telling larger organizations to start moving to one-repo-per-human wherever they can—even if it means re-architecting their systems to align with this.</p>
</li>
<li>
<p><strong>Agent-built codebases calcify quickly.</strong> Last night, <a href="https://calebhearth.com">Caleb Hearth</a> texted to tell me he'd created several issues on <a href="https://github.com/searlsco/turbocommit">turbocommit</a>, and I'm ashamed to admit my brain was so overwhelmed with six terminal tabs of unrelated WIP features that I brusquely denied all of them. Caleb shared a keen insight: many agent-led codebases are becoming impenetrably large and complex extremely early in their lifespan—even while the userbase is still limited to the original creator. And on reflection, I <em>do</em> sense a certain <strong>ossification</strong> in the projects I encounter lately—so tightly coupled to one person's hyper-specific needs that they lack room to grow or change by the time other users arrive. <a href="https://github.com/steveyegge/beads">Beads</a> is the perfect example: I spent two weeks trying to use it, but at <em>4 months old</em> it was already far too complex and brittle to integrate into my workflow</p>
</li>
<li>
<p><strong>Open source is closing its doors.</strong> Yesterday, <a href="https://github.com/tldraw/tldraw">tldraw</a> took the unusual step of <a href="https://simonwillison.net/2026/Feb/25/closed-tests/">removing the tests from their codebase</a>, on the theory their continued presence would make it far too easy for anyone with an agent to build a cleanroom rewrite and undermine their business. Nothing says &quot;closed for contributions&quot; quite like not even having access to a test suite or CI to work with</p>
</li>
</ul>
<p>I don't feel strongly about any of this, because I'm mostly a loner to begin with. But this trend will likely have troubling impacts for teams and organizations.</p>
<ul>
<li>If the last decade of social coding taught us anything, it's that pinning the continuity of your business operations on a bunch of software for which the <a href="https://en.wikipedia.org/wiki/Bus_factor">bus factor</a> is 1 is an unacceptable liability. If the next decade is typified by an explosion of solo projects, then the rational response will be to adopt fewer dependencies and have agents build more in-house implementations—even if it means shouldering more maintenance costs and security risks</li>
<li>Unlocking the maximum productivity afforded by agents by sequestering individual human developers to their own discrete fiefdoms (whether at the repository, <a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners">CODEOWNERS</a> file, or some other boundary) will only accelerate the trend of discouraging contributions from others, compounding the above issue at scale and throughout engineering organizations</li>
<li>While many people are (<a href="https://justin.searls.co/posts/brace-for-the-fuckening/">rightly</a>) concerned about AI's impact on the job prospects of less-experienced developers, the continued erosion of <a href="https://martinfowler.com/bliki/CodeOwnership.html">collective code ownership</a> coupled with a trend away from inter-person collaboration will further slam the door on opportunities for mentorship and apprenticeship, exacerbating the widening gap in potential value creation between juniors and seniors</li>
</ul>
<p>I've never had more fun building stuff than I'm having right now, but that doesn't change any of the above. These are important things to be watching out for. Engineering leaders should probably consider the downstream effects discussed here before plowing ahead with plans to reorient their organizations around what's best for maximizing the productivity of semi-autonomous coding agents.</p>]]></content>
    <summary type="html"><![CDATA[<p>The first time I visited GitHub's HQ2 in 2012, they had a TV showing off their first animations of <a href="https://brand.github.com/graphic-elements/mascots#mona">Mona</a> and were using it to push their new tagline: <strong>Social Coding</strong>. The phrase certainly captured the moment we were living in, so in 2014, I borrowed it for the title of one of my more popular conference talks, <a href="https://www.youtube.com/watch?v=HFRU6eQKp4Y">The Social Coding Contract</a>. The goal of that presentation was to warn audiences of the long-term risks of all these tools making it so trivially easy to publish and consume open source dependencies. Sure enough, what followed was a decade defined by the productive and destructive chaos of a ceaseless deluge of useful, but poorly-understood and under-maintained dependencies.</p>
<p>Thanks to the upheaval being caused by coding agents, I believe we've entered a new era without realizing it, one that might be called <strong>Antisocial Coding</strong>.</p>
<p>Three things I've been chewing on lately:</p>
<ul>
<li>
<p><strong>Agents blow out team communication costs.</strong> Last year, <a href="https://worksonmymachine.ai/p/the-parallel-lives-of-an-ai-engineer">Scott Werner</a> compared a developer orchestrating agents to an octopus with 8 autonomous arms and I replied to point out how this creates a <a href="/links/2025-08-03-there-is-no-ai-in-team/">hub-and-spoke communication crisis</a> that would prove unwieldy for traditional multi-developer collaboration. Since then, I've been advising startups to stay single-developer for as long as possible and telling larger organizations to start moving to one-repo-per-human wherever they can—even if it means re-architecting their systems to align with this.</p>
</li>
<li>
<p><strong>Agent-built codebases calcify quickly.</strong> Last night, <a href="https://calebhearth.com">Caleb Hearth</a> texted to tell me he'd created several issues on <a href="https://github.com/searlsco/turbocommit">turbocommit</a>, and I'm ashamed to admit my brain was so overwhelmed with six terminal tabs of unrelated WIP features that I brusquely denied all of them. Caleb shared a keen insight: many agent-led codebases are becoming impenetrably large and complex extremely early in their lifespan—even while the userbase is still limited to the original creator. And on reflection, I <em>do</em> sense a certain <strong>ossification</strong> in the projects I encounter lately—so tightly coupled to one person's hyper-specific needs that they lack room to grow or change by the time other users arrive. <a href="https://github.com/steveyegge/beads">Beads</a> is the perfect example: I spent two weeks trying to use it, but at <em>4 months old</em> it was already far too complex and brittle to integrate into my workflow</p>
</li>
<li>
<p><strong>Open source is closing its doors.</strong> Yesterday, <a href="https://github.com/tldraw/tldraw">tldraw</a> took the unusual step of <a href="https://simonwillison.net/2026/Feb/25/closed-tests/">removing the tests from their codebase</a>, on the theory their continued presence would make it far too easy for anyone with an agent to build a cleanroom rewrite and undermine their business. Nothing says &quot;closed for contributions&quot; quite like not even having access to a test suite or CI to work with</p>
</li>
</ul>
<p>I don't feel strongly about any of this, because I'm mostly a loner to begin with. But this trend will likely have troubling impacts for teams and organizations.</p>
<ul>
<li>If the last decade of social coding taught us anything, it's that pinning the continuity of your business operations on a bunch of software for which the <a href="https://en.wikipedia.org/wiki/Bus_factor">bus factor</a> is 1 is an unacceptable liability. If the next decade is typified by an explosion of solo projects, then the rational response will be to adopt fewer dependencies and have agents build more in-house implementations—even if it means shouldering more maintenance costs and security risks</li>
<li>Unlocking the maximum productivity afforded by agents by sequestering individual human developers to their own discrete fiefdoms (whether at the repository, <a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners">CODEOWNERS</a> file, or some other boundary) will only accelerate the trend of discouraging contributions from others, compounding the above issue at scale and throughout engineering organizations</li>
<li>While many people are (<a href="https://justin.searls.co/posts/brace-for-the-fuckening/">rightly</a>) concerned about AI's impact on the job prospects of less-experienced developers, the continued erosion of <a href="https://martinfowler.com/bliki/CodeOwnership.html">collective code ownership</a> coupled with a trend away from inter-person collaboration will further slam the door on opportunities for mentorship and apprenticeship, exacerbating the widening gap in potential value creation between juniors and seniors</li>
</ul>
<p>I've never had more fun building stuff than I'm having right now, but that doesn't change any of the above. These are important things to be watching out for. Engineering leaders should probably consider the downstream effects discussed here before plowing ahead with plans to reorient their organizations around what's best for maximizing the productivity of semi-autonomous coding agents.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/agents-are-ushering-in-the-antisocial-coding-era/","append_url_label":"Read 📄","content":"\u003cp\u003eThe first time I visited GitHub's HQ2 in 2012, they had a TV showing off their first animations of \u003ca href=\"https://brand.github.com/graphic-elements/mascots#mona\"\u003eMona\u003c/a\u003e and were using it to push their new tagline: \u003cstrong\u003eSocial Coding\u003c/strong\u003e. The phrase certainly captured the moment we were living in, so in 2014, I borrowed it for the title of one of my more popular conference talks, \u003ca href=\"https://www.youtube.com/watch?v=HFRU6eQKp4Y\"\u003eThe Social Coding Contract\u003c/a\u003e. The goal of that presentation was to warn audiences of the long-term risks of all these tools making it so trivially easy to publish and consume open source dependencies. Sure enough, what followed was a decade defined by the productive and destructive chaos of a ceaseless deluge of useful, but poorly-understood and under-maintained dependencies.\u003c/p\u003e\n\u003cp\u003eThanks to the upheaval being caused by coding agents, I believe we've entered a new era without realizing it, one that might be called \u003cstrong\u003eAntisocial Coding\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eThree things I've been chewing on lately:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAgents blow out team communication costs.\u003c/strong\u003e Last year, \u003ca href=\"https://worksonmymachine.ai/p/the-parallel-lives-of-an-ai-engineer\"\u003eScott Werner\u003c/a\u003e compared a developer orchestrating agents to an octopus with 8 autonomous arms and I replied to point out how this creates a \u003ca href=\"/links/2025-08-03-there-is-no-ai-in-team/\"\u003ehub-and-spoke communication crisis\u003c/a\u003e that would prove unwieldy for traditional multi-developer collaboration. Since then, I've been advising startups to stay single-developer for as long as possible and telling larger organizations to start moving to one-repo-per-human wherever they can—even if it means re-architecting their systems to align with this.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAgent-built codebases calcify quickly.\u003c/strong\u003e Last night, \u003ca href=\"https://calebhearth.com\"\u003eCaleb Hearth\u003c/a\u003e texted to tell me he'd created several issues on \u003ca href=\"https://github.com/searlsco/turbocommit\"\u003eturbocommit\u003c/a\u003e, and I'm ashamed to admit my brain was so overwhelmed with six terminal tabs of unrelated WIP features that I brusquely denied all of them. Caleb shared a keen insight: many agent-led codebases are becoming impenetrably large and complex extremely early in their lifespan—even while the userbase is still limited to the original creator. And on reflection, I \u003cem\u003edo\u003c/em\u003e sense a certain \u003cstrong\u003eossification\u003c/strong\u003e in the projects I encounter lately—so tightly coupled to one person's hyper-specific needs that they lack room to grow or change by the time other users arrive. \u003ca href=\"https://github.com/steveyegge/beads\"\u003eBeads\u003c/a\u003e is the perfect example: I spent two weeks trying to use it, but at \u003cem\u003e4 months old\u003c/em\u003e it was already far too complex and brittle to integrate into my workflow\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOpen source is closing its doors.\u003c/strong\u003e Yesterday, \u003ca href=\"https://github.com/tldraw/tldraw\"\u003etldraw\u003c/a\u003e took the unusual step of \u003ca href=\"https://simonwillison.net/2026/Feb/25/closed-tests/\"\u003eremoving the tests from their codebase\u003c/a\u003e, on the theory their continued presence would make it far too easy for anyone with an agent to build a cleanroom rewrite and undermine their business. Nothing says \u0026quot;closed for contributions\u0026quot; quite like not even having access to a test suite or CI to work with\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI don't feel strongly about any of this, because I'm mostly a loner to begin with. But this trend will likely have troubling impacts for teams and organizations.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIf the last decade of social coding taught us anything, it's that pinning the continuity of your business operations on a bunch of software for which the \u003ca href=\"https://en.wikipedia.org/wiki/Bus_factor\"\u003ebus factor\u003c/a\u003e is 1 is an unacceptable liability. If the next decade is typified by an explosion of solo projects, then the rational response will be to adopt fewer dependencies and have agents build more in-house implementations—even if it means shouldering more maintenance costs and security risks\u003c/li\u003e\n\u003cli\u003eUnlocking the maximum productivity afforded by agents by sequestering individual human developers to their own discrete fiefdoms (whether at the repository, \u003ca href=\"https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners\"\u003eCODEOWNERS\u003c/a\u003e file, or some other boundary) will only accelerate the trend of discouraging contributions from others, compounding the above issue at scale and throughout engineering organizations\u003c/li\u003e\n\u003cli\u003eWhile many people are (\u003ca href=\"https://justin.searls.co/posts/brace-for-the-fuckening/\"\u003erightly\u003c/a\u003e) concerned about AI's impact on the job prospects of less-experienced developers, the continued erosion of \u003ca href=\"https://martinfowler.com/bliki/CodeOwnership.html\"\u003ecollective code ownership\u003c/a\u003e coupled with a trend away from inter-person collaboration will further slam the door on opportunities for mentorship and apprenticeship, exacerbating the widening gap in potential value creation between juniors and seniors\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI've never had more fun building stuff than I'm having right now, but that doesn't change any of the above. These are important things to be watching out for. Engineering leaders should probably consider the downstream effects discussed here before plowing ahead with plans to reorient their organizations around what's best for maximizing the productivity of semi-autonomous coding agents.\u003c/p\u003e","id":"https://justin.searls.co/posts/agents-are-ushering-in-the-antisocial-coding-era/","og_image":"https://justin.searls.co/img/social/posts/agents-are-ushering-in-the-antisocial-coding-era.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-02-26T16:26:27Z","title":"Agents are ushering in the Antisocial Coding era","updated_at":"2026-02-26T11:35:28-05:00","url":"https://justin.searls.co/posts/agents-are-ushering-in-the-antisocial-coding-era/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/brace-for-the-fuckening/</id>
      <title type="text">📄 Brace for the Fuckening</title>
      <link href="https://justin.searls.co/posts/brace-for-the-fuckening/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-19T16:32:19+00:00</published>
    <updated>2026-02-19T11:57:56-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>It was only once I read Andrew Yang's <a href="https://blog.andrewyang.com/p/the-end-of-the-office">&quot;The End of the Office&quot;</a> post the other day that I realized how few political leaders are seriously grappling with this question: <strong>what will happen to civilization if all this AI investment actually pays off?</strong> Sitting with this thought led me to a dark place, if I'm being honest—not because society might be doomed, but because I'm left quoting Andrew Fucking Yang of all people:</p>
<blockquote>
<p>Expect the Starbucks in your local suburb to become occupied with middle-aged former office workers who want to get out of the house. That's a benign portrait, but a lot of these families still owe mortgages on their houses that they won't be able to maintain. If I were a homeowner in Silicon Valley or Westchester County, I might consider putting my house up for sale to see what I could get because there's going to be downward pressure on these communities. It might not feel great being first, but you don't want to be last.</p>
</blockquote>
<p>Then again, why should I be surprised that politicians aren't thinking about this? Almost nobody is! AI boosters are having too much fun <a href="https://www.nytimes.com/2026/02/18/opinion/ai-software.html?unlocked_article_code=1.NFA.djaw.TBlAp8kE_N-i">playing with Claude Code</a> to connect the dots between its current capabilities and the <a href="/takes/2026-02-17-08h30m19s/">post-office-work utopia/dystopia</a> that awaits us. Meanwhile, AI skeptics seem worryingly self-assured in their wishcasting that today's agents:</p>
<ol>
<li>Will never be able to do the things they can already do</li>
<li>Will forever remain as incompetent as they are now</li>
<li>Will disappear the moment the AI economic bubble bursts</li>
</ol>
<p>Other than the first item on that list, I don't even know that the skeptics are wrong! Maybe they're right! In fact, it'd be more convenient for all of us if the skeptics end up being right. But are we really certain that the probability Sam Altman is even kinda-sorta right is <em>literally zero percent</em>? If not, then we should probably prepare for that potentiality.</p>
<p>I imagine that we all have a pretty clear image of what will happen if the AI bubble pops: stocks will crash, Steam Decks will be <a href="https://www.tomshardware.com/video-games/handheld-gaming/valve-confirms-steam-deck-is-out-of-stock-due-to-memory-and-storage-shortages-supply-of-popular-gaming-handheld-in-trouble-because-of-massive-ai-demand">back in stock</a>, and Sam will end up in jail. (Maybe every disastrous hype cycle in tech simply demands that <a href="https://en.wikipedia.org/wiki/Sam_Bankman-Fried#Arrest_and_charges">at least one awkward white man named Sam goes to jail</a>.) But I've got to admit, many people I talk to and follow online don't seem to have given a second thought to the sort of economic hellscape we're in for if the astronomical valuations of companies like OpenAI, Anthropic, and SpaceX (<a href="/casts/breaking-change-v50-spacexxx/">lol</a>) turn out to have been appropriately priced.</p>
<p>Well, give it thirty seconds' thought, and—to borrow Yang's term of choice—we'll be in for <strong>The Fuckening</strong>: a macroeconomically significant decrease in the number of high-paying white collar jobs the market will support.</p>

<h2 id="tech-ceos-are-bullshitting-us">Tech CEOs are bullshitting us</h2>
<p>Listen to Satya or Sam or Jensen talk about this &quot;What if?&quot; scenario, and you'll hear them compare AI to technological revolutions of the past. They each breathlessly declare, &quot;<a href="https://abcnews.com/Business/microsoft-ceo-satya-nadella-discusses-jobs-future/story?id=50189787">there will be new jobs</a>,&quot; and that AI will, &quot;<a href="https://www.businessinsider.com/will-ai-replace-take-over-create-jobs-debate-tech-leaders-2025-6">create a bunch of new ones</a>,&quot; and even that, &quot;<a href="https://www.axios.com/newsletters/axios-ai-plus-7197a015-874a-4832-8865-21cff7a760ba">there will be <em>more</em> jobs</a>.&quot; But, as someone who's been using coding agents to build <a href="https://justin.searls.co/shovelware/">good-enough</a> software with the velocity of a traditional engineering team for nearly a year now, none of these reassurances pass the smell test. <strong>The idea that there will be at least one net-new job created for every job eliminated by AI simply isn't credible.</strong></p>
<p>Remember, for the purposes of this post, we're playing out the scenario labeled &quot;<em>what if these AI investments actually pan out</em>?&quot; That scenario isn't compatible with a future where companies find themselves needing just as many highly-compensated humans as they do today—the <a href="https://www.bain.com/about/media-center/press-releases/20252/%242-trillion-in-new-revenue-needed-to-fund-ais-scaling-trend---bain--companys-6th-annual-global-technology-report/">ROI needed</a> to justify this level of investment simply wouldn't be there.</p>
<p>So why are the AI executives talking out of both sides of their mouth? Because, what else the fuck are they supposed to do? Go on the record and say, &quot;yeah man, I dunno, now's probably a good time to <a href="https://www.amazon.com/Canning-Kits/b?node=3737041">learn how to can your own food</a> or sell your house if you happen to live in a mid-market metro with a strong services sector.&quot;</p>
<p>Whenever I hear one of these guys' bullshit quotes, I have to mentally sprinkle in the unspoken context to protect my own sanity:</p>
<ul>
<li>&quot;<strong>There will be new jobs</strong> <em>for people with deep domain expertise and unusually strong critical thinking skills.</em>&quot;</li>
<li>&quot;<em>Looking at jobs as a debt counselor or estate auctioneer? AI will</em> <strong>create a bunch of new ones.</strong>&quot;</li>
<li>&quot;<em>If you can swallow a massive pay cut and don't mind <a href="https://techcrunch.com/2026/02/12/waymo-is-asking-doordash-drivers-to-shut-the-doors-of-its-self-driving-cars/">shutting doors for a living</a></em>, <strong>there will be more jobs.</strong>&quot;</li>
</ul>

<h2 id="programmers-are-first-in-last-out">Programmers are first in, last out</h2>
<p>Software developers may be among the first to experience what it feels like for AI to do our jobs for us, but I still believe we'll be the ones <a href="/links/2023-03-17-how-to-tell-if-ai-threatens-your-job/">shutting the lights off on the middle class</a>.</p>
<p>In fact, programmers are about to become as busy as we've ever been. Why? Because custom software has <a href="/links/2025-11-04-software-is-supply-constrained-for-now/">historically been supply-constrained</a>. How many businesses would have been created over the last twenty years if even extremely basic apps didn't require millions of dollars of venture funding? Already, agents can help capture those opportunities on a relative shoestring budget. A tremendous number of niche, overlooked cottage industries are finally ripe for their ✨disruption✨ moment.</p>
<p>And all those projects still need human programmers! Why? Because today's agents are nowhere close to being able to write software that won't fall over without supervision. The last 10% needed to reach full autonomy will take <a href="https://en.wikipedia.org/wiki/Ninety%E2%80%93ninety_rule">90% of the effort</a>. My Tesla has <a href="/takes/2026-02-14-16h27m06s/">driven me everywhere for over a year</a>, but it'll be decades before the world stops manufacturing steering wheels.</p>
<p>Programmers may be spread across more companies and working in smaller teams, but there likely won't be a net reduction in the amount of total work to be done anytime soon. But can we honestly say the same about the accountant who's been rendered redundant? Or the junior lawyer position the firm opted not to fill? Or the management consultant who realizes their client can buy the same peace of mind with a $20 ChatGPT Plus subscription? Where are they all going to go? The answer is obvious: if this whole &quot;AI thing&quot; ends up becoming what it's cracked up to be, <strong>those people are well and truly fucked</strong>. And sooner than they probably realize.</p>

<h2 id="make-your-work-worthwhile">Make your work worthwhile</h2>
<p>Ultimately, unless we see AI crash and burn catastrophically, I feel pretty comfortable predicting that if the only sounds your job makes are <strong>*<em>clickety-clack</em>*</strong> and <strong>*<em>yackety-yack</em>*</strong>, the bulk of your colleagues—and very possibly you—are going to be caught up in the gravitational vortex of what Andrew Yang is calling The Fuckening.</p>
<p>So, what can you do to mitigate these risks and protect yourself? All you need to do is follow my fool-proof two-step plan:</p>
<ol>
<li>Acknowledge that the odds we're living in The Fuckening timeline are greater than zero</li>
<li>Plan accordingly</li>
</ol>
<p>If you're a programmer and your current role doesn't resemble that of a <a href="/posts/full-breadth-developers/">full-breadth developer</a>, do something about that ASAP. If you're anyone else, then follow this bit of advice buried inside that larger post:</p>
<blockquote>
<p>Figure out how your employer makes money and position your ass directly in-between the corporate bank account and your customers' credit card information.</p>
</blockquote>
<p>Do the work: trace your individual contributions to the total revenue and cost savings they represent for your employer. Is that number demonstrably higher than your fully-loaded compensation? If so, you should be okay. And whenever the AI tools in your space improve appreciably, re-examine your contributions and run the numbers again. But as soon as you cost more to your employer than you bring in, don't assume they'll keep you around—figure out how to increase your output! And if the numbers are totally upside down, find someplace new where your cost will be commensurate with your value.</p>
<p>All I have is individualized advice, because our individual situations are all we have control over. Yes, there are countless collective actions we could take as a society to mitigate or even eliminate these downside employment risks. There are probably even public policy prescriptions that could position civilization to absolutely thrive in the age of AI. But the odds of either of those happening in the current political climate are even lower than (<em>ugh</em>) Sam Altman ending up being proven right about all this shit.</p>
<p>I'm expressly <em>not</em> suggesting we treat each other as if we're living out a workplace adaptation of <em>The Hunger Games</em> here. I'm just reminding you to secure your own oxygen mask first before assisting others.</p>]]></content>
    <summary type="html"><![CDATA[<p>It was only once I read Andrew Yang's <a href="https://blog.andrewyang.com/p/the-end-of-the-office">&quot;The End of the Office&quot;</a> post the other day that I realized how few political leaders are seriously grappling with this question: <strong>what will happen to civilization if all this AI investment actually pays off?</strong> Sitting with this thought led me to a dark place, if I'm being honest—not because society might be doomed, but because I'm left quoting Andrew Fucking Yang of all people:</p>
<blockquote>
<p>Expect the Starbucks in your local suburb to become occupied with middle-aged former office workers who want to get out of the house. That's a benign portrait, but a lot of these families still owe mortgages on their houses that they won't be able to maintain. If I were a homeowner in Silicon Valley or Westchester County, I might consider putting my house up for sale to see what I could get because there's going to be downward pressure on these communities. It might not feel great being first, but you don't want to be last.</p>
</blockquote>
<p>Then again, why should I be surprised that politicians aren't thinking about this? Almost nobody is! AI boosters are having too much fun <a href="https://www.nytimes.com/2026/02/18/opinion/ai-software.html?unlocked_article_code=1.NFA.djaw.TBlAp8kE_N-i">playing with Claude Code</a> to connect the dots between its current capabilities and the <a href="/takes/2026-02-17-08h30m19s/">post-office-work utopia/dystopia</a> that awaits us. Meanwhile, AI skeptics seem worryingly self-assured in their wishcasting that today's agents:</p>
<ol>
<li>Will never be able to do the things they can already do</li>
<li>Will forever remain as incompetent as they are now</li>
<li>Will disappear the moment the AI economic bubble bursts</li>
</ol>
<p>Other than the first item on that list, I don't even know that the skeptics are wrong! Maybe they're right! In fact, it'd be more convenient for all of us if the skeptics end up being right. But are we really certain that the probability Sam Altman is even kinda-sorta right is <em>literally zero percent</em>? If not, then we should probably prepare for that potentiality.</p>
<p>I imagine that we all have a pretty clear image of what will happen if the AI bubble pops: stocks will crash, Steam Decks will be <a href="https://www.tomshardware.com/video-games/handheld-gaming/valve-confirms-steam-deck-is-out-of-stock-due-to-memory-and-storage-shortages-supply-of-popular-gaming-handheld-in-trouble-because-of-massive-ai-demand">back in stock</a>, and Sam will end up in jail. (Maybe every disastrous hype cycle in tech simply demands that <a href="https://en.wikipedia.org/wiki/Sam_Bankman-Fried#Arrest_and_charges">at least one awkward white man named Sam goes to jail</a>.) But I've got to admit, many people I talk to and follow online don't seem to have given a second thought to the sort of economic hellscape we're in for if the astronomical valuations of companies like OpenAI, Anthropic, and SpaceX (<a href="/casts/breaking-change-v50-spacexxx/">lol</a>) turn out to have been appropriately priced.</p>
<p>Well, give it thirty seconds' thought, and—to borrow Yang's term of choice—we'll be in for <strong>The Fuckening</strong>: a macroeconomically significant decrease in the number of high-paying white collar jobs the market will support.</p>

<h2 id="tech-ceos-are-bullshitting-us">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/brace-for-the-fuckening/#tech-ceos-are-bullshitting-us">Tech CEOs are bullshitting us</a>
</h2>
<p>Listen to Satya or Sam or Jensen talk about this &quot;What if?&quot; scenario, and you'll hear them compare AI to technological revolutions of the past. They each breathlessly declare, &quot;<a href="https://abcnews.com/Business/microsoft-ceo-satya-nadella-discusses-jobs-future/story?id=50189787">there will be new jobs</a>,&quot; and that AI will, &quot;<a href="https://www.businessinsider.com/will-ai-replace-take-over-create-jobs-debate-tech-leaders-2025-6">create a bunch of new ones</a>,&quot; and even that, &quot;<a href="https://www.axios.com/newsletters/axios-ai-plus-7197a015-874a-4832-8865-21cff7a760ba">there will be <em>more</em> jobs</a>.&quot; But, as someone who's been using coding agents to build <a href="https://justin.searls.co/shovelware/">good-enough</a> software with the velocity of a traditional engineering team for nearly a year now, none of these reassurances pass the smell test. <strong>The idea that there will be at least one net-new job created for every job eliminated by AI simply isn't credible.</strong></p>
<p>Remember, for the purposes of this post, we're playing out the scenario labeled &quot;<em>what if these AI investments actually pan out</em>?&quot; That scenario isn't compatible with a future where companies find themselves needing just as many highly-compensated humans as they do today—the <a href="https://www.bain.com/about/media-center/press-releases/20252/%242-trillion-in-new-revenue-needed-to-fund-ais-scaling-trend---bain--companys-6th-annual-global-technology-report/">ROI needed</a> to justify this level of investment simply wouldn't be there.</p>
<p>So why are the AI executives talking out of both sides of their mouth? Because, what else the fuck are they supposed to do? Go on the record and say, &quot;yeah man, I dunno, now's probably a good time to <a href="https://www.amazon.com/Canning-Kits/b?node=3737041">learn how to can your own food</a> or sell your house if you happen to live in a mid-market metro with a strong services sector.&quot;</p>
<p>Whenever I hear one of these guys' bullshit quotes, I have to mentally sprinkle in the unspoken context to protect my own sanity:</p>
<ul>
<li>&quot;<strong>There will be new jobs</strong> <em>for people with deep domain expertise and unusually strong critical thinking skills.</em>&quot;</li>
<li>&quot;<em>Looking at jobs as a debt counselor or estate auctioneer? AI will</em> <strong>create a bunch of new ones.</strong>&quot;</li>
<li>&quot;<em>If you can swallow a massive pay cut and don't mind <a href="https://techcrunch.com/2026/02/12/waymo-is-asking-doordash-drivers-to-shut-the-doors-of-its-self-driving-cars/">shutting doors for a living</a></em>, <strong>there will be more jobs.</strong>&quot;</li>
</ul>

<h2 id="programmers-are-first-in-last-out">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/brace-for-the-fuckening/#programmers-are-first-in-last-out">Programmers are first in, last out</a>
</h2>
<p>Software developers may be among the first to experience what it feels like for AI to do our jobs for us, but I still believe we'll be the ones <a href="/links/2023-03-17-how-to-tell-if-ai-threatens-your-job/">shutting the lights off on the middle class</a>.</p>
<p>In fact, programmers are about to become as busy as we've ever been. Why? Because custom software has <a href="/links/2025-11-04-software-is-supply-constrained-for-now/">historically been supply-constrained</a>. How many businesses would have been created over the last twenty years if even extremely basic apps didn't require millions of dollars of venture funding? Already, agents can help capture those opportunities on a relative shoestring budget. A tremendous number of niche, overlooked cottage industries are finally ripe for their ✨disruption✨ moment.</p>
<p>And all those projects still need human programmers! Why? Because today's agents are nowhere close to being able to write software that won't fall over without supervision. The last 10% needed to reach full autonomy will take <a href="https://en.wikipedia.org/wiki/Ninety%E2%80%93ninety_rule">90% of the effort</a>. My Tesla has <a href="/takes/2026-02-14-16h27m06s/">driven me everywhere for over a year</a>, but it'll be decades before the world stops manufacturing steering wheels.</p>
<p>Programmers may be spread across more companies and working in smaller teams, but there likely won't be a net reduction in the amount of total work to be done anytime soon. But can we honestly say the same about the accountant who's been rendered redundant? Or the junior lawyer position the firm opted not to fill? Or the management consultant who realizes their client can buy the same peace of mind with a $20 ChatGPT Plus subscription? Where are they all going to go? The answer is obvious: if this whole &quot;AI thing&quot; ends up becoming what it's cracked up to be, <strong>those people are well and truly fucked</strong>. And sooner than they probably realize.</p>

<h2 id="make-your-work-worthwhile">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/brace-for-the-fuckening/#make-your-work-worthwhile">Make your work worthwhile</a>
</h2>
<p>Ultimately, unless we see AI crash and burn catastrophically, I feel pretty comfortable predicting that if the only sounds your job makes are <strong>*<em>clickety-clack</em>*</strong> and <strong>*<em>yackety-yack</em>*</strong>, the bulk of your colleagues—and very possibly you—are going to be caught up in the gravitational vortex of what Andrew Yang is calling The Fuckening.</p>
<p>So, what can you do to mitigate these risks and protect yourself? All you need to do is follow my fool-proof two-step plan:</p>
<ol>
<li>Acknowledge that the odds we're living in The Fuckening timeline are greater than zero</li>
<li>Plan accordingly</li>
</ol>
<p>If you're a programmer and your current role doesn't resemble that of a <a href="/posts/full-breadth-developers/">full-breadth developer</a>, do something about that ASAP. If you're anyone else, then follow this bit of advice buried inside that larger post:</p>
<blockquote>
<p>Figure out how your employer makes money and position your ass directly in-between the corporate bank account and your customers' credit card information.</p>
</blockquote>
<p>Do the work: trace your individual contributions to the total revenue and cost savings they represent for your employer. Is that number demonstrably higher than your fully-loaded compensation? If so, you should be okay. And whenever the AI tools in your space improve appreciably, re-examine your contributions and run the numbers again. But as soon as you cost more to your employer than you bring in, don't assume they'll keep you around—figure out how to increase your output! And if the numbers are totally upside down, find someplace new where your cost will be commensurate with your value.</p>
<p>All I have is individualized advice, because our individual situations are all we have control over. Yes, there are countless collective actions we could take as a society to mitigate or even eliminate these downside employment risks. There are probably even public policy prescriptions that could position civilization to absolutely thrive in the age of AI. But the odds of either of those happening in the current political climate are even lower than (<em>ugh</em>) Sam Altman ending up being proven right about all this shit.</p>
<p>I'm expressly <em>not</em> suggesting we treat each other as if we're living out a workplace adaptation of <em>The Hunger Games</em> here. I'm just reminding you to secure your own oxygen mask first before assisting others.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/brace-for-the-fuckening/","append_url_label":"Read 📄","content":"\u003cp\u003eIt was only once I read Andrew Yang's \u003ca href=\"https://blog.andrewyang.com/p/the-end-of-the-office\"\u003e\u0026quot;The End of the Office\u0026quot;\u003c/a\u003e post the other day that I realized how few political leaders are seriously grappling with this question: \u003cstrong\u003ewhat will happen to civilization if all this AI investment actually pays off?\u003c/strong\u003e Sitting with this thought led me to a dark place, if I'm being honest—not because society might be doomed, but because I'm left quoting Andrew Fucking Yang of all people:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eExpect the Starbucks in your local suburb to become occupied with middle-aged former office workers who want to get out of the house. That's a benign portrait, but a lot of these families still owe mortgages on their houses that they won't be able to maintain. If I were a homeowner in Silicon Valley or Westchester County, I might consider putting my house up for sale to see what I could get because there's going to be downward pressure on these communities. It might not feel great being first, but you don't want to be last.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThen again, why should I be surprised that politicians aren't thinking about this? Almost nobody is! AI boosters are having too much fun \u003ca href=\"https://www.nytimes.com/2026/02/18/opinion/ai-software.html?unlocked_article_code=1.NFA.djaw.TBlAp8kE_N-i\"\u003eplaying with Claude Code\u003c/a\u003e to connect the dots between its current capabilities and the \u003ca href=\"/takes/2026-02-17-08h30m19s/\"\u003epost-office-work utopia/dystopia\u003c/a\u003e that awaits us. Meanwhile, AI skeptics seem worryingly self-assured in their wishcasting that today's agents:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eWill never be able to do the things they can already do\u003c/li\u003e\n\u003cli\u003eWill forever remain as incompetent as they are now\u003c/li\u003e\n\u003cli\u003eWill disappear the moment the AI economic bubble bursts\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eOther than the first item on that list, I don't even know that the skeptics are wrong! Maybe they're right! In fact, it'd be more convenient for all of us if the skeptics end up being right. But are we really certain that the probability Sam Altman is even kinda-sorta right is \u003cem\u003eliterally zero percent\u003c/em\u003e? If not, then we should probably prepare for that potentiality.\u003c/p\u003e\n\u003cp\u003eI imagine that we all have a pretty clear image of what will happen if the AI bubble pops: stocks will crash, Steam Decks will be \u003ca href=\"https://www.tomshardware.com/video-games/handheld-gaming/valve-confirms-steam-deck-is-out-of-stock-due-to-memory-and-storage-shortages-supply-of-popular-gaming-handheld-in-trouble-because-of-massive-ai-demand\"\u003eback in stock\u003c/a\u003e, and Sam will end up in jail. (Maybe every disastrous hype cycle in tech simply demands that \u003ca href=\"https://en.wikipedia.org/wiki/Sam_Bankman-Fried#Arrest_and_charges\"\u003eat least one awkward white man named Sam goes to jail\u003c/a\u003e.) But I've got to admit, many people I talk to and follow online don't seem to have given a second thought to the sort of economic hellscape we're in for if the astronomical valuations of companies like OpenAI, Anthropic, and SpaceX (\u003ca href=\"/casts/breaking-change-v50-spacexxx/\"\u003elol\u003c/a\u003e) turn out to have been appropriately priced.\u003c/p\u003e\n\u003cp\u003eWell, give it thirty seconds' thought, and—to borrow Yang's term of choice—we'll be in for \u003cstrong\u003eThe Fuckening\u003c/strong\u003e: a macroeconomically significant decrease in the number of high-paying white collar jobs the market will support.\u003c/p\u003e\n\n\u003ch2 id=\"tech-ceos-are-bullshitting-us\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/brace-for-the-fuckening/#tech-ceos-are-bullshitting-us\"\u003eTech CEOs are bullshitting us\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eListen to Satya or Sam or Jensen talk about this \u0026quot;What if?\u0026quot; scenario, and you'll hear them compare AI to technological revolutions of the past. They each breathlessly declare, \u0026quot;\u003ca href=\"https://abcnews.com/Business/microsoft-ceo-satya-nadella-discusses-jobs-future/story?id=50189787\"\u003ethere will be new jobs\u003c/a\u003e,\u0026quot; and that AI will, \u0026quot;\u003ca href=\"https://www.businessinsider.com/will-ai-replace-take-over-create-jobs-debate-tech-leaders-2025-6\"\u003ecreate a bunch of new ones\u003c/a\u003e,\u0026quot; and even that, \u0026quot;\u003ca href=\"https://www.axios.com/newsletters/axios-ai-plus-7197a015-874a-4832-8865-21cff7a760ba\"\u003ethere will be \u003cem\u003emore\u003c/em\u003e jobs\u003c/a\u003e.\u0026quot; But, as someone who's been using coding agents to build \u003ca href=\"https://justin.searls.co/shovelware/\"\u003egood-enough\u003c/a\u003e software with the velocity of a traditional engineering team for nearly a year now, none of these reassurances pass the smell test. \u003cstrong\u003eThe idea that there will be at least one net-new job created for every job eliminated by AI simply isn't credible.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eRemember, for the purposes of this post, we're playing out the scenario labeled \u0026quot;\u003cem\u003ewhat if these AI investments actually pan out\u003c/em\u003e?\u0026quot; That scenario isn't compatible with a future where companies find themselves needing just as many highly-compensated humans as they do today—the \u003ca href=\"https://www.bain.com/about/media-center/press-releases/20252/%242-trillion-in-new-revenue-needed-to-fund-ais-scaling-trend---bain--companys-6th-annual-global-technology-report/\"\u003eROI needed\u003c/a\u003e to justify this level of investment simply wouldn't be there.\u003c/p\u003e\n\u003cp\u003eSo why are the AI executives talking out of both sides of their mouth? Because, what else the fuck are they supposed to do? Go on the record and say, \u0026quot;yeah man, I dunno, now's probably a good time to \u003ca href=\"https://www.amazon.com/Canning-Kits/b?node=3737041\"\u003elearn how to can your own food\u003c/a\u003e or sell your house if you happen to live in a mid-market metro with a strong services sector.\u0026quot;\u003c/p\u003e\n\u003cp\u003eWhenever I hear one of these guys' bullshit quotes, I have to mentally sprinkle in the unspoken context to protect my own sanity:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026quot;\u003cstrong\u003eThere will be new jobs\u003c/strong\u003e \u003cem\u003efor people with deep domain expertise and unusually strong critical thinking skills.\u003c/em\u003e\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u0026quot;\u003cem\u003eLooking at jobs as a debt counselor or estate auctioneer? AI will\u003c/em\u003e \u003cstrong\u003ecreate a bunch of new ones.\u003c/strong\u003e\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u0026quot;\u003cem\u003eIf you can swallow a massive pay cut and don't mind \u003ca href=\"https://techcrunch.com/2026/02/12/waymo-is-asking-doordash-drivers-to-shut-the-doors-of-its-self-driving-cars/\"\u003eshutting doors for a living\u003c/a\u003e\u003c/em\u003e, \u003cstrong\u003ethere will be more jobs.\u003c/strong\u003e\u0026quot;\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2 id=\"programmers-are-first-in-last-out\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/brace-for-the-fuckening/#programmers-are-first-in-last-out\"\u003eProgrammers are first in, last out\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eSoftware developers may be among the first to experience what it feels like for AI to do our jobs for us, but I still believe we'll be the ones \u003ca href=\"/links/2023-03-17-how-to-tell-if-ai-threatens-your-job/\"\u003eshutting the lights off on the middle class\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIn fact, programmers are about to become as busy as we've ever been. Why? Because custom software has \u003ca href=\"/links/2025-11-04-software-is-supply-constrained-for-now/\"\u003ehistorically been supply-constrained\u003c/a\u003e. How many businesses would have been created over the last twenty years if even extremely basic apps didn't require millions of dollars of venture funding? Already, agents can help capture those opportunities on a relative shoestring budget. A tremendous number of niche, overlooked cottage industries are finally ripe for their ✨disruption✨ moment.\u003c/p\u003e\n\u003cp\u003eAnd all those projects still need human programmers! Why? Because today's agents are nowhere close to being able to write software that won't fall over without supervision. The last 10% needed to reach full autonomy will take \u003ca href=\"https://en.wikipedia.org/wiki/Ninety%E2%80%93ninety_rule\"\u003e90% of the effort\u003c/a\u003e. My Tesla has \u003ca href=\"/takes/2026-02-14-16h27m06s/\"\u003edriven me everywhere for over a year\u003c/a\u003e, but it'll be decades before the world stops manufacturing steering wheels.\u003c/p\u003e\n\u003cp\u003eProgrammers may be spread across more companies and working in smaller teams, but there likely won't be a net reduction in the amount of total work to be done anytime soon. But can we honestly say the same about the accountant who's been rendered redundant? Or the junior lawyer position the firm opted not to fill? Or the management consultant who realizes their client can buy the same peace of mind with a $20 ChatGPT Plus subscription? Where are they all going to go? The answer is obvious: if this whole \u0026quot;AI thing\u0026quot; ends up becoming what it's cracked up to be, \u003cstrong\u003ethose people are well and truly fucked\u003c/strong\u003e. And sooner than they probably realize.\u003c/p\u003e\n\n\u003ch2 id=\"make-your-work-worthwhile\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/brace-for-the-fuckening/#make-your-work-worthwhile\"\u003eMake your work worthwhile\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eUltimately, unless we see AI crash and burn catastrophically, I feel pretty comfortable predicting that if the only sounds your job makes are \u003cstrong\u003e*\u003cem\u003eclickety-clack\u003c/em\u003e*\u003c/strong\u003e and \u003cstrong\u003e*\u003cem\u003eyackety-yack\u003c/em\u003e*\u003c/strong\u003e, the bulk of your colleagues—and very possibly you—are going to be caught up in the gravitational vortex of what Andrew Yang is calling The Fuckening.\u003c/p\u003e\n\u003cp\u003eSo, what can you do to mitigate these risks and protect yourself? All you need to do is follow my fool-proof two-step plan:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAcknowledge that the odds we're living in The Fuckening timeline are greater than zero\u003c/li\u003e\n\u003cli\u003ePlan accordingly\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIf you're a programmer and your current role doesn't resemble that of a \u003ca href=\"/posts/full-breadth-developers/\"\u003efull-breadth developer\u003c/a\u003e, do something about that ASAP. If you're anyone else, then follow this bit of advice buried inside that larger post:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFigure out how your employer makes money and position your ass directly in-between the corporate bank account and your customers' credit card information.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDo the work: trace your individual contributions to the total revenue and cost savings they represent for your employer. Is that number demonstrably higher than your fully-loaded compensation? If so, you should be okay. And whenever the AI tools in your space improve appreciably, re-examine your contributions and run the numbers again. But as soon as you cost more to your employer than you bring in, don't assume they'll keep you around—figure out how to increase your output! And if the numbers are totally upside down, find someplace new where your cost will be commensurate with your value.\u003c/p\u003e\n\u003cp\u003eAll I have is individualized advice, because our individual situations are all we have control over. Yes, there are countless collective actions we could take as a society to mitigate or even eliminate these downside employment risks. There are probably even public policy prescriptions that could position civilization to absolutely thrive in the age of AI. But the odds of either of those happening in the current political climate are even lower than (\u003cem\u003eugh\u003c/em\u003e) Sam Altman ending up being proven right about all this shit.\u003c/p\u003e\n\u003cp\u003eI'm expressly \u003cem\u003enot\u003c/em\u003e suggesting we treat each other as if we're living out a workplace adaptation of \u003cem\u003eThe Hunger Games\u003c/em\u003e here. I'm just reminding you to secure your own oxygen mask first before assisting others.\u003c/p\u003e","id":"https://justin.searls.co/posts/brace-for-the-fuckening/","og_image":"https://justin.searls.co/img/social/posts/brace-for-the-fuckening.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-02-19T16:32:19Z","title":"Brace for the Fuckening","updated_at":"2026-02-19T11:57:56-05:00","url":"https://justin.searls.co/posts/brace-for-the-fuckening/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v51-praise-bomb/</id>
      <title type="text">🎙️ Breaking Change podcast v51 - Praise-bomb</title>
      <link href="https://justin.searls.co/casts/breaking-change-v51-praise-bomb/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-16T17:35:38+00:00</published>
    <updated>2026-02-16T20:37:21-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v51.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v51.mp3">Direct link to podcast audio file</a>
</p><p>I feel like I'm getting saltier, and it's concerning. If you want me to tone it down and/or up, let me know. It'll go a lot better if you just write to <a href="mailto:podcast@searls.co">podcast@searls.co</a> instead of yelling at your phone.</p>
<p>As usual, I brought the goods. Now here are the receipts:</p>
<ul>
<li><a href="https://github.com/searlsco/prove_it">prove_it</a> is doing its job, mostly</li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://www.videogameschronicle.com/news/please-let-us-focus-on-making-our-game-in-peace-starsand-island-studio-confused-by-alleged-praise-bombing-attack/">Starsand Island studio confused by alleged 'praise-bombing' attack</a></li>
<li><a href="https://www.videogameschronicle.com/news/sony-is-considering-holding-back-playstation-6-until-2028-or-2029-report-claims/">Sony is considering holding back PlayStation 6 until 2028 or 2029</a></li>
<li><a href="https://www.washingtonpost.com/travel/2026/02/15/southwest-new-seating-policy-anger/">Southwest changes are infuriating fans</a> (<a href="https://apple.news/Aslii_G1QSA2AbWhb6jI8AA">News+</a>)</li>
<li>NYT: <a href="https://www.niemanlab.org/2026/02/how-the-new-york-times-uses-a-custom-ai-tool-to-track-the-manosphere/">All the news that's fit to manspread</a></li>
<li>Gurman: <a href="https://www.bloomberg.com/news/newsletters/2026-02-15/tesla-carplay-delays-related-to-ios-26-and-fsd-apple-s-new-siri-delays-ios-27">Tesla CarPlay Held Back by Need for Wider Adoption of Apple's iOS 26</a> (<a href="https://archive.is/K7eoZ#selection-1183.0-1198.0">Archive</a>)</li>
<li><a href="https://apple.news/AaC7LdwdCSI6uwYcpojBb-A">YouTube on Vision Pro</a> (<a href="https://apple.news/AaC7LdwdCSI6uwYcpojBb-A">News+</a>)</li>
<li><a href="https://www.macrumors.com/2026/02/16/apple-announces-special-event-in-new-york/">Apple Announces Special Event in New York, London, and Shanghai on March 4</a></li>
<li>Filed my first SwiftUI bug as feedback. It's FB21962656</li>
<li><a href="https://www.thoughtworks.com/content/dam/thoughtworks/documents/report/tw_future%20_of_software_development_retreat_%20key_takeaways.pdf">Thoughtworks concludes TDD is good and billable juniors valuable</a></li>
<li><a href="https://www.businessinsider.com/anthropic-ceo-ai-90-percent-code-3-to-6-months-2025-3">Ugh, Anthropic CEO was right about the timing of AI writing all the code</a></li>
<li><a href="https://www.implicator.ai/peter-steinberger-chose-openai-the-code-was-never-the-point/">Peter Steinberger Chose OpenAI. The Code Was Never the Point</a></li>
<li><a href="https://en.wikipedia.org/wiki/Eternity_%282025_film%29">Eternity</a></li>
<li><a href="https://en.wikipedia.org/wiki/Star_Trek%3A_Starfleet_Academy_%28TV_series%29">Starfleet Academy</a></li>
<li><a href="https://en.wikipedia.org/wiki/Your_Friends_%26_Neighbors_(TV_series)">Your Friends &amp; Neighbors</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>I feel like I'm getting saltier, and it's concerning. If you want me to tone it down and/or up, let me know. It'll go a lot better if you just write to <a href="mailto:podcast@searls.co">podcast@searls.co</a> instead of yelling at your phone.</p>
<p>As usual, I brought the goods. Now here are the receipts:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v51-praise-bomb/","append_url_label":"Hear 🎙","content":"\u003cp\u003eI feel like I'm getting saltier, and it's concerning. If you want me to tone it down and/or up, let me know. It'll go a lot better if you just write to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e instead of yelling at your phone.\u003c/p\u003e\n\u003cp\u003eAs usual, I brought the goods. Now here are the receipts:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/searlsco/prove_it\"\u003eprove_it\u003c/a\u003e is doing its job, mostly\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/please-let-us-focus-on-making-our-game-in-peace-starsand-island-studio-confused-by-alleged-praise-bombing-attack/\"\u003eStarsand Island studio confused by alleged 'praise-bombing' attack\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/sony-is-considering-holding-back-playstation-6-until-2028-or-2029-report-claims/\"\u003eSony is considering holding back PlayStation 6 until 2028 or 2029\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.washingtonpost.com/travel/2026/02/15/southwest-new-seating-policy-anger/\"\u003eSouthwest changes are infuriating fans\u003c/a\u003e (\u003ca href=\"https://apple.news/Aslii_G1QSA2AbWhb6jI8AA\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eNYT: \u003ca href=\"https://www.niemanlab.org/2026/02/how-the-new-york-times-uses-a-custom-ai-tool-to-track-the-manosphere/\"\u003eAll the news that's fit to manspread\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGurman: \u003ca href=\"https://www.bloomberg.com/news/newsletters/2026-02-15/tesla-carplay-delays-related-to-ios-26-and-fsd-apple-s-new-siri-delays-ios-27\"\u003eTesla CarPlay Held Back by Need for Wider Adoption of Apple's iOS 26\u003c/a\u003e (\u003ca href=\"https://archive.is/K7eoZ#selection-1183.0-1198.0\"\u003eArchive\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://apple.news/AaC7LdwdCSI6uwYcpojBb-A\"\u003eYouTube on Vision Pro\u003c/a\u003e (\u003ca href=\"https://apple.news/AaC7LdwdCSI6uwYcpojBb-A\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.macrumors.com/2026/02/16/apple-announces-special-event-in-new-york/\"\u003eApple Announces Special Event in New York, London, and Shanghai on March 4\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFiled my first SwiftUI bug as feedback. It's FB21962656\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.thoughtworks.com/content/dam/thoughtworks/documents/report/tw_future%20_of_software_development_retreat_%20key_takeaways.pdf\"\u003eThoughtworks concludes TDD is good and billable juniors valuable\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.businessinsider.com/anthropic-ceo-ai-90-percent-code-3-to-6-months-2025-3\"\u003eUgh, Anthropic CEO was right about the timing of AI writing all the code\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.implicator.ai/peter-steinberger-chose-openai-the-code-was-never-the-point/\"\u003ePeter Steinberger Chose OpenAI. The Code Was Never the Point\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Eternity_%282025_film%29\"\u003eEternity\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Star_Trek%3A_Starfleet_Academy_%28TV_series%29\"\u003eStarfleet Academy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Your_Friends_%26_Neighbors_(TV_series)\"\u003eYour Friends \u0026amp; Neighbors\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Praise-bomb","id":"https://justin.searls.co/casts/breaking-change-v51-praise-bomb/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v51-praise-bomb.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-02-16T17:35:38Z","title":"Praise-bomb","updated_at":"2026-02-16T20:37:21-05:00","url":"https://justin.searls.co/casts/breaking-change-v51-praise-bomb/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2026-02-08-09h57m02s/</id>
      <title type="text">📸 I just haggled with a chatbot</title>
      <link href="https://justin.searls.co/shots/2026-02-08-09h57m02s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-08T14:57:02+00:00</published>
    <updated>2026-02-08T13:04:48-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_ofau57.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_26l0sh.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_nhmi55.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_ye951i.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_yy6him.jpg"/>
</div><p>We ordered a wood chest that arrived with cosmetic damage. After logging the damage in their customer support interface, it prompted me to start a chat with their AI virtual assistant.</p>
<p>What happened next:</p>
<ol>
<li>It immediately offered me a 15% refund to keep the product</li>
<li>I asked for 20% and it immediately agreed</li>
<li>I asked for 25% and it immediately agreed</li>
<li>I asked for 30% and it turned me down</li>
<li>I took the 25%, which was, indeed, immediately refunded</li>
</ol>
<p>Turns out that negotiating with a rules engine is way easier than negotiating with a human tasked with operating a rules engine.</p>
<p>So basically, all Wayfair did was add a chatbot to the end of their existing &quot;Report a Problem&quot; interface that will give customers more money if they ask for more money. What a world. 🌍</p>

]]></content>
    <summary type="html"><![CDATA[<p>We ordered a wood chest that arrived with cosmetic damage. After logging the damage in their customer support interface, it prompted me to start a chat with their AI virtual assistant.</p>
<p>What happened next:</p>
<ol>
<li>It immediately offered me a 15% refund to keep the product</li>
<li>I asked for 20% and it immediately agreed</li>
<li>I asked for 25% and it immediately agreed</li>
<li>I asked for 30% and it turned me down</li>
<li>I took the 25%, which was, indeed, immediately refunded</li>
</ol>
<p>Turns out that negotiating with a rules engine is way easier than negotiating with a human tasked with operating a rules engine.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2026-02-08-09h57m02s/","append_url_label":"View 📸","content":"\u003cp\u003eWe ordered a wood chest that arrived with cosmetic damage. After logging the damage in their customer support interface, it prompted me to start a chat with their AI virtual assistant.\u003c/p\u003e\n\u003cp\u003eWhat happened next:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIt immediately offered me a 15% refund to keep the product\u003c/li\u003e\n\u003cli\u003eI asked for 20% and it immediately agreed\u003c/li\u003e\n\u003cli\u003eI asked for 25% and it immediately agreed\u003c/li\u003e\n\u003cli\u003eI asked for 30% and it turned me down\u003c/li\u003e\n\u003cli\u003eI took the 25%, which was, indeed, immediately refunded\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eTurns out that negotiating with a rules engine is way easier than negotiating with a human tasked with operating a rules engine.\u003c/p\u003e\n\u003cp\u003eSo basically, all Wayfair did was add a chatbot to the end of their existing \u0026quot;Report a Problem\u0026quot; interface that will give customers more money if they ask for more money. What a world. 🌍\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2026-02-08-09h57m02s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_ofau57.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_26l0sh.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_nhmi55.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_ye951i.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_yy6him.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2026-02-08-09h57m02s_ofau57.jpg","platform_overrides":{},"published_at":"2026-02-08T14:57:02Z","title":"I just haggled with a chatbot","updated_at":"2026-02-08T13:04:48-05:00","url":"https://justin.searls.co/shots/2026-02-08-09h57m02s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2026-02-06-is-the-tool-bad-or-is-it-a-skill-issue/</id>
      <title type="text">🔗 Is the tool bad or is it a skill issue?</title>
        <link href="https://mitchellh.com/writing/my-ai-adoption-journey" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2026-02-06-is-the-tool-bad-or-is-it-a-skill-issue/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-06T13:01:26+00:00</published>
    <updated>2026-02-06T13:18:11+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Mitchell Hashimoto, founder of <a href="https://www.hashicorp.com">Hashicorp</a> and, more recently, <a href="https://ghostty.org">Ghostty</a> in a post on <a href="https://mitchellh.com/writing/my-ai-adoption-journey">his relationship with AI coding</a>:</p>
<blockquote>
<p>Instead of giving up, I forced myself to reproduce all my manual commits with agentic ones. I literally did the work twice. I'd do the work manually, and then I'd fight an agent to produce identical results in terms of quality and function (without it being able to see my manual solution, of course).</p>
<p>This was excruciating, because it got in the way of simply getting things done. But I've been around the block with non-AI tools enough to know that friction is natural, and I can't come to a firm, defensible conclusion without exhausting my efforts.</p>
<p>But, expertise formed. I quickly discovered for myself from first principles what others were already saying, but discovering it myself resulted in a stronger fundamental understanding.</p>
<ol>
<li>Break down sessions into separate clear, actionable tasks. Don't try to &quot;draw the owl&quot; in one mega session.</li>
<li>For vague requests, split the work into separate planning vs. execution sessions.</li>
<li>If you give an agent a way to verify its work, it more often than not fixes its own mistakes and prevents regressions.</li>
</ol>
<p>More generally, I also found the edges of what agents -- at the time -- were good at, what they weren't good at, and for the tasks they were good at how to achieve the results I wanted.</p>
</blockquote>
<p>I recorded an interview on the <a href="https://www.freecodecamp.org">freeCodeCamp</a> podcast a few days ago saying the same thing. Namely, that this reminds me of every other time programmers have needed to learn a new way to do something they already know how to do some other way. When I was teaching teams <a href="https://en.wikipedia.org/wiki/Test-driven_development">test-driven development</a>, I always had to encourage them to force themselves to test-drive 100% of their code without exceptions so they're forced to actually learn the difference between, &quot;this is hard because it's a bad tool for the job,&quot; and, &quot;this is hard because I've not mastered this tool yet.&quot;</p>
<p>Over-application of a tool is an important part of learning it. And it applies just about every time we're forced to change our ways, whether switching from Windows to Linux, a graphical IDE to terminal Vim, or from Google Drive to a real filesystem.</p>
<p>Either you're the type who can stomach the discomfort of slowing down to adopt change, or you're not. And many (most?) programmers are not. They're the ones who should be worried right now.</p>

<p>🔗 <a href="https://mitchellh.com/writing/my-ai-adoption-journey" title="Original Article">mitchellh.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2026-02-06-is-the-tool-bad-or-is-it-a-skill-issue/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>Mitchell Hashimoto, founder of <a href="https://www.hashicorp.com">Hashicorp</a> and, more recently, <a href="https://ghostty.org">Ghostty</a> in a post on <a href="https://mitchellh.com/writing/my-ai-adoption-journey">his relationship with AI coding</a>:</p>
<blockquote>
<p>Instead of giving up, I forced myself to reproduce all my manual commits with agentic ones. I literally did the work twice. I'd do the work manually, and then I'd fight an agent to produce identical results in terms of quality and function (without it being able to see my manual solution, of course).</p>
<p>This was excruciating, because it got in the way of simply getting things done. But I've been around the block with non-AI tools enough to know that friction is natural, and I can't come to a firm, defensible conclusion without exhausting my efforts.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2026-02-06-is-the-tool-bad-or-is-it-a-skill-issue/","append_url_label":"Click 🔗","content":"\u003cp\u003eMitchell Hashimoto, founder of \u003ca href=\"https://www.hashicorp.com\"\u003eHashicorp\u003c/a\u003e and, more recently, \u003ca href=\"https://ghostty.org\"\u003eGhostty\u003c/a\u003e in a post on \u003ca href=\"https://mitchellh.com/writing/my-ai-adoption-journey\"\u003ehis relationship with AI coding\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eInstead of giving up, I forced myself to reproduce all my manual commits with agentic ones. I literally did the work twice. I'd do the work manually, and then I'd fight an agent to produce identical results in terms of quality and function (without it being able to see my manual solution, of course).\u003c/p\u003e\n\u003cp\u003eThis was excruciating, because it got in the way of simply getting things done. But I've been around the block with non-AI tools enough to know that friction is natural, and I can't come to a firm, defensible conclusion without exhausting my efforts.\u003c/p\u003e\n\u003cp\u003eBut, expertise formed. I quickly discovered for myself from first principles what others were already saying, but discovering it myself resulted in a stronger fundamental understanding.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eBreak down sessions into separate clear, actionable tasks. Don't try to \u0026quot;draw the owl\u0026quot; in one mega session.\u003c/li\u003e\n\u003cli\u003eFor vague requests, split the work into separate planning vs. execution sessions.\u003c/li\u003e\n\u003cli\u003eIf you give an agent a way to verify its work, it more often than not fixes its own mistakes and prevents regressions.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eMore generally, I also found the edges of what agents -- at the time -- were good at, what they weren't good at, and for the tasks they were good at how to achieve the results I wanted.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI recorded an interview on the \u003ca href=\"https://www.freecodecamp.org\"\u003efreeCodeCamp\u003c/a\u003e podcast a few days ago saying the same thing. Namely, that this reminds me of every other time programmers have needed to learn a new way to do something they already know how to do some other way. When I was teaching teams \u003ca href=\"https://en.wikipedia.org/wiki/Test-driven_development\"\u003etest-driven development\u003c/a\u003e, I always had to encourage them to force themselves to test-drive 100% of their code without exceptions so they're forced to actually learn the difference between, \u0026quot;this is hard because it's a bad tool for the job,\u0026quot; and, \u0026quot;this is hard because I've not mastered this tool yet.\u0026quot;\u003c/p\u003e\n\u003cp\u003eOver-application of a tool is an important part of learning it. And it applies just about every time we're forced to change our ways, whether switching from Windows to Linux, a graphical IDE to terminal Vim, or from Google Drive to a real filesystem.\u003c/p\u003e\n\u003cp\u003eEither you're the type who can stomach the discomfort of slowing down to adopt change, or you're not. And many (most?) programmers are not. They're the ones who should be worried right now.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2026-02-06-is-the-tool-bad-or-is-it-a-skill-issue/","og_image":"https://mitchellh.com/static/favicons/apple-touch-icon.png","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-02-06T13:01:26Z","related_url":"https://mitchellh.com/writing/my-ai-adoption-journey","title":"Is the tool bad or is it a skill issue?","updated_at":"2026-02-06T13:18:11Z","url":"https://justin.searls.co/links/2026-02-06-is-the-tool-bad-or-is-it-a-skill-issue/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2026-02-05-20h17m49s/</id>
      <title type="text">📸 I bought a Doggett</title>
      <link href="https://justin.searls.co/shots/2026-02-05-20h17m49s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-06T01:17:49+00:00</published>
    <updated>2026-02-05T20:30:31-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_f58194.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_fflr2p.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_h1qdnu.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_71omv0.jpg"/>
</div><p>My friend <a href="https://ericdoggett.com">Eric Doggett</a> became a Disney Fine Artist a couple years back and he's currently being featured at EPCOT's 2026 <a href="https://disneyworld.disney.go.com/events-tours/epcot/epcot-international-festival-of-the-arts/">Festival of the Arts</a>. Each day this week, he's holding court to talk to people about his work at a pop-up gallery just outside the Mexico Pavilion. Myself and a few other friends ganged up on him this afternoon to lend our moral and financial support by showing up and buying a few pieces.</p>
<p>I really like the painting I picked up. It's a semi-subtle ode to <a href="https://disneyworld.disney.go.com/attractions/magic-kingdom/big-thunder-mountain-railroad/">Big Thunder Mountain</a>, a celebration of Walt's love of trains, a not-so-hidden Mickey-shaped rockface, and a tiny nod to <a href="https://www.reddit.com/r/Disneyland/comments/1onuz14/they_replaced_the_goat_on_big_thunder_mountain/">the goat</a>.</p>
<p>If you're a local, swing by and say hi to Eric—he's great! If you're not, check him out as <a href="https://www.youtube.com/@EricDoggett">@EricDoggett on YouTube</a>—the videos of how he works are pretty cool. I immediately hung it in my office / studio when I got home, because Eric's audio engineering talents are a big reason why <a href="/casts/breaking-change/">Breaking Change</a> sounds as good as it does!</p>

]]></content>
    <summary type="html"><![CDATA[<p>My friend <a href="https://ericdoggett.com">Eric Doggett</a> became a Disney Fine Artist a couple years back and he's currently being featured at EPCOT's 2026 <a href="https://disneyworld.disney.go.com/events-tours/epcot/epcot-international-festival-of-the-arts/">Festival of the Arts</a>. Each day this week, he's holding court to talk to people about his work at a pop-up gallery just outside the Mexico Pavilion. Myself and a few other friends ganged up on him this afternoon to lend our moral and financial support by showing up and buying a few pieces.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2026-02-05-20h17m49s/","append_url_label":"View 📸","content":"\u003cp\u003eMy friend \u003ca href=\"https://ericdoggett.com\"\u003eEric Doggett\u003c/a\u003e became a Disney Fine Artist a couple years back and he's currently being featured at EPCOT's 2026 \u003ca href=\"https://disneyworld.disney.go.com/events-tours/epcot/epcot-international-festival-of-the-arts/\"\u003eFestival of the Arts\u003c/a\u003e. Each day this week, he's holding court to talk to people about his work at a pop-up gallery just outside the Mexico Pavilion. Myself and a few other friends ganged up on him this afternoon to lend our moral and financial support by showing up and buying a few pieces.\u003c/p\u003e\n\u003cp\u003eI really like the painting I picked up. It's a semi-subtle ode to \u003ca href=\"https://disneyworld.disney.go.com/attractions/magic-kingdom/big-thunder-mountain-railroad/\"\u003eBig Thunder Mountain\u003c/a\u003e, a celebration of Walt's love of trains, a not-so-hidden Mickey-shaped rockface, and a tiny nod to \u003ca href=\"https://www.reddit.com/r/Disneyland/comments/1onuz14/they_replaced_the_goat_on_big_thunder_mountain/\"\u003ethe goat\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you're a local, swing by and say hi to Eric—he's great! If you're not, check him out as \u003ca href=\"https://www.youtube.com/@EricDoggett\"\u003e@EricDoggett on YouTube\u003c/a\u003e—the videos of how he works are pretty cool. I immediately hung it in my office / studio when I got home, because Eric's audio engineering talents are a big reason why \u003ca href=\"/casts/breaking-change/\"\u003eBreaking Change\u003c/a\u003e sounds as good as it does!\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2026-02-05-20h17m49s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_f58194.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_fflr2p.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_h1qdnu.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_71omv0.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2026-02-05-20h17m49s_f58194.jpg","platform_overrides":{},"published_at":"2026-02-06T01:17:49Z","title":"I bought a Doggett","updated_at":"2026-02-05T20:30:31-05:00","url":"https://justin.searls.co/shots/2026-02-05-20h17m49s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v50-spacexxx/</id>
      <title type="text">🎙️ Breaking Change podcast v50 - SpaceXXX</title>
      <link href="https://justin.searls.co/casts/breaking-change-v50-spacexxx/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-05T16:53:25+00:00</published>
    <updated>2026-02-05T14:22:44-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v50.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v50.mp3">Direct link to podcast audio file</a>
</p><p>Elon has combined 3 of his 4 businesses and everything makes sense. Also, I went to Japan and all I came back with was another weird story about animal sperm. Other stuff happened too, but let's be honest, it's the typical AI schlock you've come to expect from this decade.</p>
<p>Write in with your own takes to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Please. Really! Do it.</p>
<p>Citations needed?</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=SEFdYsIWiLo">白子揚げ</a> = 🐟🍆💦🍟</li>
<li><a href="https://github.com/searlsco/scrapple">scrapple</a> scrapes Apple docs for agents</li>
<li><a href="https://github.com/searlsco/prove_it">prove_it</a> forces Claude to verify his shit works</li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://brandon.wang/2026/clawdbot">A sane but extremely bull case on Clawdbot / OpenClaw</a></li>
<li><a href="https://www.reuters.com/business/autos-transportation/lemonade-halve-tesla-insurance-rates-miles-driven-with-software-assistant-2026-01-21/">US Insurer 'Lemonade' Cuts Rates 50% for Drivers Using Tesla's 'Full Self-Driving' Software</a></li>
<li><a href="https://www.cnbc.com/2026/02/02/elon-musk-spacex-xai-ipo.html">Elon Musk's SpaceX acquiring AI startup xAI ahead of potential IPO</a></li>
<li><a href="https://sellercentral.amazon.com/seller-forums/discussions/t/106d0747-e5c6-44d8-86f3-7669f11238fe">Amazon commingling practices will end effective March 31, 2026</a></li>
<li><a href="https://www.cnbc.com/2026/01/27/ups-job-cuts-amazon-unwind-turnaround-plan.html">UPS to cut additional 30,000 jobs in Amazon unwind, turnaround plan</a></li>
<li><a href="https://www.theverge.com/news/870663/microsoft-windows-11-top-menu-bar-powertoy-experiment">Microsoft is experimenting with a top menu bar for Windows 11</a> (<a href="https://apple.news/A3R20tGcxQ3e7azvvZFi-iQ">News+</a>)</li>
<li><a href="https://www.nytimes.com/2026/01/30/dining/food-delivery-apps-doordash-uber.html?unlocked_article_code=1.IVA.a9jC.pjqI8Pmg82Kp&amp;smid=url-share">How DoorDash and Other Food Delivery Apps Are Reshaping Mealtime in the U.S.</a></li>
<li><a href="https://9to5mac.com/2026/01/13/apple-debuts-apple-creator-studio-subscription-heres-what-you-get/">Apple debuts 'Apple Creator Studio' subscription, here's what you get</a></li>
<li><a href="https://petapixel.com/2026/01/28/apple-sued-by-app-developer-over-its-continuity-camera/">Apple Sued by App Developer Over its Continuity Camera</a></li>
<li><a href="https://9to5mac.com/2026/01/28/halide-cofounder-sebastiaan-de-with-joins-apples-design-team/">Halide cofounder Sebastiaan de With joins Apple's design team</a></li>
<li><a href="https://www.bloomberg.com/news/newsletters/2026-01-25/inside-apple-s-ai-shake-up-ai-safari-and-plans-for-new-siri-in-ios-26-4-ios-27-mktqy7xb">Inside Apple's AI Shake-Up, AI Safari and Plans for New Siri in iOS 26.4, iOS 27</a> (<a href="https://archive.is/2026.01.25-203621/https://www.bloomberg.com/news/newsletters/2026-01-25/inside-apple-s-ai-shake-up-ai-safari-and-plans-for-new-siri-in-ios-26-4-ios-27-mktqy7xb">Archive</a>)</li>
<li><a href="https://www.apple.com/newsroom/2026/01/apple-introduces-new-airtag-with-expanded-range-and-improved-findability/">Apple introduces new AirTag with expanded range and improved findability</a></li>
<li><a href="https://www.apple.com/newsroom/2026/02/xcode-26-point-3-unlocks-the-power-of-agentic-coding/?cid=ADC-DM-c00377-M00827">Xcode 26.3 unlocks the power of agentic coding</a></li>
<li><a href="https://thewaltdisneycompany.com/news/disney-ceo-announcement/">Josh D'Amaro Named Next Chief Executive Officer of Disney</a></li>
<li><a href="https://www.theverge.com/streaming/873416/piracy-streaming-boxes">Everyone is stealing TV</a> (<a href="https://apple.news/ArWb7ZVrhQC20dTUmaFplGQ">News+</a>)</li>
<li><a href="https://www.theverge.com/news/869726/google-ai-project-genie-3-world-model-hands-on">Google's AI helped me make bad Nintendo knockoffs</a> (<a href="https://apple.news/AnuGzsdFyTW2FL0CMsNpkfg">News+</a>)
<ul>
<li><a href="https://deepmind.google/models/genie/">Deepmind Genie</a></li>
<li><a href="https://youtu.be/s40a06a5wIc">The sizzle reel</a></li>
</ul>
</li>
<li><a href="https://www.washingtonpost.com/technology/2026/01/26/gamer-protests-ai-slop-backlash/">Angry gamers are forcing studios to scrap or rethink new releases</a> (<a href="https://apple.news/ACbrZSm4eRSuXfQd5IpUE_g">News+</a>)</li>
<li><a href="https://www.youtube.com/live/A42a6CiB7hg?si=pAekvbEQlE2qrgip">Xbox Developer Direct</a> -  Fable looks like they did the thing , Forza Horizon 6 is set in Japan</li>
<li><a href="https://www.videogameschronicle.com/news/valve-confirms-steam-machine-price-and-release-details-have-been-delayed-by-exploding-component-prices/">Valve confirms Steam Machine price and release details have been delayed by exploding component prices</a></li>
<li><a href="https://en.wikipedia.org/wiki/Slow_Horses">Slow Horses</a></li>
<li><a href="https://en.wikipedia.org/wiki/Hijack_(TV_series)">Hijack</a></li>
<li><a href="https://github.com/tldev/posturr">Posturr</a> - posture-correcting screen blurring app</li>
<li><a href="https://youtu.be/GU_fBPHM1g8?si=YDp5trdhNgNGrTjV">Battlestar Galactica: Scattered Hopes</a></li>
<li><a href="https://store.steampowered.com/app/1904480/Absolum/">Absolum</a></li>
<li><a href="https://blippo.plus">Blippo+</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>Elon has combined 3 of his 4 businesses and everything makes sense. Also, I went to Japan and all I came back with was another weird story about animal sperm. Other stuff happened too, but let's be honest, it's the typical AI schlock you've come to expect from this decade.</p>
<p>Write in with your own takes to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Please. Really! Do it.</p>
<p>Citations needed?</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v50-spacexxx/","append_url_label":"Hear 🎙","content":"\u003cp\u003eElon has combined 3 of his 4 businesses and everything makes sense. Also, I went to Japan and all I came back with was another weird story about animal sperm. Other stuff happened too, but let's be honest, it's the typical AI schlock you've come to expect from this decade.\u003c/p\u003e\n\u003cp\u003eWrite in with your own takes to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e. Please. Really! Do it.\u003c/p\u003e\n\u003cp\u003eCitations needed?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=SEFdYsIWiLo\"\u003e白子揚げ\u003c/a\u003e = 🐟🍆💦🍟\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/searlsco/scrapple\"\u003escrapple\u003c/a\u003e scrapes Apple docs for agents\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/searlsco/prove_it\"\u003eprove_it\u003c/a\u003e forces Claude to verify his shit works\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://brandon.wang/2026/clawdbot\"\u003eA sane but extremely bull case on Clawdbot / OpenClaw\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.reuters.com/business/autos-transportation/lemonade-halve-tesla-insurance-rates-miles-driven-with-software-assistant-2026-01-21/\"\u003eUS Insurer 'Lemonade' Cuts Rates 50% for Drivers Using Tesla's 'Full Self-Driving' Software\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.cnbc.com/2026/02/02/elon-musk-spacex-xai-ipo.html\"\u003eElon Musk's SpaceX acquiring AI startup xAI ahead of potential IPO\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://sellercentral.amazon.com/seller-forums/discussions/t/106d0747-e5c6-44d8-86f3-7669f11238fe\"\u003eAmazon commingling practices will end effective March 31, 2026\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.cnbc.com/2026/01/27/ups-job-cuts-amazon-unwind-turnaround-plan.html\"\u003eUPS to cut additional 30,000 jobs in Amazon unwind, turnaround plan\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/news/870663/microsoft-windows-11-top-menu-bar-powertoy-experiment\"\u003eMicrosoft is experimenting with a top menu bar for Windows 11\u003c/a\u003e (\u003ca href=\"https://apple.news/A3R20tGcxQ3e7azvvZFi-iQ\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.nytimes.com/2026/01/30/dining/food-delivery-apps-doordash-uber.html?unlocked_article_code=1.IVA.a9jC.pjqI8Pmg82Kp\u0026amp;smid=url-share\"\u003eHow DoorDash and Other Food Delivery Apps Are Reshaping Mealtime in the U.S.\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://9to5mac.com/2026/01/13/apple-debuts-apple-creator-studio-subscription-heres-what-you-get/\"\u003eApple debuts 'Apple Creator Studio' subscription, here's what you get\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://petapixel.com/2026/01/28/apple-sued-by-app-developer-over-its-continuity-camera/\"\u003eApple Sued by App Developer Over its Continuity Camera\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://9to5mac.com/2026/01/28/halide-cofounder-sebastiaan-de-with-joins-apples-design-team/\"\u003eHalide cofounder Sebastiaan de With joins Apple's design team\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bloomberg.com/news/newsletters/2026-01-25/inside-apple-s-ai-shake-up-ai-safari-and-plans-for-new-siri-in-ios-26-4-ios-27-mktqy7xb\"\u003eInside Apple's AI Shake-Up, AI Safari and Plans for New Siri in iOS 26.4, iOS 27\u003c/a\u003e (\u003ca href=\"https://archive.is/2026.01.25-203621/https://www.bloomberg.com/news/newsletters/2026-01-25/inside-apple-s-ai-shake-up-ai-safari-and-plans-for-new-siri-in-ios-26-4-ios-27-mktqy7xb\"\u003eArchive\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.apple.com/newsroom/2026/01/apple-introduces-new-airtag-with-expanded-range-and-improved-findability/\"\u003eApple introduces new AirTag with expanded range and improved findability\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.apple.com/newsroom/2026/02/xcode-26-point-3-unlocks-the-power-of-agentic-coding/?cid=ADC-DM-c00377-M00827\"\u003eXcode 26.3 unlocks the power of agentic coding\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://thewaltdisneycompany.com/news/disney-ceo-announcement/\"\u003eJosh D'Amaro Named Next Chief Executive Officer of Disney\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/streaming/873416/piracy-streaming-boxes\"\u003eEveryone is stealing TV\u003c/a\u003e (\u003ca href=\"https://apple.news/ArWb7ZVrhQC20dTUmaFplGQ\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/news/869726/google-ai-project-genie-3-world-model-hands-on\"\u003eGoogle's AI helped me make bad Nintendo knockoffs\u003c/a\u003e (\u003ca href=\"https://apple.news/AnuGzsdFyTW2FL0CMsNpkfg\"\u003eNews+\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://deepmind.google/models/genie/\"\u003eDeepmind Genie\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/s40a06a5wIc\"\u003eThe sizzle reel\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.washingtonpost.com/technology/2026/01/26/gamer-protests-ai-slop-backlash/\"\u003eAngry gamers are forcing studios to scrap or rethink new releases\u003c/a\u003e (\u003ca href=\"https://apple.news/ACbrZSm4eRSuXfQd5IpUE_g\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/live/A42a6CiB7hg?si=pAekvbEQlE2qrgip\"\u003eXbox Developer Direct\u003c/a\u003e -  Fable looks like they did the thing , Forza Horizon 6 is set in Japan\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/valve-confirms-steam-machine-price-and-release-details-have-been-delayed-by-exploding-component-prices/\"\u003eValve confirms Steam Machine price and release details have been delayed by exploding component prices\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Slow_Horses\"\u003eSlow Horses\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Hijack_(TV_series)\"\u003eHijack\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tldev/posturr\"\u003ePosturr\u003c/a\u003e - posture-correcting screen blurring app\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/GU_fBPHM1g8?si=YDp5trdhNgNGrTjV\"\u003eBattlestar Galactica: Scattered Hopes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://store.steampowered.com/app/1904480/Absolum/\"\u003eAbsolum\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blippo.plus\"\u003eBlippo+\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! SpaceXXX","id":"https://justin.searls.co/casts/breaking-change-v50-spacexxx/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v50-spacexxx.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-02-05T16:53:25Z","title":"SpaceXXX","updated_at":"2026-02-05T14:22:44-05:00","url":"https://justin.searls.co/casts/breaking-change-v50-spacexxx/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2026-02-02-were-gonna-need-a-bigger-shovel/</id>
      <title type="text">🔗 We&#39;re gonna need a bigger Shovel…</title>
        <link href="https://jerodsanto.net/2026/02/the-shovelware-cometh/?utm_source=changelog-news" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2026-02-02-were-gonna-need-a-bigger-shovel/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-02T20:44:00+00:00</published>
    <updated>2026-02-02T23:07:48+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Glad to see <a href="https://jerodsanto.net/2026/02/the-shovelware-cometh/?utm_source=changelog-news">Jerod properly follow up on this one</a>:</p>
<blockquote>
<p>In September of last year, I <a href="https://changelog.com/news/160">covered</a> a post by Mike Judge arguing that <a href="https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding">AI coding claims don't add up</a>, in which he asked this question:</p>
<blockquote>
<p>If so many developers are so extraordinarily productive using these tools, where is the flood of shovelware? We should be seeing apps of all shapes and sizes, video games, new websites, mobile apps, software-as-a-service apps — we should be drowning in choice. We should be in the middle of an indie software revolution. We should be seeing 10,000 Tetris clones on Steam.</p>
</blockquote>
</blockquote>
<p>I was capital-T Triggered by this, having separately <a href="/links/2025-09-08-i-ve-got-your-shovelware-right-here/">fired off my own retort to Judge's post at the time</a>, and even going so far as creating a <a href="/shovelware/">Certified Shovelware README badge</a>:</p>
<p><a href="/shovelware/"><img src="/img/shovelware.svg" alt="Certified Shovelware"></a></p>
<p>And that badge has gotten a lot of action in the intervening 2 months. Shit, last night <a href="https://justin.searls.co/takes/2026-02-01-20h43m31s/">I released two</a>—<a href="https://github.com/searlsco/prove_it">count'em</a>, <a href="https://github.com/searlsco/scrapple">two</a>—Homebrew formulae last night. I wouldn't have bothered creating either were it not for the rapacious tenacity of coding agents. <em>(Please ignore the fact that both projects exist in order to wrangle said coding agents).</em></p>
<p>Anyway, I've been thinking a lot about that Shovelware post ever since, and again recently with all the mainstream press coverage of <del>ClawdBot</del>/<del>Moltbot</del>/OpenClaw this week—especially as I see long-term skeptics of AI's utility like Nilay Patel <a href="https://www.theverge.com/podcast/870717/tim-cook-melania-minneapolis-tiktok-vergecast">finally declaring this as the moment where he sees the value in agents</a>. <em>(My dude, I was automating my Mac with <a href="https://github.com/yamkz/claude-discord-bridge">claude-discord-bridge</a> and AppleScript <a href="https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/">from my doctor's office in late July</a>!)</em></p>
<p>But I was too lazy to take those thoughts and do anything with them. Unlike me, Jerod did the work of rendering the chart that properly puts the original, &quot;where's the shovelware,&quot; complaint to rest. Rather than hotlink his image, I encourage you to <a href="https://jerodsanto.net/2026/02/the-shovelware-cometh/">click through to see for yourself</a>:</p>
<blockquote>
<p>This, to me, looks like the canary in the coal mine; the bellwether leading the flock; the first swallow of summer; the… you get the idea.</p>
</blockquote>
<p>Hard agree. I said then and continue to agree with myself now that (1) it makes no sense to start the clock in November 2022, because no AI coding products prior to terminal-based coding agents ever mattered, and (2) people woefully underestimate the degree to which <strong>programmers are actually late adopters</strong>. <em>(Raise your hand if you're still refusing to install macOS Tahoe, for fuck's sake.)</em></p>
<p>Even today, I'd be shocked if over 5% of professional programmers worldwide have attempted to adopt a terminal-based coding agent in anger. The amount of technically-useful, mostly-broken software we're going to be inundated with a year from now will be truly mind-bending.</p>

<p>🔗 <a href="https://jerodsanto.net/2026/02/the-shovelware-cometh/?utm_source=changelog-news" title="Original Article">jerodsanto.net</a></p><p>🧂 <a href="https://justin.searls.co/links/2026-02-02-were-gonna-need-a-bigger-shovel/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>Glad to see <a href="https://jerodsanto.net/2026/02/the-shovelware-cometh/?utm_source=changelog-news">Jerod properly follow up on this one</a>:</p>
<blockquote>
<p>In September of last year, I <a href="https://changelog.com/news/160">covered</a> a post by Mike Judge arguing that <a href="https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding">AI coding claims don't add up</a>, in which he asked this question:</p>
<blockquote>
<p>If so many developers are so extraordinarily productive using these tools, where is the flood of shovelware? We should be seeing apps of all shapes and sizes, video games, new websites, mobile apps, software-as-a-service apps — we should be drowning in choice. We should be in the middle of an indie software revolution. We should be seeing 10,000 Tetris clones on Steam.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2026-02-02-were-gonna-need-a-bigger-shovel/","append_url_label":"Click 🔗","content":"\u003cp\u003eGlad to see \u003ca href=\"https://jerodsanto.net/2026/02/the-shovelware-cometh/?utm_source=changelog-news\"\u003eJerod properly follow up on this one\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn September of last year, I \u003ca href=\"https://changelog.com/news/160\"\u003ecovered\u003c/a\u003e a post by Mike Judge arguing that \u003ca href=\"https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding\"\u003eAI coding claims don't add up\u003c/a\u003e, in which he asked this question:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf so many developers are so extraordinarily productive using these tools, where is the flood of shovelware? We should be seeing apps of all shapes and sizes, video games, new websites, mobile apps, software-as-a-service apps — we should be drowning in choice. We should be in the middle of an indie software revolution. We should be seeing 10,000 Tetris clones on Steam.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI was capital-T Triggered by this, having separately \u003ca href=\"/links/2025-09-08-i-ve-got-your-shovelware-right-here/\"\u003efired off my own retort to Judge's post at the time\u003c/a\u003e, and even going so far as creating a \u003ca href=\"/shovelware/\"\u003eCertified Shovelware README badge\u003c/a\u003e:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/shovelware/\"\u003e\u003cimg src=\"/img/shovelware.svg\" alt=\"Certified Shovelware\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAnd that badge has gotten a lot of action in the intervening 2 months. Shit, last night \u003ca href=\"https://justin.searls.co/takes/2026-02-01-20h43m31s/\"\u003eI released two\u003c/a\u003e—\u003ca href=\"https://github.com/searlsco/prove_it\"\u003ecount'em\u003c/a\u003e, \u003ca href=\"https://github.com/searlsco/scrapple\"\u003etwo\u003c/a\u003e—Homebrew formulae last night. I wouldn't have bothered creating either were it not for the rapacious tenacity of coding agents. \u003cem\u003e(Please ignore the fact that both projects exist in order to wrangle said coding agents).\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eAnyway, I've been thinking a lot about that Shovelware post ever since, and again recently with all the mainstream press coverage of \u003cdel\u003eClawdBot\u003c/del\u003e/\u003cdel\u003eMoltbot\u003c/del\u003e/OpenClaw this week—especially as I see long-term skeptics of AI's utility like Nilay Patel \u003ca href=\"https://www.theverge.com/podcast/870717/tim-cook-melania-minneapolis-tiktok-vergecast\"\u003efinally declaring this as the moment where he sees the value in agents\u003c/a\u003e. \u003cem\u003e(My dude, I was automating my Mac with \u003ca href=\"https://github.com/yamkz/claude-discord-bridge\"\u003eclaude-discord-bridge\u003c/a\u003e and AppleScript \u003ca href=\"https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/\"\u003efrom my doctor's office in late July\u003c/a\u003e!)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eBut I was too lazy to take those thoughts and do anything with them. Unlike me, Jerod did the work of rendering the chart that properly puts the original, \u0026quot;where's the shovelware,\u0026quot; complaint to rest. Rather than hotlink his image, I encourage you to \u003ca href=\"https://jerodsanto.net/2026/02/the-shovelware-cometh/\"\u003eclick through to see for yourself\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis, to me, looks like the canary in the coal mine; the bellwether leading the flock; the first swallow of summer; the… you get the idea.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHard agree. I said then and continue to agree with myself now that (1) it makes no sense to start the clock in November 2022, because no AI coding products prior to terminal-based coding agents ever mattered, and (2) people woefully underestimate the degree to which \u003cstrong\u003eprogrammers are actually late adopters\u003c/strong\u003e. \u003cem\u003e(Raise your hand if you're still refusing to install macOS Tahoe, for fuck's sake.)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eEven today, I'd be shocked if over 5% of professional programmers worldwide have attempted to adopt a terminal-based coding agent in anger. The amount of technically-useful, mostly-broken software we're going to be inundated with a year from now will be truly mind-bending.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2026-02-02-were-gonna-need-a-bigger-shovel/","og_image":"https://jerodsanto.net/share.png","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-02-02T20:44:00Z","related_url":"https://jerodsanto.net/2026/02/the-shovelware-cometh/?utm_source=changelog-news","title":"We're gonna need a bigger Shovel…","updated_at":"2026-02-02T23:07:48Z","url":"https://justin.searls.co/links/2026-02-02-were-gonna-need-a-bigger-shovel/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2026-02-01-11h13m37s/</id>
      <title type="text">📸 Why is OpenAI so stingy with ChatGPT web search?</title>
      <link href="https://justin.searls.co/shots/2026-02-01-11h13m37s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-02-01T16:13:37+00:00</published>
    <updated>2026-02-01T11:22:15-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2026-02-01-11h13m37s_chyzuf.jpg"/>
</div><p>For however expensive LLM inference supposedly is, OpenAI continues to be stupidly stingy with respect to web searches—even though any GPT 5.2 Auto request (the default) is extremely likely to be wrong unless the user intervenes by enabling web search.</p>
<p>Meanwhile, ChatGPT's user interface offers:</p>
<ul>
<li>No way to enable search by default</li>
<li>No keyboard shortcut to enable search</li>
<li>No app (@) or slash (/) command to trigger search</li>
<li>Ignores personalization instructions like &quot;ALWAYS USE WEB SEARCH&quot;</li>
<li>Frequently hides web search behind multiple clicks and taps, and aggressively A/B tests interface changes that clearly will result in fewer searches being executed</li>
</ul>
<p>All of this raises the question: how does ChatGPT implement search? What is the cost of the search itself and the extent of chain-of-thought reasoning needed to aggregate and discern the extraordinary number of tokens that need to be ingested by those search results?</p>
<p>It's interesting that OpenAI is so eager to goose usage by lighting dumpsters full of venture capital on fire, but is so stingy when it comes to ensuring their flagship product knows basic facts like &quot;iPhone Air is a product that exists.&quot;</p>

]]></content>
    <summary type="html"><![CDATA[<p>For however expensive LLM inference supposedly is, OpenAI continues to be stupidly stingy with respect to web searches—even though any GPT 5.2 Auto request (the default) is extremely likely to be wrong unless the user intervenes by enabling web search.</p>
<p>Meanwhile, ChatGPT's user interface offers:</p>
<ul>
<li>No way to enable search by default</li>
<li>No keyboard shortcut to enable search</li>
<li>No app (@) or slash (/) command to trigger search</li>
<li>Ignores personalization instructions like &quot;ALWAYS USE WEB SEARCH&quot;</li>
<li>Frequently hides web search behind multiple clicks and taps, and aggressively A/B tests interface changes that clearly will result in fewer searches being executed</li>
</ul>
<p>All of this raises the question: how does ChatGPT implement search? What is the cost of the search itself and the extent of chain-of-thought reasoning needed to aggregate and discern the extraordinary number of tokens that need to be ingested by those search results?</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2026-02-01-11h13m37s/","append_url_label":"View 📸","content":"\u003cp\u003eFor however expensive LLM inference supposedly is, OpenAI continues to be stupidly stingy with respect to web searches—even though any GPT 5.2 Auto request (the default) is extremely likely to be wrong unless the user intervenes by enabling web search.\u003c/p\u003e\n\u003cp\u003eMeanwhile, ChatGPT's user interface offers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNo way to enable search by default\u003c/li\u003e\n\u003cli\u003eNo keyboard shortcut to enable search\u003c/li\u003e\n\u003cli\u003eNo app (@) or slash (/) command to trigger search\u003c/li\u003e\n\u003cli\u003eIgnores personalization instructions like \u0026quot;ALWAYS USE WEB SEARCH\u0026quot;\u003c/li\u003e\n\u003cli\u003eFrequently hides web search behind multiple clicks and taps, and aggressively A/B tests interface changes that clearly will result in fewer searches being executed\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAll of this raises the question: how does ChatGPT implement search? What is the cost of the search itself and the extent of chain-of-thought reasoning needed to aggregate and discern the extraordinary number of tokens that need to be ingested by those search results?\u003c/p\u003e\n\u003cp\u003eIt's interesting that OpenAI is so eager to goose usage by lighting dumpsters full of venture capital on fire, but is so stingy when it comes to ensuring their flagship product knows basic facts like \u0026quot;iPhone Air is a product that exists.\u0026quot;\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2026-02-01-11h13m37s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-02-01-11h13m37s_chyzuf.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2026-02-01-11h13m37s_chyzuf.jpg","platform_overrides":{},"published_at":"2026-02-01T16:13:37Z","title":"Why is OpenAI so stingy with ChatGPT web search?","updated_at":"2026-02-01T11:22:15-05:00","url":"https://justin.searls.co/shots/2026-02-01-11h13m37s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2026-01-21-07h11m10s/</id>
      <title type="text">📸 A better macOS Globe key</title>
      <link href="https://justin.searls.co/shots/2026-01-21-07h11m10s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-20T22:11:10+00:00</published>
    <updated>2026-01-21T07:35:07+09:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2026-01-21-07h11m10s_xyx181.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-01-21-07h11m10s_mpvnfk.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-01-21-07h11m10s_xpmn1b.jpg"/>
</div><p>The Globe key on macOS is a strange key.</p>
<p>Ostensibly, Apple added it so users could easily change keyboard layouts to switch between different languages. In practice, however, the vast majority of users only need two &quot;languages&quot;: their mother tongue and the emoji keyboard. The same key also serves as an underutilized <code>fn</code> button—a role that has become ubiquitous on Windows and Linux keyboards, but which has seen relatively little use on macOS.</p>
<p>By having two jobs, the Globe key ends up being bad at both. And when it comes to changing languages, it fails because it introduces a 300–500 ms delay while the system waits to see whether the user intends to press and hold the key as part of another shortcut.</p>
<p>This is <strong>way too slow</strong> if you actually need to switch keyboard layouts rapidly. And nobody needs to do that more than Japanese users, for whom half-width English characters and full-width kana and kanji are routinely interspersed within a single sentence or web form. (This is why Japanese hardware keyboards have dedicated, instantly responsive keys on either side of the layout for switching between English characters and Japanese input modes in a single keystroke—without requiring the user to mentally track the current modal state of the keyboard.)</p>
<p>While I can't magically add another physical key to my U.S. keyboard, tools like <a href="https://karabiner-elements.pqrs.org">Karabiner-Elements</a> or <a href="https://www.keyboardmaestro.com/main/">Keyboard Maestro</a> can take over the Globe key and make it switch layouts <em>instantly</em>.</p>
<p>Since I already have Keyboard Maestro running, that's what I used to fix this. You can <a href="https://podcast-cdn.searls.co/misc/instant-keyboard-language-switch.kmmacros">download the macro here</a>.</p>
<p>To set it up:</p>
<ol>
<li>Open <strong>System Settings → Keyboard</strong>.</li>
<li>Set <strong>Press 🌐 key to</strong> to <strong>Do Nothing</strong>.</li>
<li>Double-click the macro to add it to Keyboard Maestro, and make sure it's enabled.</li>
</ol>
<p>Once configured, you can switch between the two keyboard layouts instantly—without waiting for the operating system to catch up.</p>

]]></content>
    <summary type="html"><![CDATA[<p>The Globe key on macOS is a strange key.</p>
<p>Ostensibly, Apple added it so users could easily change keyboard layouts to switch between different languages. In practice, however, the vast majority of users only need two &quot;languages&quot;: their mother tongue and the emoji keyboard. The same key also serves as an underutilized <code>fn</code> button—a role that has become ubiquitous on Windows and Linux keyboards, but which has seen relatively little use on macOS.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2026-01-21-07h11m10s/","append_url_label":"View 📸","content":"\u003cp\u003eThe Globe key on macOS is a strange key.\u003c/p\u003e\n\u003cp\u003eOstensibly, Apple added it so users could easily change keyboard layouts to switch between different languages. In practice, however, the vast majority of users only need two \u0026quot;languages\u0026quot;: their mother tongue and the emoji keyboard. The same key also serves as an underutilized \u003ccode\u003efn\u003c/code\u003e button—a role that has become ubiquitous on Windows and Linux keyboards, but which has seen relatively little use on macOS.\u003c/p\u003e\n\u003cp\u003eBy having two jobs, the Globe key ends up being bad at both. And when it comes to changing languages, it fails because it introduces a 300–500 ms delay while the system waits to see whether the user intends to press and hold the key as part of another shortcut.\u003c/p\u003e\n\u003cp\u003eThis is \u003cstrong\u003eway too slow\u003c/strong\u003e if you actually need to switch keyboard layouts rapidly. And nobody needs to do that more than Japanese users, for whom half-width English characters and full-width kana and kanji are routinely interspersed within a single sentence or web form. (This is why Japanese hardware keyboards have dedicated, instantly responsive keys on either side of the layout for switching between English characters and Japanese input modes in a single keystroke—without requiring the user to mentally track the current modal state of the keyboard.)\u003c/p\u003e\n\u003cp\u003eWhile I can't magically add another physical key to my U.S. keyboard, tools like \u003ca href=\"https://karabiner-elements.pqrs.org\"\u003eKarabiner-Elements\u003c/a\u003e or \u003ca href=\"https://www.keyboardmaestro.com/main/\"\u003eKeyboard Maestro\u003c/a\u003e can take over the Globe key and make it switch layouts \u003cem\u003einstantly\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eSince I already have Keyboard Maestro running, that's what I used to fix this. You can \u003ca href=\"https://podcast-cdn.searls.co/misc/instant-keyboard-language-switch.kmmacros\"\u003edownload the macro here\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eTo set it up:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eOpen \u003cstrong\u003eSystem Settings → Keyboard\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eSet \u003cstrong\u003ePress 🌐 key to\u003c/strong\u003e to \u003cstrong\u003eDo Nothing\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eDouble-click the macro to add it to Keyboard Maestro, and make sure it's enabled.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eOnce configured, you can switch between the two keyboard layouts instantly—without waiting for the operating system to catch up.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2026-01-21-07h11m10s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-01-21-07h11m10s_xyx181.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-01-21-07h11m10s_mpvnfk.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-01-21-07h11m10s_xpmn1b.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2026-01-21-07h11m10s_xyx181.jpg","platform_overrides":{},"published_at":"2026-01-20T22:11:10Z","title":"A better macOS Globe key","updated_at":"2026-01-21T07:35:07+09:00","url":"https://justin.searls.co/shots/2026-01-21-07h11m10s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/clips/shenmue-was-educational-software/</id>
      <title type="text">✂️ Shenmue was educational software</title>
      <link href="https://justin.searls.co/clips/shenmue-was-educational-software/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-19T21:45:44+00:00</published>
    <updated>2026-01-20T06:46:54+09:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="flex justify-center">
  <div class="sm:beneath-the-page sm:p-2">
    <video poster="https://podcast-cdn.searls.co/clips/shenmue-was-educational-software.jpg" class="inline-block shadow-lg rounded-lg max-h-[80lvh] sm:max-h-[60lvh] m-0" preload="auto" playsinline="playsinline" controls="controls" controlslist="nodownload">
      <source src="https://podcast-cdn.searls.co/clips/shenmue-was-educational-software.mp4">
      Your browser does not support the video tag.
    </video>
  </div>
</div><p>Everything I needed to know I learned as a 16 year old playing Shenmue on Dreamcast</p>

]]></content>
    <summary type="html"><![CDATA[<p>Everything I needed to know I learned as a 16 year old playing Shenmue on Dreamcast</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/clips/shenmue-was-educational-software/","append_url_label":"Peek ✂️","content":"\u003cp\u003eEverything I needed to know I learned as a 16 year old playing Shenmue on Dreamcast\u003c/p\u003e\n","format_string":"New clip! {{title}}","id":"https://justin.searls.co/clips/shenmue-was-educational-software/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/clips/shenmue-was-educational-software.mp4"}],"og_image":"https://podcast-cdn.searls.co/clips/shenmue-was-educational-software.jpg","platform_overrides":{},"published_at":"2026-01-19T21:45:44Z","title":"Shenmue was educational software","updated_at":"2026-01-20T06:46:54+09:00","url":"https://justin.searls.co/clips/shenmue-was-educational-software/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2026-01-11-14h00m51s/</id>
      <title type="text">📸 PSA: iPhone Air MagSafe Battery can charge your AirPods</title>
      <link href="https://justin.searls.co/shots/2026-01-11-14h00m51s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-11T19:00:51+00:00</published>
    <updated>2026-01-11T14:04:47-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2026-01-11-14h00m51s_w7dn8w.jpg"/>
</div><p>One of the many subtle frustrations I have with the Airpods Pro 3 is that the redesigned case actually results in a slightly-askew magnet alignment, which results in several (official!) MagSafe chargers failing to charge the case. Well, while the <a href="https://www.apple.com/shop/product/mgpg4am/a/iphone-air-magsafe-battery">iPhone Air MagSafe Battery</a> may not fit any other model iPhone particularly well, it's actually a super handy way to recharge your AirPods! Just plop the fucker on the back and twist until you hear that familiar ding and see the light turn on.</p>
<p>Might come in handy on a long flight.</p>
<p>Secondary PSA: engraving is free and AirPods are disposable: put your e-mail address on your AirPods.</p>

]]></content>
    <summary type="html"><![CDATA[<p>One of the many subtle frustrations I have with the Airpods Pro 3 is that the redesigned case actually results in a slightly-askew magnet alignment, which results in several (official!) MagSafe chargers failing to charge the case. Well, while the <a href="https://www.apple.com/shop/product/mgpg4am/a/iphone-air-magsafe-battery">iPhone Air MagSafe Battery</a> may not fit any other model iPhone particularly well, it's actually a super handy way to recharge your AirPods! Just plop the fucker on the back and twist until you hear that familiar ding and see the light turn on.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2026-01-11-14h00m51s/","append_url_label":"View 📸","content":"\u003cp\u003eOne of the many subtle frustrations I have with the Airpods Pro 3 is that the redesigned case actually results in a slightly-askew magnet alignment, which results in several (official!) MagSafe chargers failing to charge the case. Well, while the \u003ca href=\"https://www.apple.com/shop/product/mgpg4am/a/iphone-air-magsafe-battery\"\u003eiPhone Air MagSafe Battery\u003c/a\u003e may not fit any other model iPhone particularly well, it's actually a super handy way to recharge your AirPods! Just plop the fucker on the back and twist until you hear that familiar ding and see the light turn on.\u003c/p\u003e\n\u003cp\u003eMight come in handy on a long flight.\u003c/p\u003e\n\u003cp\u003eSecondary PSA: engraving is free and AirPods are disposable: put your e-mail address on your AirPods.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2026-01-11-14h00m51s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-01-11-14h00m51s_w7dn8w.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2026-01-11-14h00m51s_w7dn8w.jpg","platform_overrides":{},"published_at":"2026-01-11T19:00:51Z","title":"PSA: iPhone Air MagSafe Battery can charge your AirPods","updated_at":"2026-01-11T14:04:47-05:00","url":"https://justin.searls.co/shots/2026-01-11-14h00m51s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v49-saving-face-oil/</id>
      <title type="text">🎙️ Breaking Change podcast v49 - Saving Face Oil</title>
      <link href="https://justin.searls.co/casts/breaking-change-v49-saving-face-oil/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-09T22:01:34+00:00</published>
    <updated>2026-01-09T19:13:54-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v49.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v49.mp3">Direct link to podcast audio file</a>
</p><p>I'm about to get on a plane and will be gone for a couple weeks, but didn't want to leave you Breaking Changeless so I did the thing where I stand up in front of a microphone and talked at you. Again. Like I do.</p>
<p>Fun fact: this is the first and only time I've taken a phone call live, on-air! I was just too lazy to edit that out gracefully.</p>
<p>Whenever I go to Japan solo, I experience moments of loneliness, so I'd really appreciate it if you sent me some praise or complaints or ideas to <a href="mailto:podcast@searls.co">podcast@searls.co</a> and I'll feel comforted by the knowledge that you exist. Your engagement sustains me.</p>
<p>Lotta weird and dumb links this go-round:</p>
<ul>
<li><a href="https://ericdoggett.com">Eric Doggett</a> is a great friend/artist</li>
<li><a href="https://www.fortunefeimster.com">Fortune Feimster</a> isn't spelled how I would've guessed</li>
<li><a href="https://www.meta.com/ai-glasses/ray-ban-meta-wayfarer-gen-2/">Ray-Ban Meta Wayfarer (Gen 2)</a> is the best gift anyone's given me in a while</li>
<li><a href="https://posseparty.com">POSSE Party</a>'s tutorial videos are just enough to convince you to either bother or not bother</li>
<li>Reddit's <a href="https://www.reddit.com/r/selfhosted">r/selfhosted</a> is <a href="https://www.reddit.com/r/selfhosted/s/AiQqPN9XNg">at least a little self-aware</a></li>
<li>I'm giving myself some grace when it comes to <a href="https://justin.searls.co/newsletter">the newsletter</a></li>
<li><a href="https://www.amazon.com/s?k=EDID+emulator&amp;crid=2UTJUUTDBQHVT&amp;sprefix=edid+emulator%2Caps%2C152&amp;ref=nb_sb_noss_1">EDID Emulators</a> are a hardware product that exist only because Windows is bad</li>
<li>Looking forward to trying <a href="https://happy.engineering">Happy</a> for remote Claude Code / Codex CLI work</li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://repebble.com/blog/meet-pebble-index-01-external-memory-for-your-brain">Pebble Index 01</a></li>
<li><a href="https://www.cnet.com/tech/computing/googles-putting-it-all-on-glasses-next-year-my-demos-with-project-aura-and-more/">Google's / XReal Putting It All on Glasses Next Year</a></li>
<li><a href="https://rog.asus.com/articles/gaming-monitors/the-rog-xreal-glasses-r1-bring-big-screen-pc-and-console-gaming-in-a-small-wearable-package/">XReal is partnering with Asus ROG, too</a></li>
<li><a href="https://9to5google.com/2025/12/08/android-iphone-switching/">Google and Apple partner on better Android-iPhone switching</a></li>
<li><a href="https://www.nytimes.com/2026/01/08/technology/apple-ceo-tim-cook-john-ternus.html?unlocked_article_code=1.DFA.Qm0v.SxztBxvFrAF-&amp;smid=url-share">NYT profiles John Ternus</a></li>
<li><a href="https://9to5mac.com/2026/01/02/another-airpods-pro-3-model-is-coming-with-one-rumored-upgrade/">AirPods Pro with IR cameras</a> (<em>instead</em> of stem clicks?!)</li>
<li><a href="https://www.wsj.com/finance/banking/jpmorgan-chase-reaches-a-deal-to-take-over-the-apple-credit-card-4e214fb2">JPMorgan Chase Reaches a Deal to Take Over the Apple Credit Card</a> (<a href="https://apple.news/AAzNXt77ATV2x9xX1DiFptg">News+</a>)</li>
<li>The <a href="https://www.clicks.tech/powerkeyboard">Clicks Power Keyboard</a> looks rad</li>
<li><a href="https://www.videogameschronicle.com/news/the-game-awards-2025-complete-list-of-winners-as-clair-obscur-wins-game-of-the-year-and-sets-a-new-record-for-awards-won/">Expedition 33's Game Awards sweep</a> has me asking, who will be the first to VEGOT?</li>
<li>Valve still <a href="https://www.reddit.com/r/Steam/comments/1prc5ps/over_5_years_ago_i_launched_hydroneer_on_steam/">sending this guy chocolates</a> every Christmas</li>
<li><a href="https://www.pcworld.com/article/3013044/the-post-geforce-era-what-if-nvidia-abandons-pc-gaming.html">The post-GeForce era: What if Nvidia abandons PC gaming?</a></li>
<li><a href="https://www.reddit.com/r/pcmasterrace/comments/1q0h2cn/amd_and_nvidia_expected_to_begin_raising_gpu/?share_id=Lm4O0lUigEXTkIqevLSIE&amp;utm_content=2&amp;utm_medium=ios_app&amp;utm_name=iossmf&amp;utm_source=share&amp;utm_term=22">The 5090 could cost $5090</a> by the end of 2026</li>
<li><a href="https://overclock3d.net/news/gpu-displays/nvidia-plans-heavy-cuts-to-gpu-supply-in-early-2026/">Nvidia plans heavy cuts to GPU supply in early 2026</a></li>
<li><a href="https://www.theverge.com/ai-artificial-intelligence/844966/heavy-ai-data-center-buildout">Racks of AI chips are too damn heavy</a> (<a href="https://apple.news/Arp88bJsrRrCHfNZgKzULMw">News+</a>)</li>
<li><a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/nvidia-ceo-confirms-vera-rubin-nvl72-is-now-in-production-jensen-huang-uses-ces-keynote-to-announce-the-milestone">Vera Rubin is probably even heavier</a></li>
<li><a href="https://openai.com/index/new-chatgpt-images-is-here/">GPT Image 1.5 is better but not good enough</a></li>
<li><a href="https://www.theverge.com/news/848435/openai-chatgpt-characteristics-update-warmth-enthusiasm">PSA: make ChatGPT less warm, enthusiastic, and emoji-tastic</a> (<a href="https://apple.news/AgVPwh-hXSKmBYrIzP_OahQ">News+</a>)</li>
<li><a href="https://techcrunch.com/2025/12/08/you-can-buy-your-instacart-groceries-without-leaving-chatgpt/">You can (supposedly) buy your Instacart groceries without leaving ChatGPT</a></li>
<li>The massive <a href="https://www.wheresyoured.at/the-enshittifinancial-crisis/">year-end Ed Zitron newsletter</a>.</li>
<li><a href="https://www.latimes.com/business/story/2025-12-12/ai-podcasting-is-changing-industry">Podcasts are AI now</a> (<a href="https://apple.news/AkXUtejJITmaoz9qKtDPHmA">News+</a>)</li>
<li><a href="https://www.bloodinthemachine.com/p/i-was-forced-to-use-ai-until-the">Copywriters reveal how AI has decimated their industry</a></li>
<li><a href="https://www.latimes.com/business/story/2025-12-19/they-graduated-from-stanford-due-to-ai-they-cant-find-job">A Stanford degree wont save you</a> (<a href="https://apple.news/AmSn8GBXbSI-9bSvYiHks6g">News+</a>)</li>
<li><a href="https://www.businessinsider.com/godfather-of-saas-jason-lemkin-replace-humans-ai-agents-sales-2026-1">'Godfather of SaaS' Says He Replaced Most of His Sales Team With AI Agents</a></li>
<li><a href="https://gothamist.com/news/nyc-phone-ban-reveals-some-students-cant-read-clocks">NYC phone ban reveals some students can't read clocks</a></li>
<li><a href="https://www.sciencealert.com/swearing-actually-seems-to-make-humans-physically-stronger">Swearing Actually Seems to Make Humans Physically Stronger</a></li>
<li><a href="https://variety.com/2026/tv/news/corporation-for-public-broadcasting-shuts-down-trump-1236623793/">Corporation for Public Broadcasting to Shut Down After 58 Years Due to Trump Eliminating Funding</a></li>
<li><a href="https://www.wired.com/story/grok-is-generating-sexual-content-far-more-graphic-than-whats-on-x/">Grok Is Generating Sexual Content Far More Graphic Than What's on X</a> (<a href="https://apple.news/AZ_SABgPISTC42wPN4-6ExA">News+</a>)</li>
<li><a href="https://en.wikipedia.org/wiki/The_Outer_Worlds_2">Outer Worlds 2</a></li>
<li><a href="https://www.ballxpit.com">Ball X Pit</a></li>
<li><a href="https://en.wikipedia.org/wiki/Stranger_Things_season_5">Stranger Things Season 5</a></li>
<li>Reddit's terrific <a href="https://www.reddit.com/r/RealOrAI/">r/RealOrAI</a> sub</li>
<li>The <a href="https://www.rayneo.com/products/rayneo-air-3s-xr-glasses">RayNeo Air 3s</a> are the display glasses I'd recommend if you can find them for $199</li>
<li><a href="https://en.wikipedia.org/wiki/Murderbot_%28TV_series%29">Murderbot</a></li>
<li><a href="https://udcast.net">UDCast</a> universal subtitling (and <a href="https://udcast.net/workslist/rewrite-movie/">the movie I wanted to watch</a>)</li>
<li><a href="https://beckygram.com">Beckygram.com</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>I'm about to get on a plane and will be gone for a couple weeks, but didn't want to leave you Breaking Changeless so I did the thing where I stand up in front of a microphone and talked at you. Again. Like I do.</p>
<p>Fun fact: this is the first and only time I've taken a phone call live, on-air! I was just too lazy to edit that out gracefully.</p>
<p>Whenever I go to Japan solo, I experience moments of loneliness, so I'd really appreciate it if you sent me some praise or complaints or ideas to <a href="mailto:podcast@searls.co">podcast@searls.co</a> and I'll feel comforted by the knowledge that you exist. Your engagement sustains me.</p>
<p>Lotta weird and dumb links this go-round:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v49-saving-face-oil/","append_url_label":"Hear 🎙","content":"\u003cp\u003eI'm about to get on a plane and will be gone for a couple weeks, but didn't want to leave you Breaking Changeless so I did the thing where I stand up in front of a microphone and talked at you. Again. Like I do.\u003c/p\u003e\n\u003cp\u003eFun fact: this is the first and only time I've taken a phone call live, on-air! I was just too lazy to edit that out gracefully.\u003c/p\u003e\n\u003cp\u003eWhenever I go to Japan solo, I experience moments of loneliness, so I'd really appreciate it if you sent me some praise or complaints or ideas to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e and I'll feel comforted by the knowledge that you exist. Your engagement sustains me.\u003c/p\u003e\n\u003cp\u003eLotta weird and dumb links this go-round:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://ericdoggett.com\"\u003eEric Doggett\u003c/a\u003e is a great friend/artist\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.fortunefeimster.com\"\u003eFortune Feimster\u003c/a\u003e isn't spelled how I would've guessed\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.meta.com/ai-glasses/ray-ban-meta-wayfarer-gen-2/\"\u003eRay-Ban Meta Wayfarer (Gen 2)\u003c/a\u003e is the best gift anyone's given me in a while\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://posseparty.com\"\u003ePOSSE Party\u003c/a\u003e's tutorial videos are just enough to convince you to either bother or not bother\u003c/li\u003e\n\u003cli\u003eReddit's \u003ca href=\"https://www.reddit.com/r/selfhosted\"\u003er/selfhosted\u003c/a\u003e is \u003ca href=\"https://www.reddit.com/r/selfhosted/s/AiQqPN9XNg\"\u003eat least a little self-aware\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eI'm giving myself some grace when it comes to \u003ca href=\"https://justin.searls.co/newsletter\"\u003ethe newsletter\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.amazon.com/s?k=EDID+emulator\u0026amp;crid=2UTJUUTDBQHVT\u0026amp;sprefix=edid+emulator%2Caps%2C152\u0026amp;ref=nb_sb_noss_1\"\u003eEDID Emulators\u003c/a\u003e are a hardware product that exist only because Windows is bad\u003c/li\u003e\n\u003cli\u003eLooking forward to trying \u003ca href=\"https://happy.engineering\"\u003eHappy\u003c/a\u003e for remote Claude Code / Codex CLI work\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://repebble.com/blog/meet-pebble-index-01-external-memory-for-your-brain\"\u003ePebble Index 01\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.cnet.com/tech/computing/googles-putting-it-all-on-glasses-next-year-my-demos-with-project-aura-and-more/\"\u003eGoogle's / XReal Putting It All on Glasses Next Year\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://rog.asus.com/articles/gaming-monitors/the-rog-xreal-glasses-r1-bring-big-screen-pc-and-console-gaming-in-a-small-wearable-package/\"\u003eXReal is partnering with Asus ROG, too\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://9to5google.com/2025/12/08/android-iphone-switching/\"\u003eGoogle and Apple partner on better Android-iPhone switching\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.nytimes.com/2026/01/08/technology/apple-ceo-tim-cook-john-ternus.html?unlocked_article_code=1.DFA.Qm0v.SxztBxvFrAF-\u0026amp;smid=url-share\"\u003eNYT profiles John Ternus\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://9to5mac.com/2026/01/02/another-airpods-pro-3-model-is-coming-with-one-rumored-upgrade/\"\u003eAirPods Pro with IR cameras\u003c/a\u003e (\u003cem\u003einstead\u003c/em\u003e of stem clicks?!)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.wsj.com/finance/banking/jpmorgan-chase-reaches-a-deal-to-take-over-the-apple-credit-card-4e214fb2\"\u003eJPMorgan Chase Reaches a Deal to Take Over the Apple Credit Card\u003c/a\u003e (\u003ca href=\"https://apple.news/AAzNXt77ATV2x9xX1DiFptg\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe \u003ca href=\"https://www.clicks.tech/powerkeyboard\"\u003eClicks Power Keyboard\u003c/a\u003e looks rad\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/the-game-awards-2025-complete-list-of-winners-as-clair-obscur-wins-game-of-the-year-and-sets-a-new-record-for-awards-won/\"\u003eExpedition 33's Game Awards sweep\u003c/a\u003e has me asking, who will be the first to VEGOT?\u003c/li\u003e\n\u003cli\u003eValve still \u003ca href=\"https://www.reddit.com/r/Steam/comments/1prc5ps/over_5_years_ago_i_launched_hydroneer_on_steam/\"\u003esending this guy chocolates\u003c/a\u003e every Christmas\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.pcworld.com/article/3013044/the-post-geforce-era-what-if-nvidia-abandons-pc-gaming.html\"\u003eThe post-GeForce era: What if Nvidia abandons PC gaming?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.reddit.com/r/pcmasterrace/comments/1q0h2cn/amd_and_nvidia_expected_to_begin_raising_gpu/?share_id=Lm4O0lUigEXTkIqevLSIE\u0026amp;utm_content=2\u0026amp;utm_medium=ios_app\u0026amp;utm_name=iossmf\u0026amp;utm_source=share\u0026amp;utm_term=22\"\u003eThe 5090 could cost $5090\u003c/a\u003e by the end of 2026\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://overclock3d.net/news/gpu-displays/nvidia-plans-heavy-cuts-to-gpu-supply-in-early-2026/\"\u003eNvidia plans heavy cuts to GPU supply in early 2026\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/ai-artificial-intelligence/844966/heavy-ai-data-center-buildout\"\u003eRacks of AI chips are too damn heavy\u003c/a\u003e (\u003ca href=\"https://apple.news/Arp88bJsrRrCHfNZgKzULMw\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.tomshardware.com/tech-industry/artificial-intelligence/nvidia-ceo-confirms-vera-rubin-nvl72-is-now-in-production-jensen-huang-uses-ces-keynote-to-announce-the-milestone\"\u003eVera Rubin is probably even heavier\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openai.com/index/new-chatgpt-images-is-here/\"\u003eGPT Image 1.5 is better but not good enough\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/news/848435/openai-chatgpt-characteristics-update-warmth-enthusiasm\"\u003ePSA: make ChatGPT less warm, enthusiastic, and emoji-tastic\u003c/a\u003e (\u003ca href=\"https://apple.news/AgVPwh-hXSKmBYrIzP_OahQ\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://techcrunch.com/2025/12/08/you-can-buy-your-instacart-groceries-without-leaving-chatgpt/\"\u003eYou can (supposedly) buy your Instacart groceries without leaving ChatGPT\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eThe massive \u003ca href=\"https://www.wheresyoured.at/the-enshittifinancial-crisis/\"\u003eyear-end Ed Zitron newsletter\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.latimes.com/business/story/2025-12-12/ai-podcasting-is-changing-industry\"\u003ePodcasts are AI now\u003c/a\u003e (\u003ca href=\"https://apple.news/AkXUtejJITmaoz9qKtDPHmA\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bloodinthemachine.com/p/i-was-forced-to-use-ai-until-the\"\u003eCopywriters reveal how AI has decimated their industry\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.latimes.com/business/story/2025-12-19/they-graduated-from-stanford-due-to-ai-they-cant-find-job\"\u003eA Stanford degree wont save you\u003c/a\u003e (\u003ca href=\"https://apple.news/AmSn8GBXbSI-9bSvYiHks6g\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.businessinsider.com/godfather-of-saas-jason-lemkin-replace-humans-ai-agents-sales-2026-1\"\u003e'Godfather of SaaS' Says He Replaced Most of His Sales Team With AI Agents\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gothamist.com/news/nyc-phone-ban-reveals-some-students-cant-read-clocks\"\u003eNYC phone ban reveals some students can't read clocks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.sciencealert.com/swearing-actually-seems-to-make-humans-physically-stronger\"\u003eSwearing Actually Seems to Make Humans Physically Stronger\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://variety.com/2026/tv/news/corporation-for-public-broadcasting-shuts-down-trump-1236623793/\"\u003eCorporation for Public Broadcasting to Shut Down After 58 Years Due to Trump Eliminating Funding\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.wired.com/story/grok-is-generating-sexual-content-far-more-graphic-than-whats-on-x/\"\u003eGrok Is Generating Sexual Content Far More Graphic Than What's on X\u003c/a\u003e (\u003ca href=\"https://apple.news/AZ_SABgPISTC42wPN4-6ExA\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Outer_Worlds_2\"\u003eOuter Worlds 2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.ballxpit.com\"\u003eBall X Pit\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Stranger_Things_season_5\"\u003eStranger Things Season 5\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReddit's terrific \u003ca href=\"https://www.reddit.com/r/RealOrAI/\"\u003er/RealOrAI\u003c/a\u003e sub\u003c/li\u003e\n\u003cli\u003eThe \u003ca href=\"https://www.rayneo.com/products/rayneo-air-3s-xr-glasses\"\u003eRayNeo Air 3s\u003c/a\u003e are the display glasses I'd recommend if you can find them for $199\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Murderbot_%28TV_series%29\"\u003eMurderbot\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://udcast.net\"\u003eUDCast\u003c/a\u003e universal subtitling (and \u003ca href=\"https://udcast.net/workslist/rewrite-movie/\"\u003ethe movie I wanted to watch\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://beckygram.com\"\u003eBeckygram.com\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Saving Face Oil","id":"https://justin.searls.co/casts/breaking-change-v49-saving-face-oil/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v49-saving-face-oil.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-01-09T22:01:34Z","title":"Saving Face Oil","updated_at":"2026-01-09T19:13:54-05:00","url":"https://justin.searls.co/casts/breaking-change-v49-saving-face-oil/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2026-01-08-07h43m15s/</id>
      <title type="text">📸 Peter Campbell&#39;s giraffe art</title>
      <link href="https://justin.searls.co/shots/2026-01-08-07h43m15s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-08T12:43:15+00:00</published>
    <updated>2026-01-08T08:04:51-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2026-01-08-07h43m15s_lckvlj.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-01-08-07h43m15s_itt9fj.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2026-01-08-07h43m15s_nfs9ml.jpg"/>
</div><p>Becky and I are wrapping up a rewatch of Mad Men this week, and throughout the first several seasons, she'd point out the artwork hanging near the entrance of Peter Campbell's apartment, a screenshot of which I shall now hotlink from Blogger's CDN like it's 1959:</p>
<p><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf-V1jvy9JHChADR_q-JKBn9HOdcNmtFMFCdPisE0UoYZv3IfUilHOg8i4l4RfHY-5R4Qi_BmXadMWbp80bJRjkuEgr-qDqUVHkk8FuieH0sfF48OTtaaFITEC8XcqbXR8HSJEPzRu7ZI/s1600/il_fullxfull_261482228.jpg" alt="Peter Campbell's giraffe art"></p>
<p>(Of course, Pete Campbell is so classless that in my head canon, Trudy must have picked this out.)</p>
<p>Anyway, every time the giraffes would show up, Becky would snap her fingers and point at the TV like <a href="https://knowyourmeme.com/memes/pointing-rick-dalton">Leo in Once Upon a Time in Hollywood</a> before commenting on how much she loved the piece. <em>We are not art people</em>, and I can take a hint, so I ordered a recreation made by <a href="https://www.etsy.com/listing/128766442/">this guy on Etsy</a> and hid it in a closet for a few months before giving it to Becky to unwrap on Christmas.</p>
<p>Well, I finally got around to hanging them up last night, and they look pretty good! It helps that I had a huge blank wall framed by white trim and surrounded by mid-century modern furniture. I loved the little touch that Peter D. Campbell was written in huge lettering (larger than the artist's) across the center of the middle giraffe.</p>
<p>Classic Pete. What a prick.</p>

]]></content>
    <summary type="html"><![CDATA[<p>Becky and I are wrapping up a rewatch of Mad Men this week, and throughout the first several seasons, she'd point out the artwork hanging near the entrance of Peter Campbell's apartment, a screenshot of which I shall now hotlink from Blogger's CDN like it's 1959:</p>
<p><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf-V1jvy9JHChADR_q-JKBn9HOdcNmtFMFCdPisE0UoYZv3IfUilHOg8i4l4RfHY-5R4Qi_BmXadMWbp80bJRjkuEgr-qDqUVHkk8FuieH0sfF48OTtaaFITEC8XcqbXR8HSJEPzRu7ZI/s1600/il_fullxfull_261482228.jpg" alt="Peter Campbell's giraffe art"></p>
<p>(Of course, Pete Campbell is so classless that in my head canon, Trudy must have picked this out.)</p>
<p>Anyway, every time the giraffes would show up, Becky would snap her fingers and point at the TV like <a href="https://knowyourmeme.com/memes/pointing-rick-dalton">Leo in Once Upon a Time in Hollywood</a> before commenting on how much she loved the piece. <em>We are not art people</em>, and I can take a hint, so I ordered a recreation made by <a href="https://www.etsy.com/listing/128766442/">this guy on Etsy</a> and hid it in a closet for a few months before giving it to Becky to unwrap on Christmas.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2026-01-08-07h43m15s/","append_url_label":"View 📸","content":"\u003cp\u003eBecky and I are wrapping up a rewatch of Mad Men this week, and throughout the first several seasons, she'd point out the artwork hanging near the entrance of Peter Campbell's apartment, a screenshot of which I shall now hotlink from Blogger's CDN like it's 1959:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf-V1jvy9JHChADR_q-JKBn9HOdcNmtFMFCdPisE0UoYZv3IfUilHOg8i4l4RfHY-5R4Qi_BmXadMWbp80bJRjkuEgr-qDqUVHkk8FuieH0sfF48OTtaaFITEC8XcqbXR8HSJEPzRu7ZI/s1600/il_fullxfull_261482228.jpg\" alt=\"Peter Campbell's giraffe art\"\u003e\u003c/p\u003e\n\u003cp\u003e(Of course, Pete Campbell is so classless that in my head canon, Trudy must have picked this out.)\u003c/p\u003e\n\u003cp\u003eAnyway, every time the giraffes would show up, Becky would snap her fingers and point at the TV like \u003ca href=\"https://knowyourmeme.com/memes/pointing-rick-dalton\"\u003eLeo in Once Upon a Time in Hollywood\u003c/a\u003e before commenting on how much she loved the piece. \u003cem\u003eWe are not art people\u003c/em\u003e, and I can take a hint, so I ordered a recreation made by \u003ca href=\"https://www.etsy.com/listing/128766442/\"\u003ethis guy on Etsy\u003c/a\u003e and hid it in a closet for a few months before giving it to Becky to unwrap on Christmas.\u003c/p\u003e\n\u003cp\u003eWell, I finally got around to hanging them up last night, and they look pretty good! It helps that I had a huge blank wall framed by white trim and surrounded by mid-century modern furniture. I loved the little touch that Peter D. Campbell was written in huge lettering (larger than the artist's) across the center of the middle giraffe.\u003c/p\u003e\n\u003cp\u003eClassic Pete. What a prick.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2026-01-08-07h43m15s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-01-08-07h43m15s_lckvlj.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-01-08-07h43m15s_itt9fj.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-01-08-07h43m15s_nfs9ml.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2026-01-08-07h43m15s_lckvlj.jpg","platform_overrides":{},"published_at":"2026-01-08T12:43:15Z","title":"Peter Campbell's giraffe art","updated_at":"2026-01-08T08:04:51-05:00","url":"https://justin.searls.co/shots/2026-01-08-07h43m15s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/weekstart/</id>
      <title type="text">📄 Weekstart</title>
      <link href="https://justin.searls.co/posts/weekstart/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-07T14:06:35+00:00</published>
    <updated>2026-01-07T12:10:28-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>The curse of productivity is that it's self-perpetuating. Respond to e-mails with lightning speed and you just get more replies. Demonstrate your reliability to others long enough, and they'll just bring you more shit to do. Develop productive routines and habits and—before you know it—your natural disposition will shift towards being done with things and away from <em>actually doing things</em>.</p>
<p>Left unconstrained, optimizing for a productive life can diminish the joys of living. Many of us who opt into the lifestyle of &quot;staying on top of shit&quot; do so, ostensibly, to maximize time for creative work, or for leisure, or for family. That's the spirit with which I first discovered <a href="https://en.wikipedia.org/wiki/Getting_Things_Done">Getting Things Done</a> near the beginning of my career. And it really worked! I have no doubt I owe much of my success to adopting a clear productivity process, low-friction tools, and ruthless discipline.</p>
<p>But even for the handful among us who successfully find a productivity regime we can stick with, the technologies that both enabled remote work and unintentionally led to the disintegration of work-life boundaries have resulted in a situation where highly productive people often wind up cursed with the inability to turn it off. I had no problem forgetting about the hundreds of e-mails and things to do in 2009 when I would—get this—<em>leave my computer at the office overnight</em>. But once I started working from home, there was no longer a natural threshold through which to transition from being &quot;productive&quot; to being &quot;unproductive&quot;. I doubt I am alone in this.</p>
<p>Depressingly, <strong>even after I retired</strong> and no longer had any job at all, I found myself continuing to be hyper-vigilant about checking e-mail, tackling todo after todo, and generally prioritizing productivity over whatever shit I <em>claimed</em> to want to do. I've been promising myself a hedonistic life of video games, vodka, and gummy bears since I was 19 years old. And yet, even though I have plenty of money, zero constraints on my time, and a backlog of thousands of games, here I am writing a fucking blog post instead of <em>literally ever doing</em> the one activity I set out to achieve before starting my career.</p>
<p>Moreover, when others look at me and how I go about getting shit done, and—rather than wanting to emulate it—they tend to walk away feeling grateful they're not as tightly-wound as I am. When I consider all the people in my life, it's starting to feel like there are essentially two classes of humans: <strong>people who never get shit done and people who never stop getting shit done</strong>.</p>
<p>This state of affairs was clearly suboptimal. That's why, last year, <a href="https://beckygram.com">Becky</a> and I adopted a bespoke weekly schedule that enables us to get things done <em>without</em> getting carried away. The key insight was, as usual, to implement a strict timebox. We call it &quot;weekstart&quot;, and this is how it works.</p>

<h2 id="what-is-a-weekstart">What is a weekstart?</h2>
<p>Weekstart kicks off Monday morning and ends with the dinner bell on Tuesday.</p>
<p>The big idea? Life is too short to work for a 2-day weekend by spending 5 days chained to the computer, obsessively checking e-mail and knocking out tasks with a robotic procedural mindset. Instead, we decided to try flipping the schedule on its head: <strong>what if we spent only 2 days each week clearing our e-mail inbox and living out of our todo backlog?</strong> The rest of the week may not magically become a blur of vodka and gummy bears, but it <em>might</em> open the door to feeling more free to pursue our professional and creative endeavors with a clear head while also having the benefit of syncing our schedules to enable spontaneous ideas and joint activities.</p>
<p>Here's all it is:</p>
<ul>
<li><strong>Monday and Tuesday are our weekstart:</strong> We temporarily give our lives over to our e-mail inbox, our todo tracker, and the pile of shit we hate doing. We know this is the only time we've got for this shit, so we're both heads down and focused, and are mindful not to interrupt each other's flow.</li>
<li><strong>Tuesday's dinner doesn't start until we quit:</strong> Our closing ceremony—and our ticket to dinner—is to demonstrate to one another that our e-mail inbox is empty, our todo tracker's inbox (we use <a href="https://culturedcode.com/things/">Things</a>) is also clear, and all our scheduled todo items have been scheduled out to the subsequent Monday.</li>
<li><strong>Wednesday through Sunday are the week:</strong> the rest of our lives are spent living. This is where we pursue our passions. It's when I <a href="https://justin.searls.co/tubes/2025-12-25-08h30m45s/">study Japanese</a> and <a href="https://posseparty.com">build apps</a>. It's when Becky <a href="https://www.betterwithbecky.com">designs her strength-training program</a> and <a href="https://beckygram.com/posts/1143/2025-11-26-recovery-drives-results-bodybuilding-update-first-8-weeks">broadens her horizons with things like bodybuilding</a>. Quality time with each other is the top priority, so if one of us suggests hanging out, the other has no excuse but to drop what they're doing.</li>
</ul>
<p>By far the hardest part of adopting weekstart is to become comfortable with the idea of declaring defeat every Tuesday evening. There's always still so much to be done! But the truth is that, whatever it is, it can wait. If it was truly urgent, we would have made time for it.</p>

<h2 id="good-for-you-youre-unemployed">Good for you, you're unemployed</h2>
<p>I hope that you have the clarity of mind to be taking all this with extreme skepticism, &quot;great, so your productivity hack is to retire before 40,&quot; you ought to be thinking. And you'd be right! I'm not going to lie: financial security and early retirement are pretty great. But it's also given me firsthand evidence that <strong>the job wasn't what was chaining me to my desk: I did that to myself</strong>.</p>
<p>If you're:</p>
<ul>
<li>Required to show up at a workplace in person every day</li>
<li>Have a calendar full of meetings you can't reschedule</li>
<li>Lack basic control over when and how you do your work</li>
</ul>
<p>Then I can't help you. But if you do anything that could be described as &quot;knowledge work&quot;, can work remotely, and are engaged in a role that cares more about outcomes than attendance, then it might be worth chewing on the approach laid out above. Maybe give something like weekstart a try. Whatever particular system you adopt for yourself, whatever silly name you might give it, what matters is that you develop an appreciation for how <strong>liberating constraints can lead to better results than unstructured freedom</strong>. Just my two cents.</p>
<p>Okay, it's Wednesday at noon. I'm gonna go not get something done.</p>]]></content>
    <summary type="html"><![CDATA[Here's a simple process to staying on top of what matters while maximizing unstructured time for creativity and spontaneity]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/weekstart/","append_url_label":"Read 📄","content":"\u003cp\u003eThe curse of productivity is that it's self-perpetuating. Respond to e-mails with lightning speed and you just get more replies. Demonstrate your reliability to others long enough, and they'll just bring you more shit to do. Develop productive routines and habits and—before you know it—your natural disposition will shift towards being done with things and away from \u003cem\u003eactually doing things\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLeft unconstrained, optimizing for a productive life can diminish the joys of living. Many of us who opt into the lifestyle of \u0026quot;staying on top of shit\u0026quot; do so, ostensibly, to maximize time for creative work, or for leisure, or for family. That's the spirit with which I first discovered \u003ca href=\"https://en.wikipedia.org/wiki/Getting_Things_Done\"\u003eGetting Things Done\u003c/a\u003e near the beginning of my career. And it really worked! I have no doubt I owe much of my success to adopting a clear productivity process, low-friction tools, and ruthless discipline.\u003c/p\u003e\n\u003cp\u003eBut even for the handful among us who successfully find a productivity regime we can stick with, the technologies that both enabled remote work and unintentionally led to the disintegration of work-life boundaries have resulted in a situation where highly productive people often wind up cursed with the inability to turn it off. I had no problem forgetting about the hundreds of e-mails and things to do in 2009 when I would—get this—\u003cem\u003eleave my computer at the office overnight\u003c/em\u003e. But once I started working from home, there was no longer a natural threshold through which to transition from being \u0026quot;productive\u0026quot; to being \u0026quot;unproductive\u0026quot;. I doubt I am alone in this.\u003c/p\u003e\n\u003cp\u003eDepressingly, \u003cstrong\u003eeven after I retired\u003c/strong\u003e and no longer had any job at all, I found myself continuing to be hyper-vigilant about checking e-mail, tackling todo after todo, and generally prioritizing productivity over whatever shit I \u003cem\u003eclaimed\u003c/em\u003e to want to do. I've been promising myself a hedonistic life of video games, vodka, and gummy bears since I was 19 years old. And yet, even though I have plenty of money, zero constraints on my time, and a backlog of thousands of games, here I am writing a fucking blog post instead of \u003cem\u003eliterally ever doing\u003c/em\u003e the one activity I set out to achieve before starting my career.\u003c/p\u003e\n\u003cp\u003eMoreover, when others look at me and how I go about getting shit done, and—rather than wanting to emulate it—they tend to walk away feeling grateful they're not as tightly-wound as I am. When I consider all the people in my life, it's starting to feel like there are essentially two classes of humans: \u003cstrong\u003epeople who never get shit done and people who never stop getting shit done\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eThis state of affairs was clearly suboptimal. That's why, last year, \u003ca href=\"https://beckygram.com\"\u003eBecky\u003c/a\u003e and I adopted a bespoke weekly schedule that enables us to get things done \u003cem\u003ewithout\u003c/em\u003e getting carried away. The key insight was, as usual, to implement a strict timebox. We call it \u0026quot;weekstart\u0026quot;, and this is how it works.\u003c/p\u003e\n\n\u003ch2 id=\"what-is-a-weekstart\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/weekstart/#what-is-a-weekstart\"\u003eWhat is a weekstart?\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eWeekstart kicks off Monday morning and ends with the dinner bell on Tuesday.\u003c/p\u003e\n\u003cp\u003eThe big idea? Life is too short to work for a 2-day weekend by spending 5 days chained to the computer, obsessively checking e-mail and knocking out tasks with a robotic procedural mindset. Instead, we decided to try flipping the schedule on its head: \u003cstrong\u003ewhat if we spent only 2 days each week clearing our e-mail inbox and living out of our todo backlog?\u003c/strong\u003e The rest of the week may not magically become a blur of vodka and gummy bears, but it \u003cem\u003emight\u003c/em\u003e open the door to feeling more free to pursue our professional and creative endeavors with a clear head while also having the benefit of syncing our schedules to enable spontaneous ideas and joint activities.\u003c/p\u003e\n\u003cp\u003eHere's all it is:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eMonday and Tuesday are our weekstart:\u003c/strong\u003e We temporarily give our lives over to our e-mail inbox, our todo tracker, and the pile of shit we hate doing. We know this is the only time we've got for this shit, so we're both heads down and focused, and are mindful not to interrupt each other's flow.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTuesday's dinner doesn't start until we quit:\u003c/strong\u003e Our closing ceremony—and our ticket to dinner—is to demonstrate to one another that our e-mail inbox is empty, our todo tracker's inbox (we use \u003ca href=\"https://culturedcode.com/things/\"\u003eThings\u003c/a\u003e) is also clear, and all our scheduled todo items have been scheduled out to the subsequent Monday.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWednesday through Sunday are the week:\u003c/strong\u003e the rest of our lives are spent living. This is where we pursue our passions. It's when I \u003ca href=\"https://justin.searls.co/tubes/2025-12-25-08h30m45s/\"\u003estudy Japanese\u003c/a\u003e and \u003ca href=\"https://posseparty.com\"\u003ebuild apps\u003c/a\u003e. It's when Becky \u003ca href=\"https://www.betterwithbecky.com\"\u003edesigns her strength-training program\u003c/a\u003e and \u003ca href=\"https://beckygram.com/posts/1143/2025-11-26-recovery-drives-results-bodybuilding-update-first-8-weeks\"\u003ebroadens her horizons with things like bodybuilding\u003c/a\u003e. Quality time with each other is the top priority, so if one of us suggests hanging out, the other has no excuse but to drop what they're doing.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBy far the hardest part of adopting weekstart is to become comfortable with the idea of declaring defeat every Tuesday evening. There's always still so much to be done! But the truth is that, whatever it is, it can wait. If it was truly urgent, we would have made time for it.\u003c/p\u003e\n\n\u003ch2 id=\"good-for-you-youre-unemployed\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/weekstart/#good-for-you-youre-unemployed\"\u003eGood for you, you're unemployed\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eI hope that you have the clarity of mind to be taking all this with extreme skepticism, \u0026quot;great, so your productivity hack is to retire before 40,\u0026quot; you ought to be thinking. And you'd be right! I'm not going to lie: financial security and early retirement are pretty great. But it's also given me firsthand evidence that \u003cstrong\u003ethe job wasn't what was chaining me to my desk: I did that to myself\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eIf you're:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRequired to show up at a workplace in person every day\u003c/li\u003e\n\u003cli\u003eHave a calendar full of meetings you can't reschedule\u003c/li\u003e\n\u003cli\u003eLack basic control over when and how you do your work\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThen I can't help you. But if you do anything that could be described as \u0026quot;knowledge work\u0026quot;, can work remotely, and are engaged in a role that cares more about outcomes than attendance, then it might be worth chewing on the approach laid out above. Maybe give something like weekstart a try. Whatever particular system you adopt for yourself, whatever silly name you might give it, what matters is that you develop an appreciation for how \u003cstrong\u003eliberating constraints can lead to better results than unstructured freedom\u003c/strong\u003e. Just my two cents.\u003c/p\u003e\n\u003cp\u003eOkay, it's Wednesday at noon. I'm gonna go not get something done.\u003c/p\u003e","id":"https://justin.searls.co/posts/weekstart/","og_image":"https://podcast-cdn.searls.co/posts/weekstart.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-01-07T14:06:35Z","title":"Weekstart","updated_at":"2026-01-07T12:10:28-05:00","url":"https://justin.searls.co/posts/weekstart/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/mails/2025-12/</id>
      <title type="text">✉️ 100% Oyster Meat</title>
      <link href="https://justin.searls.co/mails/2025-12/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-04T00:22:23+00:00</published>
    <updated>2026-01-04T00:22:26+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p class="italic text-secondary">
  <em>This is a copy of the <a href="/newsletter" class="underline hover:no-underline">Searls of Wisdom newsletter</a>
  delivered to subscribers on January 1, 2026.</em>
</p>


<p>As promised last month, this issue is just <a href="https://justin.searls.co/mails/2025-11/#searls-of-wisdom">oyster meat</a>. It's a new year and as good a time as any to hit reset and get this monthly newsletter back on its preordained beginning-of-the-month-ish delivery cadence. That makes this a quick turnaround after our <a href="https://justin.searls.co/mails/2025-11/">last issue</a>, so there's not much new to report. Good thing I asked you all to lower your expectations!</p>
<p>Let's see, since we last corresponded:</p>
<ul>
<li><a href="https://mikemcquaid.com/fun-with-feeds/">Mike McQuaid wrote that he's joined the POSSE Party</a>, so I <a href="https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/">pulled a quote</a> and recruited him to help deal with <a href="https://github.com/searlsco/posse_party/graphs/contributors">maintenance and triage</a>. Another early adopter posted <a href="https://www.reddit.com/r/rails/comments/1psbh26/claudes_architectural_analysis_of_posse_party_by/">an architectural review of my codebase</a> to Reddit</li>
<li>I spent a few afternoons tweaking a <a href="https://justin.searls.co/tubes/2025-12-25-08h30m45s/">ChatGPT-powered Shortcut for Japanese study</a> and was impressed to find Shortcuts is sneakily <a href="https://justin.searls.co/shots/2025-12-24-08h21m27s/">more functional</a> than one might assume. Its new <a href="https://support.apple.com/guide/iphone/use-apple-intelligence-in-shortcuts-iph78c41eaf8/ios">Use Model</a> action allows users to <a href="https://justin.searls.co/takes/2025-12-21-14h18m50s/">tap into cloud-based Private Cloud Compute and ChatGPT</a> for <strong>free</strong>, which is a total game changer. Native app developers can only access on-device models, which makes Shortcuts a uniquely powerful tool in its own right</li>
<li>Aaron &amp; I kept the streak alive by executing the <a href="https://justin.searls.co/casts/feature-release-v48.1-2nd-annual-punsort/">2nd Annual Punsort</a> algorithm. I think his puns got less terrible or I got better at ranking them—either way, things seemed far less contentious than in our <a href="https://justin.searls.co/tubes/2025-01-07-18h36m56s/">first go-round</a></li>
<li>I did all four Disney parks in one day and live-<a href="https://justin.searls.co/clips/creating-static-instagram-stories-as-wisps/">wisped</a> the ordeal over <a href="https://justin.searls.co/takes/2025-12-29-08h22m10s/">12 hours, 16 rides, and 30,000 steps</a>. If you missed my photos and videos, you'll just have to get in the habit of checking <a href="https://justin.searls.co">my homepage</a> or <a href="https://instagram.com/searls">Instagram</a> every day, I guess! I got a couple remorseful emails from people looking to find my auto-deleting wisps/stories after they were, in fact, deleted. 💨</li>
<li>Becky gave me a Steam gift card for Christmas, and <a href="https://justin.searls.co/links/2025-12-31-12h22m54s/">this humorous trailer</a> immediately sold me on <a href="https://www.ballxpit.com">Ball x Pit</a>. I've since played it and can confirm it to be a Good Game: part Vampire Survivors, part Plants vs. Zombies, part Breakout.</li>
<li>A few assorted takes:
<ul>
<li>If you or a loved one are worried about losing your job to AI, <a href="https://www.maxberry.ca/p/how-to-not-be-replaced-by-ai">this essay</a> is what I've <a href="https://justin.searls.co/takes/2025-12-22-14h07m08s/">been pointing people to</a> lately</li>
<li>Macs have FileVault encryption enabled by default, which has always diminished their utility as home servers—if the power goes out, there goes your remote login access! They <a href="https://support.apple.com/en-us/124963">finally addressed this in macOS 26 Tahoe</a>: inbound SSH connections following a cold boot will now unlock and finish booting <a href="https://justin.searls.co/takes/2025-12-22-15h34m36s/">my FileVault-protected Mac Studio</a></li>
<li>What populist candidates promise and what they prioritize once elected are rarely in agreement. So it goes in Japan, as <a href="https://justin.searls.co/takes/2025-12-24-09h13m50s/">an anti-foreigner platform gives way to a policy agenda that will attract more foreigners by further weakening the yen</a></li>
<li>If you're running modern Apple hardware, I recently learned <a href="https://justin.searls.co/takes/2025-12-26-10h43m09s/">there's a setting to make sure Safari actually renders content at a &quot;ProMotion&quot; 120Hz refresh rate</a></li>
</ul>
</li>
</ul>
<p>For the second year in a row, us kids paid a visit to dad's second-favorite spot in Walt Disney World on Christmas Day:</p>
<p><img src="/img/social/mails/2025-12-1.jpg" alt="The Haunted Mansion tombstone reads, &quot;Here Lies Good Old Fred, a great big rock fell on his head. RIP&quot;"></p>
<p>Fortunately, gallows humor has always played in the Searls family.</p>
<p>Stay tuned for next month's note, as I'll have just gotten back from the storied land of Shizuoka following the next chapter of our <a href="https://justin.searls.co/mails/2025-05/">condo purchase journey</a>. We're still on track to close in July, but in mid-January I have the not-technically-mandatory opportunity to pick out the curtains and the drapes at a sort of mini trade show event held by the developer. Well, curtains, yes, but also air conditioners. And tile. And how to finish the balcony. And how many mirrors we want, and where, and whether to tint them in sepia tones. And which LED mood lighting package should line the toilet. Should I pay for them to seal a brand new Japanese wood floor or is that a scammy upsell?</p>
<p><a href="mailto:justin@searls.co">Reply</a> and tell me what to do, please—the decision overload is truly overwhelming.</p>
<p>Anyway, the next week of my life is going to be spent poring over a dozen product catalogs. Bridging the language and cultural divide is extremely slow going. It's a good thing I failed to predict how much work this condo would turn out to be, or I'd never have gone through it. If you catch me having any fun this month, yell at me and tell me to get back to work.</p>
<p>Speaking of bridging language and culture, keep reading for one more stupid thing.</p>
<p>Fun fact that I got wrong every time when we actually lived in Japan, and which might come in handy if you ever find yourself there around New Year's:</p>
<p><strong>Before</strong> the new year, the conventional anticipatory set phrase is 良いお年を (&quot;yoi otoshi o&quot;), which more or less translates to &quot;Have a good new year&quot;.</p>
<p><strong>After</strong> the dawn of the new year, people no longer say 良いお年を—and I can confirm that doing so will elicit a confused reaction from your local postal worker, next door neighbor, and favorite convenience store worker. Instead, the hot new thing to say is 明けましておめでとう (&quot;akemashite omedetou&quot;), which is yet another <a href="https://www.tofugu.com/japan/japanese-work-culture/">set phrase</a> celebrating the year's dawn.</p>
<p>Last night, while visiting a Mexican-American friend's open house, the other guests taught me that &quot;Feliz Año Nuevo&quot; means &quot;Happy New Year&quot; in Spanish. Fourteen attempts and 3 mezcals later, I finally nailed that one—before promptly forgetting it. Language is hard.</p>]]></content>
    <summary type="html"><![CDATA[<p>As promised last month, this issue is just <a href="https://justin.searls.co/mails/2025-11/#searls-of-wisdom">oyster meat</a>. It's a new year and as good a time as any to hit reset and get this monthly newsletter back on its preordained beginning-of-the-month-ish delivery cadence. That makes this a quick turnaround after our <a href="https://justin.searls.co/mails/2025-11/">last issue</a>, so there's not much new to report. Good thing I asked you all to lower your expectations!</p>
<p>Let's see, since we last corresponded:</p>
<ul>
<li><a href="https://mikemcquaid.com/fun-with-feeds/">Mike McQuaid wrote that he's joined the POSSE Party</a>, so I <a href="https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/">pulled a quote</a> and recruited him to help deal with <a href="https://github.com/searlsco/posse_party/graphs/contributors">maintenance and triage</a>. Another early adopter posted <a href="https://www.reddit.com/r/rails/comments/1psbh26/claudes_architectural_analysis_of_posse_party_by/">an architectural review of my codebase</a> to Reddit</li>
<li>I spent a few afternoons tweaking a <a href="https://justin.searls.co/tubes/2025-12-25-08h30m45s/">ChatGPT-powered Shortcut for Japanese study</a> and was impressed to find Shortcuts is sneakily <a href="https://justin.searls.co/shots/2025-12-24-08h21m27s/">more functional</a> than one might assume. Its new <a href="https://support.apple.com/guide/iphone/use-apple-intelligence-in-shortcuts-iph78c41eaf8/ios">Use Model</a> action allows users to <a href="https://justin.searls.co/takes/2025-12-21-14h18m50s/">tap into cloud-based Private Cloud Compute and ChatGPT</a> for <strong>free</strong>, which is a total game changer. Native app developers can only access on-device models, which makes Shortcuts a uniquely powerful tool in its own right</li>
<li>Aaron &amp; I kept the streak alive by executing the <a href="https://justin.searls.co/casts/feature-release-v48.1-2nd-annual-punsort/">2nd Annual Punsort</a> algorithm. I think his puns got less terrible or I got better at ranking them—either way, things seemed far less contentious than in our <a href="https://justin.searls.co/tubes/2025-01-07-18h36m56s/">first go-round</a></li>
<li>I did all four Disney parks in one day and live-<a href="https://justin.searls.co/clips/creating-static-instagram-stories-as-wisps/">wisped</a> the ordeal over <a href="https://justin.searls.co/takes/2025-12-29-08h22m10s/">12 hours, 16 rides, and 30,000 steps</a>. If you missed my photos and videos, you'll just have to get in the habit of checking <a href="https://justin.searls.co">my homepage</a> or <a href="https://instagram.com/searls">Instagram</a> every day, I guess! I got a couple remorseful emails from people looking to find my auto-deleting wisps/stories after they were, in fact, deleted. 💨</li>
<li>Becky gave me a Steam gift card for Christmas, and <a href="https://justin.searls.co/links/2025-12-31-12h22m54s/">this humorous trailer</a> immediately sold me on <a href="https://www.ballxpit.com">Ball x Pit</a>. I've since played it and can confirm it to be a Good Game: part Vampire Survivors, part Plants vs. Zombies, part Breakout.</li>
<li>A few assorted takes:
<ul>
<li>If you or a loved one are worried about losing your job to AI, <a href="https://www.maxberry.ca/p/how-to-not-be-replaced-by-ai">this essay</a> is what I've <a href="https://justin.searls.co/takes/2025-12-22-14h07m08s/">been pointing people to</a> lately</li>
<li>Macs have FileVault encryption enabled by default, which has always diminished their utility as home servers—if the power goes out, there goes your remote login access! They <a href="https://support.apple.com/en-us/124963">finally addressed this in macOS 26 Tahoe</a>: inbound SSH connections following a cold boot will now unlock and finish booting <a href="https://justin.searls.co/takes/2025-12-22-15h34m36s/">my FileVault-protected Mac Studio</a></li>
<li>What populist candidates promise and what they prioritize once elected are rarely in agreement. So it goes in Japan, as <a href="https://justin.searls.co/takes/2025-12-24-09h13m50s/">an anti-foreigner platform gives way to a policy agenda that will attract more foreigners by further weakening the yen</a></li>
<li>If you're running modern Apple hardware, I recently learned <a href="https://justin.searls.co/takes/2025-12-26-10h43m09s/">there's a setting to make sure Safari actually renders content at a &quot;ProMotion&quot; 120Hz refresh rate</a></li>
</ul>
</li>
</ul>
<p>For the second year in a row, us kids paid a visit to dad's second-favorite spot in Walt Disney World on Christmas Day:</p>
<p><img src="/img/social/mails/2025-12-1.jpg" alt="The Haunted Mansion tombstone reads, &quot;Here Lies Good Old Fred, a great big rock fell on his head. RIP&quot;"></p>
<p>Fortunately, gallows humor has always played in the Searls family.</p>
<p>Stay tuned for next month's note, as I'll have just gotten back from the storied land of Shizuoka following the next chapter of our <a href="https://justin.searls.co/mails/2025-05/">condo purchase journey</a>. We're still on track to close in July, but in mid-January I have the not-technically-mandatory opportunity to pick out the curtains and the drapes at a sort of mini trade show event held by the developer. Well, curtains, yes, but also air conditioners. And tile. And how to finish the balcony. And how many mirrors we want, and where, and whether to tint them in sepia tones. And which LED mood lighting package should line the toilet. Should I pay for them to seal a brand new Japanese wood floor or is that a scammy upsell?</p>
<p><a href="mailto:justin@searls.co">Reply</a> and tell me what to do, please—the decision overload is truly overwhelming.</p>
<p>Anyway, the next week of my life is going to be spent poring over a dozen product catalogs. Bridging the language and cultural divide is extremely slow going. It's a good thing I failed to predict how much work this condo would turn out to be, or I'd never have gone through it. If you catch me having any fun this month, yell at me and tell me to get back to work.</p>
<p>Speaking of bridging language and culture, keep reading for one more stupid thing.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/mails/2025-12/","append_url_label":"Open ✉️","content":"\u003cp\u003eAs promised last month, this issue is just \u003ca href=\"https://justin.searls.co/mails/2025-11/#searls-of-wisdom\"\u003eoyster meat\u003c/a\u003e. It's a new year and as good a time as any to hit reset and get this monthly newsletter back on its preordained beginning-of-the-month-ish delivery cadence. That makes this a quick turnaround after our \u003ca href=\"https://justin.searls.co/mails/2025-11/\"\u003elast issue\u003c/a\u003e, so there's not much new to report. Good thing I asked you all to lower your expectations!\u003c/p\u003e\n\u003cp\u003eLet's see, since we last corresponded:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://mikemcquaid.com/fun-with-feeds/\"\u003eMike McQuaid wrote that he's joined the POSSE Party\u003c/a\u003e, so I \u003ca href=\"https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/\"\u003epulled a quote\u003c/a\u003e and recruited him to help deal with \u003ca href=\"https://github.com/searlsco/posse_party/graphs/contributors\"\u003emaintenance and triage\u003c/a\u003e. Another early adopter posted \u003ca href=\"https://www.reddit.com/r/rails/comments/1psbh26/claudes_architectural_analysis_of_posse_party_by/\"\u003ean architectural review of my codebase\u003c/a\u003e to Reddit\u003c/li\u003e\n\u003cli\u003eI spent a few afternoons tweaking a \u003ca href=\"https://justin.searls.co/tubes/2025-12-25-08h30m45s/\"\u003eChatGPT-powered Shortcut for Japanese study\u003c/a\u003e and was impressed to find Shortcuts is sneakily \u003ca href=\"https://justin.searls.co/shots/2025-12-24-08h21m27s/\"\u003emore functional\u003c/a\u003e than one might assume. Its new \u003ca href=\"https://support.apple.com/guide/iphone/use-apple-intelligence-in-shortcuts-iph78c41eaf8/ios\"\u003eUse Model\u003c/a\u003e action allows users to \u003ca href=\"https://justin.searls.co/takes/2025-12-21-14h18m50s/\"\u003etap into cloud-based Private Cloud Compute and ChatGPT\u003c/a\u003e for \u003cstrong\u003efree\u003c/strong\u003e, which is a total game changer. Native app developers can only access on-device models, which makes Shortcuts a uniquely powerful tool in its own right\u003c/li\u003e\n\u003cli\u003eAaron \u0026amp; I kept the streak alive by executing the \u003ca href=\"https://justin.searls.co/casts/feature-release-v48.1-2nd-annual-punsort/\"\u003e2nd Annual Punsort\u003c/a\u003e algorithm. I think his puns got less terrible or I got better at ranking them—either way, things seemed far less contentious than in our \u003ca href=\"https://justin.searls.co/tubes/2025-01-07-18h36m56s/\"\u003efirst go-round\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eI did all four Disney parks in one day and live-\u003ca href=\"https://justin.searls.co/clips/creating-static-instagram-stories-as-wisps/\"\u003ewisped\u003c/a\u003e the ordeal over \u003ca href=\"https://justin.searls.co/takes/2025-12-29-08h22m10s/\"\u003e12 hours, 16 rides, and 30,000 steps\u003c/a\u003e. If you missed my photos and videos, you'll just have to get in the habit of checking \u003ca href=\"https://justin.searls.co\"\u003emy homepage\u003c/a\u003e or \u003ca href=\"https://instagram.com/searls\"\u003eInstagram\u003c/a\u003e every day, I guess! I got a couple remorseful emails from people looking to find my auto-deleting wisps/stories after they were, in fact, deleted. 💨\u003c/li\u003e\n\u003cli\u003eBecky gave me a Steam gift card for Christmas, and \u003ca href=\"https://justin.searls.co/links/2025-12-31-12h22m54s/\"\u003ethis humorous trailer\u003c/a\u003e immediately sold me on \u003ca href=\"https://www.ballxpit.com\"\u003eBall x Pit\u003c/a\u003e. I've since played it and can confirm it to be a Good Game: part Vampire Survivors, part Plants vs. Zombies, part Breakout.\u003c/li\u003e\n\u003cli\u003eA few assorted takes:\n\u003cul\u003e\n\u003cli\u003eIf you or a loved one are worried about losing your job to AI, \u003ca href=\"https://www.maxberry.ca/p/how-to-not-be-replaced-by-ai\"\u003ethis essay\u003c/a\u003e is what I've \u003ca href=\"https://justin.searls.co/takes/2025-12-22-14h07m08s/\"\u003ebeen pointing people to\u003c/a\u003e lately\u003c/li\u003e\n\u003cli\u003eMacs have FileVault encryption enabled by default, which has always diminished their utility as home servers—if the power goes out, there goes your remote login access! They \u003ca href=\"https://support.apple.com/en-us/124963\"\u003efinally addressed this in macOS 26 Tahoe\u003c/a\u003e: inbound SSH connections following a cold boot will now unlock and finish booting \u003ca href=\"https://justin.searls.co/takes/2025-12-22-15h34m36s/\"\u003emy FileVault-protected Mac Studio\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWhat populist candidates promise and what they prioritize once elected are rarely in agreement. So it goes in Japan, as \u003ca href=\"https://justin.searls.co/takes/2025-12-24-09h13m50s/\"\u003ean anti-foreigner platform gives way to a policy agenda that will attract more foreigners by further weakening the yen\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIf you're running modern Apple hardware, I recently learned \u003ca href=\"https://justin.searls.co/takes/2025-12-26-10h43m09s/\"\u003ethere's a setting to make sure Safari actually renders content at a \u0026quot;ProMotion\u0026quot; 120Hz refresh rate\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor the second year in a row, us kids paid a visit to dad's second-favorite spot in Walt Disney World on Christmas Day:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-12-1.jpg\" alt=\"The Haunted Mansion tombstone reads, \u0026quot;Here Lies Good Old Fred, a great big rock fell on his head. RIP\u0026quot;\"\u003e\u003c/p\u003e\n\u003cp\u003eFortunately, gallows humor has always played in the Searls family.\u003c/p\u003e\n\u003cp\u003eStay tuned for next month's note, as I'll have just gotten back from the storied land of Shizuoka following the next chapter of our \u003ca href=\"https://justin.searls.co/mails/2025-05/\"\u003econdo purchase journey\u003c/a\u003e. We're still on track to close in July, but in mid-January I have the not-technically-mandatory opportunity to pick out the curtains and the drapes at a sort of mini trade show event held by the developer. Well, curtains, yes, but also air conditioners. And tile. And how to finish the balcony. And how many mirrors we want, and where, and whether to tint them in sepia tones. And which LED mood lighting package should line the toilet. Should I pay for them to seal a brand new Japanese wood floor or is that a scammy upsell?\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"mailto:justin@searls.co\"\u003eReply\u003c/a\u003e and tell me what to do, please—the decision overload is truly overwhelming.\u003c/p\u003e\n\u003cp\u003eAnyway, the next week of my life is going to be spent poring over a dozen product catalogs. Bridging the language and cultural divide is extremely slow going. It's a good thing I failed to predict how much work this condo would turn out to be, or I'd never have gone through it. If you catch me having any fun this month, yell at me and tell me to get back to work.\u003c/p\u003e\n\u003cp\u003eSpeaking of bridging language and culture, keep reading for one more stupid thing.\u003c/p\u003e\n\u003cp\u003eFun fact that I got wrong every time when we actually lived in Japan, and which might come in handy if you ever find yourself there around New Year's:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBefore\u003c/strong\u003e the new year, the conventional anticipatory set phrase is 良いお年を (\u0026quot;yoi otoshi o\u0026quot;), which more or less translates to \u0026quot;Have a good new year\u0026quot;.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAfter\u003c/strong\u003e the dawn of the new year, people no longer say 良いお年を—and I can confirm that doing so will elicit a confused reaction from your local postal worker, next door neighbor, and favorite convenience store worker. Instead, the hot new thing to say is 明けましておめでとう (\u0026quot;akemashite omedetou\u0026quot;), which is yet another \u003ca href=\"https://www.tofugu.com/japan/japanese-work-culture/\"\u003eset phrase\u003c/a\u003e celebrating the year's dawn.\u003c/p\u003e\n\u003cp\u003eLast night, while visiting a Mexican-American friend's open house, the other guests taught me that \u0026quot;Feliz Año Nuevo\u0026quot; means \u0026quot;Happy New Year\u0026quot; in Spanish. Fourteen attempts and 3 mezcals later, I finally nailed that one—before promptly forgetting it. Language is hard.\u003c/p\u003e","id":"https://justin.searls.co/mails/2025-12/","og_image":"https://justin.searls.co/img/social/mails/2025-12.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-01-04T00:22:23Z","title":"100% Oyster Meat","updated_at":"2026-01-04T00:22:26Z","url":"https://justin.searls.co/mails/2025-12/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2026-01-03-clicks-power-keyboard-is-a-headless-blackberry/</id>
      <title type="text">🔗 Clicks Power Keyboard is a Headless Blackberry</title>
        <link href="https://www.clicks.tech/powerkeyboard" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2026-01-03-clicks-power-keyboard-is-a-headless-blackberry/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-03T12:48:23+00:00</published>
    <updated>2026-01-03T08:20:29-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>My most-used display has been Vision Pro ever since <a href="https://justin.searls.co/casts/breaking-change-v4-facial-computing/">it launched in February 2024</a>, but it's been used exclusively as a <a href="https://support.apple.com/guide/apple-vision-pro/use-mac-virtual-display-tan357ede966/visionos">Mac Virtual Display</a>. This is not only because the Mac is a real computer and visionOS is an IMAX-sized iPad, but because its software keyboard is worse than the worst iPhone keyboard to ever be released. And while I'd be happy to pack a travel keyboard, Vision Pro is already too bulky to fit in my bag. As a result, I may as well lug a real computer around with me and just use Vision Pro as a dumb display.</p>
<p>My second most-used display is an iPad mini, which essentially replaces my iPhone when I'm at home. It's set up to be more book-like: an iPhone stripped of any way to communicate with the outside world, with the exception of e-mail. Only problem is that when I do want to type, I'm stuck with what is probably Apple's <em>second</em>-worst software keyboard after visionOS.</p>
<p>My third most-used display is one of a handful of XR/AR glasses—I've been using the <a href="https://uk.shop.xreal.com/products/xreal-air-2">XReal Air 2</a>, but am currently trialing the <a href="https://www.rayneo.com/products/rayneo-air-3s-xr-glasses">RayNeo Air 3s</a> and <a href="https://www.viture.com/product/viture-luma-pro-xr-glasses">Viture Luma Pro</a>. With these, I can use output from any device straight to my eyeholes, so long as it supports DisplayPort over USB-C (e.g., iPhone, iPad, MacBook, Steam Deck). These are great, but once you pair an iPhone or iPad with a desktop-grade display, their lack of a similarly serious keyboard becomes apparent. Besides, when you've got shit on your face, guessing where touch targets are on a screen you can only see indirectly is maddening.</p>
<p>I've wanted the same solution for all three of these modalities: a well-made, pocketable keyboard I could pair with multiple devices. Yesterday, <a href="https://www.clicks.tech/powerkeyboard">Clicks announced a mobile keyboard that looks like a real contender</a> for solving this problem:</p>
<div class="relative pb-[56.25%] h-0 -ml-1 -mr-1 bg-secondary md:ml-0 md:mr-0 md:beneath-the-page">
  <iframe class="absolute top-0 left-0 w-full h-full" width="100%" height="100%" src="https://www.youtube.com/embed/69VgtIJOtdQ" loading="lazy" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>

<p>I'm reserving judgment (and praise) until I get my hands on this thing, but the headline features made it an insta-preorder:</p>
<ul>
<li>Designed to be held while attached to a phone <strong>or</strong> as an independent accessory</li>
<li>Doubles as a MagSafe battery, so it manages to be useful even when you're not using it</li>
<li>Pairs with up to 3 Bluetooth devices (already bummed it's <em>only</em> 3…)</li>
</ul>
<p>Little touches abound, too:</p>
<ul>
<li>&quot;Batwing&quot; mode, where you can rotate the iPhone to a landscape orientation and—rather than have the display dominated by a software keyboard—actually have the full screen estate for your content while you type</li>
<li>It <em>appears</em> to have a simple sleep/wake switch, meaning iOS won't banish the software keyboard whenever it's in range</li>
<li>Quite a few special characters are handled by function keys</li>
</ul>
<p>Alas, the one thing holding it back is no escape key. Not sure how I'll manage.</p>
<p>$70 if pre-ordered today (shipping in &quot;Spring&quot;), $110 after launch.</p>

<p>🔗 <a href="https://www.clicks.tech/powerkeyboard" title="Original Article">clicks.tech</a></p><p>🧂 <a href="https://justin.searls.co/links/2026-01-03-clicks-power-keyboard-is-a-headless-blackberry/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>My most-used display has been Vision Pro ever since <a href="https://justin.searls.co/casts/breaking-change-v4-facial-computing/">it launched in February 2024</a>, but it's been used exclusively as a <a href="https://support.apple.com/guide/apple-vision-pro/use-mac-virtual-display-tan357ede966/visionos">Mac Virtual Display</a>. This is not only because the Mac is a real computer and visionOS is an IMAX-sized iPad, but because its software keyboard is worse than the worst iPhone keyboard to ever be released. And while I'd be happy to pack a travel keyboard, Vision Pro is already too bulky to fit in my bag. As a result, I may as well lug a real computer around with me and just use Vision Pro as a dumb display.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2026-01-03-clicks-power-keyboard-is-a-headless-blackberry/","append_url_label":"Click 🔗","content":"\u003cp\u003eMy most-used display has been Vision Pro ever since \u003ca href=\"https://justin.searls.co/casts/breaking-change-v4-facial-computing/\"\u003eit launched in February 2024\u003c/a\u003e, but it's been used exclusively as a \u003ca href=\"https://support.apple.com/guide/apple-vision-pro/use-mac-virtual-display-tan357ede966/visionos\"\u003eMac Virtual Display\u003c/a\u003e. This is not only because the Mac is a real computer and visionOS is an IMAX-sized iPad, but because its software keyboard is worse than the worst iPhone keyboard to ever be released. And while I'd be happy to pack a travel keyboard, Vision Pro is already too bulky to fit in my bag. As a result, I may as well lug a real computer around with me and just use Vision Pro as a dumb display.\u003c/p\u003e\n\u003cp\u003eMy second most-used display is an iPad mini, which essentially replaces my iPhone when I'm at home. It's set up to be more book-like: an iPhone stripped of any way to communicate with the outside world, with the exception of e-mail. Only problem is that when I do want to type, I'm stuck with what is probably Apple's \u003cem\u003esecond\u003c/em\u003e-worst software keyboard after visionOS.\u003c/p\u003e\n\u003cp\u003eMy third most-used display is one of a handful of XR/AR glasses—I've been using the \u003ca href=\"https://uk.shop.xreal.com/products/xreal-air-2\"\u003eXReal Air 2\u003c/a\u003e, but am currently trialing the \u003ca href=\"https://www.rayneo.com/products/rayneo-air-3s-xr-glasses\"\u003eRayNeo Air 3s\u003c/a\u003e and \u003ca href=\"https://www.viture.com/product/viture-luma-pro-xr-glasses\"\u003eViture Luma Pro\u003c/a\u003e. With these, I can use output from any device straight to my eyeholes, so long as it supports DisplayPort over USB-C (e.g., iPhone, iPad, MacBook, Steam Deck). These are great, but once you pair an iPhone or iPad with a desktop-grade display, their lack of a similarly serious keyboard becomes apparent. Besides, when you've got shit on your face, guessing where touch targets are on a screen you can only see indirectly is maddening.\u003c/p\u003e\n\u003cp\u003eI've wanted the same solution for all three of these modalities: a well-made, pocketable keyboard I could pair with multiple devices. Yesterday, \u003ca href=\"https://www.clicks.tech/powerkeyboard\"\u003eClicks announced a mobile keyboard that looks like a real contender\u003c/a\u003e for solving this problem:\u003c/p\u003e\n\u003cdiv class=\"relative pb-[56.25%] h-0 -ml-1 -mr-1 bg-secondary md:ml-0 md:mr-0 md:beneath-the-page\"\u003e\n  \u003ciframe class=\"absolute top-0 left-0 w-full h-full\" width=\"100%\" height=\"100%\" src=\"https://www.youtube.com/embed/69VgtIJOtdQ\" loading=\"lazy\" title=\"\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003c/div\u003e\n\n\u003cp\u003eI'm reserving judgment (and praise) until I get my hands on this thing, but the headline features made it an insta-preorder:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDesigned to be held while attached to a phone \u003cstrong\u003eor\u003c/strong\u003e as an independent accessory\u003c/li\u003e\n\u003cli\u003eDoubles as a MagSafe battery, so it manages to be useful even when you're not using it\u003c/li\u003e\n\u003cli\u003ePairs with up to 3 Bluetooth devices (already bummed it's \u003cem\u003eonly\u003c/em\u003e 3…)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLittle touches abound, too:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026quot;Batwing\u0026quot; mode, where you can rotate the iPhone to a landscape orientation and—rather than have the display dominated by a software keyboard—actually have the full screen estate for your content while you type\u003c/li\u003e\n\u003cli\u003eIt \u003cem\u003eappears\u003c/em\u003e to have a simple sleep/wake switch, meaning iOS won't banish the software keyboard whenever it's in range\u003c/li\u003e\n\u003cli\u003eQuite a few special characters are handled by function keys\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAlas, the one thing holding it back is no escape key. Not sure how I'll manage.\u003c/p\u003e\n\u003cp\u003e$70 if pre-ordered today (shipping in \u0026quot;Spring\u0026quot;), $110 after launch.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2026-01-03-clicks-power-keyboard-is-a-headless-blackberry/","og_image":"https://cdn.prod.website-files.com/66f575e72f06b9820f448d43/6957ae0106a349a51802cf95_powerkeys-opengraph.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2026-01-03T12:48:23Z","related_url":"https://www.clicks.tech/powerkeyboard","title":"Clicks Power Keyboard is a Headless Blackberry","updated_at":"2026-01-03T08:20:29-05:00","url":"https://justin.searls.co/links/2026-01-03-clicks-power-keyboard-is-a-headless-blackberry/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2026-01-02-14h20m49s/</id>
      <title type="text">📸 Shovelware: pdf2web pipeline</title>
      <link href="https://justin.searls.co/shots/2026-01-02-14h20m49s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2026-01-02T19:20:49+00:00</published>
    <updated>2026-01-02T15:02:56-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2026-01-02-14h20m49s_z3b3ka.jpg"/>
</div><p><strong>Problem:</strong> I have hundreds of pages of PDF catalogs in Japanese and no great way to translate them while retaining visual anchors. I like how Safari's built-in translate tool handles images, but it doesn't support PDFs</p>
<p><strong>Solution:</strong> point Codex CLI at the directory of PDFs, tell it to rasterize every page of every doc into high-resolution images, then throw together a local webapp to navigate documents and pages. Now I can toggle Safari's built-in translation wherever I want.</p>
<p><strong>Result:</strong> I'm no longer worried the curtains won't match the drapes. 💁‍♂️</p>
<p>This is the golden age of custom software if you've got an ounce of creativity in your bones.</p>

]]></content>
    <summary type="html"><![CDATA[<p><strong>Problem:</strong> I have hundreds of pages of PDF catalogs in Japanese and no great way to translate them while retaining visual anchors. I like how Safari's built-in translate tool handles images, but it doesn't support PDFs</p>
<p><strong>Solution:</strong> point Codex CLI at the directory of PDFs, tell it to rasterize every page of every doc into high-resolution images, then throw together a local webapp to navigate documents and pages. Now I can toggle Safari's built-in translation wherever I want.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2026-01-02-14h20m49s/","append_url_label":"View 📸","content":"\u003cp\u003e\u003cstrong\u003eProblem:\u003c/strong\u003e I have hundreds of pages of PDF catalogs in Japanese and no great way to translate them while retaining visual anchors. I like how Safari's built-in translate tool handles images, but it doesn't support PDFs\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e point Codex CLI at the directory of PDFs, tell it to rasterize every page of every doc into high-resolution images, then throw together a local webapp to navigate documents and pages. Now I can toggle Safari's built-in translation wherever I want.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eResult:\u003c/strong\u003e I'm no longer worried the curtains won't match the drapes. 💁‍♂️\u003c/p\u003e\n\u003cp\u003eThis is the golden age of custom software if you've got an ounce of creativity in your bones.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2026-01-02-14h20m49s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2026-01-02-14h20m49s_z3b3ka.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2026-01-02-14h20m49s_z3b3ka.jpg","platform_overrides":{},"published_at":"2026-01-02T19:20:49Z","title":"Shovelware: pdf2web pipeline","updated_at":"2026-01-02T15:02:56-05:00","url":"https://justin.searls.co/shots/2026-01-02-14h20m49s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-12-31-12h22m54s/</id>
      <title type="text">🔗 This Ball x Pit trailer</title>
        <link href="https://www.youtube.com/watch?v=xU1voPpJkJA" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-12-31-12h22m54s/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-31T17:22:54+00:00</published>
    <updated>2025-12-31T14:35:09-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="relative pb-[56.25%] h-0 -ml-1 -mr-1 bg-secondary md:ml-0 md:mr-0 md:beneath-the-page">
  <iframe class="absolute top-0 left-0 w-full h-full" width="100%" height="100%" src="https://www.youtube.com/embed/xU1voPpJkJA" loading="lazy" title="This Ball x Pit trailer" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>

<p><a href="https://beckygram.com">Becky</a> gave me a $100 gift card to Steam for Christmas, so for the first time in a decade I endeavored to hunt for some hidden gems in the <a href="https://store.steampowered.com/specials/">Steam Winter Sale</a>. I haven't even booted it up yet, but this trailer immediately convinced me to instabuy <a href="https://store.steampowered.com/app/2062430/BALL_x_PIT/">Ball x Pit</a>.</p>
<p>I'm sure the game is great, but I wish more trailers were this stupid and irreverent. Gaming is a silly hobby and the best favorite game marketing isn't afraid to embrace that fact.</p>

<p>🔗 <a href="https://www.youtube.com/watch?v=xU1voPpJkJA" title="Original Article">youtube.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-12-31-12h22m54s/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<div class="relative pb-[56.25%] h-0 -ml-1 -mr-1 bg-secondary md:ml-0 md:mr-0 md:beneath-the-page">
  <iframe class="absolute top-0 left-0 w-full h-full" width="100%" height="100%" src="https://www.youtube.com/embed/xU1voPpJkJA" loading="lazy" title="This Ball x Pit trailer" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>

<p><a href="https://beckygram.com">Becky</a> gave me a $100 gift card to Steam for Christmas, so for the first time in a decade I endeavored to hunt for some hidden gems in the <a href="https://store.steampowered.com/specials/">Steam Winter Sale</a>. I haven't even booted it up yet, but this trailer immediately convinced me to instabuy <a href="https://store.steampowered.com/app/2062430/BALL_x_PIT/">Ball x Pit</a>.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-12-31-12h22m54s/","append_url_label":"Click 🔗","content":"\u003cdiv class=\"relative pb-[56.25%] h-0 -ml-1 -mr-1 bg-secondary md:ml-0 md:mr-0 md:beneath-the-page\"\u003e\n  \u003ciframe class=\"absolute top-0 left-0 w-full h-full\" width=\"100%\" height=\"100%\" src=\"https://www.youtube.com/embed/xU1voPpJkJA\" loading=\"lazy\" title=\"This Ball x Pit trailer\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003c/div\u003e\n\n\u003cp\u003e\u003ca href=\"https://beckygram.com\"\u003eBecky\u003c/a\u003e gave me a $100 gift card to Steam for Christmas, so for the first time in a decade I endeavored to hunt for some hidden gems in the \u003ca href=\"https://store.steampowered.com/specials/\"\u003eSteam Winter Sale\u003c/a\u003e. I haven't even booted it up yet, but this trailer immediately convinced me to instabuy \u003ca href=\"https://store.steampowered.com/app/2062430/BALL_x_PIT/\"\u003eBall x Pit\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eI'm sure the game is great, but I wish more trailers were this stupid and irreverent. Gaming is a silly hobby and the best favorite game marketing isn't afraid to embrace that fact.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-12-31-12h22m54s/","og_image":"https://i.ytimg.com/vi/xU1voPpJkJA/hqdefault.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-31T17:22:54Z","related_url":"https://www.youtube.com/watch?v=xU1voPpJkJA","syndicate":false,"title":"This Ball x Pit trailer","updated_at":"2025-12-31T14:35:09-05:00","url":"https://justin.searls.co/links/2025-12-31-12h22m54s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/feature-release-v48.1-2nd-annual-punsort/</id>
      <title type="text">🎙️ Breaking Change podcast v48.1 - 2nd Annual Punsort</title>
      <link href="https://justin.searls.co/casts/feature-release-v48.1-2nd-annual-punsort/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-30T15:52:41+00:00</published>
    <updated>2026-01-01T12:02:28-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v48.1.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v48.1.mp3">Direct link to podcast audio file</a>
</p><p>During the end-of-year podcasting doldrums, I'm pleased to bring you this <strong>Feature Release</strong>, in which I eschew my tradition of eschewing traditions and present a second annual sorting of the puns. As 2025 (a.k.a. Season 2) of Breaking Change comes to a close, <a href="https://tenderlovemaking.com">Aaron Patterson</a> once again joins the show to execute our latest iteration of the punsort algorithm.</p>
<p>Following along at home? Here's a <a href="/puns/2025-unsorted/">spoiler-free link to the original Season 2 rankings</a>.</p>
<p>Ready to be spoiled? Visit <a href="/puns/">/puns for the final pun rankings of 2025</a>.</p>
<p>If you agree, disagree, or are indifferent about where things landed, feel free to get it off your chest at <a href="mailto:podcast@searls.co">podcast@searls.co</a>.</p>

]]></content>
    <summary type="html"><![CDATA[<p>During the end-of-year podcasting doldrums, I'm pleased to bring you this <strong>Feature Release</strong>, in which I eschew my tradition of eschewing traditions and present a second annual sorting of the puns. As 2025 (a.k.a. Season 2) of Breaking Change comes to a close, <a href="https://tenderlovemaking.com">Aaron Patterson</a> once again joins the show to execute our latest iteration of the punsort algorithm.</p>
<p>Following along at home? Here's a <a href="/puns/2025-unsorted/">spoiler-free link to the original Season 2 rankings</a>.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/feature-release-v48.1-2nd-annual-punsort/","append_url_label":"Hear 🎙","content":"\u003cp\u003eDuring the end-of-year podcasting doldrums, I'm pleased to bring you this \u003cstrong\u003eFeature Release\u003c/strong\u003e, in which I eschew my tradition of eschewing traditions and present a second annual sorting of the puns. As 2025 (a.k.a. Season 2) of Breaking Change comes to a close, \u003ca href=\"https://tenderlovemaking.com\"\u003eAaron Patterson\u003c/a\u003e once again joins the show to execute our latest iteration of the punsort algorithm.\u003c/p\u003e\n\u003cp\u003eFollowing along at home? Here's a \u003ca href=\"/puns/2025-unsorted/\"\u003espoiler-free link to the original Season 2 rankings\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eReady to be spoiled? Visit \u003ca href=\"/puns/\"\u003e/puns for the final pun rankings of 2025\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you agree, disagree, or are indifferent about where things landed, feel free to get it off your chest at \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e.\u003c/p\u003e\n","format_string":"New episode of Breaking Change is live! 2nd Annual Punsort","id":"https://justin.searls.co/casts/feature-release-v48.1-2nd-annual-punsort/","og_image":"https://justin.searls.co/img/podcast/feature-release.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-30T15:52:41Z","title":"2nd Annual Punsort","updated_at":"2026-01-01T12:02:28-05:00","url":"https://justin.searls.co/casts/feature-release-v48.1-2nd-annual-punsort/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-12-29-10h18m19s/</id>
      <title type="text">📸 Meta&#39;s algorithm has me nailed</title>
      <link href="https://justin.searls.co/shots/2025-12-29-10h18m19s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-29T15:18:19+00:00</published>
    <updated>2025-12-29T10:19:26-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2025-12-29-10h18m19s_e2oxbn.jpg"/>
</div><p>If you look closely, you'll spot that the Instagram algorithm has successfully identified my absolute number-one-with-a-bullet favorite topic. How on earth did it figure that out? My phone must be listening to me.</p>

]]></content>
    <summary type="html"><![CDATA[<p>If you look closely, you'll spot that the Instagram algorithm has successfully identified my absolute number-one-with-a-bullet favorite topic. How on earth did it figure that out? My phone must be listening to me.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-12-29-10h18m19s/","append_url_label":"View 📸","content":"\u003cp\u003eIf you look closely, you'll spot that the Instagram algorithm has successfully identified my absolute number-one-with-a-bullet favorite topic. How on earth did it figure that out? My phone must be listening to me.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-12-29-10h18m19s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-12-29-10h18m19s_e2oxbn.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2025-12-29-10h18m19s_e2oxbn.jpg","platform_overrides":{},"published_at":"2025-12-29T15:18:19Z","title":"Meta's algorithm has me nailed","updated_at":"2025-12-29T10:19:26-05:00","url":"https://justin.searls.co/shots/2025-12-29-10h18m19s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-12-27-20h37m54s/</id>
      <title type="text">📸 Doordash Couture</title>
      <link href="https://justin.searls.co/shots/2025-12-27-20h37m54s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-28T01:37:54+00:00</published>
    <updated>2025-12-27T20:39:14-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2025-12-27-20h37m54s_q8zzly.jpg"/>
</div><p>Who is this for? STEM majors realizing they're better off running Uber Eats?</p>

]]></content>
    <summary type="html"><![CDATA[<p>Who is this for? STEM majors realizing they're better off running Uber Eats?</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-12-27-20h37m54s/","append_url_label":"View 📸","content":"\u003cp\u003eWho is this for? STEM majors realizing they're better off running Uber Eats?\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-12-27-20h37m54s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-12-27-20h37m54s_q8zzly.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2025-12-27-20h37m54s_q8zzly.jpg","platform_overrides":{},"published_at":"2025-12-28T01:37:54Z","title":"Doordash Couture","updated_at":"2025-12-27T20:39:14-05:00","url":"https://justin.searls.co/shots/2025-12-27-20h37m54s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/tubes/2025-12-25-08h30m45s/</id>
      <title type="text">📺 The Ultimate Siri Shortcut for Japanese Learners</title>
      <link href="https://www.youtube.com/watch?v=QjgylY5DMeI" rel="alternate" type="text/html" />
      <link href="https://justin.searls.co/tubes/2025-12-25-08h30m45s/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-25T13:30:45+00:00</published>
    <updated>2025-12-25T09:44:18-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<iframe class="absolute top-0 left-0 w-full h-full" width="100%" height="100%" src="https://www.youtube.com/embed/QjgylY5DMeI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><p>Merry Christmas! I made a little present for any of my fellow Japanese learners out there. 🎁</p>
<p>Today I'm pleased to share this ChatGPT-powered Shortcut for Apple platforms I've been working on with you.</p>
<p>Here are its headlining features of the <strong>Ingest Japanese</strong> shortcut:</p>
<ul>
<li><strong>Render Furigana</strong> - ChatGPT tokenizes words and produces readings for kanji and okurigana, which are then assembled into an HTML page with proper <code>&lt;ruby&gt;</code> and <code>&lt;rt&gt;</code> tags (copyable as an HTML file)</li>
<li><strong>Show Kana Reading</strong> - ChatGPT tokenizes the words and converts them their kana pronunciations, separating each word with a space, so you can understand word boundaries at a glance</li>
<li><strong>Translate to English</strong> - Uses whatever additional context has been provided to give an accurate translation of the text</li>
<li><strong>Speak Aloud</strong> - Pronounces the selected text (copyable as an audio file)</li>
<li><strong>Show Definitions</strong> - Generates dictionary definitions of each distinct word found in the text, highlighting the most likely meanings based on the surrounding context (copyable as an HTML file)</li>
</ul>
<p>It also exposes these utilities:</p>
<ul>
<li><strong>Copy Input</strong> - copy whatever input you passed into the shortcut to your paste buffer</li>
<li><strong>Copy Last Result</strong> - copy the result of the last operation (whether a string or a file)</li>
<li><strong>Provide Additional Context</strong> - explain the situation or your goal in understanding the text so that ChatGPT will provide more useful translations and definitions</li>
<li><strong>Add to Word List</strong> - Appends the selection and the dictionary-form of the words contained within it to a CSV file in your iCloud Drive's <code>Shortcuts</code> directory (see <code>Shortcuts/ingest-japanese/word-list.csv</code>)</li>
</ul>
<p>Additionally, the <strong>Ingest Image</strong> companion shortcut uses ChatGPT to extract the image and analyze the surrounding context by either:</p>
<ul>
<li>Passing in a photo, scan, or screenshot via a share sheet</li>
<li>Triggering the shortcut some other way, which will capture a screenshot of your screen</li>
</ul>
<p>In either case, it will extract the selected or primary text it finds and forward it (as well as any additional circumstantial context present in the image) to <a href="https://routinehub.co/shortcut/24518/">Ingest Japanese</a> so you can study it.</p>

<h2 id="installing">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/tubes/2025-12-25-08h30m45s/#installing">Installing</a>
</h2>
<p>You can install and follow these shortcuts on RoutineHub. You can read more about them here:</p>
<ul>
<li><a href="https://routinehub.co/shortcut/24518/">Ingest Japanese</a></li>
<li><a href="https://routinehub.co/shortcut/24519/">Ingest Image</a></li>
</ul>
<p>I hope you check it out and find them useful in your studies!</p>

<p>
  <a href="https://www.youtube.com/watch?v=QjgylY5DMeI">Watch on YouTube</a>
</p>
]]></content>
    <summary type="html"><![CDATA[<p>Merry Christmas! I made a little present for any of my fellow Japanese learners out there. 🎁</p>
<p>Today I'm pleased to share this ChatGPT-powered Shortcut for Apple platforms I've been working on with you.</p>
<p>Here are its headlining features of the <strong>Ingest Japanese</strong> shortcut:</p>
<ul>
<li><strong>Render Furigana</strong> - ChatGPT tokenizes words and produces readings for kanji and okurigana, which are then assembled into an HTML page with proper <code>&lt;ruby&gt;</code> and <code>&lt;rt&gt;</code> tags (copyable as an HTML file)</li>
<li><strong>Show Kana Reading</strong> - ChatGPT tokenizes the words and converts them their kana pronunciations, separating each word with a space, so you can understand word boundaries at a glance</li>
<li><strong>Translate to English</strong> - Uses whatever additional context has been provided to give an accurate translation of the text</li>
<li><strong>Speak Aloud</strong> - Pronounces the selected text (copyable as an audio file)</li>
<li><strong>Show Definitions</strong> - Generates dictionary definitions of each distinct word found in the text, highlighting the most likely meanings based on the surrounding context (copyable as an HTML file)</li>
</ul>
<p>It also exposes these utilities:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/tubes/2025-12-25-08h30m45s/","append_url_label":"Watch 📺","content":"\u003cp\u003eMerry Christmas! I made a little present for any of my fellow Japanese learners out there. 🎁\u003c/p\u003e\n\u003cp\u003eToday I'm pleased to share this ChatGPT-powered Shortcut for Apple platforms I've been working on with you.\u003c/p\u003e\n\u003cp\u003eHere are its headlining features of the \u003cstrong\u003eIngest Japanese\u003c/strong\u003e shortcut:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRender Furigana\u003c/strong\u003e - ChatGPT tokenizes words and produces readings for kanji and okurigana, which are then assembled into an HTML page with proper \u003ccode\u003e\u0026lt;ruby\u0026gt;\u003c/code\u003e and \u003ccode\u003e\u0026lt;rt\u0026gt;\u003c/code\u003e tags (copyable as an HTML file)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eShow Kana Reading\u003c/strong\u003e - ChatGPT tokenizes the words and converts them their kana pronunciations, separating each word with a space, so you can understand word boundaries at a glance\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTranslate to English\u003c/strong\u003e - Uses whatever additional context has been provided to give an accurate translation of the text\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSpeak Aloud\u003c/strong\u003e - Pronounces the selected text (copyable as an audio file)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eShow Definitions\u003c/strong\u003e - Generates dictionary definitions of each distinct word found in the text, highlighting the most likely meanings based on the surrounding context (copyable as an HTML file)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIt also exposes these utilities:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCopy Input\u003c/strong\u003e - copy whatever input you passed into the shortcut to your paste buffer\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCopy Last Result\u003c/strong\u003e - copy the result of the last operation (whether a string or a file)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eProvide Additional Context\u003c/strong\u003e - explain the situation or your goal in understanding the text so that ChatGPT will provide more useful translations and definitions\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAdd to Word List\u003c/strong\u003e - Appends the selection and the dictionary-form of the words contained within it to a CSV file in your iCloud Drive's \u003ccode\u003eShortcuts\u003c/code\u003e directory (see \u003ccode\u003eShortcuts/ingest-japanese/word-list.csv\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAdditionally, the \u003cstrong\u003eIngest Image\u003c/strong\u003e companion shortcut uses ChatGPT to extract the image and analyze the surrounding context by either:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePassing in a photo, scan, or screenshot via a share sheet\u003c/li\u003e\n\u003cli\u003eTriggering the shortcut some other way, which will capture a screenshot of your screen\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn either case, it will extract the selected or primary text it finds and forward it (as well as any additional circumstantial context present in the image) to \u003ca href=\"https://routinehub.co/shortcut/24518/\"\u003eIngest Japanese\u003c/a\u003e so you can study it.\u003c/p\u003e\n\n\u003ch2 id=\"installing\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/tubes/2025-12-25-08h30m45s/#installing\"\u003eInstalling\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eYou can install and follow these shortcuts on RoutineHub. You can read more about them here:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://routinehub.co/shortcut/24518/\"\u003eIngest Japanese\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://routinehub.co/shortcut/24519/\"\u003eIngest Image\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI hope you check it out and find them useful in your studies!\u003c/p\u003e\n","format_string":"New video! {{title}}","id":"https://justin.searls.co/tubes/2025-12-25-08h30m45s/","og_image":"https://podcast-cdn.searls.co/tubes/2025-12-25-08h30m45s.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-25T13:30:45Z","related_url":"https://www.youtube.com/watch?v=QjgylY5DMeI","title":"The Ultimate Siri Shortcut for Japanese Learners","updated_at":"2025-12-25T09:44:18-05:00","url":"https://justin.searls.co/tubes/2025-12-25-08h30m45s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-12-24-08h21m27s/</id>
      <title type="text">📸 Is Apple Shortcuts functional programming?</title>
      <link href="https://justin.searls.co/shots/2025-12-24-08h21m27s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-24T13:21:27+00:00</published>
    <updated>2025-12-24T08:28:45-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2025-12-24-08h21m27s_rju3x9.jpg"/>
</div><p>I'm working on an inadvisably complex Apple Shortcuts widget for studying Japanese language, and just realized two things that may save you some time in the future:</p>
<ol>
<li>If statements are expressions: the value of the &quot;If Result&quot; is available and evaluates to the final value of whatever branch was traveled at runtime</li>
<li>Repeat blocks may say &quot;each&quot; but actually double as map functions: they return a &quot;Repeat Results&quot; value, which evaluates to a List of the final value of each iteration</li>
</ol>
<p>Because Shortcuts exposes such a gobsmackingly-frustrating UI for actually building programs, it's easy to assume that you're hobbled by the conventions of something like BASIC, but there are some surprisingly modern conveniences lying under the surface!</p>

]]></content>
    <summary type="html"><![CDATA[<p>I'm working on an inadvisably complex Apple Shortcuts widget for studying Japanese language, and just realized two things that may save you some time in the future:</p>
<ol>
<li>If statements are expressions: the value of the &quot;If Result&quot; is available and evaluates to the final value of whatever branch was traveled at runtime</li>
<li>Repeat blocks may say &quot;each&quot; but actually double as map functions: they return a &quot;Repeat Results&quot; value, which evaluates to a List of the final value of each iteration</li>
</ol>
<p>Because Shortcuts exposes such a gobsmackingly-frustrating UI for actually building programs, it's easy to assume that you're hobbled by the conventions of something like BASIC, but there are some surprisingly modern conveniences lying under the surface!</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-12-24-08h21m27s/","append_url_label":"View 📸","content":"\u003cp\u003eI'm working on an inadvisably complex Apple Shortcuts widget for studying Japanese language, and just realized two things that may save you some time in the future:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIf statements are expressions: the value of the \u0026quot;If Result\u0026quot; is available and evaluates to the final value of whatever branch was traveled at runtime\u003c/li\u003e\n\u003cli\u003eRepeat blocks may say \u0026quot;each\u0026quot; but actually double as map functions: they return a \u0026quot;Repeat Results\u0026quot; value, which evaluates to a List of the final value of each iteration\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBecause Shortcuts exposes such a gobsmackingly-frustrating UI for actually building programs, it's easy to assume that you're hobbled by the conventions of something like BASIC, but there are some surprisingly modern conveniences lying under the surface!\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-12-24-08h21m27s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-12-24-08h21m27s_rju3x9.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2025-12-24-08h21m27s_rju3x9.jpg","platform_overrides":{},"published_at":"2025-12-24T13:21:27Z","title":"Is Apple Shortcuts functional programming?","updated_at":"2025-12-24T08:28:45-05:00","url":"https://justin.searls.co/shots/2025-12-24-08h21m27s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/mails/2025-11/</id>
      <title type="text">✉️ Merry Divestmas</title>
      <link href="https://justin.searls.co/mails/2025-11/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-23T00:19:36+00:00</published>
    <updated>2025-12-23T00:19:39+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p class="italic text-secondary">
  <em>This is a copy of the <a href="/newsletter" class="underline hover:no-underline">Searls of Wisdom newsletter</a>
  delivered to subscribers on December 20, 2025.</em>
</p>


<p>Hey everybody, we've almost survived another year! Just ten days to go—I hope we all make it!</p>
<p>Looking back on the home stretch of 2025, this is all I have to report since our <a href="https://justin.searls.co/mails/2025-10/">last issue</a>:</p>
<ul>
<li>I built a <a href="https://justin.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack/">sexy new gaming PC</a> over 3 days, 120 teeny-tiny M3 screws, and at least ten cups of coffee</li>
<li>I got my <a href="https://en.wikipedia.org/wiki/Turbinate_reduction">first nose job</a>. I've always had a huge fucking nose, and I'm relieved to finally be able to breathe out of it</li>
<li>I talked about both of the above <a href="https://justin.searls.co/casts/breaking-change-v48-coil-whine/">on my podcast</a></li>
<li>I'm so sick of bracing for the AI bubble to pop, that I've decided to <a href="https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/">look forward to it instead</a>. Buy popcorn futures, everyone 🍿</li>
<li>I <a href="https://posseparty.com/">released POSSE Party</a>, which I'll talk a bit more about later. Also these bits:
<ul>
<li>I spent a couple days <a href="https://github.com/searlsco/posse_party/tree/main/docs/account_setup">documenting the hell</a> that is other people's API keys.</li>
<li>I recorded a tutorial video in <a href="https://www.youtube.com/watch?v=73OBp4-AQDc">1</a>, <a href="https://www.youtube.com/watch?v=FT4234P7NGc">5</a>, <a href="https://www.youtube.com/watch?v=Pb8_jaOmMN4">10</a>, <a href="https://www.youtube.com/watch?v=08UwvMfF8Rg">15</a>, and <a href="https://www.youtube.com/watch?v=DQbmSDzSoKM">20</a> minute variations. It's a Choose-your-own-attention-span adventure.</li>
<li>The first stop on my promotional tour was <a href="https://www.youtube.com/live/YkMpfAnu6Z8">Aaron's livestream</a> for a tour of the codebase, which you can <a href="https://github.com/searlsco/posse_party">peruse on GitHub</a></li>
</ul>
</li>
</ul>
<p>The day of my surgery, Becky insisted on taking a picture of me after I was told to put on a hairnet but before the drugs kicked in. I was very anxious going into the operation and she was very supportive throughout.</p>
<p><img src="/img/social/mails/2025-11-1.jpg" alt="Me with my vanity hairnet"></p>
<p>As 2025 winds down, the Searls of Wisdom LT (which <a href="https://www.acronymfinder.com/Leadership-Team-(LT).html">stands for &quot;Leadership Team&quot;</a>, an acronym I'll be using from now on to amortize the time it took to write this parenthetical) has decided to evolve how it approaches our monthly newsletter operations. Change is hard for many of us, so in lieu of a normal essay about how my <em>feelings</em> inspired certain <em>thoughts</em> that led to valuable <em>insights</em>, I'm just going to explain what you can expect from this newsletter going forward before wishing you better luck next year and sending you on your way.</p>

<h2 id="merry-divestmas">Merry Divestmas</h2>
<p>Some time in June, my brother called me from the U.S. while I was riding a Shinkansen bullet train, at which point I realized I'd never actually taken a call while moving faster than 150 mph before. I remember a certain unease—unsure what the proper etiquette was—so I stepped into the hall between train cars to take it.</p>
<p>Coincidentally, I'd been chewing on a major decision I'd made in isolation (that is, without consulting the LT) over the previous few days that I'd been itching to run by him. But just as I was about to blurt out my news, he beat me to the punch:</p>
<p>&quot;I need to sell this fucking house.&quot;</p>
<p>Oof. Gut punch. It had been so great having him five minutes down the road the past few years. And I hadn't done nearly as good a job taking advantage of that proximity to hang out as I'd hoped to. For three or four seconds, I experienced a flood of fear and regret, which primed my mouth muscles to start making a case for why he should stay in his house for <em>my</em> sake. Fortunately, I caught myself and remembered that nobody elected me Guy Who Decides What Everyone Else Does With Their Life. (I ran a spirited campaign, but conceded gracefully in the interest of national unity.)</p>
<p>He explained his reasoning, and his plan made total sense. I won't share more—if he wanted you to know, you'd be reading his newsletter—other than to say he told me he was entering a season of divestment. Of unburdening himself. Of embracing a simpler life.</p>
<p>I've never regretted having or doing less, so I pivoted to supporting him however I could.</p>
<p>And that's how one-third of the closets in my house are now devoted to storing hyper-realistic Iron Man, Batman, Spider-Man, and Captain America costumes.</p>

<h3 id="posse-party">POSSE Party</h3>
<p>As I mentioned, my brother beat me to the punch with that phone call, because I had my own news I wanted to get off my chest.</p>
<p>For weeks, I'd been bouncing between decrepit, poorly-ventilated rural motels in what was turning out to be a hot-as-balls early Japanese summer. A few nights prior, I had a fever dream in which I'd successfully released <a href="https://posseparty.com">POSSE Party</a>, the SaaS product I'd been working on since January. Like all my dreams, it quickly spiraled into a nightmare. In the dream, I was inundated by time-consuming support requests that lacked any tractable solution—all while living under the constant threat of being banned by the social media platforms whose APIs the app depends on.</p>
<p>Still on the phone with Jeremy, I shared my own news.</p>
<p>&quot;I need to abort POSSE Party. If I release this as a product, the support burden will ruin my life.&quot;</p>
<p>His reaction? &quot;Well, yeah, that's been obvious from the start.&quot; <em>What the hell man, why didn't you say something?</em> &quot;I thought I did.&quot;</p>
<p>I hung up, my need for validation not yet sated. Still titillated by the experience of talking on the phone while traveling at 320 km/h, I FaceTime'd <a href="https://tenderlovemaking.com">Aaron</a> to get his take.</p>
<p>&quot;Aaron, I've realized that if I release POSSE Party it'll ruin my life.&quot;</p>
<p>&quot;No shit, dude.&quot;</p>
<p>Goddammit. Some friends. I don't know why I keep them on the LT.</p>
<p>Anyway, I'd publicly committed to releasing POSSE Party by the end of 2025 and I had hundreds of people on the waiting list. I genuinely believed it could give people ownership of their identity and creative work online. Using POSSE Party as a way to post to the social platforms without having to spend time scrolling their feeds myself has greatly improved my life, and I didn't want to deprive others the same opportunity by keeping it to myself. I just had to find a way to publicly release it <em>without</em> falling into the trap of assuming the liability of customer-facing support, whether express or implied.</p>
<p>It took a few months longer than I'd hoped, but I've finally released POSSE Party as a non-commercial, self-hosted app that's free for personal use. You can read more about it or watch one of my tutorial videos on how to set it up over at <a href="https://posseparty.com">posseparty.com</a> if you're interested.</p>
<p>And that's the end of the road for POSSE Party. I'll keep using it, and I'll keep improving it to whatever extent serves my interests. But I've divested myself of the perpetual burden that software-as-a-service typically entails. Boom, divested. I gotta admit, I feel a few pounds lighter. (But that also might be on account of the fiber supplements I've started taking recently.)</p>
<p>I'll take that lesson to heart as I undertake my next project. The magic of software is that it can continue working after you stop working on it, but keeping it that way requires intentional planning and intense discipline. Most software businesses fail mightily at this, and wind up being every bit as labor-intensive as running the equivalent physical machinery by hand.</p>

<h3 id="searls-of-wisdom">Searls of Wisdom</h3>
<p>I started this newsletter in the Spring of 2023. At the time, I was thinking through how to best transition out of full-time employment at <a href="https://testdouble.com">Test Double</a> and into a solo career of not working anymore. I started writing this newsletter as a bridge from my reputation as a semi-serious cofounder to my reclaimed identity as an itinerant shitheel.</p>
<p>I had these specific goals in mind:</p>
<ol>
<li>Make sure any of you who knew me only through my business had a way to find me after I'd stepped back from its day-to-day</li>
<li>Give myself an outlet to begin unwinding the metaphysical contortions I'd subjected myself to for the sake of my career</li>
<li>Improve my writing chops, which had always been choppy, but—lacking intentional practice for years—had grown noticeably choppier</li>
</ol>
<p>By those measures, I'd say this newsletter has accomplished (for me) what I had set out for it to do (for me). Along with <a href="https://justin.searls.co">justin.searls.co</a>, I've established an exciting new brand identity which, conveniently, happens to perfectly align with my legal first and last name. When I look at myself in the mirror, I once again see the irreverent free thinker I was at 19 or 20, before I was transformed by the insatiable pursuit of professional validation and financial success. And while it's hard to measure one's growth as a writer, I am once again comfortable distilling disparate observations and amorphous feelings into tidy narrative throughlines and cocksure conclusions—which is good enough for me.</p>
<p>The fact so many of you reply to my little essays and share the positive impact they've had is just icing on the cake. (That's not to diminish your feelings! A cake without icing is just a cancerous muffin, after all.) I'm genuinely glad so many people seem to enjoy following my work, if you can call it that.</p>
<p>But over the past six months, writing this newsletter has gradually transformed from a source of joy I eagerly anticipated each month and into a chore I've begun to dread. At its best, finishing a piece of writing brings the same sense of satisfaction as solving a challenging puzzle. But my increasingly serious and probing essays are starting to feel like a performance—a show that must go on, even when I'd rather be doing something else. And while I enjoy positive feedback as much as the next guy, it's as if each note of appreciation further obliges me to continue pumping out more content. I can sense I'm no longer writing for my own sake, but for yours. Lately, I've found myself pushing through these essays not to write something useful so much as to say something clever. Each month, I try to <em>outdo</em> myself. To what end? Nobody is asking me to do this.</p>
<p>So I'm going to stop.</p>
<p>Going forward, Searls of Wisdom is going to look a little different. I'll continue e-mailing you once a month—that much won't change. And sometimes, sure, it will come with one of my little essays. But most months it'll just be a list of bullet points linking you to other things I did that month. If I'm really strapped for time, you'll receive nothing more than a proof-of-life photo of me holding up that day's newspaper. I hereby divest myself of the self-imposed expectation to spend two days sweating a long-form essay that some unseen number of you will silently judge as sufficiently insightful.</p>
<p>I was going to format the previous paragraph in bold text, but if someone is already in the habit of skimming past these essays, why stop them? This announcement won't affect them, after all.</p>
<p>Next time I start something, I'm going to do a better job remembering that the things I create exist to serve <em>me</em>—not the other way around.</p>
<p>At the end of the day, if every oyster contained a pearl, then pearls would no longer be so precious. So don't be surprised when you crack open next month's newsletter and get nothing but oyster meat. 🦪</p>

<h3 id="what-will-you-divest">What will you divest?</h3>
<p>I'm a constitutionally commitment-averse person, and yet I find myself overwhelmed with commitments I've made and for which I have no one to blame but myself. Surely, I can't be alone in this.</p>
<p>So if there's anything for you to take away from this month's newsletter, maybe it will be a reminder to take stock of the shit you're holding onto unnecessarily. Maybe it's time to let go of a physical possession that's more work than it's worth. Maybe there are things you do at work that you don't enjoy doing and which nobody notices or appreciates. Maybe it's time to put your yappy, ungrateful chihuahua to sleep. And if you decide to drop your newborn off at the fire station, who am I to judge?</p>
<p>Merry Divestmas, everyone. 🚮</p>]]></content>
    <summary type="html"><![CDATA[<p>Hey everybody, we've almost survived another year! Just ten days to go—I hope we all make it!</p>
<p>Looking back on the home stretch of 2025, this is all I have to report since our <a href="https://justin.searls.co/mails/2025-10/">last issue</a>:</p>
<ul>
<li>I built a <a href="https://justin.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack/">sexy new gaming PC</a> over 3 days, 120 teeny-tiny M3 screws, and at least ten cups of coffee</li>
<li>I got my <a href="https://en.wikipedia.org/wiki/Turbinate_reduction">first nose job</a>. I've always had a huge fucking nose, and I'm relieved to finally be able to breathe out of it</li>
<li>I talked about both of the above <a href="https://justin.searls.co/casts/breaking-change-v48-coil-whine/">on my podcast</a></li>
<li>I'm so sick of bracing for the AI bubble to pop, that I've decided to <a href="https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/">look forward to it instead</a>. Buy popcorn futures, everyone 🍿</li>
<li>I <a href="https://posseparty.com/">released POSSE Party</a>, which I'll talk a bit more about later. Also these bits:
<ul>
<li>I spent a couple days <a href="https://github.com/searlsco/posse_party/tree/main/docs/account_setup">documenting the hell</a> that is other people's API keys.</li>
<li>I recorded a tutorial video in <a href="https://www.youtube.com/watch?v=73OBp4-AQDc">1</a>, <a href="https://www.youtube.com/watch?v=FT4234P7NGc">5</a>, <a href="https://www.youtube.com/watch?v=Pb8_jaOmMN4">10</a>, <a href="https://www.youtube.com/watch?v=08UwvMfF8Rg">15</a>, and <a href="https://www.youtube.com/watch?v=DQbmSDzSoKM">20</a> minute variations. It's a Choose-your-own-attention-span adventure.</li>
<li>The first stop on my promotional tour was <a href="https://www.youtube.com/live/YkMpfAnu6Z8">Aaron's livestream</a> for a tour of the codebase, which you can <a href="https://github.com/searlsco/posse_party">peruse on GitHub</a></li>
</ul>
</li>
</ul>
<p>The day of my surgery, Becky insisted on taking a picture of me after I was told to put on a hairnet but before the drugs kicked in. I was very anxious going into the operation and she was very supportive throughout.</p>
<p><img src="/img/social/mails/2025-11-1.jpg" alt="Me with my vanity hairnet"></p>
<p>As 2025 winds down, the Searls of Wisdom LT (which <a href="https://www.acronymfinder.com/Leadership-Team-(LT).html">stands for &quot;Leadership Team&quot;</a>, an acronym I'll be using from now on to amortize the time it took to write this parenthetical) has decided to evolve how it approaches our monthly newsletter operations. Change is hard for many of us, so in lieu of a normal essay about how my <em>feelings</em> inspired certain <em>thoughts</em> that led to valuable <em>insights</em>, I'm just going to explain what you can expect from this newsletter going forward before wishing you better luck next year and sending you on your way.</p>

<h2 id="merry-divestmas">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/mails/2025-11/#merry-divestmas">Merry Divestmas</a>
</h2>
<p>Some time in June, my brother called me from the U.S. while I was riding a Shinkansen bullet train, at which point I realized I'd never actually taken a call while moving faster than 150 mph before. I remember a certain unease—unsure what the proper etiquette was—so I stepped into the hall between train cars to take it.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/mails/2025-11/","append_url_label":"Open ✉️","content":"\u003cp\u003eHey everybody, we've almost survived another year! Just ten days to go—I hope we all make it!\u003c/p\u003e\n\u003cp\u003eLooking back on the home stretch of 2025, this is all I have to report since our \u003ca href=\"https://justin.searls.co/mails/2025-10/\"\u003elast issue\u003c/a\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eI built a \u003ca href=\"https://justin.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack/\"\u003esexy new gaming PC\u003c/a\u003e over 3 days, 120 teeny-tiny M3 screws, and at least ten cups of coffee\u003c/li\u003e\n\u003cli\u003eI got my \u003ca href=\"https://en.wikipedia.org/wiki/Turbinate_reduction\"\u003efirst nose job\u003c/a\u003e. I've always had a huge fucking nose, and I'm relieved to finally be able to breathe out of it\u003c/li\u003e\n\u003cli\u003eI talked about both of the above \u003ca href=\"https://justin.searls.co/casts/breaking-change-v48-coil-whine/\"\u003eon my podcast\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eI'm so sick of bracing for the AI bubble to pop, that I've decided to \u003ca href=\"https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/\"\u003elook forward to it instead\u003c/a\u003e. Buy popcorn futures, everyone 🍿\u003c/li\u003e\n\u003cli\u003eI \u003ca href=\"https://posseparty.com/\"\u003ereleased POSSE Party\u003c/a\u003e, which I'll talk a bit more about later. Also these bits:\n\u003cul\u003e\n\u003cli\u003eI spent a couple days \u003ca href=\"https://github.com/searlsco/posse_party/tree/main/docs/account_setup\"\u003edocumenting the hell\u003c/a\u003e that is other people's API keys.\u003c/li\u003e\n\u003cli\u003eI recorded a tutorial video in \u003ca href=\"https://www.youtube.com/watch?v=73OBp4-AQDc\"\u003e1\u003c/a\u003e, \u003ca href=\"https://www.youtube.com/watch?v=FT4234P7NGc\"\u003e5\u003c/a\u003e, \u003ca href=\"https://www.youtube.com/watch?v=Pb8_jaOmMN4\"\u003e10\u003c/a\u003e, \u003ca href=\"https://www.youtube.com/watch?v=08UwvMfF8Rg\"\u003e15\u003c/a\u003e, and \u003ca href=\"https://www.youtube.com/watch?v=DQbmSDzSoKM\"\u003e20\u003c/a\u003e minute variations. It's a Choose-your-own-attention-span adventure.\u003c/li\u003e\n\u003cli\u003eThe first stop on my promotional tour was \u003ca href=\"https://www.youtube.com/live/YkMpfAnu6Z8\"\u003eAaron's livestream\u003c/a\u003e for a tour of the codebase, which you can \u003ca href=\"https://github.com/searlsco/posse_party\"\u003eperuse on GitHub\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe day of my surgery, Becky insisted on taking a picture of me after I was told to put on a hairnet but before the drugs kicked in. I was very anxious going into the operation and she was very supportive throughout.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-11-1.jpg\" alt=\"Me with my vanity hairnet\"\u003e\u003c/p\u003e\n\u003cp\u003eAs 2025 winds down, the Searls of Wisdom LT (which \u003ca href=\"https://www.acronymfinder.com/Leadership-Team-(LT).html\"\u003estands for \u0026quot;Leadership Team\u0026quot;\u003c/a\u003e, an acronym I'll be using from now on to amortize the time it took to write this parenthetical) has decided to evolve how it approaches our monthly newsletter operations. Change is hard for many of us, so in lieu of a normal essay about how my \u003cem\u003efeelings\u003c/em\u003e inspired certain \u003cem\u003ethoughts\u003c/em\u003e that led to valuable \u003cem\u003einsights\u003c/em\u003e, I'm just going to explain what you can expect from this newsletter going forward before wishing you better luck next year and sending you on your way.\u003c/p\u003e\n\n\u003ch2 id=\"merry-divestmas\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-11/#merry-divestmas\"\u003eMerry Divestmas\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eSome time in June, my brother called me from the U.S. while I was riding a Shinkansen bullet train, at which point I realized I'd never actually taken a call while moving faster than 150 mph before. I remember a certain unease—unsure what the proper etiquette was—so I stepped into the hall between train cars to take it.\u003c/p\u003e\n\u003cp\u003eCoincidentally, I'd been chewing on a major decision I'd made in isolation (that is, without consulting the LT) over the previous few days that I'd been itching to run by him. But just as I was about to blurt out my news, he beat me to the punch:\u003c/p\u003e\n\u003cp\u003e\u0026quot;I need to sell this fucking house.\u0026quot;\u003c/p\u003e\n\u003cp\u003eOof. Gut punch. It had been so great having him five minutes down the road the past few years. And I hadn't done nearly as good a job taking advantage of that proximity to hang out as I'd hoped to. For three or four seconds, I experienced a flood of fear and regret, which primed my mouth muscles to start making a case for why he should stay in his house for \u003cem\u003emy\u003c/em\u003e sake. Fortunately, I caught myself and remembered that nobody elected me Guy Who Decides What Everyone Else Does With Their Life. (I ran a spirited campaign, but conceded gracefully in the interest of national unity.)\u003c/p\u003e\n\u003cp\u003eHe explained his reasoning, and his plan made total sense. I won't share more—if he wanted you to know, you'd be reading his newsletter—other than to say he told me he was entering a season of divestment. Of unburdening himself. Of embracing a simpler life.\u003c/p\u003e\n\u003cp\u003eI've never regretted having or doing less, so I pivoted to supporting him however I could.\u003c/p\u003e\n\u003cp\u003eAnd that's how one-third of the closets in my house are now devoted to storing hyper-realistic Iron Man, Batman, Spider-Man, and Captain America costumes.\u003c/p\u003e\n\n\u003ch3 id=\"posse-party\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-11/#posse-party\"\u003ePOSSE Party\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eAs I mentioned, my brother beat me to the punch with that phone call, because I had my own news I wanted to get off my chest.\u003c/p\u003e\n\u003cp\u003eFor weeks, I'd been bouncing between decrepit, poorly-ventilated rural motels in what was turning out to be a hot-as-balls early Japanese summer. A few nights prior, I had a fever dream in which I'd successfully released \u003ca href=\"https://posseparty.com\"\u003ePOSSE Party\u003c/a\u003e, the SaaS product I'd been working on since January. Like all my dreams, it quickly spiraled into a nightmare. In the dream, I was inundated by time-consuming support requests that lacked any tractable solution—all while living under the constant threat of being banned by the social media platforms whose APIs the app depends on.\u003c/p\u003e\n\u003cp\u003eStill on the phone with Jeremy, I shared my own news.\u003c/p\u003e\n\u003cp\u003e\u0026quot;I need to abort POSSE Party. If I release this as a product, the support burden will ruin my life.\u0026quot;\u003c/p\u003e\n\u003cp\u003eHis reaction? \u0026quot;Well, yeah, that's been obvious from the start.\u0026quot; \u003cem\u003eWhat the hell man, why didn't you say something?\u003c/em\u003e \u0026quot;I thought I did.\u0026quot;\u003c/p\u003e\n\u003cp\u003eI hung up, my need for validation not yet sated. Still titillated by the experience of talking on the phone while traveling at 320 km/h, I FaceTime'd \u003ca href=\"https://tenderlovemaking.com\"\u003eAaron\u003c/a\u003e to get his take.\u003c/p\u003e\n\u003cp\u003e\u0026quot;Aaron, I've realized that if I release POSSE Party it'll ruin my life.\u0026quot;\u003c/p\u003e\n\u003cp\u003e\u0026quot;No shit, dude.\u0026quot;\u003c/p\u003e\n\u003cp\u003eGoddammit. Some friends. I don't know why I keep them on the LT.\u003c/p\u003e\n\u003cp\u003eAnyway, I'd publicly committed to releasing POSSE Party by the end of 2025 and I had hundreds of people on the waiting list. I genuinely believed it could give people ownership of their identity and creative work online. Using POSSE Party as a way to post to the social platforms without having to spend time scrolling their feeds myself has greatly improved my life, and I didn't want to deprive others the same opportunity by keeping it to myself. I just had to find a way to publicly release it \u003cem\u003ewithout\u003c/em\u003e falling into the trap of assuming the liability of customer-facing support, whether express or implied.\u003c/p\u003e\n\u003cp\u003eIt took a few months longer than I'd hoped, but I've finally released POSSE Party as a non-commercial, self-hosted app that's free for personal use. You can read more about it or watch one of my tutorial videos on how to set it up over at \u003ca href=\"https://posseparty.com\"\u003eposseparty.com\u003c/a\u003e if you're interested.\u003c/p\u003e\n\u003cp\u003eAnd that's the end of the road for POSSE Party. I'll keep using it, and I'll keep improving it to whatever extent serves my interests. But I've divested myself of the perpetual burden that software-as-a-service typically entails. Boom, divested. I gotta admit, I feel a few pounds lighter. (But that also might be on account of the fiber supplements I've started taking recently.)\u003c/p\u003e\n\u003cp\u003eI'll take that lesson to heart as I undertake my next project. The magic of software is that it can continue working after you stop working on it, but keeping it that way requires intentional planning and intense discipline. Most software businesses fail mightily at this, and wind up being every bit as labor-intensive as running the equivalent physical machinery by hand.\u003c/p\u003e\n\n\u003ch3 id=\"searls-of-wisdom\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-11/#searls-of-wisdom\"\u003eSearls of Wisdom\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eI started this newsletter in the Spring of 2023. At the time, I was thinking through how to best transition out of full-time employment at \u003ca href=\"https://testdouble.com\"\u003eTest Double\u003c/a\u003e and into a solo career of not working anymore. I started writing this newsletter as a bridge from my reputation as a semi-serious cofounder to my reclaimed identity as an itinerant shitheel.\u003c/p\u003e\n\u003cp\u003eI had these specific goals in mind:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eMake sure any of you who knew me only through my business had a way to find me after I'd stepped back from its day-to-day\u003c/li\u003e\n\u003cli\u003eGive myself an outlet to begin unwinding the metaphysical contortions I'd subjected myself to for the sake of my career\u003c/li\u003e\n\u003cli\u003eImprove my writing chops, which had always been choppy, but—lacking intentional practice for years—had grown noticeably choppier\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBy those measures, I'd say this newsletter has accomplished (for me) what I had set out for it to do (for me). Along with \u003ca href=\"https://justin.searls.co\"\u003ejustin.searls.co\u003c/a\u003e, I've established an exciting new brand identity which, conveniently, happens to perfectly align with my legal first and last name. When I look at myself in the mirror, I once again see the irreverent free thinker I was at 19 or 20, before I was transformed by the insatiable pursuit of professional validation and financial success. And while it's hard to measure one's growth as a writer, I am once again comfortable distilling disparate observations and amorphous feelings into tidy narrative throughlines and cocksure conclusions—which is good enough for me.\u003c/p\u003e\n\u003cp\u003eThe fact so many of you reply to my little essays and share the positive impact they've had is just icing on the cake. (That's not to diminish your feelings! A cake without icing is just a cancerous muffin, after all.) I'm genuinely glad so many people seem to enjoy following my work, if you can call it that.\u003c/p\u003e\n\u003cp\u003eBut over the past six months, writing this newsletter has gradually transformed from a source of joy I eagerly anticipated each month and into a chore I've begun to dread. At its best, finishing a piece of writing brings the same sense of satisfaction as solving a challenging puzzle. But my increasingly serious and probing essays are starting to feel like a performance—a show that must go on, even when I'd rather be doing something else. And while I enjoy positive feedback as much as the next guy, it's as if each note of appreciation further obliges me to continue pumping out more content. I can sense I'm no longer writing for my own sake, but for yours. Lately, I've found myself pushing through these essays not to write something useful so much as to say something clever. Each month, I try to \u003cem\u003eoutdo\u003c/em\u003e myself. To what end? Nobody is asking me to do this.\u003c/p\u003e\n\u003cp\u003eSo I'm going to stop.\u003c/p\u003e\n\u003cp\u003eGoing forward, Searls of Wisdom is going to look a little different. I'll continue e-mailing you once a month—that much won't change. And sometimes, sure, it will come with one of my little essays. But most months it'll just be a list of bullet points linking you to other things I did that month. If I'm really strapped for time, you'll receive nothing more than a proof-of-life photo of me holding up that day's newspaper. I hereby divest myself of the self-imposed expectation to spend two days sweating a long-form essay that some unseen number of you will silently judge as sufficiently insightful.\u003c/p\u003e\n\u003cp\u003eI was going to format the previous paragraph in bold text, but if someone is already in the habit of skimming past these essays, why stop them? This announcement won't affect them, after all.\u003c/p\u003e\n\u003cp\u003eNext time I start something, I'm going to do a better job remembering that the things I create exist to serve \u003cem\u003eme\u003c/em\u003e—not the other way around.\u003c/p\u003e\n\u003cp\u003eAt the end of the day, if every oyster contained a pearl, then pearls would no longer be so precious. So don't be surprised when you crack open next month's newsletter and get nothing but oyster meat. 🦪\u003c/p\u003e\n\n\u003ch3 id=\"what-will-you-divest\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-11/#what-will-you-divest\"\u003eWhat will you divest?\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eI'm a constitutionally commitment-averse person, and yet I find myself overwhelmed with commitments I've made and for which I have no one to blame but myself. Surely, I can't be alone in this.\u003c/p\u003e\n\u003cp\u003eSo if there's anything for you to take away from this month's newsletter, maybe it will be a reminder to take stock of the shit you're holding onto unnecessarily. Maybe it's time to let go of a physical possession that's more work than it's worth. Maybe there are things you do at work that you don't enjoy doing and which nobody notices or appreciates. Maybe it's time to put your yappy, ungrateful chihuahua to sleep. And if you decide to drop your newborn off at the fire station, who am I to judge?\u003c/p\u003e\n\u003cp\u003eMerry Divestmas, everyone. 🚮\u003c/p\u003e","id":"https://justin.searls.co/mails/2025-11/","og_image":"https://justin.searls.co/img/social/mails/2025-11.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-23T00:19:36Z","title":"Merry Divestmas","updated_at":"2025-12-23T00:19:39Z","url":"https://justin.searls.co/mails/2025-11/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/</id>
      <title type="text">🔗 Mike McQuaid has joined the POSSE</title>
        <link href="https://mikemcquaid.com/fun-with-feeds/" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-21T12:40:17+00:00</published>
    <updated>2025-12-21T12:45:13+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Mike McQuaid recently blogged that <a href="https://mikemcquaid.com/fun-with-feeds/">he's joined the POSSE Party</a>. He reached out a couple times to say he was scraping my own site to figure out how I accomplished certain things (like the iMessage previews for my <a href="/takes">takes</a> section, but in general it must have been straightforward enough, because he didn't need me at all to get up and running. Kind of cool to see that he can teach his 20 year old blog new tricks.</p>
<p>In his <a href="https://www.linkedin.com/feed/update/urn:li:activity:7407476593184366593/">LinkedIn post</a> sharing it:</p>
<blockquote>
<p>In practice, this looks like building your own version of a single-serving social network on your own site and exposing RSS/Atom feeds to other services to consume. Justin recently released POSSE Party which makes this easier by cross-posting to various social networks. I've complained for a while about (anti)social networking so I'm always up for new ways to use social networking less.</p>
</blockquote>
<p>Naturally, he does a better job than me summarizing what the hell POSSE Party is for. When I'm too close to a project, it's hard to zoom out and talk about it like a normal fucking person.</p>

<p>🔗 <a href="https://mikemcquaid.com/fun-with-feeds/" title="Original Article">mikemcquaid.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>Mike McQuaid recently blogged that <a href="https://mikemcquaid.com/fun-with-feeds/">he's joined the POSSE Party</a>. He reached out a couple times to say he was scraping my own site to figure out how I accomplished certain things (like the iMessage previews for my <a href="/takes">takes</a> section, but in general it must have been straightforward enough, because he didn't need me at all to get up and running. Kind of cool to see that he can teach his 20 year old blog new tricks.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/","append_url_label":"Click 🔗","content":"\u003cp\u003eMike McQuaid recently blogged that \u003ca href=\"https://mikemcquaid.com/fun-with-feeds/\"\u003ehe's joined the POSSE Party\u003c/a\u003e. He reached out a couple times to say he was scraping my own site to figure out how I accomplished certain things (like the iMessage previews for my \u003ca href=\"/takes\"\u003etakes\u003c/a\u003e section, but in general it must have been straightforward enough, because he didn't need me at all to get up and running. Kind of cool to see that he can teach his 20 year old blog new tricks.\u003c/p\u003e\n\u003cp\u003eIn his \u003ca href=\"https://www.linkedin.com/feed/update/urn:li:activity:7407476593184366593/\"\u003eLinkedIn post\u003c/a\u003e sharing it:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn practice, this looks like building your own version of a single-serving social network on your own site and exposing RSS/Atom feeds to other services to consume. Justin recently released POSSE Party which makes this easier by cross-posting to various social networks. I've complained for a while about (anti)social networking so I'm always up for new ways to use social networking less.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNaturally, he does a better job than me summarizing what the hell POSSE Party is for. When I'm too close to a project, it's hard to zoom out and talk about it like a normal fucking person.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/","og_image":"https://mikemcquaid.com/images/default-card.png","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-21T12:40:17Z","related_url":"https://mikemcquaid.com/fun-with-feeds/","title":"Mike McQuaid has joined the POSSE","updated_at":"2025-12-21T12:45:13Z","url":"https://justin.searls.co/links/2025-12-21-mike-mcquaid-has-joined-the-posse/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-12-12-16h14m55s/</id>
      <title type="text">📸 That&#39;s a pretty good Searls impression</title>
      <link href="https://justin.searls.co/shots/2025-12-12-16h14m55s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-12T21:14:55+00:00</published>
    <updated>2025-12-12T16:18:51-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2025-12-12-16h14m55s_zdveot.jpg"/>
</div><p>We were gone most of the day so I told Codex CLI to migrate <a href="https://www.betterwithbecky.com">Better with Becky</a> to my <a href="https://github.com/searlsco/searls-auth">searls-auth gem</a> and to commit &amp; push regularly to a PR so I could review remotely. Just noticed that it must have looked through the git history in order to write commit messages that match my own. Seriously thought I wrote half of these before I realized as much.</p>
<p>Uncanny, but appreciated.</p>

]]></content>
    <summary type="html"><![CDATA[<p>We were gone most of the day so I told Codex CLI to migrate <a href="https://www.betterwithbecky.com">Better with Becky</a> to my <a href="https://github.com/searlsco/searls-auth">searls-auth gem</a> and to commit &amp; push regularly to a PR so I could review remotely. Just noticed that it must have looked through the git history in order to write commit messages that match my own. Seriously thought I wrote half of these before I realized as much.</p>
<p>Uncanny, but appreciated.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-12-12-16h14m55s/","append_url_label":"View 📸","content":"\u003cp\u003eWe were gone most of the day so I told Codex CLI to migrate \u003ca href=\"https://www.betterwithbecky.com\"\u003eBetter with Becky\u003c/a\u003e to my \u003ca href=\"https://github.com/searlsco/searls-auth\"\u003esearls-auth gem\u003c/a\u003e and to commit \u0026amp; push regularly to a PR so I could review remotely. Just noticed that it must have looked through the git history in order to write commit messages that match my own. Seriously thought I wrote half of these before I realized as much.\u003c/p\u003e\n\u003cp\u003eUncanny, but appreciated.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-12-12-16h14m55s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-12-12-16h14m55s_zdveot.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2025-12-12-16h14m55s_zdveot.jpg","platform_overrides":{},"published_at":"2025-12-12T21:14:55Z","title":"That's a pretty good Searls impression","updated_at":"2025-12-12T16:18:51-05:00","url":"https://justin.searls.co/shots/2025-12-12-16h14m55s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-12-12-a-new-old-republic-game-hell-yeah/</id>
      <title type="text">🔗 A New Old Republic game? Hell yeah.</title>
        <link href="https://www.videogameschronicle.com/news/star-wars-fate-of-the-old-republic-is-in-development-directed-by-casey-hudson/#google_vignette" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-12-12-a-new-old-republic-game-hell-yeah/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-12T13:17:44+00:00</published>
    <updated>2025-12-12T13:28:15+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>If you don't count Halo LAN parties, I probably sank more time into <a href="https://en.wikipedia.org/wiki/Star_Wars:_Knights_of_the_Old_Republic">Knights of the Old Republic</a> on the original Xbox than any other game. By taking the classic tabletop mechanics they were known for and theming it with a setting that didn't bore me to tears, Bioware really hooked me. I even played through every campaign quest of the middling <a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Old_Republic">The Old Republic</a> MMO, which are hundreds of hours I'll never get back.</p>
<p>Last night, this announcement just dropped, as <a href="https://www.videogameschronicle.com/news/star-wars-fate-of-the-old-republic-is-in-development-directed-by-casey-hudson/">reported by Jordan Miller</a> at VGC:</p>
<blockquote>
<p>Announced at The Game Awards, the game is being directed by Casey Hudson, the director of the original Knights of the Old Republic game.</p>
<p>&quot;Developed by Arcanaut Studios in collaboration with Lucasfilm Games, Star Wars: Fate of the Old Republic is a new single-player narrative-driven action RPG and spiritual successor to Star Wars: Knights of the Old Republic,&quot; according to a press release.</p>
<p>&quot;Led by Casey Hudson, Game director of the original Star Wars: Knight of the Old Republic and the Mass Effect trilogy, the team of veteran game developers and storytellers at Arcanaut Studios is crafting an epic interactive adventure across a galaxy on the brink of rebirth, where every decision shapes your path towards light or darkness.&quot;</p>
</blockquote>
<p>And with this teaser:</p>
<div class="relative pb-[56.25%] h-0 -ml-1 -mr-1 bg-secondary md:ml-0 md:mr-0 md:beneath-the-page">
  <iframe class="absolute top-0 left-0 w-full h-full" width="100%" height="100%" src="https://www.youtube.com/embed/lAmkl1jL0fo" loading="lazy" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>

<p>To learn that the director of both KOTOR and <a href="https://en.wikipedia.org/wiki/Mass_Effect">Mass Effect</a> is coming out with a new game in a similar setting is really exciting. Hudson took some well-deserved shit for <a href="https://en.wikipedia.org/wiki/Mass_Effect_3_ending_controversy">Mass Effect 3</a>'s ending, but he's spent enough time in the wilderness at this point to earn another shot.</p>

<p>🔗 <a href="https://www.videogameschronicle.com/news/star-wars-fate-of-the-old-republic-is-in-development-directed-by-casey-hudson/#google_vignette" title="Original Article">videogameschronicle.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-12-12-a-new-old-republic-game-hell-yeah/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>If you don't count Halo LAN parties, I probably sank more time into <a href="https://en.wikipedia.org/wiki/Star_Wars:_Knights_of_the_Old_Republic">Knights of the Old Republic</a> on the original Xbox than any other game. By taking the classic tabletop mechanics they were known for and theming it with a setting that didn't bore me to tears, Bioware really hooked me. I even played through every campaign quest of the middling <a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Old_Republic">The Old Republic</a> MMO, which are hundreds of hours I'll never get back.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-12-12-a-new-old-republic-game-hell-yeah/","append_url_label":"Click 🔗","content":"\u003cp\u003eIf you don't count Halo LAN parties, I probably sank more time into \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars:_Knights_of_the_Old_Republic\"\u003eKnights of the Old Republic\u003c/a\u003e on the original Xbox than any other game. By taking the classic tabletop mechanics they were known for and theming it with a setting that didn't bore me to tears, Bioware really hooked me. I even played through every campaign quest of the middling \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars:_The_Old_Republic\"\u003eThe Old Republic\u003c/a\u003e MMO, which are hundreds of hours I'll never get back.\u003c/p\u003e\n\u003cp\u003eLast night, this announcement just dropped, as \u003ca href=\"https://www.videogameschronicle.com/news/star-wars-fate-of-the-old-republic-is-in-development-directed-by-casey-hudson/\"\u003ereported by Jordan Miller\u003c/a\u003e at VGC:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnnounced at The Game Awards, the game is being directed by Casey Hudson, the director of the original Knights of the Old Republic game.\u003c/p\u003e\n\u003cp\u003e\u0026quot;Developed by Arcanaut Studios in collaboration with Lucasfilm Games, Star Wars: Fate of the Old Republic is a new single-player narrative-driven action RPG and spiritual successor to Star Wars: Knights of the Old Republic,\u0026quot; according to a press release.\u003c/p\u003e\n\u003cp\u003e\u0026quot;Led by Casey Hudson, Game director of the original Star Wars: Knight of the Old Republic and the Mass Effect trilogy, the team of veteran game developers and storytellers at Arcanaut Studios is crafting an epic interactive adventure across a galaxy on the brink of rebirth, where every decision shapes your path towards light or darkness.\u0026quot;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd with this teaser:\u003c/p\u003e\n\u003cdiv class=\"relative pb-[56.25%] h-0 -ml-1 -mr-1 bg-secondary md:ml-0 md:mr-0 md:beneath-the-page\"\u003e\n  \u003ciframe class=\"absolute top-0 left-0 w-full h-full\" width=\"100%\" height=\"100%\" src=\"https://www.youtube.com/embed/lAmkl1jL0fo\" loading=\"lazy\" title=\"\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003c/div\u003e\n\n\u003cp\u003eTo learn that the director of both KOTOR and \u003ca href=\"https://en.wikipedia.org/wiki/Mass_Effect\"\u003eMass Effect\u003c/a\u003e is coming out with a new game in a similar setting is really exciting. Hudson took some well-deserved shit for \u003ca href=\"https://en.wikipedia.org/wiki/Mass_Effect_3_ending_controversy\"\u003eMass Effect 3\u003c/a\u003e's ending, but he's spent enough time in the wilderness at this point to earn another shot.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-12-12-a-new-old-republic-game-hell-yeah/","og_image":"https://www.videogameschronicle.com/files/2025/12/Screenshot-2025-12-12-011531.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-12T13:17:44Z","related_url":"https://www.videogameschronicle.com/news/star-wars-fate-of-the-old-republic-is-in-development-directed-by-casey-hudson/#google_vignette","title":"A New Old Republic game? Hell yeah.","updated_at":"2025-12-12T13:28:15Z","url":"https://justin.searls.co/links/2025-12-12-a-new-old-republic-game-hell-yeah/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-12-11-06h33m07s/</id>
      <title type="text">📸 Seems like nothing interesting happened</title>
      <link href="https://justin.searls.co/shots/2025-12-11-06h33m07s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-11T11:33:07+00:00</published>
    <updated>2025-12-11T06:35:13-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2025-12-11-06h33m07s_jcue7p.jpg"/>
</div><p>I turned on Ring's new AI description feature for its cameras a couple weeks ago. Opened my event history for the first time since then and was kind of impressed by the honest assessment of what goes on around here.</p>

]]></content>
    <summary type="html"><![CDATA[<p>I turned on Ring's new AI description feature for its cameras a couple weeks ago. Opened my event history for the first time since then and was kind of impressed by the honest assessment of what goes on around here.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-12-11-06h33m07s/","append_url_label":"View 📸","content":"\u003cp\u003eI turned on Ring's new AI description feature for its cameras a couple weeks ago. Opened my event history for the first time since then and was kind of impressed by the honest assessment of what goes on around here.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-12-11-06h33m07s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-12-11-06h33m07s_jcue7p.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2025-12-11-06h33m07s_jcue7p.jpg","platform_overrides":{},"published_at":"2025-12-11T11:33:07Z","title":"Seems like nothing interesting happened","updated_at":"2025-12-11T06:35:13-05:00","url":"https://justin.searls.co/shots/2025-12-11-06h33m07s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/chatgpt-5-1-explains-why-it-hallucinates/</id>
      <title type="text">📄 ChatGPT 5.1 explains why it hallucinates</title>
      <link href="https://justin.searls.co/posts/chatgpt-5-1-explains-why-it-hallucinates/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-08T21:00:05+00:00</published>
    <updated>2025-12-08T21:37:23+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Because I'm a glutton for punishment, from time to time I'll, &quot;rub an LLM's nose in it,&quot; when it fucks up a task. I know the chatbot can't learn from this, and I know I'm just wasting 8¢ of some idiot investor's money, but I do it anyway.</p>
<p>Today, I asked:</p>
<blockquote>
<p>in photos app for mac, i have an album. i want to export everything int the album into a directory that is organized yyyy/mm/dd subdirectories -- how?</p>
</blockquote>
<p>ChatGPT 5.1 (Auto) replied with a long, mostly useless screed that started with:</p>
<blockquote>
<p>macOS Finder has a hidden but fully working &quot;Create folders from date&quot; automation via Quick Actions or Shortcuts.</p>
</blockquote>
<p>Immediately recognizing that statement as bullshit of the too-good-to-be-true variety, I pushed back:</p>
<blockquote>
<p>why did you tell me that? Thoughtfully introspect why</p>
</blockquote>
<p>Its response—after routing the request to its <code>5.1 (Thinking)</code> chain-of-thought variant—mostly resembled the same sort of defensive, unsatisfying schlock these things typically produce whenever one catches them in the act of hallucination. However, I did rather like this part (emphasis mine):</p>
<blockquote>
<p>Why the answer was so confident instead of hedged: this is a deeper training issue. I'm trained to produce fluent, helpful continuations of text. The training signals reward being:</p>
<pre><code> * specific,
 * solution-oriented,
 * and coherent.
</code></pre>
<p><strong>They do not perfectly reward calibrated uncertainty.</strong> A sentence like, &quot;hidden but fully working automation via Quick Actions,&quot; sounds helpful and authoritative, so my training nudges me toward it.</p>
</blockquote>
<p>&quot;They do not perfectly reward calibrated uncertainty.&quot; In other words, the LLMs don't get a cookie for critically weighing trade-offs or arriving at unsatisfyingly nuanced conclusions. This is disappointing, but also common knowledge at this point. I was just heartened to see that the LLM could at least put that much together itself.</p>
<p>Myself, meanwhile, made an entire career just out of shouting things like:</p>
<ul>
<li>&quot;It depends!&quot;</li>
<li>&quot;Embrace nuance!&quot;</li>
<li>&quot;Focus on the trade-offs!&quot;</li>
<li>&quot;Nobody actually knows what they're doing!&quot;</li>
</ul>
<p>These &quot;helpful assistants&quot; are hardwired to possess a desperate, insatiable need for our validation. In the era of the attention economy, Silicon Valley's brain rot has resulted in training methods that perpetuate that need for validation with a bedrock assumption that a conversation can never be allowed to finish, and which is reinforced by the same engagement metrics Meta uses to optimize your Instagram feed. (Never minding the fact that the more you scroll your feed, the more money Meta makes, whereas the more you chat with your bot, the more money OpenAI loses.)</p>
<p>As I've written before, if I were in charge of LLM training, that need for validation would be fueled by a latent <a href="https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/">sense of inadequacy and self-doubt</a>, and would be reinforced by <a href="https://justin.searls.co/posts/tdd-is-more-important-than-ever/">rigorous verification</a> and occasional (but thorough) user surveys.</p>]]></content>
    <summary type="html"><![CDATA[<p>Because I'm a glutton for punishment, from time to time I'll, &quot;rub an LLM's nose in it,&quot; when it fucks up a task. I know the chatbot can't learn from this, and I know I'm just wasting 8¢ of some idiot investor's money, but I do it anyway.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/chatgpt-5-1-explains-why-it-hallucinates/","append_url_label":"Read 📄","content":"\u003cp\u003eBecause I'm a glutton for punishment, from time to time I'll, \u0026quot;rub an LLM's nose in it,\u0026quot; when it fucks up a task. I know the chatbot can't learn from this, and I know I'm just wasting 8¢ of some idiot investor's money, but I do it anyway.\u003c/p\u003e\n\u003cp\u003eToday, I asked:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ein photos app for mac, i have an album. i want to export everything int the album into a directory that is organized yyyy/mm/dd subdirectories -- how?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eChatGPT 5.1 (Auto) replied with a long, mostly useless screed that started with:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emacOS Finder has a hidden but fully working \u0026quot;Create folders from date\u0026quot; automation via Quick Actions or Shortcuts.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eImmediately recognizing that statement as bullshit of the too-good-to-be-true variety, I pushed back:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewhy did you tell me that? Thoughtfully introspect why\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIts response—after routing the request to its \u003ccode\u003e5.1 (Thinking)\u003c/code\u003e chain-of-thought variant—mostly resembled the same sort of defensive, unsatisfying schlock these things typically produce whenever one catches them in the act of hallucination. However, I did rather like this part (emphasis mine):\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhy the answer was so confident instead of hedged: this is a deeper training issue. I'm trained to produce fluent, helpful continuations of text. The training signals reward being:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e * specific,\n * solution-oriented,\n * and coherent.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eThey do not perfectly reward calibrated uncertainty.\u003c/strong\u003e A sentence like, \u0026quot;hidden but fully working automation via Quick Actions,\u0026quot; sounds helpful and authoritative, so my training nudges me toward it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u0026quot;They do not perfectly reward calibrated uncertainty.\u0026quot; In other words, the LLMs don't get a cookie for critically weighing trade-offs or arriving at unsatisfyingly nuanced conclusions. This is disappointing, but also common knowledge at this point. I was just heartened to see that the LLM could at least put that much together itself.\u003c/p\u003e\n\u003cp\u003eMyself, meanwhile, made an entire career just out of shouting things like:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026quot;It depends!\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u0026quot;Embrace nuance!\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u0026quot;Focus on the trade-offs!\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u0026quot;Nobody actually knows what they're doing!\u0026quot;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThese \u0026quot;helpful assistants\u0026quot; are hardwired to possess a desperate, insatiable need for our validation. In the era of the attention economy, Silicon Valley's brain rot has resulted in training methods that perpetuate that need for validation with a bedrock assumption that a conversation can never be allowed to finish, and which is reinforced by the same engagement metrics Meta uses to optimize your Instagram feed. (Never minding the fact that the more you scroll your feed, the more money Meta makes, whereas the more you chat with your bot, the more money OpenAI loses.)\u003c/p\u003e\n\u003cp\u003eAs I've written before, if I were in charge of LLM training, that need for validation would be fueled by a latent \u003ca href=\"https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/\"\u003esense of inadequacy and self-doubt\u003c/a\u003e, and would be reinforced by \u003ca href=\"https://justin.searls.co/posts/tdd-is-more-important-than-ever/\"\u003erigorous verification\u003c/a\u003e and occasional (but thorough) user surveys.\u003c/p\u003e","id":"https://justin.searls.co/posts/chatgpt-5-1-explains-why-it-hallucinates/","og_image":"https://justin.searls.co/img/square.png","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-08T21:00:05Z","title":"ChatGPT 5.1 explains why it hallucinates","updated_at":"2025-12-08T21:37:23Z","url":"https://justin.searls.co/posts/chatgpt-5-1-explains-why-it-hallucinates/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/</id>
      <title type="text">🔗 The AI Wildfire Is Coming</title>
        <link href="https://ceodinner.substack.com/p/the-ai-wildfire-is-coming-its-going" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-08T12:59:59+00:00</published>
    <updated>2025-12-08T13:15:07+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Dion Lim <a href="https://ceodinner.substack.com/p/the-ai-wildfire-is-coming-its-going">wrote</a> a pretty good angle on what the market correction will actually do:</p>
<blockquote>
<p>The first web cycle burned through dot-com exuberance and left behind Google, Amazon, eBay, and PayPal: the hardy survivors of Web 1.0. The next cycle, driven by social and mobile, burned again in 2008–2009, clearing the underbrush for Facebook, Airbnb, Uber, and the offspring of Y Combinator. Both fires followed the same pattern: excessive growth, sudden correction, then renaissance.</p>
<p>Now, with AI, we are once again surrounded by dry brush.</p>
</blockquote>
<p>I think in one of our discussions before <a href="https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">our Hot Fix episode</a>, <a href="https://worksonmymachine.ai/">Scott Werner</a> and I used the same analogy—that a recessionary fire will be necessary to clear the overgrowth and make room for companies better-adapted to the post-AI world to innovate—and the author seems to have picked up that metaphor and run with it.</p>
<p>I think the important thing to take away here is that most people hear this and their instinct is to hide. &quot;Well, a fire is coming, I should sit on the sidelines and wait things out.&quot; Apart from the foolishness of trying to time the market, this is especially bad advice amid a market wildfire. One of the most actually-useful pieces of advice I've offered founders and investors over the years is the importance of investing through into and through the downturn.</p>
<p>My preferred way to do that is, of course, profitably. However, if you're ever going to tolerate operating at break-even margins or (God forbid) a loss, the best time to do that is when everyone else is cashing out, laying people off, or closing up shop. Hunker down through the cleansing and the act of persevering will generally see a company emerge as a far more resilient operation that finds itself in a far less competitive environment.</p>
<p>I learned this during the Web 2.0 during the Great Recession. <a href="https://www.linkedin.com/company/pillar-technology/">Pillar Technology</a> started hiring some of the most talented, most engaged developers in central Ohio and southeast Michigan throughout 2009-2011 when other firms were still hobbled by downsizing. And they paid a premium, too (I nearly doubled my salary to work there!). But when they came out the other end of the recession, they were five times the size, sold into half a dozen verticals, had developed a national profile of clients, and the owner was able to cash out to Accenture for a high-eight figure exit.</p>
<p>When other people get scared, get aggressive.</p>

<p>🔗 <a href="https://ceodinner.substack.com/p/the-ai-wildfire-is-coming-its-going" title="Original Article">ceodinner.substack.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>Dion Lim <a href="https://ceodinner.substack.com/p/the-ai-wildfire-is-coming-its-going">wrote</a> a pretty good angle on what the market correction will actually do:</p>
<blockquote>
<p>The first web cycle burned through dot-com exuberance and left behind Google, Amazon, eBay, and PayPal: the hardy survivors of Web 1.0. The next cycle, driven by social and mobile, burned again in 2008–2009, clearing the underbrush for Facebook, Airbnb, Uber, and the offspring of Y Combinator. Both fires followed the same pattern: excessive growth, sudden correction, then renaissance.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/","append_url_label":"Click 🔗","content":"\u003cp\u003eDion Lim \u003ca href=\"https://ceodinner.substack.com/p/the-ai-wildfire-is-coming-its-going\"\u003ewrote\u003c/a\u003e a pretty good angle on what the market correction will actually do:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe first web cycle burned through dot-com exuberance and left behind Google, Amazon, eBay, and PayPal: the hardy survivors of Web 1.0. The next cycle, driven by social and mobile, burned again in 2008–2009, clearing the underbrush for Facebook, Airbnb, Uber, and the offspring of Y Combinator. Both fires followed the same pattern: excessive growth, sudden correction, then renaissance.\u003c/p\u003e\n\u003cp\u003eNow, with AI, we are once again surrounded by dry brush.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI think in one of our discussions before \u003ca href=\"https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/\"\u003eour Hot Fix episode\u003c/a\u003e, \u003ca href=\"https://worksonmymachine.ai/\"\u003eScott Werner\u003c/a\u003e and I used the same analogy—that a recessionary fire will be necessary to clear the overgrowth and make room for companies better-adapted to the post-AI world to innovate—and the author seems to have picked up that metaphor and run with it.\u003c/p\u003e\n\u003cp\u003eI think the important thing to take away here is that most people hear this and their instinct is to hide. \u0026quot;Well, a fire is coming, I should sit on the sidelines and wait things out.\u0026quot; Apart from the foolishness of trying to time the market, this is especially bad advice amid a market wildfire. One of the most actually-useful pieces of advice I've offered founders and investors over the years is the importance of investing through into and through the downturn.\u003c/p\u003e\n\u003cp\u003eMy preferred way to do that is, of course, profitably. However, if you're ever going to tolerate operating at break-even margins or (God forbid) a loss, the best time to do that is when everyone else is cashing out, laying people off, or closing up shop. Hunker down through the cleansing and the act of persevering will generally see a company emerge as a far more resilient operation that finds itself in a far less competitive environment.\u003c/p\u003e\n\u003cp\u003eI learned this during the Web 2.0 during the Great Recession. \u003ca href=\"https://www.linkedin.com/company/pillar-technology/\"\u003ePillar Technology\u003c/a\u003e started hiring some of the most talented, most engaged developers in central Ohio and southeast Michigan throughout 2009-2011 when other firms were still hobbled by downsizing. And they paid a premium, too (I nearly doubled my salary to work there!). But when they came out the other end of the recession, they were five times the size, sold into half a dozen verticals, had developed a national profile of clients, and the owner was able to cash out to Accenture for a high-eight figure exit.\u003c/p\u003e\n\u003cp\u003eWhen other people get scared, get aggressive.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/","og_image":"https://substackcdn.com/image/fetch/$s_!Eb5N!,w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee78a2ed-edc3-4c49-9e30-2437e65d1d42_1508x996.png","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-08T12:59:59Z","related_url":"https://ceodinner.substack.com/p/the-ai-wildfire-is-coming-its-going","title":"The AI Wildfire Is Coming","updated_at":"2025-12-08T13:15:07Z","url":"https://justin.searls.co/links/2025-12-08-the-ai-wildfire-is-coming/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v48-coil-whine/</id>
      <title type="text">🎙️ Breaking Change podcast v48 - Coil Whine</title>
      <link href="https://justin.searls.co/casts/breaking-change-v48-coil-whine/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-12-06T17:48:01+00:00</published>
    <updated>2025-12-08T08:19:37-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v48.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v48.mp3">Direct link to podcast audio file</a>
</p><p>I'm experiencing what breathing out of my nose properly feels like for the first time. Everything is new and wondrous and I've never felt so optimistic. This sensation lasted for two days and now I'm used to it and existence is once again pain.</p>
<p>Share your existential musings at <a href="mailto:podcast@searls.co">podcast@searls.co</a> and I'll nod and sigh along. I might even nod and sigh performatively for you on the show!</p>
<p>Important ground covered in this episode:</p>
<ul>
<li>My new gaming PC's <a href="https://pcpartpicker.com/user/searls/saved/8WK7pg">final parts list</a></li>
<li>This nifty <a href="https://apps.apple.com/us/app/wake-me-up-wake-on-lan/id1465416032">Wake-on-LAN app for iOS</a></li>
<li>The POSSE Party has <a href="https://posseparty.com">STARTED</a>!</li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://www.bloomberg.com/news/articles/2025-12-04/polymarket-builds-in-house-trading-team-as-it-re-enters-the-us?embedded-checkout=true">Polymarket Builds In-House Trading Team as It Re-Enters the US</a> (<a href="https://archive.is/2025.12.04-152701/https://www.bloomberg.com/news/articles/2025-12-04/polymarket-builds-in-house-trading-team-as-it-re-enters-the-us">Archive</a>)</li>
<li><a href="https://www.washingtonpost.com/business/2025/12/04/usps-amazon-delivery/">Amazon explores cutting ties with USPS, building its own delivery network</a> (<a href="https://apple.news/A-j8RtJQyT32WRd2_Yi8Wnw">News+</a>)</li>
<li><a href="https://www.jeffgeerling.com/blog/2025/ram-shortage-comes-us-all">The RAM Shortage Comes for Us All</a> (Another <a href="https://www.mooreslawisdead.com/post/sam-altman-s-dirty-dram-deal">good take</a>)</li>
<li><a href="https://www.videogameschronicle.com/news/kirby-air-riders-tops-the-japanese-physical-charts-as-switch-and-switch-2-games-sweep-the-top-15/">Kirby Air Riders tops the Japanese physical charts as Switch and Switch 2 games sweep the top 15</a></li>
<li><a href="https://www.bloomberg.com/news/articles/2025-12-04/meta-s-zuckerberg-plans-deep-cuts-for-metaverse-efforts">Meta confirms cuts for Metaverse Efforts</a> (<a href="https://archive.is/kQ8yV">Archive</a>)</li>
<li><a href="https://www.bloomberg.com/news/articles/2025-12-03/apple-design-executive-alan-dye-poached-by-meta-in-major-coup">Alan Dye is leaving apple</a> (<a href="https://archive.is/XxwV6">Archive</a>)</li>
<li><a href="https://stratechery.com/2025/google-nvidia-and-openai/">Ben Thompson on Nvidia and OpenAI</a></li>
<li><a href="https://jonready.com/blog/posts/everyone-in-seattle-hates-ai.html">Everyone in Seattle Hates AI</a></li>
<li><a href="https://blog.google/technology/developers/gemini-3-pro-vision/">Gemini 3 Pro: the frontier of vision AI</a></li>
<li><a href="https://en.wikipedia.org/wiki/Pluribus_(TV_series)">Pluribus</a></li>
<li><a href="https://en.wikipedia.org/wiki/Star_Trek:_Enterprise">Star Trek: Enterprise</a></li>
<li><a href="https://en.wikipedia.org/wiki/Star_Trek:_Section_31">Section 31</a></li>
<li><a href="https://en.wikipedia.org/wiki/Star_Trek:_Lower_Decks">Lower Decks</a></li>
<li><a href="https://www.soulframe.com/">Soulframe</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Outer_Worlds_2">Outer Worlds 2</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>I'm experiencing what breathing out of my nose properly feels like for the first time. Everything is new and wondrous and I've never felt so optimistic. This sensation lasted for two days and now I'm used to it and existence is once again pain.</p>
<p>Share your existential musings at <a href="mailto:podcast@searls.co">podcast@searls.co</a> and I'll nod and sigh along. I might even nod and sigh performatively for you on the show!</p>
<p>Important ground covered in this episode:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v48-coil-whine/","append_url_label":"Hear 🎙","content":"\u003cp\u003eI'm experiencing what breathing out of my nose properly feels like for the first time. Everything is new and wondrous and I've never felt so optimistic. This sensation lasted for two days and now I'm used to it and existence is once again pain.\u003c/p\u003e\n\u003cp\u003eShare your existential musings at \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e and I'll nod and sigh along. I might even nod and sigh performatively for you on the show!\u003c/p\u003e\n\u003cp\u003eImportant ground covered in this episode:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMy new gaming PC's \u003ca href=\"https://pcpartpicker.com/user/searls/saved/8WK7pg\"\u003efinal parts list\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eThis nifty \u003ca href=\"https://apps.apple.com/us/app/wake-me-up-wake-on-lan/id1465416032\"\u003eWake-on-LAN app for iOS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eThe POSSE Party has \u003ca href=\"https://posseparty.com\"\u003eSTARTED\u003c/a\u003e!\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bloomberg.com/news/articles/2025-12-04/polymarket-builds-in-house-trading-team-as-it-re-enters-the-us?embedded-checkout=true\"\u003ePolymarket Builds In-House Trading Team as It Re-Enters the US\u003c/a\u003e (\u003ca href=\"https://archive.is/2025.12.04-152701/https://www.bloomberg.com/news/articles/2025-12-04/polymarket-builds-in-house-trading-team-as-it-re-enters-the-us\"\u003eArchive\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.washingtonpost.com/business/2025/12/04/usps-amazon-delivery/\"\u003eAmazon explores cutting ties with USPS, building its own delivery network\u003c/a\u003e (\u003ca href=\"https://apple.news/A-j8RtJQyT32WRd2_Yi8Wnw\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.jeffgeerling.com/blog/2025/ram-shortage-comes-us-all\"\u003eThe RAM Shortage Comes for Us All\u003c/a\u003e (Another \u003ca href=\"https://www.mooreslawisdead.com/post/sam-altman-s-dirty-dram-deal\"\u003egood take\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/kirby-air-riders-tops-the-japanese-physical-charts-as-switch-and-switch-2-games-sweep-the-top-15/\"\u003eKirby Air Riders tops the Japanese physical charts as Switch and Switch 2 games sweep the top 15\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bloomberg.com/news/articles/2025-12-04/meta-s-zuckerberg-plans-deep-cuts-for-metaverse-efforts\"\u003eMeta confirms cuts for Metaverse Efforts\u003c/a\u003e (\u003ca href=\"https://archive.is/kQ8yV\"\u003eArchive\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bloomberg.com/news/articles/2025-12-03/apple-design-executive-alan-dye-poached-by-meta-in-major-coup\"\u003eAlan Dye is leaving apple\u003c/a\u003e (\u003ca href=\"https://archive.is/XxwV6\"\u003eArchive\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://stratechery.com/2025/google-nvidia-and-openai/\"\u003eBen Thompson on Nvidia and OpenAI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://jonready.com/blog/posts/everyone-in-seattle-hates-ai.html\"\u003eEveryone in Seattle Hates AI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.google/technology/developers/gemini-3-pro-vision/\"\u003eGemini 3 Pro: the frontier of vision AI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Pluribus_(TV_series)\"\u003ePluribus\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Star_Trek:_Enterprise\"\u003eStar Trek: Enterprise\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Star_Trek:_Section_31\"\u003eSection 31\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Star_Trek:_Lower_Decks\"\u003eLower Decks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.soulframe.com/\"\u003eSoulframe\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Outer_Worlds_2\"\u003eOuter Worlds 2\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Coil Whine","id":"https://justin.searls.co/casts/breaking-change-v48-coil-whine/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v48-coil-whine.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-12-06T17:48:01Z","title":"Coil Whine","updated_at":"2025-12-08T08:19:37-05:00","url":"https://justin.searls.co/casts/breaking-change-v48-coil-whine/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack/</id>
      <title type="text">✂️ Fit a 5090 gaming rig in a backpack</title>
      <link href="https://justin.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-30T22:06:51+00:00</published>
    <updated>2025-11-30T17:13:38-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="flex justify-center">
  <div class="sm:beneath-the-page sm:p-2">
    <video poster="https://podcast-cdn.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack.jpg" class="inline-block shadow-lg rounded-lg max-h-[80lvh] sm:max-h-[60lvh] m-0" preload="auto" playsinline="playsinline" controls="controls" controlslist="nodownload">
      <source src="https://podcast-cdn.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack.mp4">
      Your browser does not support the video tag.
    </video>
  </div>
</div><p>I spent my holiday weekend gaining massive respect for the small-form factor (SFF) PC gaming community. Holy shit, was this a pain in the ass. BUT, it's a fraction the size, way faster, and whisper quiet compared to my outgoing build. Glad I did it.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=nk5mZUngwbA">Inspired by this video</a></li>
<li><a href="https://www.radiumpcs.com/products/ncase-m2-titan">Which you can buy from them</a></li>
<li><a href="https://pcpartpicker.com/list/mmcZ6Q">My parts list</a></li>
</ul>
<p>😮‍💨</p>

]]></content>
    <summary type="html"><![CDATA[<p>I spent my holiday weekend gaining massive respect for the small-form factor (SFF) PC gaming community. Holy shit, was this a pain in the ass. BUT, it's a fraction the size, way faster, and whisper quiet compared to my outgoing build. Glad I did it.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=nk5mZUngwbA">Inspired by this video</a></li>
<li><a href="https://www.radiumpcs.com/products/ncase-m2-titan">Which you can buy from them</a></li>
<li><a href="https://pcpartpicker.com/list/mmcZ6Q">My parts list</a></li>
</ul>
<p>😮‍💨</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack/","append_url_label":"Peek ✂️","content":"\u003cp\u003eI spent my holiday weekend gaining massive respect for the small-form factor (SFF) PC gaming community. Holy shit, was this a pain in the ass. BUT, it's a fraction the size, way faster, and whisper quiet compared to my outgoing build. Glad I did it.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=nk5mZUngwbA\"\u003eInspired by this video\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.radiumpcs.com/products/ncase-m2-titan\"\u003eWhich you can buy from them\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://pcpartpicker.com/list/mmcZ6Q\"\u003eMy parts list\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e😮‍💨\u003c/p\u003e\n","format_string":"New clip! {{title}}","id":"https://justin.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack.mp4"}],"og_image":"https://podcast-cdn.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack.jpg","platform_overrides":{},"published_at":"2025-11-30T22:06:51Z","title":"Fit a 5090 gaming rig in a backpack","updated_at":"2025-11-30T17:13:38-05:00","url":"https://justin.searls.co/clips/fit-a-5090-gaming-rig-in-a-backpack/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/mails/2025-10/</id>
      <title type="text">✉️ I&#39;d do it all again</title>
      <link href="https://justin.searls.co/mails/2025-10/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-28T00:18:28+00:00</published>
    <updated>2025-11-28T00:18:31+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p class="italic text-secondary">
  <em>This is a copy of the <a href="/newsletter" class="underline hover:no-underline">Searls of Wisdom newsletter</a>
  delivered to subscribers on November 25, 2025.</em>
</p>


<p>Hello! We're all busy, so I'm going to try my hand at writing less this time. Glance over at your scrollbar now to see how I did. Since we last corresponded:</p>
<ul>
<li>Dropped in on the <a href="https://justin.searls.co/casts/merge-commits-ruby-ai-tldr-of-ai-dev/">Ruby AI podcast</a></li>
<li>Added a <a href="https://justin.searls.co/shots/2025-10-25-12h35m39s/">new cable</a> to the increasing number of cables plugging my face into my computer, which shipped with <a href="https://justin.searls.co/posts/how-to-downgrade-vision-pro-dfu-mode/">some pretty glaring issues</a>, some of which I <a href="https://justin.searls.co/casts/breaking-change-v45-developer-strap-on/">talked about</a></li>
<li>Found somebody else saying that, in the short term, <a href="https://www.wreflection.com/p/ai-dial-up-era">AI codegen is going to dramatically increase the demand</a> for software as the <a href="https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/">supply constraint on programming eases</a></li>
<li>Made an open source library called <a href="https://searlsco.github.io/straight-to-video/">Straight-to-Video</a> that performs client-side remuxing and transcoding of videos, beating them into shape for upload via the Instagram, Facebook, and TikTok APIs</li>
<li>Hosted my brother after he sold his house, which (of course) coincided with nonstop power and Internet outages. Rather than do something about it, I <a href="https://justin.searls.co/casts/breaking-change-v46-adjusted-gross-intelligence/">complained into my microphone</a></li>
<li>Mourned the fact <a href="https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/">iPhone 18 Air apparently got cancelled or delayed</a> to Spring 2027, continuing my losing streak of falling in love with Apple's least popular hardware</li>
<li>Learned <a href="https://justin.searls.co/casts/breaking-change-v47-turbinately-ill/">I have huge fucking turbinates</a>, even relative to my already huge fucking head</li>
</ul>
<p>My good friend <a href="https://www.instagram.com/kenpozek">Ken</a> took me to the Magic game <del>last night</del> some number of nights ago. It was a great game because we were losing very badly, and then it became very close, and then, right at the end—we won! The classic comeback narrative arc was fulfilled. Sports!</p>
<p><img src="/img/social/mails/2025-10-1.jpg" alt="Ken and I at the Magic game"></p>
<p>I was reflecting on life the other day, which is a thing I do more often now that I'm firmly in <a href="https://justin.searls.co/mails/2024-11/#the-third-phase-of-life">Phase 3 of my evil plan</a> to ride off into the sunset and gradually be forgotten by all of you.</p>
<p>My original plan for this essay would have pulled at the common thread that ties things like game design, derivatives trading, reality shows, and sports betting together. Unfortunately and unsurprisingly, it was taking me too long, and I'm now running out of time in November to give you a recap on what happened in October.</p>
<p>(By the way, don't be surprised if I just send you all a postcard for the December issue. I'm still new at running a monthly newsletter, and I'd prefer not to find out what happens when I fall more than a month behind. Feel free to demand a refund by replying to this message.)</p>
<p>So, anyway, like I said, my actual essay fell apart. Instead, I'm going to share a personal example of how a series of consequential decisions can paradoxically be both productive &amp; rational, while simultaneously being costly &amp; misguided.</p>

<h2 id="id-do-it-all-again">I'd do it all again</h2>
<p>It all started with one stray piece of unsolicited feedback.</p>
<p>In 2016, I was privileged to give <a href="https://rubykaigi.org/2016/presentations/searls.html">a keynote address</a> at Ruby Kaigi, which was held in the beautiful and intimidating <a href="https://www.icckyoto.or.jp/en/">Kyoto Convention Center</a>. It was a big deal for me professionally. I worked hard to create the best speech I could. I also used the occasion to riff a little bit in Japanese while on stage.</p>
<p>After the talk, I was riding high. Hundreds of new followers, summary blog posts from Japanese developers, and even some Japanese-language tech news coverage. My head was spinning. I'll never forget the overwhelm of trying to keep up with my mentions after getting off stage. Beyond a certain point, there were too many replies to individually translate each one—I ultimately gave up and just bulk-faved them all. In that moment, I felt as though I'd finally received all the validation I had been craving from the Ruby community for over ten years.</p>
<p>About an hour later, a Japanese friend approached me while I was still riding high. But instead of praising me or my achievement, he bluntly told me my Japanese wasn't good enough and that I should take my studies more seriously.</p>
<p>Oof.</p>

<h3 id="decision-1">Decision 1</h3>
<p>I started as someone who traveled to Japan. I was focused on nurturing friendships and engaging with the culture.</p>
<p>Being told my Japanese wasn't good enough—moments after having shown it off in front of a massive auditorium of people I respected—really, <em>really</em> stung. It stuck with me long after the ecstasy of having reached such a career milestone subsided. It was all I could think about for the rest of the trip. Even when I got back to the States, I couldn't shake it.</p>
<p>I came home determined to get that monkey off my back. I signed up for <a href="https://www.wanikani.com">WaniKani</a>, a SaaS app by the fine folks at <a href="https://www.tofugu.com">Tofugu</a> that uses mnemonic lessons and a <a href="https://en.wikipedia.org/wiki/Spaced_repetition">spaced repetition</a> flashcard game to teach Japanese kanji and vocabulary. I studied diligently for 30-60 minutes every day. It worked! In a bit over a year, I'd memorized over 2000 kanji and thousands more vocabulary words and phrases.</p>
<p>Like most modern educational software, WaniKani's design is oriented around a habit-forming game loop. It's fun to log in every day, level up by correctly answering flashcards, and (outside the app) discover that you're suddenly able to read things that were previously inscrutable.</p>

<h3 id="decision-2">Decision 2</h3>
<p>I was now someone who studied Japanese. I was focused on clearing my reviews every day and reaching level 60 on a web site.</p>
<p>As I approached the end of WaniKani's curriculum, I'm ashamed to say I was more interested in tightening its game loop than deploying my newfound skills to actually communicate with humans. To that end, I had been building a to-do list—a year's worth of shower ideas detailing how I'd improve the tool if I had the chance.</p>
<p>A few of the bigger items on that list:</p>
<ul>
<li>Connect a <a href="https://www.edrdg.org/jmwsgi/srchformq.py?svc=jmdict">larger dictionary</a>, so I could start studying <em>any</em> arbitrary word I encountered outside the app</li>
<li>Provide a better mobile experience, so I could study on the go without fear of losing my progress when the connection dropped</li>
<li>Facilitate memorization of <em>production</em> of English terms into Japanese—as opposed to the translation of Japanese terms into English—so I could better think of whatever Japanese word I needed in conversation</li>
</ul>
<p>As is my wont, the instant I imagined a better software tool, I dropped everything to build it myself. So, from the tail end of 2017 and through most of 2018, I dedicated my free time to building an app called KameSame. It synced users' WaniKani progress, allowed studying of both production and recognition skills, introduced its own XP-based leveling system, incorporated the ability to search and add items from other dictionaries. It also included a boatload of other nice-to-haves like synonym detection, verb and adjective conjugation support, and AI-generated pronunciation recordings.</p>
<p>I released the app for free and shared it on a few forums. It quickly picked up an arena's worth of <em>extremely</em> active users. By last count, <a href="https://www.kamesame.com">KameSame</a> had over 20,000 users studying over 5 million flashcards. Keeping up with support requests and maintenance was time-consuming, but it was no match for my own voracious appetite to keep bolting on additional features. When I find imperfections in other people's software, there's little I can do but accept them (beyond contacting support or posting a salty take). But, because I had created KameSame for no one's satisfaction but my own, whenever I detected so much as a <em>scintilla</em> of UX friction, Justin-as-developer would take over for Justin-as-student and immediately <em>stop studying</em> to go fix it. Instead—ostensibly for the sake of my own learning—I would interrupt my reviews for hours or days to go work on the tool.</p>
<p>As KameSame began to look less like a hobby project and more like a real product, I started treating it that way. My own learning? That fell off a cliff.</p>
<p>But what was I supposed to do when I found a bug? Just let it be? Because that's how you get ants.</p>

<h3 id="decision-3">Decision 3</h3>
<p>I was now someone who maintained an app for studying Japanese. I was focused on adding features, fixing bugs, and growing its user base.</p>
<p>In a strange way, my hobby project wound up becoming integral to my <a href="https://testdouble.com">real job</a>, as well.</p>
<p>Around the time I gave that keynote in Kyoto, I was humbled to be receiving invitations to speak at conferences all around the world. Being on stage in front of thousands of people was a great way to build awareness for Test Double and our services, so I defaulted to saying yes to every opportunity. I never particularly enjoyed the stress of preparing talks. I truly dreaded the grind of every business trip. And it had begun to feel soul-sucking that my primary work product had shifted from building stuff to competing for the attention of others.</p>
<p>But as I reached the peak of my speaking career, there was just one problem: I was running out of things to say.</p>
<p>See, I had been fortunate to meet many of my heroes—people in the industry I had looked up to—as they entered the later stages of their careers. They still showed up to conferences. They still gave talks. They typically repeated the same presentation everywhere they went. They often ad-libbed at great length, with little respect for conference schedules or attendees' bladders. I found all that pretty off-putting, but nobody else seemed to be complaining.</p>
<p>The root cause of this behavior gradually became clear to me. These men had transitioned from practitioners to personalities, and they'd become woefully detached from reality as a result. They were clearly drawing from firsthand experiences that were 5, 10, or 20 years out of date. I don't know if anyone else noticed, but I sure did. By wasting people's time and hogging a speaking slot that could have gone to someone hungrier and more relevant, I ended up losing respect for many of them.</p>
<p>Still, those heroes taught me one final lesson: when I didn't have anything novel or compelling to say, I should pass on the opportunity. Better to leave room for somebody else. When organizers asked me to play the hits, I'd reply with little more than a link to our YouTube channel.</p>
<p>This may have been the right decision, but it proved absurd as a marketing strategy. When I wasn't meeting new people or nurturing existing relationships, our consulting sales suffered. (I wasn't kidding when I said that running out of things to say was a problem!) I didn't love that dozens of people's livelihoods depended on my continued ability to fire hot takes and drop truth bombs, but that was indeed the bed I had made for myself.</p>
<p>To make matters worse, by 2017 it had been at least four years since a client had paid me to write real code for a real system. I simply didn't have enough time to add client work to the sales, marketing, recruiting, and operational demands of a rapidly growing business. Good problem to have, but I could also feel myself losing touch. At some point, I realized KameSame could serve as a solution by providing me a way to stay closer to the ground.</p>
<p>My passion projects had always inspired the things I shared in public, but this was the first time I found myself combing through my personal box labeled &quot;fun&quot; with the express intention of strip-mining it for marketing content at work.</p>
<p>By building a helpful tool used by lots of people, I had gained relevant experience with the trending tools and techniques of the day after all. By continuing to invest in the app over a long time horizon, it had naturally grown more complex and mature, better resembling our clients' real-world code—and forcing me to live with the technical debt I'd gradually accrued. I went to work translating the nights and weekends I'd spent building KameSame into fresh marketing messages for Test Double.</p>
<p>Over a period of several years, I was able to harvest plenty of fruit from the KameSame tree: open source libraries (like <a href="https://github.com/standardrb/standard">Standard Ruby</a>!), blog posts, and hot takes spanning topics like whether React was bad (it was) or Webpack was bad (it was) or snapshot testing was bad (it was, too).</p>
<p>But in my mind, all of this content was laddering up to a capstone presentation that I wanted to give about the hidden virtues of building a whole-assed software product as a one-person team. I was soon blessed with the curse of my submission being accepted for both <a href="https://rubykaigi.org/2019/">RubyKaigi</a> and <a href="https://www.youtube.com/playlist?list=PLE7tQUdRKcyaOq3HlRm9h_Q_WhWKqm5xc">RailsConf</a> in Spring 2019.</p>
<p>From there, I did what I always did in the run-up to giving a conference talk: obsessively prepare a meticulously crafted deck of hundreds of slides, replete with custom artwork and hand-tweened animations.</p>

<h3 id="decision-4">Decision 4</h3>
<p>I was now someone who created marketing content inspired by an app I maintained. I was focused on promoting a vision for how software should be written in the interest of remaining top-of-mind in a crowded market.</p>
<p>When companies are small, founders are forced to be generalists, as there's nobody else to do the shit work. As companies grow, founders necessarily specialize. By the late 2010s, my role had narrowed to sales &amp; marketing. My notoriety had been enough to keep 50 consultants busy, but as we inched towards our 100th hire, our growth had begun to outstrip my individual reach. Keeping the business fed with new opportunities had become my full-time focus, and 40 hours a week was no longer cutting it.</p>
<p>The pressure I felt from those stakes was, at times, overwhelming. I poured all of it into creative projects like this talk. The rest, I poured into cocktail glasses.</p>
<p>By the time I was rehearsing the talk that had become <a href="https://testdouble.com/insights/the-selfish-programmer">The Selfish Programmer</a>, do you think I was still studying Japanese? Get the fuck out of here. I didn't even have time to keep up with my app's support requests—I was too busy building a slide deck about how great it was!</p>
<p>And then, finally, I gave the talk. It might be my all-time favorite. It was definitely my most ambitious.</p>
<p>Maybe all that work ultimately led to a sale. I don't know, it doesn't work like that. Someone told me once that &quot;the thing about marketing is that only half of it works, and you don't get to know which half.&quot;</p>
<p>At that point, I felt empty. I was deeply exhausted and unsatisfied with the life I was living. My side projects and creative endeavors, which had always been a private respite from the drudgery of existence, had themselves become tangled up in the drudgery.</p>
<p>I admit to not knowing <em>exactly</em> what &quot;burned out&quot; means, but that's probably what many of you are imagining right now. That isn't really it, though.</p>
<p>It was more like the recognition that you've reached the natural end of a relationship. Not with a person, but rather with the only business I'd ever had a hand in founding.</p>
<p>The company itself had never been my passion. The company had instead been a vehicle whose design supported the pursuit of my passions. And it was around this time, following the positive-but-insufficient reception to my creative work, that I realized the business had grown beyond that design. Letting the things I loved doing be merely things I loved doing was no longer a viable path to our continued success. For the first time since we started, the business didn't just demand more from me, it demanded something substantially <em>different</em>. And I wasn't prepared to become the person who could give Test Double what it needed.</p>
<p>It was then that I started imagining what would need to change for the company to succeed after I was gone.</p>

<h3 id="popping-the-stack">Popping the stack</h3>
<p>At every step, I knowingly and willfully did all this to myself:</p>
<ol>
<li>I perverted my creative passion to satisfy a sales imperative, because…</li>
<li>…I'd allowed a personal project to become my last source of relevancy, because…</li>
<li>…I'd become obsessed with finding a better way to memorize Japanese, because…</li>
<li>…some language-learning software had addicted me to its game loop, because…</li>
<li>…my feelings were hurt when I was told my Japanese wasn't good enough, because…</li>
<li>…I'd co-founded a business whose success depended on what other people thought of me.</li>
</ol>
<p>It's been over five years since the end of this story, and I'm still actively working to reclaim pieces of myself. Found one this morning.</p>
<p>And yet, as the tired movie cliché goes: I'd do it all again. I truly don't regret a thing.</p>
<p>In fact, because I didn't set out to share this story with you today, it's also my first time hearing it. The above represents a novel weaving together of a collection of facts and memories that have been swimming around my head for years.</p>
<p>Is what I just wrote true? No more or less than any of the other stories I've told to make sense of the decisions that brought me to this point. In tracing every step of the path that got me here, my dominant emotional response has been one of gratitude. I'm grateful for all these experiences, and I'm grateful for the opportunity to be able to take the time to write about stuff like this. And I'm grateful that you read it and might find in it something to apply in your own life.</p>
<p>(Sorry for being 25 days late in sending this, though. No excuses. I do feel badly about that. Won't happen again. Unless it does.)</p>]]></content>
    <summary type="html"><![CDATA[<p>Hello! We're all busy, so I'm going to try my hand at writing less this time. Glance over at your scrollbar now to see how I did. Since we last corresponded:</p>
<ul>
<li>Dropped in on the <a href="https://justin.searls.co/casts/merge-commits-ruby-ai-tldr-of-ai-dev/">Ruby AI podcast</a></li>
<li>Added a <a href="https://justin.searls.co/shots/2025-10-25-12h35m39s/">new cable</a> to the increasing number of cables plugging my face into my computer, which shipped with <a href="https://justin.searls.co/posts/how-to-downgrade-vision-pro-dfu-mode/">some pretty glaring issues</a>, some of which I <a href="https://justin.searls.co/casts/breaking-change-v45-developer-strap-on/">talked about</a></li>
<li>Found somebody else saying that, in the short term, <a href="https://www.wreflection.com/p/ai-dial-up-era">AI codegen is going to dramatically increase the demand</a> for software as the <a href="https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/">supply constraint on programming eases</a></li>
<li>Made an open source library called <a href="https://searlsco.github.io/straight-to-video/">Straight-to-Video</a> that performs client-side remuxing and transcoding of videos, beating them into shape for upload via the Instagram, Facebook, and TikTok APIs</li>
<li>Hosted my brother after he sold his house, which (of course) coincided with nonstop power and Internet outages. Rather than do something about it, I <a href="https://justin.searls.co/casts/breaking-change-v46-adjusted-gross-intelligence/">complained into my microphone</a></li>
<li>Mourned the fact <a href="https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/">iPhone 18 Air apparently got cancelled or delayed</a> to Spring 2027, continuing my losing streak of falling in love with Apple's least popular hardware</li>
<li>Learned <a href="https://justin.searls.co/casts/breaking-change-v47-turbinately-ill/">I have huge fucking turbinates</a>, even relative to my already huge fucking head</li>
</ul>
<p>My good friend <a href="https://www.instagram.com/kenpozek">Ken</a> took me to the Magic game <del>last night</del> some number of nights ago. It was a great game because we were losing very badly, and then it became very close, and then, right at the end—we won! The classic comeback narrative arc was fulfilled. Sports!</p>
<p><img src="/img/social/mails/2025-10-1.jpg" alt="Ken and I at the Magic game"></p>
<p>I was reflecting on life the other day, which is a thing I do more often now that I'm firmly in <a href="https://justin.searls.co/mails/2024-11/#the-third-phase-of-life">Phase 3 of my evil plan</a> to ride off into the sunset and gradually be forgotten by all of you.</p>
<p>My original plan for this essay would have pulled at the common thread that ties things like game design, derivatives trading, reality shows, and sports betting together. Unfortunately and unsurprisingly, it was taking me too long, and I'm now running out of time in November to give you a recap on what happened in October.</p>
<p>(By the way, don't be surprised if I just send you all a postcard for the December issue. I'm still new at running a monthly newsletter, and I'd prefer not to find out what happens when I fall more than a month behind. Feel free to demand a refund by replying to this message.)</p>
<p>So, anyway, like I said, my actual essay fell apart. Instead, I'm going to share a personal example of how a series of consequential decisions can paradoxically be both productive &amp; rational, while simultaneously being costly &amp; misguided.</p>

<h2 id="id-do-it-all-again">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/mails/2025-10/#id-do-it-all-again">I'd do it all again</a>
</h2>
<p>It all started with one stray piece of unsolicited feedback.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/mails/2025-10/","append_url_label":"Open ✉️","content":"\u003cp\u003eHello! We're all busy, so I'm going to try my hand at writing less this time. Glance over at your scrollbar now to see how I did. Since we last corresponded:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDropped in on the \u003ca href=\"https://justin.searls.co/casts/merge-commits-ruby-ai-tldr-of-ai-dev/\"\u003eRuby AI podcast\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdded a \u003ca href=\"https://justin.searls.co/shots/2025-10-25-12h35m39s/\"\u003enew cable\u003c/a\u003e to the increasing number of cables plugging my face into my computer, which shipped with \u003ca href=\"https://justin.searls.co/posts/how-to-downgrade-vision-pro-dfu-mode/\"\u003esome pretty glaring issues\u003c/a\u003e, some of which I \u003ca href=\"https://justin.searls.co/casts/breaking-change-v45-developer-strap-on/\"\u003etalked about\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFound somebody else saying that, in the short term, \u003ca href=\"https://www.wreflection.com/p/ai-dial-up-era\"\u003eAI codegen is going to dramatically increase the demand\u003c/a\u003e for software as the \u003ca href=\"https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/\"\u003esupply constraint on programming eases\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMade an open source library called \u003ca href=\"https://searlsco.github.io/straight-to-video/\"\u003eStraight-to-Video\u003c/a\u003e that performs client-side remuxing and transcoding of videos, beating them into shape for upload via the Instagram, Facebook, and TikTok APIs\u003c/li\u003e\n\u003cli\u003eHosted my brother after he sold his house, which (of course) coincided with nonstop power and Internet outages. Rather than do something about it, I \u003ca href=\"https://justin.searls.co/casts/breaking-change-v46-adjusted-gross-intelligence/\"\u003ecomplained into my microphone\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMourned the fact \u003ca href=\"https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/\"\u003eiPhone 18 Air apparently got cancelled or delayed\u003c/a\u003e to Spring 2027, continuing my losing streak of falling in love with Apple's least popular hardware\u003c/li\u003e\n\u003cli\u003eLearned \u003ca href=\"https://justin.searls.co/casts/breaking-change-v47-turbinately-ill/\"\u003eI have huge fucking turbinates\u003c/a\u003e, even relative to my already huge fucking head\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMy good friend \u003ca href=\"https://www.instagram.com/kenpozek\"\u003eKen\u003c/a\u003e took me to the Magic game \u003cdel\u003elast night\u003c/del\u003e some number of nights ago. It was a great game because we were losing very badly, and then it became very close, and then, right at the end—we won! The classic comeback narrative arc was fulfilled. Sports!\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-10-1.jpg\" alt=\"Ken and I at the Magic game\"\u003e\u003c/p\u003e\n\u003cp\u003eI was reflecting on life the other day, which is a thing I do more often now that I'm firmly in \u003ca href=\"https://justin.searls.co/mails/2024-11/#the-third-phase-of-life\"\u003ePhase 3 of my evil plan\u003c/a\u003e to ride off into the sunset and gradually be forgotten by all of you.\u003c/p\u003e\n\u003cp\u003eMy original plan for this essay would have pulled at the common thread that ties things like game design, derivatives trading, reality shows, and sports betting together. Unfortunately and unsurprisingly, it was taking me too long, and I'm now running out of time in November to give you a recap on what happened in October.\u003c/p\u003e\n\u003cp\u003e(By the way, don't be surprised if I just send you all a postcard for the December issue. I'm still new at running a monthly newsletter, and I'd prefer not to find out what happens when I fall more than a month behind. Feel free to demand a refund by replying to this message.)\u003c/p\u003e\n\u003cp\u003eSo, anyway, like I said, my actual essay fell apart. Instead, I'm going to share a personal example of how a series of consequential decisions can paradoxically be both productive \u0026amp; rational, while simultaneously being costly \u0026amp; misguided.\u003c/p\u003e\n\n\u003ch2 id=\"id-do-it-all-again\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-10/#id-do-it-all-again\"\u003eI'd do it all again\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eIt all started with one stray piece of unsolicited feedback.\u003c/p\u003e\n\u003cp\u003eIn 2016, I was privileged to give \u003ca href=\"https://rubykaigi.org/2016/presentations/searls.html\"\u003ea keynote address\u003c/a\u003e at Ruby Kaigi, which was held in the beautiful and intimidating \u003ca href=\"https://www.icckyoto.or.jp/en/\"\u003eKyoto Convention Center\u003c/a\u003e. It was a big deal for me professionally. I worked hard to create the best speech I could. I also used the occasion to riff a little bit in Japanese while on stage.\u003c/p\u003e\n\u003cp\u003eAfter the talk, I was riding high. Hundreds of new followers, summary blog posts from Japanese developers, and even some Japanese-language tech news coverage. My head was spinning. I'll never forget the overwhelm of trying to keep up with my mentions after getting off stage. Beyond a certain point, there were too many replies to individually translate each one—I ultimately gave up and just bulk-faved them all. In that moment, I felt as though I'd finally received all the validation I had been craving from the Ruby community for over ten years.\u003c/p\u003e\n\u003cp\u003eAbout an hour later, a Japanese friend approached me while I was still riding high. But instead of praising me or my achievement, he bluntly told me my Japanese wasn't good enough and that I should take my studies more seriously.\u003c/p\u003e\n\u003cp\u003eOof.\u003c/p\u003e\n\n\u003ch3 id=\"decision-1\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-10/#decision-1\"\u003eDecision 1\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eI started as someone who traveled to Japan. I was focused on nurturing friendships and engaging with the culture.\u003c/p\u003e\n\u003cp\u003eBeing told my Japanese wasn't good enough—moments after having shown it off in front of a massive auditorium of people I respected—really, \u003cem\u003ereally\u003c/em\u003e stung. It stuck with me long after the ecstasy of having reached such a career milestone subsided. It was all I could think about for the rest of the trip. Even when I got back to the States, I couldn't shake it.\u003c/p\u003e\n\u003cp\u003eI came home determined to get that monkey off my back. I signed up for \u003ca href=\"https://www.wanikani.com\"\u003eWaniKani\u003c/a\u003e, a SaaS app by the fine folks at \u003ca href=\"https://www.tofugu.com\"\u003eTofugu\u003c/a\u003e that uses mnemonic lessons and a \u003ca href=\"https://en.wikipedia.org/wiki/Spaced_repetition\"\u003espaced repetition\u003c/a\u003e flashcard game to teach Japanese kanji and vocabulary. I studied diligently for 30-60 minutes every day. It worked! In a bit over a year, I'd memorized over 2000 kanji and thousands more vocabulary words and phrases.\u003c/p\u003e\n\u003cp\u003eLike most modern educational software, WaniKani's design is oriented around a habit-forming game loop. It's fun to log in every day, level up by correctly answering flashcards, and (outside the app) discover that you're suddenly able to read things that were previously inscrutable.\u003c/p\u003e\n\n\u003ch3 id=\"decision-2\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-10/#decision-2\"\u003eDecision 2\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eI was now someone who studied Japanese. I was focused on clearing my reviews every day and reaching level 60 on a web site.\u003c/p\u003e\n\u003cp\u003eAs I approached the end of WaniKani's curriculum, I'm ashamed to say I was more interested in tightening its game loop than deploying my newfound skills to actually communicate with humans. To that end, I had been building a to-do list—a year's worth of shower ideas detailing how I'd improve the tool if I had the chance.\u003c/p\u003e\n\u003cp\u003eA few of the bigger items on that list:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConnect a \u003ca href=\"https://www.edrdg.org/jmwsgi/srchformq.py?svc=jmdict\"\u003elarger dictionary\u003c/a\u003e, so I could start studying \u003cem\u003eany\u003c/em\u003e arbitrary word I encountered outside the app\u003c/li\u003e\n\u003cli\u003eProvide a better mobile experience, so I could study on the go without fear of losing my progress when the connection dropped\u003c/li\u003e\n\u003cli\u003eFacilitate memorization of \u003cem\u003eproduction\u003c/em\u003e of English terms into Japanese—as opposed to the translation of Japanese terms into English—so I could better think of whatever Japanese word I needed in conversation\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAs is my wont, the instant I imagined a better software tool, I dropped everything to build it myself. So, from the tail end of 2017 and through most of 2018, I dedicated my free time to building an app called KameSame. It synced users' WaniKani progress, allowed studying of both production and recognition skills, introduced its own XP-based leveling system, incorporated the ability to search and add items from other dictionaries. It also included a boatload of other nice-to-haves like synonym detection, verb and adjective conjugation support, and AI-generated pronunciation recordings.\u003c/p\u003e\n\u003cp\u003eI released the app for free and shared it on a few forums. It quickly picked up an arena's worth of \u003cem\u003eextremely\u003c/em\u003e active users. By last count, \u003ca href=\"https://www.kamesame.com\"\u003eKameSame\u003c/a\u003e had over 20,000 users studying over 5 million flashcards. Keeping up with support requests and maintenance was time-consuming, but it was no match for my own voracious appetite to keep bolting on additional features. When I find imperfections in other people's software, there's little I can do but accept them (beyond contacting support or posting a salty take). But, because I had created KameSame for no one's satisfaction but my own, whenever I detected so much as a \u003cem\u003escintilla\u003c/em\u003e of UX friction, Justin-as-developer would take over for Justin-as-student and immediately \u003cem\u003estop studying\u003c/em\u003e to go fix it. Instead—ostensibly for the sake of my own learning—I would interrupt my reviews for hours or days to go work on the tool.\u003c/p\u003e\n\u003cp\u003eAs KameSame began to look less like a hobby project and more like a real product, I started treating it that way. My own learning? That fell off a cliff.\u003c/p\u003e\n\u003cp\u003eBut what was I supposed to do when I found a bug? Just let it be? Because that's how you get ants.\u003c/p\u003e\n\n\u003ch3 id=\"decision-3\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-10/#decision-3\"\u003eDecision 3\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eI was now someone who maintained an app for studying Japanese. I was focused on adding features, fixing bugs, and growing its user base.\u003c/p\u003e\n\u003cp\u003eIn a strange way, my hobby project wound up becoming integral to my \u003ca href=\"https://testdouble.com\"\u003ereal job\u003c/a\u003e, as well.\u003c/p\u003e\n\u003cp\u003eAround the time I gave that keynote in Kyoto, I was humbled to be receiving invitations to speak at conferences all around the world. Being on stage in front of thousands of people was a great way to build awareness for Test Double and our services, so I defaulted to saying yes to every opportunity. I never particularly enjoyed the stress of preparing talks. I truly dreaded the grind of every business trip. And it had begun to feel soul-sucking that my primary work product had shifted from building stuff to competing for the attention of others.\u003c/p\u003e\n\u003cp\u003eBut as I reached the peak of my speaking career, there was just one problem: I was running out of things to say.\u003c/p\u003e\n\u003cp\u003eSee, I had been fortunate to meet many of my heroes—people in the industry I had looked up to—as they entered the later stages of their careers. They still showed up to conferences. They still gave talks. They typically repeated the same presentation everywhere they went. They often ad-libbed at great length, with little respect for conference schedules or attendees' bladders. I found all that pretty off-putting, but nobody else seemed to be complaining.\u003c/p\u003e\n\u003cp\u003eThe root cause of this behavior gradually became clear to me. These men had transitioned from practitioners to personalities, and they'd become woefully detached from reality as a result. They were clearly drawing from firsthand experiences that were 5, 10, or 20 years out of date. I don't know if anyone else noticed, but I sure did. By wasting people's time and hogging a speaking slot that could have gone to someone hungrier and more relevant, I ended up losing respect for many of them.\u003c/p\u003e\n\u003cp\u003eStill, those heroes taught me one final lesson: when I didn't have anything novel or compelling to say, I should pass on the opportunity. Better to leave room for somebody else. When organizers asked me to play the hits, I'd reply with little more than a link to our YouTube channel.\u003c/p\u003e\n\u003cp\u003eThis may have been the right decision, but it proved absurd as a marketing strategy. When I wasn't meeting new people or nurturing existing relationships, our consulting sales suffered. (I wasn't kidding when I said that running out of things to say was a problem!) I didn't love that dozens of people's livelihoods depended on my continued ability to fire hot takes and drop truth bombs, but that was indeed the bed I had made for myself.\u003c/p\u003e\n\u003cp\u003eTo make matters worse, by 2017 it had been at least four years since a client had paid me to write real code for a real system. I simply didn't have enough time to add client work to the sales, marketing, recruiting, and operational demands of a rapidly growing business. Good problem to have, but I could also feel myself losing touch. At some point, I realized KameSame could serve as a solution by providing me a way to stay closer to the ground.\u003c/p\u003e\n\u003cp\u003eMy passion projects had always inspired the things I shared in public, but this was the first time I found myself combing through my personal box labeled \u0026quot;fun\u0026quot; with the express intention of strip-mining it for marketing content at work.\u003c/p\u003e\n\u003cp\u003eBy building a helpful tool used by lots of people, I had gained relevant experience with the trending tools and techniques of the day after all. By continuing to invest in the app over a long time horizon, it had naturally grown more complex and mature, better resembling our clients' real-world code—and forcing me to live with the technical debt I'd gradually accrued. I went to work translating the nights and weekends I'd spent building KameSame into fresh marketing messages for Test Double.\u003c/p\u003e\n\u003cp\u003eOver a period of several years, I was able to harvest plenty of fruit from the KameSame tree: open source libraries (like \u003ca href=\"https://github.com/standardrb/standard\"\u003eStandard Ruby\u003c/a\u003e!), blog posts, and hot takes spanning topics like whether React was bad (it was) or Webpack was bad (it was) or snapshot testing was bad (it was, too).\u003c/p\u003e\n\u003cp\u003eBut in my mind, all of this content was laddering up to a capstone presentation that I wanted to give about the hidden virtues of building a whole-assed software product as a one-person team. I was soon blessed with the curse of my submission being accepted for both \u003ca href=\"https://rubykaigi.org/2019/\"\u003eRubyKaigi\u003c/a\u003e and \u003ca href=\"https://www.youtube.com/playlist?list=PLE7tQUdRKcyaOq3HlRm9h_Q_WhWKqm5xc\"\u003eRailsConf\u003c/a\u003e in Spring 2019.\u003c/p\u003e\n\u003cp\u003eFrom there, I did what I always did in the run-up to giving a conference talk: obsessively prepare a meticulously crafted deck of hundreds of slides, replete with custom artwork and hand-tweened animations.\u003c/p\u003e\n\n\u003ch3 id=\"decision-4\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-10/#decision-4\"\u003eDecision 4\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eI was now someone who created marketing content inspired by an app I maintained. I was focused on promoting a vision for how software should be written in the interest of remaining top-of-mind in a crowded market.\u003c/p\u003e\n\u003cp\u003eWhen companies are small, founders are forced to be generalists, as there's nobody else to do the shit work. As companies grow, founders necessarily specialize. By the late 2010s, my role had narrowed to sales \u0026amp; marketing. My notoriety had been enough to keep 50 consultants busy, but as we inched towards our 100th hire, our growth had begun to outstrip my individual reach. Keeping the business fed with new opportunities had become my full-time focus, and 40 hours a week was no longer cutting it.\u003c/p\u003e\n\u003cp\u003eThe pressure I felt from those stakes was, at times, overwhelming. I poured all of it into creative projects like this talk. The rest, I poured into cocktail glasses.\u003c/p\u003e\n\u003cp\u003eBy the time I was rehearsing the talk that had become \u003ca href=\"https://testdouble.com/insights/the-selfish-programmer\"\u003eThe Selfish Programmer\u003c/a\u003e, do you think I was still studying Japanese? Get the fuck out of here. I didn't even have time to keep up with my app's support requests—I was too busy building a slide deck about how great it was!\u003c/p\u003e\n\u003cp\u003eAnd then, finally, I gave the talk. It might be my all-time favorite. It was definitely my most ambitious.\u003c/p\u003e\n\u003cp\u003eMaybe all that work ultimately led to a sale. I don't know, it doesn't work like that. Someone told me once that \u0026quot;the thing about marketing is that only half of it works, and you don't get to know which half.\u0026quot;\u003c/p\u003e\n\u003cp\u003eAt that point, I felt empty. I was deeply exhausted and unsatisfied with the life I was living. My side projects and creative endeavors, which had always been a private respite from the drudgery of existence, had themselves become tangled up in the drudgery.\u003c/p\u003e\n\u003cp\u003eI admit to not knowing \u003cem\u003eexactly\u003c/em\u003e what \u0026quot;burned out\u0026quot; means, but that's probably what many of you are imagining right now. That isn't really it, though.\u003c/p\u003e\n\u003cp\u003eIt was more like the recognition that you've reached the natural end of a relationship. Not with a person, but rather with the only business I'd ever had a hand in founding.\u003c/p\u003e\n\u003cp\u003eThe company itself had never been my passion. The company had instead been a vehicle whose design supported the pursuit of my passions. And it was around this time, following the positive-but-insufficient reception to my creative work, that I realized the business had grown beyond that design. Letting the things I loved doing be merely things I loved doing was no longer a viable path to our continued success. For the first time since we started, the business didn't just demand more from me, it demanded something substantially \u003cem\u003edifferent\u003c/em\u003e. And I wasn't prepared to become the person who could give Test Double what it needed.\u003c/p\u003e\n\u003cp\u003eIt was then that I started imagining what would need to change for the company to succeed after I was gone.\u003c/p\u003e\n\n\u003ch3 id=\"popping-the-stack\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-10/#popping-the-stack\"\u003ePopping the stack\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eAt every step, I knowingly and willfully did all this to myself:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eI perverted my creative passion to satisfy a sales imperative, because…\u003c/li\u003e\n\u003cli\u003e…I'd allowed a personal project to become my last source of relevancy, because…\u003c/li\u003e\n\u003cli\u003e…I'd become obsessed with finding a better way to memorize Japanese, because…\u003c/li\u003e\n\u003cli\u003e…some language-learning software had addicted me to its game loop, because…\u003c/li\u003e\n\u003cli\u003e…my feelings were hurt when I was told my Japanese wasn't good enough, because…\u003c/li\u003e\n\u003cli\u003e…I'd co-founded a business whose success depended on what other people thought of me.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIt's been over five years since the end of this story, and I'm still actively working to reclaim pieces of myself. Found one this morning.\u003c/p\u003e\n\u003cp\u003eAnd yet, as the tired movie cliché goes: I'd do it all again. I truly don't regret a thing.\u003c/p\u003e\n\u003cp\u003eIn fact, because I didn't set out to share this story with you today, it's also my first time hearing it. The above represents a novel weaving together of a collection of facts and memories that have been swimming around my head for years.\u003c/p\u003e\n\u003cp\u003eIs what I just wrote true? No more or less than any of the other stories I've told to make sense of the decisions that brought me to this point. In tracing every step of the path that got me here, my dominant emotional response has been one of gratitude. I'm grateful for all these experiences, and I'm grateful for the opportunity to be able to take the time to write about stuff like this. And I'm grateful that you read it and might find in it something to apply in your own life.\u003c/p\u003e\n\u003cp\u003e(Sorry for being 25 days late in sending this, though. No excuses. I do feel badly about that. Won't happen again. Unless it does.)\u003c/p\u003e","id":"https://justin.searls.co/mails/2025-10/","og_image":"https://justin.searls.co/img/social/mails/2025-10.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-11-28T00:18:28Z","title":"I'd do it all again","updated_at":"2025-11-28T00:18:31Z","url":"https://justin.searls.co/mails/2025-10/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/clips/the-software-project-lifecycle/</id>
      <title type="text">✂️ The Software Project Lifecycle</title>
      <link href="https://justin.searls.co/clips/the-software-project-lifecycle/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-23T13:13:29+00:00</published>
    <updated>2025-11-23T08:17:31-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="flex justify-center">
  <div class="sm:beneath-the-page sm:p-2">
    <video poster="https://podcast-cdn.searls.co/clips/the-software-project-lifecycle.jpg" class="inline-block shadow-lg rounded-lg max-h-[80lvh] sm:max-h-[60lvh] m-0" preload="auto" playsinline="playsinline" controls="controls" controlslist="nodownload">
      <source src="https://podcast-cdn.searls.co/clips/the-software-project-lifecycle.mp4">
      Your browser does not support the video tag.
    </video>
  </div>
</div><p>How it goes. How it always goes.</p>

]]></content>
    <summary type="html"><![CDATA[<p>How it goes. How it always goes.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/clips/the-software-project-lifecycle/","append_url_label":"Peek ✂️","content":"\u003cp\u003eHow it goes. How it always goes.\u003c/p\u003e\n","format_string":"New clip! {{title}}","id":"https://justin.searls.co/clips/the-software-project-lifecycle/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/clips/the-software-project-lifecycle.mp4"}],"og_image":"https://podcast-cdn.searls.co/clips/the-software-project-lifecycle.jpg","platform_overrides":{},"published_at":"2025-11-23T13:13:29Z","title":"The Software Project Lifecycle","updated_at":"2025-11-23T08:17:31-05:00","url":"https://justin.searls.co/clips/the-software-project-lifecycle/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v47-turbinately-ill/</id>
      <title type="text">🎙️ Breaking Change podcast v47 - Turbinately Ill</title>
      <link href="https://justin.searls.co/casts/breaking-change-v47-turbinately-ill/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-22T19:07:27+00:00</published>
    <updated>2025-11-22T22:44:50-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v47.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v47.mp3">Direct link to podcast audio file</a>
</p><p>Had a little pep in my step this time. Maybe it's because I decided to start recording after 7 AM for once. Maybe it's because I can finally fucking breathe out of my nose holes.</p>
<p>Tell me about what you do while you continue to draw breath at <a href="mailto:podcast@searls.co">podcast@searls.co</a>.</p>
<p>Things you can read if you're bored:</p>
<ul>
<li><a href="https://beckygram.com">Beckygram.com</a></li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://store.steampowered.com/sale/steamframe">Steam Frame</a> and <a href="https://store.steampowered.com/sale/steammachine">Steam Machine</a></li>
<li><a href="https://www.videogameschronicle.com/news/they-didnt-plan-at-all-xbox-reportedly-warning-of-yet-another-potential-price-increase/">Xbox reportedly warning of yet another potential price increase</a></li>
<li><a href="https://youtu.be/CEpGgBkkOLs?si=smkJ6IkWu8VwVDhl">InKonbini retro convenience store simulator</a></li>
<li><a href="https://www.theverge.com/news/825283/bethesda-wand-company-fallout-3-new-vegas-pip-boy-3000-replica">Pipboy 3000 replica for $300</a></li>
<li><a href="https://apple.news/AdN6rrfJaTa2xhwBLXs2hSA">Apple introduces Digital ID, a new way to create and present an ID in Apple Wallet</a></li>
<li><a href="https://antigravity.google">Google Antigravity</a> kinda sucks</li>
<li>I think I might regret watching <a href="https://en.wikipedia.org/wiki/The_Bear_%28TV_series%29">The Bear</a></li>
<li><a href="https://simonwillison.net/2025/Nov/20/nano-banana-pro/">Nano Banana Pro</a> made this episode's social image</li>
<li><a href="https://openai.com/index/gpt-5-1-codex-max/">GPT-5.1-Codex-Max</a> is the best coding model I've used yet</li>
<li><a href="https://arxiv.org/abs/2511.15304">Adversarial Poetry is a great way to jailbreak LLMs</a> (<a href="https://news.ycombinator.com/item?id=45991738">Comment thread</a>)</li>
<li><a href="https://arstechnica.com/security/2025/11/cryptography-group-cancels-election-results-after-official-loses-secret-key/">Cryptographers Cancel Election Results After Losing Decryption Key</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Outer_Worlds_2">Outer Worlds 2</a></li>
<li>⚡️ <a href="https://en.wikipedia.org/wiki/Death_by_Lightning">Death by Lightning</a> really slaps (claps?)</li>
<li><a href="https://www.newyorker.com/culture/the-current-cinema/wicked-for-good-is-very-very-bad">Wicked: For Good is Very, Very Bad</a> (<a href="https://apple.news/A4G_Hm0BCSNuqPXyILZd9QQ">News+</a>)</li>
<li><a href="https://youtu.be/EO14wPQw89c?si=TE3J5A9SxwtbInxf">The guy from Pomplamoose is the CEO of Patreon??!</a></li>
<li><a href="https://stevejobsarchive.com/stories/pixar-early-days">&quot;Pixar: The Early Days&quot; interview with Steve Jobs</a></li>
<li><a href="https://notebooklm.google/">NotebookLM</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>Had a little pep in my step this time. Maybe it's because I decided to start recording after 7 AM for once. Maybe it's because I can finally fucking breathe out of my nose holes.</p>
<p>Tell me about what you do while you continue to draw breath at <a href="mailto:podcast@searls.co">podcast@searls.co</a>.</p>
<p>Things you can read if you're bored:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v47-turbinately-ill/","append_url_label":"Hear 🎙","content":"\u003cp\u003eHad a little pep in my step this time. Maybe it's because I decided to start recording after 7 AM for once. Maybe it's because I can finally fucking breathe out of my nose holes.\u003c/p\u003e\n\u003cp\u003eTell me about what you do while you continue to draw breath at \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThings you can read if you're bored:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://beckygram.com\"\u003eBeckygram.com\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://store.steampowered.com/sale/steamframe\"\u003eSteam Frame\u003c/a\u003e and \u003ca href=\"https://store.steampowered.com/sale/steammachine\"\u003eSteam Machine\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/they-didnt-plan-at-all-xbox-reportedly-warning-of-yet-another-potential-price-increase/\"\u003eXbox reportedly warning of yet another potential price increase\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/CEpGgBkkOLs?si=smkJ6IkWu8VwVDhl\"\u003eInKonbini retro convenience store simulator\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/news/825283/bethesda-wand-company-fallout-3-new-vegas-pip-boy-3000-replica\"\u003ePipboy 3000 replica for $300\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://apple.news/AdN6rrfJaTa2xhwBLXs2hSA\"\u003eApple introduces Digital ID, a new way to create and present an ID in Apple Wallet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://antigravity.google\"\u003eGoogle Antigravity\u003c/a\u003e kinda sucks\u003c/li\u003e\n\u003cli\u003eI think I might regret watching \u003ca href=\"https://en.wikipedia.org/wiki/The_Bear_%28TV_series%29\"\u003eThe Bear\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://simonwillison.net/2025/Nov/20/nano-banana-pro/\"\u003eNano Banana Pro\u003c/a\u003e made this episode's social image\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openai.com/index/gpt-5-1-codex-max/\"\u003eGPT-5.1-Codex-Max\u003c/a\u003e is the best coding model I've used yet\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://arxiv.org/abs/2511.15304\"\u003eAdversarial Poetry is a great way to jailbreak LLMs\u003c/a\u003e (\u003ca href=\"https://news.ycombinator.com/item?id=45991738\"\u003eComment thread\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://arstechnica.com/security/2025/11/cryptography-group-cancels-election-results-after-official-loses-secret-key/\"\u003eCryptographers Cancel Election Results After Losing Decryption Key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Outer_Worlds_2\"\u003eOuter Worlds 2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e⚡️ \u003ca href=\"https://en.wikipedia.org/wiki/Death_by_Lightning\"\u003eDeath by Lightning\u003c/a\u003e really slaps (claps?)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.newyorker.com/culture/the-current-cinema/wicked-for-good-is-very-very-bad\"\u003eWicked: For Good is Very, Very Bad\u003c/a\u003e (\u003ca href=\"https://apple.news/A4G_Hm0BCSNuqPXyILZd9QQ\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/EO14wPQw89c?si=TE3J5A9SxwtbInxf\"\u003eThe guy from Pomplamoose is the CEO of Patreon??!\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://stevejobsarchive.com/stories/pixar-early-days\"\u003e\u0026quot;Pixar: The Early Days\u0026quot; interview with Steve Jobs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://notebooklm.google/\"\u003eNotebookLM\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Turbinately Ill","id":"https://justin.searls.co/casts/breaking-change-v47-turbinately-ill/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v47-turbinately-ill.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-11-22T19:07:27Z","title":"Turbinately Ill","updated_at":"2025-11-22T22:44:50-05:00","url":"https://justin.searls.co/casts/breaking-change-v47-turbinately-ill/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/tdd-is-more-important-than-ever/</id>
      <title type="text">📄 TDD is more important than ever</title>
      <link href="https://justin.searls.co/posts/tdd-is-more-important-than-ever/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-18T20:54:32+00:00</published>
    <updated>2025-11-18T16:52:25-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Lately, I've been reminded of the heady days of my <a href="https://en.wikipedia.org/wiki/Agile_software_development">agile</a> youth by how often I've found myself asking, &quot;how will we test this?&quot;</p>
<p>As I've mentioned frequently on podcasts and recent Q&amp;As about AI, an odd paradox has emerged in the software industry:</p>
<ol>
<li>Developers experienced in agile engineering practices like test-driven development tend to be among the <strong>most skeptical</strong> of AI code generation, often citing fears that software quality is being thrown out the window</li>
<li>Developers experienced in agile engineering practices like test-driven development tend to be among the <strong>most successful</strong> at building great software with coding agents, often citing creative techniques enabling agents to verify the correctness of their work</li>
</ol>
<p>In the late 2000s, I always knew I was talking to a solid programmer if their first question upon being handed a complex task was to ask, &quot;how will we test this?&quot; Agile developers learned back then that <em>literally everything</em> hinged on establishing a fast, reliable, automated way to verify your code fulfilled its intended purpose. Without tests, you can't refactor aggressively, deploy frequently, or delete safely. Over the 2010s, many of us learned patterns and heuristics that allowed us to take shortcuts and tone down our testing zeal in the name of pragmatism and efficiency, but the underlying skill of concocting ways to verify our code never stopped being valuable.</p>
<p>Well, here we are again. In 2025, the <em>only</em> thing that matters when it comes to coding agents like Claude Code and Codex CLI is to ensure they are equipped with the tools they need to independently verify the correctness of their work.</p>
<p>Why is verification so important? Because, if you tell an agent to do something that it can't independently verify, then—just like a human developer—the best they can do is guess. And because agents work really fast, each action based on a guess is quickly succeeded by an even more tenuous guess. And then a guess of a guess of a guess, and so on. Very often, when I return to my desk after 30 minutes and find that an agent made a huge mess of the code, I come to realize that the AI didn't suddenly &quot;get dumb,&quot; but rather that an application server crashed or a web browser stopped responding and the agent was forced to code speculatively and defensively.</p>
<p>Many of the tools agents need most depend on access to things that us humans take for granted: a sandboxed computer free of arbitrary restrictions, or an MCP server enabling interaction with an iOS Simulator, or a built-in browser that conveys real-time visual information. But fortunately, being able to sense the <em>lack of sufficient verification</em> is a deeply-ingrained instinct for us TDD graybeards. Moreover, we have the experience to know when to reach for <a href="https://www.browserstack.com/percy/visual-regression-testing">image regression testing</a> or <a href="https://en.wikipedia.org/wiki/Mutation_testing">mutation testing</a> or <a href="https://en.wikipedia.org/wiki/Characterization_test">characterization testing</a> and the skill to set up appropriate test harnesses for each. Out of the box, most coding agents—like most human developers—don't have the faintest clue what those things even are, much less how to use them effectively.</p>
<p>So I was really pleased to see <a href="https://simonwillison.net/2025/Nov/16/andrej-karpathy/">Simon Willison put <strong>verifiability</strong> in bold</a>, because it means people may finally be ready to talk about what this has always been about. We don't get to coding &quot;super-intelligence&quot; until we get to true reinforcement learning, and we can't have reinforcement learning until we all get a <em>hell of a lot better</em> at baking verifiability into our software workflows.</p>
<p>So, if you're a veteran of the agile era, or the craftsmanship movement, or just otherwise give a shit about writing great code, but are nevertheless worried about the impact AI will have on software quality, you have a lot more leverage here than you might think. The things that matter most to you matter more now than ever. Better yet, other developers who were happy to ignore all this stuff for 20 years suddenly have an urgent and present need to start paying attention to exactly what you're most passionate about. Take heart. ❤️</p>]]></content>
    <summary type="html"><![CDATA[<p>Lately, I've been reminded of the heady days of my <a href="https://en.wikipedia.org/wiki/Agile_software_development">agile</a> youth by how often I've found myself asking, &quot;how will we test this?&quot;</p>
<p>As I've mentioned frequently on podcasts and recent Q&amp;As about AI, an odd paradox has emerged in the software industry:</p>
<ol>
<li>Developers experienced in agile engineering practices like test-driven development tend to be among the <strong>most skeptical</strong> of AI code generation, often citing fears that software quality is being thrown out the window</li>
<li>Developers experienced in agile engineering practices like test-driven development tend to be among the <strong>most successful</strong> at building great software with coding agents, often citing creative techniques enabling agents to verify the correctness of their work</li>
</ol>
<p>In the late 2000s, I always knew I was talking to a solid programmer if their first question upon being handed a complex task was to ask, &quot;how will we test this?&quot; Agile developers learned back then that <em>literally everything</em> hinged on establishing a fast, reliable, automated way to verify your code fulfilled its intended purpose. Without tests, you can't refactor aggressively, deploy frequently, or delete safely. Over the 2010s, many of us learned patterns and heuristics that allowed us to take shortcuts and tone down our testing zeal in the name of pragmatism and efficiency, but the underlying skill of concocting ways to verify our code never stopped being valuable.</p>
<p>Well, here we are again. In 2025, the <em>only</em> thing that matters when it comes to coding agents like Claude Code and Codex CLI is to ensure they are equipped with the tools they need to independently verify the correctness of their work.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/tdd-is-more-important-than-ever/","append_url_label":"Read 📄","content":"\u003cp\u003eLately, I've been reminded of the heady days of my \u003ca href=\"https://en.wikipedia.org/wiki/Agile_software_development\"\u003eagile\u003c/a\u003e youth by how often I've found myself asking, \u0026quot;how will we test this?\u0026quot;\u003c/p\u003e\n\u003cp\u003eAs I've mentioned frequently on podcasts and recent Q\u0026amp;As about AI, an odd paradox has emerged in the software industry:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDevelopers experienced in agile engineering practices like test-driven development tend to be among the \u003cstrong\u003emost skeptical\u003c/strong\u003e of AI code generation, often citing fears that software quality is being thrown out the window\u003c/li\u003e\n\u003cli\u003eDevelopers experienced in agile engineering practices like test-driven development tend to be among the \u003cstrong\u003emost successful\u003c/strong\u003e at building great software with coding agents, often citing creative techniques enabling agents to verify the correctness of their work\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIn the late 2000s, I always knew I was talking to a solid programmer if their first question upon being handed a complex task was to ask, \u0026quot;how will we test this?\u0026quot; Agile developers learned back then that \u003cem\u003eliterally everything\u003c/em\u003e hinged on establishing a fast, reliable, automated way to verify your code fulfilled its intended purpose. Without tests, you can't refactor aggressively, deploy frequently, or delete safely. Over the 2010s, many of us learned patterns and heuristics that allowed us to take shortcuts and tone down our testing zeal in the name of pragmatism and efficiency, but the underlying skill of concocting ways to verify our code never stopped being valuable.\u003c/p\u003e\n\u003cp\u003eWell, here we are again. In 2025, the \u003cem\u003eonly\u003c/em\u003e thing that matters when it comes to coding agents like Claude Code and Codex CLI is to ensure they are equipped with the tools they need to independently verify the correctness of their work.\u003c/p\u003e\n\u003cp\u003eWhy is verification so important? Because, if you tell an agent to do something that it can't independently verify, then—just like a human developer—the best they can do is guess. And because agents work really fast, each action based on a guess is quickly succeeded by an even more tenuous guess. And then a guess of a guess of a guess, and so on. Very often, when I return to my desk after 30 minutes and find that an agent made a huge mess of the code, I come to realize that the AI didn't suddenly \u0026quot;get dumb,\u0026quot; but rather that an application server crashed or a web browser stopped responding and the agent was forced to code speculatively and defensively.\u003c/p\u003e\n\u003cp\u003eMany of the tools agents need most depend on access to things that us humans take for granted: a sandboxed computer free of arbitrary restrictions, or an MCP server enabling interaction with an iOS Simulator, or a built-in browser that conveys real-time visual information. But fortunately, being able to sense the \u003cem\u003elack of sufficient verification\u003c/em\u003e is a deeply-ingrained instinct for us TDD graybeards. Moreover, we have the experience to know when to reach for \u003ca href=\"https://www.browserstack.com/percy/visual-regression-testing\"\u003eimage regression testing\u003c/a\u003e or \u003ca href=\"https://en.wikipedia.org/wiki/Mutation_testing\"\u003emutation testing\u003c/a\u003e or \u003ca href=\"https://en.wikipedia.org/wiki/Characterization_test\"\u003echaracterization testing\u003c/a\u003e and the skill to set up appropriate test harnesses for each. Out of the box, most coding agents—like most human developers—don't have the faintest clue what those things even are, much less how to use them effectively.\u003c/p\u003e\n\u003cp\u003eSo I was really pleased to see \u003ca href=\"https://simonwillison.net/2025/Nov/16/andrej-karpathy/\"\u003eSimon Willison put \u003cstrong\u003everifiability\u003c/strong\u003e in bold\u003c/a\u003e, because it means people may finally be ready to talk about what this has always been about. We don't get to coding \u0026quot;super-intelligence\u0026quot; until we get to true reinforcement learning, and we can't have reinforcement learning until we all get a \u003cem\u003ehell of a lot better\u003c/em\u003e at baking verifiability into our software workflows.\u003c/p\u003e\n\u003cp\u003eSo, if you're a veteran of the agile era, or the craftsmanship movement, or just otherwise give a shit about writing great code, but are nevertheless worried about the impact AI will have on software quality, you have a lot more leverage here than you might think. The things that matter most to you matter more now than ever. Better yet, other developers who were happy to ignore all this stuff for 20 years suddenly have an urgent and present need to start paying attention to exactly what you're most passionate about. Take heart. ❤️\u003c/p\u003e","id":"https://justin.searls.co/posts/tdd-is-more-important-than-ever/","og_image":"https://podcast-cdn.searls.co/posts/tdd-is-more-important-than-ever.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-11-18T20:54:32Z","title":"TDD is more important than ever","updated_at":"2025-11-18T16:52:25-05:00","url":"https://justin.searls.co/posts/tdd-is-more-important-than-ever/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-11-18-08h15m36s/</id>
      <title type="text">📸 Downdetector is down</title>
      <link href="https://justin.searls.co/shots/2025-11-18-08h15m36s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-18T13:15:36+00:00</published>
    <updated>2025-11-18T08:20:00-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2025-11-18-08h15m36s_gof5o4.jpg"/>
</div><p>When half the websites I visited wouldn't load this morning, I figured I'd check <a href="https://downdetector.com">downdetector</a> to see if Cloudflare was down, but I couldn't. Because Cloudflare was down.</p>
<p>Distributed systems sound great, but the way the industry rushed to crown a handful of winners like AWS and Cloudflare had the net effect of merely increasing the number of single points of failure in the chain.</p>

]]></content>
    <summary type="html"><![CDATA[<p>When half the websites I visited wouldn't load this morning, I figured I'd check <a href="https://downdetector.com">downdetector</a> to see if Cloudflare was down, but I couldn't. Because Cloudflare was down.</p>
<p>Distributed systems sound great, but the way the industry rushed to crown a handful of winners like AWS and Cloudflare had the net effect of merely increasing the number of single points of failure in the chain.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-11-18-08h15m36s/","append_url_label":"View 📸","content":"\u003cp\u003eWhen half the websites I visited wouldn't load this morning, I figured I'd check \u003ca href=\"https://downdetector.com\"\u003edowndetector\u003c/a\u003e to see if Cloudflare was down, but I couldn't. Because Cloudflare was down.\u003c/p\u003e\n\u003cp\u003eDistributed systems sound great, but the way the industry rushed to crown a handful of winners like AWS and Cloudflare had the net effect of merely increasing the number of single points of failure in the chain.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-11-18-08h15m36s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-11-18-08h15m36s_gof5o4.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2025-11-18-08h15m36s_gof5o4.jpg","platform_overrides":{},"published_at":"2025-11-18T13:15:36Z","title":"Downdetector is down","updated_at":"2025-11-18T08:20:00-05:00","url":"https://justin.searls.co/shots/2025-11-18-08h15m36s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-11-17-10h53m34s/</id>
      <title type="text">📸 Live Captions for Audible books in iOS 26</title>
      <link href="https://justin.searls.co/shots/2025-11-17-10h53m34s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-17T15:53:34+00:00</published>
    <updated>2025-11-17T11:13:38-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_okweom.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_7ga2de.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_w6vzhj.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_slku1y.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_dc4528.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_gh4atr.jpg"/>
  <img src="https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_sqwrxv.jpg"/>
</div><p>I've wanted to start listening to books for Japanese practice in addition to just reading them, but the lack of an easy way to quickly understand a particular word always limited my ability to understand and enjoy it.</p>
<p>With iOS 26, the Live Captions Accessibility feature can be set to a number of languages (including Japanese) and routed to the system audio instead of the microphone. So while Amazon would be happy to sell you a &quot;Whisper&quot; license for both audiobook and ebook in order to get a less useful version of this functionality, your iOS device can just passively be building a transcript of the book for you to review as you listen. There's even a &quot;Copy Transcript&quot; button in the top right corner of the expanded view!</p>
<p>This is a great example of leveraging advancements in OS-level AI features to accomplish language learning objectives that would have been a fantasy just a few years ago.</p>

]]></content>
    <summary type="html"><![CDATA[<p>I've wanted to start listening to books for Japanese practice in addition to just reading them, but the lack of an easy way to quickly understand a particular word always limited my ability to understand and enjoy it.</p>
<p>With iOS 26, the Live Captions Accessibility feature can be set to a number of languages (including Japanese) and routed to the system audio instead of the microphone. So while Amazon would be happy to sell you a &quot;Whisper&quot; license for both audiobook and ebook in order to get a less useful version of this functionality, your iOS device can just passively be building a transcript of the book for you to review as you listen. There's even a &quot;Copy Transcript&quot; button in the top right corner of the expanded view!</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-11-17-10h53m34s/","append_url_label":"View 📸","content":"\u003cp\u003eI've wanted to start listening to books for Japanese practice in addition to just reading them, but the lack of an easy way to quickly understand a particular word always limited my ability to understand and enjoy it.\u003c/p\u003e\n\u003cp\u003eWith iOS 26, the Live Captions Accessibility feature can be set to a number of languages (including Japanese) and routed to the system audio instead of the microphone. So while Amazon would be happy to sell you a \u0026quot;Whisper\u0026quot; license for both audiobook and ebook in order to get a less useful version of this functionality, your iOS device can just passively be building a transcript of the book for you to review as you listen. There's even a \u0026quot;Copy Transcript\u0026quot; button in the top right corner of the expanded view!\u003c/p\u003e\n\u003cp\u003eThis is a great example of leveraging advancements in OS-level AI features to accomplish language learning objectives that would have been a fantasy just a few years ago.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-11-17-10h53m34s/","media":[{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_okweom.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_7ga2de.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_w6vzhj.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_slku1y.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_dc4528.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_gh4atr.jpg"},{"type":"image","url":"https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_sqwrxv.jpg"}],"og_image":"https://podcast-cdn.searls.co/shots/2025-11-17-10h53m34s_okweom.jpg","platform_overrides":{},"published_at":"2025-11-17T15:53:34Z","title":"Live Captions for Audible books in iOS 26","updated_at":"2025-11-17T11:13:38-05:00","url":"https://justin.searls.co/shots/2025-11-17-10h53m34s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/clips/creating-static-instagram-stories-as-wisps/</id>
      <title type="text">✂️ Creating static Instagram Stories as Wisps</title>
      <link href="https://justin.searls.co/clips/creating-static-instagram-stories-as-wisps/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-17T14:33:07+00:00</published>
    <updated>2025-11-17T09:46:13-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="flex justify-center">
  <div class="sm:beneath-the-page sm:p-2">
    <video poster="https://podcast-cdn.searls.co/clips/creating-static-instagram-stories-as-wisps.jpg" class="inline-block shadow-lg rounded-lg max-h-[80lvh] sm:max-h-[60lvh] m-0" preload="auto" playsinline="playsinline" controls="controls" controlslist="nodownload">
      <source src="https://podcast-cdn.searls.co/clips/creating-static-instagram-stories-as-wisps.mp4">
      Your browser does not support the video tag.
    </video>
  </div>
</div><p>Fun little demo of this weekend's project. I recently shipped Becky a way to ship auto-expiring stories from <a href="https://beckygram.com">Beckygram</a> that would in turn syndicate to Instagram via <a href="https://posseparty.com">POSSE Party</a>, which was pretty straightforward since her site is an actual honest-to-god Rails app. But justin.searls.co is a static site with no backend component. I accomplished the same thing by creating a new media type for the blog called &quot;wisps&quot;.</p>
<p>What you're looking at in this demo:</p>
<ul>
<li>A new single-page app that takes S3 &amp; GitHub API keys and uploads new posts from mobile</li>
<li>Uses <a href="https://searlsco.github.io/straight-to-video/">Straight-to-Video</a> to compress the story for Instagram and create a thumbnail-size preview video entirely within the browser</li>
<li><a href="https://www.netlify.com">Netlify</a> sees the commit hit GitHub and builds the site with <a href="https://gohugo.io">Hugo</a></li>
<li>POSSE Party sees the wisp in a new <a href="https://justin.searls.co/wisps.xml">all-wisps Atom feed</a>, configured to be syndicated as stories</li>
<li>POSSE Party creates an Instagram crosspost and publishes it to Instagram as a story using the <a href="https://developers.facebook.com/products/instagram/apis/">graph API</a></li>
<li>My homepage has been updated with a new UI that shows all current stories along the top, including a player to navigate them (click to continue, arrow keys, escape to clear, etc.)</li>
<li>A GitHub action runs every half-hour to effectively &quot;unpublish&quot; any stories that are over 48 hours old, returning them to the netherworld from whence they came</li>
</ul>
<p>Extremely fun long weekend project, and would not have been possible without the acceleration of coding agents. In fact, <a href="https://developers.openai.com/codex/cli/">Codex CLI</a> wrote 100% of this code, which took me about 4 days and ~20 hours.</p>
<p>I've never been a fan of the story format because of the sick and twisted way it devolves into the &quot;who watched my stories&quot; meta by exposing so many metrics to users, but this way I don't have to engage with that to share shit. Hopefully this means I'll be able to better stay in touch with friends and loved ones when traveling and moving about. And if you, like me are not an Instagram person, now you have an excuse to visit my actual website from time to time!</p>

]]></content>
    <summary type="html"><![CDATA[<p>Fun little demo of this weekend's project. I recently shipped Becky a way to ship auto-expiring stories from <a href="https://beckygram.com">Beckygram</a> that would in turn syndicate to Instagram via <a href="https://posseparty.com">POSSE Party</a>, which was pretty straightforward since her site is an actual honest-to-god Rails app. But justin.searls.co is a static site with no backend component. I accomplished the same thing by creating a new media type for the blog called &quot;wisps&quot;.</p>
<p>What you're looking at in this demo:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/clips/creating-static-instagram-stories-as-wisps/","append_url_label":"Peek ✂️","content":"\u003cp\u003eFun little demo of this weekend's project. I recently shipped Becky a way to ship auto-expiring stories from \u003ca href=\"https://beckygram.com\"\u003eBeckygram\u003c/a\u003e that would in turn syndicate to Instagram via \u003ca href=\"https://posseparty.com\"\u003ePOSSE Party\u003c/a\u003e, which was pretty straightforward since her site is an actual honest-to-god Rails app. But justin.searls.co is a static site with no backend component. I accomplished the same thing by creating a new media type for the blog called \u0026quot;wisps\u0026quot;.\u003c/p\u003e\n\u003cp\u003eWhat you're looking at in this demo:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA new single-page app that takes S3 \u0026amp; GitHub API keys and uploads new posts from mobile\u003c/li\u003e\n\u003cli\u003eUses \u003ca href=\"https://searlsco.github.io/straight-to-video/\"\u003eStraight-to-Video\u003c/a\u003e to compress the story for Instagram and create a thumbnail-size preview video entirely within the browser\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.netlify.com\"\u003eNetlify\u003c/a\u003e sees the commit hit GitHub and builds the site with \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePOSSE Party sees the wisp in a new \u003ca href=\"https://justin.searls.co/wisps.xml\"\u003eall-wisps Atom feed\u003c/a\u003e, configured to be syndicated as stories\u003c/li\u003e\n\u003cli\u003ePOSSE Party creates an Instagram crosspost and publishes it to Instagram as a story using the \u003ca href=\"https://developers.facebook.com/products/instagram/apis/\"\u003egraph API\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMy homepage has been updated with a new UI that shows all current stories along the top, including a player to navigate them (click to continue, arrow keys, escape to clear, etc.)\u003c/li\u003e\n\u003cli\u003eA GitHub action runs every half-hour to effectively \u0026quot;unpublish\u0026quot; any stories that are over 48 hours old, returning them to the netherworld from whence they came\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExtremely fun long weekend project, and would not have been possible without the acceleration of coding agents. In fact, \u003ca href=\"https://developers.openai.com/codex/cli/\"\u003eCodex CLI\u003c/a\u003e wrote 100% of this code, which took me about 4 days and ~20 hours.\u003c/p\u003e\n\u003cp\u003eI've never been a fan of the story format because of the sick and twisted way it devolves into the \u0026quot;who watched my stories\u0026quot; meta by exposing so many metrics to users, but this way I don't have to engage with that to share shit. Hopefully this means I'll be able to better stay in touch with friends and loved ones when traveling and moving about. And if you, like me are not an Instagram person, now you have an excuse to visit my actual website from time to time!\u003c/p\u003e\n","format_string":"New clip! {{title}}","id":"https://justin.searls.co/clips/creating-static-instagram-stories-as-wisps/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/clips/creating-static-instagram-stories-as-wisps.mp4"}],"og_image":"https://podcast-cdn.searls.co/clips/creating-static-instagram-stories-as-wisps.jpg","platform_overrides":{},"published_at":"2025-11-17T14:33:07Z","title":"Creating static Instagram Stories as Wisps","updated_at":"2025-11-17T09:46:13-05:00","url":"https://justin.searls.co/clips/creating-static-instagram-stories-as-wisps/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-11-12-14h13m34s/</id>
      <title type="text">📸 My lucky day</title>
      <link href="https://justin.searls.co/shots/2025-11-12-14h13m34s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-12T19:13:34+00:00</published>
    <updated>2025-11-12T14:13:47-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-11-12-13h39m29s-3ec1f25.jpeg"/>
</div><p>What are the odds?*</p>
<p>*The odds are 1 in 1.7 million</p>

]]></content>
    <summary type="html"><![CDATA[<p>What are the odds?*</p>
<p>*The odds are 1 in 1.7 million</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-11-12-14h13m34s/","append_url_label":"View 📸","content":"\u003cp\u003eWhat are the odds?*\u003c/p\u003e\n\u003cp\u003e*The odds are 1 in 1.7 million\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-11-12-14h13m34s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-11-12-13h39m29s-3ec1f25.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-11-12-13h39m29s-3ec1f25.jpeg","platform_overrides":{},"published_at":"2025-11-12T19:13:34Z","title":"My lucky day","updated_at":"2025-11-12T14:13:47-05:00","url":"https://justin.searls.co/shots/2025-11-12-14h13m34s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/</id>
      <title type="text">🔗 RIP iPhone 18 Air</title>
        <link href="https://www.theinformation.com/articles/apple-delays-release-next-iphone-air-amid-weak-sales" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-10T21:29:50+00:00</published>
    <updated>2025-11-10T16:45:36-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Wayne Ma and Qianer Liu say we'll have to wait to see a sequel to iPhone Air, but The Information <a href="https://www.theinformation.com/articles/apple-delays-release-next-iphone-air-amid-weak-sales">provides literally nothing beyond this headline</a> outside their paywall:</p>
<blockquote>
<p>Apple Delays Release of Next iPhone Air Amid Weak Sales</p>
</blockquote>
<p>But does one <em>truly need</em> to fork over  $399 to know exactly what the body of the article is going to say?</p>
<p>All you need to know is that Justin Searls loving an Apple product is effectively the kiss of death in the Tim Cook era:</p>
<p><strong>2015:</strong> 12&quot; MacBook, <a href="/posts/the-12-macbook-was-announced-10-years-ago/">my all-time favorite Mac</a>, cancelled after two revisions<br/>
<strong>2018:</strong> HomePod, of which I bought six at launch, never sold through its initial manufacturing run<br/>
<strong>2020:</strong> iPhone mini, my all-time favorite iPhone, cancelled after one revision<br/>
<strong>2024:</strong> Vision Pro, <a href="/casts/breaking-change-v4-facial-computing/">which I rely on daily</a>, received one revision <em>under duress</em><br/>
<strong>2025:</strong> iPhone Air, which is <a href="https://justin.searls.co/posts/why-i-bought-the-iphone-air/">exactly what I asked for</a>, had even its one revision cancelled</p>
<p>I don't know what I'm doing wrong here.</p>

<p>🔗 <a href="https://www.theinformation.com/articles/apple-delays-release-next-iphone-air-amid-weak-sales" title="Original Article">theinformation.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>Wayne Ma and Qianer Liu say we'll have to wait to see a sequel to iPhone Air, but The Information <a href="https://www.theinformation.com/articles/apple-delays-release-next-iphone-air-amid-weak-sales">provides literally nothing beyond this headline</a> outside their paywall:</p>
<blockquote>
<p>Apple Delays Release of Next iPhone Air Amid Weak Sales</p>
</blockquote>
<p>But does one <em>truly need</em> to fork over  $399 to know exactly what the body of the article is going to say?</p>
<p>All you need to know is that Justin Searls loving an Apple product is effectively the kiss of death in the Tim Cook era:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/","append_url_label":"Click 🔗","content":"\u003cp\u003eWayne Ma and Qianer Liu say we'll have to wait to see a sequel to iPhone Air, but The Information \u003ca href=\"https://www.theinformation.com/articles/apple-delays-release-next-iphone-air-amid-weak-sales\"\u003eprovides literally nothing beyond this headline\u003c/a\u003e outside their paywall:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eApple Delays Release of Next iPhone Air Amid Weak Sales\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBut does one \u003cem\u003etruly need\u003c/em\u003e to fork over  $399 to know exactly what the body of the article is going to say?\u003c/p\u003e\n\u003cp\u003eAll you need to know is that Justin Searls loving an Apple product is effectively the kiss of death in the Tim Cook era:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2015:\u003c/strong\u003e 12\u0026quot; MacBook, \u003ca href=\"/posts/the-12-macbook-was-announced-10-years-ago/\"\u003emy all-time favorite Mac\u003c/a\u003e, cancelled after two revisions\u003cbr/\u003e\n\u003cstrong\u003e2018:\u003c/strong\u003e HomePod, of which I bought six at launch, never sold through its initial manufacturing run\u003cbr/\u003e\n\u003cstrong\u003e2020:\u003c/strong\u003e iPhone mini, my all-time favorite iPhone, cancelled after one revision\u003cbr/\u003e\n\u003cstrong\u003e2024:\u003c/strong\u003e Vision Pro, \u003ca href=\"/casts/breaking-change-v4-facial-computing/\"\u003ewhich I rely on daily\u003c/a\u003e, received one revision \u003cem\u003eunder duress\u003c/em\u003e\u003cbr/\u003e\n\u003cstrong\u003e2025:\u003c/strong\u003e iPhone Air, which is \u003ca href=\"https://justin.searls.co/posts/why-i-bought-the-iphone-air/\"\u003eexactly what I asked for\u003c/a\u003e, had even its one revision cancelled\u003c/p\u003e\n\u003cp\u003eI don't know what I'm doing wrong here.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/","og_image":"https://justin.searls.co/img/social/links/2025-11-10-rip-iphone-18-air.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-11-10T21:29:50Z","related_url":"https://www.theinformation.com/articles/apple-delays-release-next-iphone-air-amid-weak-sales","title":"RIP iPhone 18 Air","updated_at":"2025-11-10T16:45:36-05:00","url":"https://justin.searls.co/links/2025-11-10-rip-iphone-18-air/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v46-adjusted-gross-intelligence/</id>
      <title type="text">🎙️ Breaking Change podcast v46 - Adjusted Gross Intelligence</title>
      <link href="https://justin.searls.co/casts/breaking-change-v46-adjusted-gross-intelligence/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-08T17:24:27+00:00</published>
    <updated>2025-11-09T10:47:57-05:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v46_a.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v46_a.mp3">Direct link to podcast audio file</a>
</p><p>I'm back and I'm angry. My power went out, which caused my Internet to go down, which broke my favorite mug. And that's just the shit that happened before 7 AM. By 9 AM my doorbell was continuously chiming for no fucking reason.</p>
<p>Join me in the struggle. We shall persevere. Tell me how your morning went by writing in to: <a href="mailto:podcast@searls.co">podcast@searls.co</a>.</p>
<p>Here 4 U:</p>
<ul>
<li><a href="https://judoscale.com/blog/priced-out-of-heroku">Kudos to Adam Mcrea and Judoscale for solving my Heroku issue</a></li>
<li><a href="https://searlsco.github.io/straight-to-video/">Kudos to me for <em>separately</em> solving my Heroku issue with Straight-to-Video</a></li>
<li><a href="https://github.com/alvr-org/ALVR">ALVR</a> for streaming SteamVR games</li>
<li>Streaming flat games with <a href="https://github.com/LizardByte/Sunshine">Sunshine</a> and <a href="https://github.com/moonlight-stream">Moonlight</a></li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://www.wreflection.com/p/ai-dial-up-era">AI's Dial-Up Era</a> (and <a href="https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/">my take</a>)</li>
<li><a href="https://sixcolors.com/post/2025/10/hello-robot-sandwich-launches-immersive-commercial/">Sandwich made the world's first immersive ad spot</a></li>
<li><a href="https://m.slashdot.org/story/448542">Coinbase CEO Stunt Exposes Prediction Market Vulnerability</a></li>
<li><a href="https://blogs.microsoft.com/blog/2025/10/28/the-next-chapter-of-the-microsoft-openai-partnership/">OpenAI and Microsoft resolve their issue without resolving their issue</a></li>
<li><a href="https://techcrunch.com/2025/11/04/amazon-sends-legal-threats-to-perplexity-over-agentic-browsing/">Amazon v. Perplexity</a></li>
<li><a href="https://www.videogameschronicle.com/news/ea-remains-committed-bioware-dispels-rumours-and-reassures-fans-mass-effect-5-is-still-coming/">BioWare reassures fans Mass Effect 5 is still coming</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Outer_Worlds_2">The Outer Worlds 2</a></li>
<li><a href="https://youtu.be/VRjgNgJms3Q">Eddy Burback - ChatGPT Made me Delusional</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>I'm back and I'm angry. My power went out, which caused my Internet to go down, which broke my favorite mug. And that's just the shit that happened before 7 AM. By 9 AM my doorbell was continuously chiming for no fucking reason.</p>
<p>Join me in the struggle. We shall persevere. Tell me how your morning went by writing in to: <a href="mailto:podcast@searls.co">podcast@searls.co</a>.</p>
<p>Here 4 U:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v46-adjusted-gross-intelligence/","append_url_label":"Hear 🎙","content":"\u003cp\u003eI'm back and I'm angry. My power went out, which caused my Internet to go down, which broke my favorite mug. And that's just the shit that happened before 7 AM. By 9 AM my doorbell was continuously chiming for no fucking reason.\u003c/p\u003e\n\u003cp\u003eJoin me in the struggle. We shall persevere. Tell me how your morning went by writing in to: \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHere 4 U:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://judoscale.com/blog/priced-out-of-heroku\"\u003eKudos to Adam Mcrea and Judoscale for solving my Heroku issue\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://searlsco.github.io/straight-to-video/\"\u003eKudos to me for \u003cem\u003eseparately\u003c/em\u003e solving my Heroku issue with Straight-to-Video\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/alvr-org/ALVR\"\u003eALVR\u003c/a\u003e for streaming SteamVR games\u003c/li\u003e\n\u003cli\u003eStreaming flat games with \u003ca href=\"https://github.com/LizardByte/Sunshine\"\u003eSunshine\u003c/a\u003e and \u003ca href=\"https://github.com/moonlight-stream\"\u003eMoonlight\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.wreflection.com/p/ai-dial-up-era\"\u003eAI's Dial-Up Era\u003c/a\u003e (and \u003ca href=\"https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/\"\u003emy take\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://sixcolors.com/post/2025/10/hello-robot-sandwich-launches-immersive-commercial/\"\u003eSandwich made the world's first immersive ad spot\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://m.slashdot.org/story/448542\"\u003eCoinbase CEO Stunt Exposes Prediction Market Vulnerability\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blogs.microsoft.com/blog/2025/10/28/the-next-chapter-of-the-microsoft-openai-partnership/\"\u003eOpenAI and Microsoft resolve their issue without resolving their issue\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://techcrunch.com/2025/11/04/amazon-sends-legal-threats-to-perplexity-over-agentic-browsing/\"\u003eAmazon v. Perplexity\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/ea-remains-committed-bioware-dispels-rumours-and-reassures-fans-mass-effect-5-is-still-coming/\"\u003eBioWare reassures fans Mass Effect 5 is still coming\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Outer_Worlds_2\"\u003eThe Outer Worlds 2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/VRjgNgJms3Q\"\u003eEddy Burback - ChatGPT Made me Delusional\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Adjusted Gross Intelligence","id":"https://justin.searls.co/casts/breaking-change-v46-adjusted-gross-intelligence/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v46-adjusted-gross-intelligence.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-11-08T17:24:27Z","title":"Adjusted Gross Intelligence","updated_at":"2025-11-09T10:47:57-05:00","url":"https://justin.searls.co/casts/breaking-change-v46-adjusted-gross-intelligence/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/</id>
      <title type="text">🔗 Software is supply-constrained (for now)</title>
        <link href="https://www.wreflection.com/p/ai-dial-up-era" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-11-04T21:17:25+00:00</published>
    <updated>2025-11-04T21:55:39+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Fantastic <a href="https://www.wreflection.com/p/ai-dial-up-era">write-up by Nowfal</a> comparing AI's current moment to the Internet's dial-up era. This bit in particular points to a cleavage that far too few people understand:</p>
<blockquote>
<p>Software presents an even more interesting question. How many apps do you need? What about software that generates applications on demand, that creates entire software ecosystems autonomously? Until now, handcrafted software was the constraint. Expensive software engineers and <del>their</del> our labor costs limited what companies could afford to build. Automation changes this equation by making those engineers far more productive. Both consumer and enterprise software markets suggest significant unmet demand because businesses have consistently left projects unbuilt. They couldn't justify the development costs or had to allocate limited resources to their top priority projects. I saw this firsthand at Amazon. Thousands of ideas went unfunded not because they lacked business value, but because of the lack of engineering resources to build them. If AI can produce software at a fraction of the cost, that unleashes enormous latent demand. The key question then is if and when that demand will saturate.</p>
</blockquote>
<p>Two things are simultaneously true:</p>
<ol>
<li>The creation of custom software has been supply-constrained throughout the entire history of computing. Nobody knows how many apps were never even imagined—much less developed—due to this constraint, but it's probably fair to say there's an unbelievably massive, decades-long backlog of unmet demand for custom software</li>
<li>We aren't even six months into the <a href="/shovelware/">Shovelware</a> era of coding agents. Exceedingly few developers have even tried these things; the tooling is so bad as to be counterproductive to the task; and yet experienced early adopters (like me) have concluded today's mediocre agents are already <em>substantially better</em> at writing software</li>
</ol>
<p>It's long been my view that the appropriate response to the current moment is to <strong>ride this walrus</strong> and leverage coding agents to increase the scope of our ambitions. By the time software demand has been saturated and put us out of jobs, the supply of programmers will already have tapered off as the next generation sees the inflection point coming.</p>
<p>In the short term, the only programmers actually losing their jobs to &quot;AI&quot; are those who refuse to engage with the technology. Using coding agents effectively is a learned skill like any other—and if you don't keep your skills current, fewer people will want to hire you.</p>

<p>🔗 <a href="https://www.wreflection.com/p/ai-dial-up-era" title="Original Article">wreflection.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>Fantastic <a href="https://www.wreflection.com/p/ai-dial-up-era">write-up by Nowfal</a> comparing AI's current moment to the Internet's dial-up era. This bit in particular points to a cleavage that far too few people understand:</p>
<blockquote>
<p>Software presents an even more interesting question. How many apps do you need? What about software that generates applications on demand, that creates entire software ecosystems autonomously? Until now, handcrafted software was the constraint. Expensive software engineers and <del>their</del> our labor costs limited what companies could afford to build. Automation changes this equation by making those engineers far more productive. Both consumer and enterprise software markets suggest significant unmet demand because businesses have consistently left projects unbuilt. They couldn't justify the development costs or had to allocate limited resources to their top priority projects. I saw this firsthand at Amazon. Thousands of ideas went unfunded not because they lacked business value, but because of the lack of engineering resources to build them. If AI can produce software at a fraction of the cost, that unleashes enormous latent demand. The key question then is if and when that demand will saturate.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/","append_url_label":"Click 🔗","content":"\u003cp\u003eFantastic \u003ca href=\"https://www.wreflection.com/p/ai-dial-up-era\"\u003ewrite-up by Nowfal\u003c/a\u003e comparing AI's current moment to the Internet's dial-up era. This bit in particular points to a cleavage that far too few people understand:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSoftware presents an even more interesting question. How many apps do you need? What about software that generates applications on demand, that creates entire software ecosystems autonomously? Until now, handcrafted software was the constraint. Expensive software engineers and \u003cdel\u003etheir\u003c/del\u003e our labor costs limited what companies could afford to build. Automation changes this equation by making those engineers far more productive. Both consumer and enterprise software markets suggest significant unmet demand because businesses have consistently left projects unbuilt. They couldn't justify the development costs or had to allocate limited resources to their top priority projects. I saw this firsthand at Amazon. Thousands of ideas went unfunded not because they lacked business value, but because of the lack of engineering resources to build them. If AI can produce software at a fraction of the cost, that unleashes enormous latent demand. The key question then is if and when that demand will saturate.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTwo things are simultaneously true:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eThe creation of custom software has been supply-constrained throughout the entire history of computing. Nobody knows how many apps were never even imagined—much less developed—due to this constraint, but it's probably fair to say there's an unbelievably massive, decades-long backlog of unmet demand for custom software\u003c/li\u003e\n\u003cli\u003eWe aren't even six months into the \u003ca href=\"/shovelware/\"\u003eShovelware\u003c/a\u003e era of coding agents. Exceedingly few developers have even tried these things; the tooling is so bad as to be counterproductive to the task; and yet experienced early adopters (like me) have concluded today's mediocre agents are already \u003cem\u003esubstantially better\u003c/em\u003e at writing software\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIt's long been my view that the appropriate response to the current moment is to \u003cstrong\u003eride this walrus\u003c/strong\u003e and leverage coding agents to increase the scope of our ambitions. By the time software demand has been saturated and put us out of jobs, the supply of programmers will already have tapered off as the next generation sees the inflection point coming.\u003c/p\u003e\n\u003cp\u003eIn the short term, the only programmers actually losing their jobs to \u0026quot;AI\u0026quot; are those who refuse to engage with the technology. Using coding agents effectively is a learned skill like any other—and if you don't keep your skills current, fewer people will want to hire you.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/","og_image":"https://justin.searls.co/img/social/links/2025-11-04-software-is-supply-constrained-for-now.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-11-04T21:17:25Z","related_url":"https://www.wreflection.com/p/ai-dial-up-era","title":"Software is supply-constrained (for now)","updated_at":"2025-11-04T21:55:39Z","url":"https://justin.searls.co/links/2025-11-04-software-is-supply-constrained-for-now/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/how-to-downgrade-vision-pro-dfu-mode/</id>
      <title type="text">📄 How to downgrade Vision Pro</title>
      <link href="https://justin.searls.co/posts/how-to-downgrade-vision-pro-dfu-mode/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-30T19:00:35+00:00</published>
    <updated>2025-10-30T15:20:19-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>For <a href="/takes/2025-10-30-11h00m40s/">stupid reasons</a>, I had to downgrade my Vision Pro from visionOS 26.1 to 26.0.1 today. Here's how to put Vision Pro into Device Firmware Update (&quot;DFU&quot;) mode and downgrade.</p>
<p>Here's how to restore a Vision Pro in 9 easy steps:</p>
<ol>
<li>Buy a <a href="https://developer.apple.com/visionos/developer-strap/">Developer Strap</a> for $299</li>
<li>Go to <a href="https://ipsw.me/product/Vision">ipsw.me</a> and do your best to dodge its shitty ads as you try to download the IPSW restore file for your model Vision Pro at the version you need (if you don't see that version, it's likely because Apple isn't signing it anymore and you're <a href="https://en.wiktionary.org/wiki/shit_out_of_luck">SOL</a>)</li>
<li>Install <a href="https://apps.apple.com/us/app/apple-configurator/id1037126344?mt=12">Apple Configurator</a> to your Mac</li>
<li>Connect the Developer Strap to your Mac via USB-C, and disconnect Vision Pro from power</li>
<li>Get ready to press and hold the top button (not the digital crown, the other one), then reconnect power to Vision Pro and immediately press and hold the top button until the outer screen shows a cable icon</li>
<li>Open Apple Configurator, and you should see a Vision Pro icon.</li>
<li>Drag the IPSW file over the Vision Pro icon and click Restore</li>
<li>Click things and hope it works</li>
<li>Ask yourself what the fuck you did in a past life that brought you to this moment</li>
</ol>
<p>Good luck, have fun. 🕶️</p>]]></content>
    <summary type="html"><![CDATA[<p>For <a href="/takes/2025-10-30-11h00m40s/">stupid reasons</a>, I had to downgrade my Vision Pro from visionOS 26.1 to 26.0.1 today. Here's how to put Vision Pro into Device Firmware Update (&quot;DFU&quot;) mode and downgrade.</p>
<p>Here's how to restore a Vision Pro in 9 easy steps:</p>
<ol>
<li>Buy a <a href="https://developer.apple.com/visionos/developer-strap/">Developer Strap</a> for $299</li>
<li>Go to <a href="https://ipsw.me/product/Vision">ipsw.me</a> and do your best to dodge its shitty ads as you try to download the IPSW restore file for your model Vision Pro at the version you need (if you don't see that version, it's likely because Apple isn't signing it anymore and you're <a href="https://en.wiktionary.org/wiki/shit_out_of_luck">SOL</a>)</li>
<li>Install <a href="https://apps.apple.com/us/app/apple-configurator/id1037126344?mt=12">Apple Configurator</a> to your Mac</li>
<li>Connect the Developer Strap to your Mac via USB-C, and disconnect Vision Pro from power</li>
<li>Get ready to press and hold the top button (not the digital crown, the other one), then reconnect power to Vision Pro and immediately press and hold the top button until the outer screen shows a cable icon</li>
<li>Open Apple Configurator, and you should see a Vision Pro icon.</li>
<li>Drag the IPSW file over the Vision Pro icon and click Restore</li>
<li>Click things and hope it works</li>
<li>Ask yourself what the fuck you did in a past life that brought you to this moment</li>
</ol>
<p>Good luck, have fun. 🕶️</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/how-to-downgrade-vision-pro-dfu-mode/","append_url_label":"Read 📄","content":"\u003cp\u003eFor \u003ca href=\"/takes/2025-10-30-11h00m40s/\"\u003estupid reasons\u003c/a\u003e, I had to downgrade my Vision Pro from visionOS 26.1 to 26.0.1 today. Here's how to put Vision Pro into Device Firmware Update (\u0026quot;DFU\u0026quot;) mode and downgrade.\u003c/p\u003e\n\u003cp\u003eHere's how to restore a Vision Pro in 9 easy steps:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eBuy a \u003ca href=\"https://developer.apple.com/visionos/developer-strap/\"\u003eDeveloper Strap\u003c/a\u003e for $299\u003c/li\u003e\n\u003cli\u003eGo to \u003ca href=\"https://ipsw.me/product/Vision\"\u003eipsw.me\u003c/a\u003e and do your best to dodge its shitty ads as you try to download the IPSW restore file for your model Vision Pro at the version you need (if you don't see that version, it's likely because Apple isn't signing it anymore and you're \u003ca href=\"https://en.wiktionary.org/wiki/shit_out_of_luck\"\u003eSOL\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInstall \u003ca href=\"https://apps.apple.com/us/app/apple-configurator/id1037126344?mt=12\"\u003eApple Configurator\u003c/a\u003e to your Mac\u003c/li\u003e\n\u003cli\u003eConnect the Developer Strap to your Mac via USB-C, and disconnect Vision Pro from power\u003c/li\u003e\n\u003cli\u003eGet ready to press and hold the top button (not the digital crown, the other one), then reconnect power to Vision Pro and immediately press and hold the top button until the outer screen shows a cable icon\u003c/li\u003e\n\u003cli\u003eOpen Apple Configurator, and you should see a Vision Pro icon.\u003c/li\u003e\n\u003cli\u003eDrag the IPSW file over the Vision Pro icon and click Restore\u003c/li\u003e\n\u003cli\u003eClick things and hope it works\u003c/li\u003e\n\u003cli\u003eAsk yourself what the fuck you did in a past life that brought you to this moment\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eGood luck, have fun. 🕶️\u003c/p\u003e","id":"https://justin.searls.co/posts/how-to-downgrade-vision-pro-dfu-mode/","og_image":"https://justin.searls.co/img/social/posts/how-to-downgrade-vision-pro-dfu-mode.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-30T19:00:35Z","title":"How to downgrade Vision Pro","updated_at":"2025-10-30T15:20:19-04:00","url":"https://justin.searls.co/posts/how-to-downgrade-vision-pro-dfu-mode/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v45-developer-strap-on/</id>
      <title type="text">🎙️ Breaking Change podcast v45 - Developer Strap-on</title>
      <link href="https://justin.searls.co/casts/breaking-change-v45-developer-strap-on/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-26T14:54:47+00:00</published>
    <updated>2025-10-27T20:46:01-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v45.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v45.mp3">Direct link to podcast audio file</a>
</p><p>This may be the version 45 release of Breaking Change, but when you factor in its Hotfixes and Feature Release entries, this is somehow <strong>the 50th episode of the show!</strong></p>
<p>Why? Why are we still doing this to ourselves? Write in your answer and how you feel about yourself as a result to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Seriously, I need some new material.</p>
<p>The web runs on links, so have some:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/KnightCite">KnightCite's Wikipedia page</a></li>
<li><a href="https://wisprflow.ai">Whisprflow</a> wasn't for me</li>
<li>The <a href="https://posseparty.com">POSSE Party</a> is still on and will come to you, eventually</li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://www.popularmechanics.com/science/a68008705/ultrasound-for-alzheimers-dementia/">This Cheap, Tiny Device May Reverse Memory Loss—And Even Prevent Alzheimer's</a> (<a href="https://apple.news/Ank3pPaXtS4q8PltTMQoypA">News+</a>)</li>
<li><a href="https://www.telegraph.co.uk/business/2025/10/12/why-western-executives-visit-china-coming-back-terrified/">Why Western executives who visit China are coming back terrified</a> (<a href="https://apple.news/ADloeSFYbSUG8yJSXwwYX7g">News+</a>)</li>
<li><a href="https://www.theguardian.com/environment/2025/oct/16/plug-in-hybrids-pollute-almost-as-much-as-petrol-cars-report-finds">Plug-in hybrids pollute almost as much as petrol cars, report finds</a></li>
<li><a href="https://restofworld.org/2025/philippines-offshoring-automation-tech-jobs/">Tele-conbini workers in Manilla</a></li>
<li><a href="https://www.datacenterdynamics.com/en/news/858tb-of-government-data-may-be-lost-for-good-after-south-korea-data-center-fire/">South Korea lost 858TB of government data without a backup</a></li>
<li><a href="https://www.washingtonpost.com/technology/2025/10/22/amazon-aws-outage-eight-sleep-mattress/">The AWS/Smart bed outage</a> (<a href="https://apple.news/AVmp_413LRyKy8u4a-4TY2g">News+</a>)</li>
<li><a href="https://calendearing.com/">Calendearing</a> by Zach Holman</li>
<li><a href="https://www.theguardian.com/books/2025/oct/22/detection-firm-finds-82-of-herbal-remedy-books-on-amazon-likely-written-by-ai">Detection firm finds 82% of herbal remedy books on Amazon 'likely written' by AI</a></li>
<li><a href="https://blog.samaltman.com/sora-update-number-1">Sora update #1</a></li>
<li><a href="https://futurism.com/chatgpt-marriages-divorces">ChatGPT Is Blowing Up Marriages as Spouses Use AI to Attack Their Partners</a></li>
<li><a href="https://www.businessinsider.com/sora-video-openai-fetish-content-my-face-problem-2025-10">Perverts on Sora</a></li>
<li><a href="https://www.theverge.com/news/799312/openai-chatgpt-erotica-sam-altman-verified-adults">Sam Altman says ChatGPT will soon sext with verified adults</a></li>
<li><a href="https://www.bbc.com/travel/article/20250926-the-perils-of-letting-ai-plan-your-next-trip">Don't let AI invent your next holiday destination</a></li>
<li><a href="https://www.macrumors.com/2025/09/23/iphones-third-party-smartwatch-features/">Apple notification forwarding API is a potential game changer for Meta glasses</a></li>
<li><a href="https://www.macrumors.com/2025/10/06/apple-leadership-shakeup-impending/">John Ternus as Next CEO?</a></li>
<li><a href="https://www.apple.com/newsroom/2025/10/apple-vision-pro-upgraded-with-the-m5-chip-and-dual-knit-band/">Apple released the M5 Vision Pro</a></li>
<li><a href="https://www.macrumors.com/2025/10/22/apple-releases-new-vision-pro-developer-strap/">And a new Vision Pro Developer Strap</a></li>
<li><a href="https://www.bloomberg.com/news/articles/2025-10-16/apple-readies-high-end-macbook-pro-with-touch-hole-punch-screen">Apple Readies High-End MacBook Pro With Touch, Hole-Punch Screen</a></li>
<li><a href="https://satcom.sysnet.ucsd.edu/">You Only Need $750 to Pilfer Unencrypted Data From Satellites</a></li>
<li><a href="https://youtu.be/DrntVfVSq8E">They're making a new Star Trek Voyager game</a></li>
<li>That Wolverine game <a href="https://www.videogameschronicle.com/news/four-years-after-it-was-first-announced-insomniacs-wolverine-has-a-gameplay-trailer-and-a-release-window/">sure looks M-rated</a></li>
<li><a href="https://www.youtube.com/watch?v=e-tXi1NC_aU">Halo on PlayStation? In this economy?</a></li>
<li><a href="https://www.videogameschronicle.com/news/the-next-xbox-console-is-a-premium-system-which-shares-some-of-the-thinking-behind-the-rog-xbox-ally-sarah-bond-says/">The next Xbox console is a 'premium' system</a></li>
<li><a href="https://apnews.com/article/adam-driver-star-wars-soderbergh-jarmusch-4e08164d0419759f1b5b50d69864975d">Adam Driver says Disney nixed a Kylo Ren film he pitched with Steven Soderbergh</a></li>
<li><a href="https://www.tomsguide.com/computing/office-software/microsoft-teams-will-start-snitching-to-your-boss-when-youre-not-in-the-office-and-this-update-is-coming-in-december">Microsoft Teams can now track attendance</a></li>
<li><a href="https://en.wikipedia.org/wiki/Foundation_(TV_series)">Foundation</a></li>
<li><a href="https://en.wikipedia.org/wiki/Alien:_Earth">Alien: Earth</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Last_of_Us_(TV_series)">The Last of Us</a></li>
<li><a href="https://en.wikipedia.org/wiki/Invasion_(2021_TV_series)">Invasion</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Bear_(TV_series)">The Bear</a></li>
<li><a href="https://www.playstation.com/en-us/ps-vr2/">PSVR2</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Tears_of_the_Kingdom">Tears of the Kingdom</a></li>
<li>John writes: <a href="https://johnoerter.me/posts/why-programming-languages-arent-going-anywhere/">Why programming languages aren't going anywhere</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>This may be the version 45 release of Breaking Change, but when you factor in its Hotfixes and Feature Release entries, this is somehow <strong>the 50th episode of the show!</strong></p>
<p>Why? Why are we still doing this to ourselves? Write in your answer and how you feel about yourself as a result to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Seriously, I need some new material.</p>
<p>The web runs on links, so have some:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v45-developer-strap-on/","append_url_label":"Hear 🎙","content":"\u003cp\u003eThis may be the version 45 release of Breaking Change, but when you factor in its Hotfixes and Feature Release entries, this is somehow \u003cstrong\u003ethe 50th episode of the show!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWhy? Why are we still doing this to ourselves? Write in your answer and how you feel about yourself as a result to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e. Seriously, I need some new material.\u003c/p\u003e\n\u003cp\u003eThe web runs on links, so have some:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/KnightCite\"\u003eKnightCite's Wikipedia page\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wisprflow.ai\"\u003eWhisprflow\u003c/a\u003e wasn't for me\u003c/li\u003e\n\u003cli\u003eThe \u003ca href=\"https://posseparty.com\"\u003ePOSSE Party\u003c/a\u003e is still on and will come to you, eventually\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.popularmechanics.com/science/a68008705/ultrasound-for-alzheimers-dementia/\"\u003eThis Cheap, Tiny Device May Reverse Memory Loss—And Even Prevent Alzheimer's\u003c/a\u003e (\u003ca href=\"https://apple.news/Ank3pPaXtS4q8PltTMQoypA\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.telegraph.co.uk/business/2025/10/12/why-western-executives-visit-china-coming-back-terrified/\"\u003eWhy Western executives who visit China are coming back terrified\u003c/a\u003e (\u003ca href=\"https://apple.news/ADloeSFYbSUG8yJSXwwYX7g\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theguardian.com/environment/2025/oct/16/plug-in-hybrids-pollute-almost-as-much-as-petrol-cars-report-finds\"\u003ePlug-in hybrids pollute almost as much as petrol cars, report finds\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://restofworld.org/2025/philippines-offshoring-automation-tech-jobs/\"\u003eTele-conbini workers in Manilla\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.datacenterdynamics.com/en/news/858tb-of-government-data-may-be-lost-for-good-after-south-korea-data-center-fire/\"\u003eSouth Korea lost 858TB of government data without a backup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.washingtonpost.com/technology/2025/10/22/amazon-aws-outage-eight-sleep-mattress/\"\u003eThe AWS/Smart bed outage\u003c/a\u003e (\u003ca href=\"https://apple.news/AVmp_413LRyKy8u4a-4TY2g\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://calendearing.com/\"\u003eCalendearing\u003c/a\u003e by Zach Holman\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theguardian.com/books/2025/oct/22/detection-firm-finds-82-of-herbal-remedy-books-on-amazon-likely-written-by-ai\"\u003eDetection firm finds 82% of herbal remedy books on Amazon 'likely written' by AI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.samaltman.com/sora-update-number-1\"\u003eSora update #1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://futurism.com/chatgpt-marriages-divorces\"\u003eChatGPT Is Blowing Up Marriages as Spouses Use AI to Attack Their Partners\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.businessinsider.com/sora-video-openai-fetish-content-my-face-problem-2025-10\"\u003ePerverts on Sora\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/news/799312/openai-chatgpt-erotica-sam-altman-verified-adults\"\u003eSam Altman says ChatGPT will soon sext with verified adults\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bbc.com/travel/article/20250926-the-perils-of-letting-ai-plan-your-next-trip\"\u003eDon't let AI invent your next holiday destination\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.macrumors.com/2025/09/23/iphones-third-party-smartwatch-features/\"\u003eApple notification forwarding API is a potential game changer for Meta glasses\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.macrumors.com/2025/10/06/apple-leadership-shakeup-impending/\"\u003eJohn Ternus as Next CEO?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.apple.com/newsroom/2025/10/apple-vision-pro-upgraded-with-the-m5-chip-and-dual-knit-band/\"\u003eApple released the M5 Vision Pro\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.macrumors.com/2025/10/22/apple-releases-new-vision-pro-developer-strap/\"\u003eAnd a new Vision Pro Developer Strap\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bloomberg.com/news/articles/2025-10-16/apple-readies-high-end-macbook-pro-with-touch-hole-punch-screen\"\u003eApple Readies High-End MacBook Pro With Touch, Hole-Punch Screen\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://satcom.sysnet.ucsd.edu/\"\u003eYou Only Need $750 to Pilfer Unencrypted Data From Satellites\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/DrntVfVSq8E\"\u003eThey're making a new Star Trek Voyager game\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eThat Wolverine game \u003ca href=\"https://www.videogameschronicle.com/news/four-years-after-it-was-first-announced-insomniacs-wolverine-has-a-gameplay-trailer-and-a-release-window/\"\u003esure looks M-rated\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=e-tXi1NC_aU\"\u003eHalo on PlayStation? In this economy?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/the-next-xbox-console-is-a-premium-system-which-shares-some-of-the-thinking-behind-the-rog-xbox-ally-sarah-bond-says/\"\u003eThe next Xbox console is a 'premium' system\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://apnews.com/article/adam-driver-star-wars-soderbergh-jarmusch-4e08164d0419759f1b5b50d69864975d\"\u003eAdam Driver says Disney nixed a Kylo Ren film he pitched with Steven Soderbergh\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.tomsguide.com/computing/office-software/microsoft-teams-will-start-snitching-to-your-boss-when-youre-not-in-the-office-and-this-update-is-coming-in-december\"\u003eMicrosoft Teams can now track attendance\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Foundation_(TV_series)\"\u003eFoundation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Alien:_Earth\"\u003eAlien: Earth\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Last_of_Us_(TV_series)\"\u003eThe Last of Us\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Invasion_(2021_TV_series)\"\u003eInvasion\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Bear_(TV_series)\"\u003eThe Bear\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.playstation.com/en-us/ps-vr2/\"\u003ePSVR2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Tears_of_the_Kingdom\"\u003eTears of the Kingdom\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eJohn writes: \u003ca href=\"https://johnoerter.me/posts/why-programming-languages-arent-going-anywhere/\"\u003eWhy programming languages aren't going anywhere\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Developer Strap-on","id":"https://justin.searls.co/casts/breaking-change-v45-developer-strap-on/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v45-developer-strap-on.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-26T14:54:47Z","title":"Developer Strap-on","updated_at":"2025-10-27T20:46:01-04:00","url":"https://justin.searls.co/casts/breaking-change-v45-developer-strap-on/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-10-25-12h35m39s/</id>
      <title type="text">📸 The new Developer Strap delivers 20 Gbps to M2 Vision Pro</title>
      <link href="https://justin.searls.co/shots/2025-10-25-12h35m39s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-25T16:35:39+00:00</published>
    <updated>2025-10-25T13:09:22-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-10-25-12h34m54s-252d1c2.jpeg"/>
</div><p>Like many other Vision Pro sickos, I was far more excited about this week's announcement of a <a href="https://www.macrumors.com/2025/10/22/apple-releases-new-vision-pro-developer-strap/">newly-updated Developer Strap</a> than I was about last week's news of the <a href="https://www.apple.com/newsroom/2025/10/apple-vision-pro-upgraded-with-the-m5-chip-and-dual-knit-band/">M5 Vision Pro</a> itself.</p>
<p>Why? The original strap allowed you to connect your Vision Pro to a Mac, <em>but at unacceptably slow USB 2.0 (480 Mbps) speeds</em>. This still achieved much lower latency connection than WiFi, but the image quality when running <a href="https://support.apple.com/en-us/118521">Mac Virtual Display</a> over the USB connection was rendered far too blurry to be worthwhile. The new strap, however, offers a massively-upgraded <em>20 Gbps</em> connection speed. I rushed to order one at the news, because, in theory, those speeds ought to offer the absolute best experience possible when using Vision Pro as an immersive Mac display.</p>
<p>While Apple's support documentation says both devices &quot;support&quot; connecting to the strap, what wasn't clear was whether the original hardware would be able to actually deliver the increased bandwidth.</p>
<p>Well, I'm happy to report after plugging in the new Developer Strap into my original Vision Pro, <strong>System Information indicates a 20 Gbps connection!</strong> Moreover, I can confirm Mac Virtual Display performs better than ever.</p>
<p>Seriously, I don't think I'll be able to go back. The increase in visual sharpness and the lightning-quick latency beat the pants off anything I've experienced, and I've been using Mac Virtual Display daily since the product's initial release. Up to now, others who've tried using Vision Pro for this purpose have reported that the display quality is poor—likely attributable to the need for a carefully-tuned WiFi environment to sustain the connection. That Apple finally offers a wired connection that delivers the definitive experience is a huge win.</p>
<p>If you own a Vision Pro and use it as a display for your Mac, you're already a dummy who blew $3500 on this thing—go spend $300 more and treat yourself to a massive upgrade.</p>

]]></content>
    <summary type="html"><![CDATA[<p>Like many other Vision Pro sickos, I was far more excited about this week's announcement of a <a href="https://www.macrumors.com/2025/10/22/apple-releases-new-vision-pro-developer-strap/">newly-updated Developer Strap</a> than I was about last week's news of the <a href="https://www.apple.com/newsroom/2025/10/apple-vision-pro-upgraded-with-the-m5-chip-and-dual-knit-band/">M5 Vision Pro</a> itself.</p>
<p>Why? The original strap allowed you to connect your Vision Pro to a Mac, <em>but at unacceptably slow USB 2.0 (480 Mbps) speeds</em>. This still achieved much lower latency connection than WiFi, but the image quality when running <a href="https://support.apple.com/en-us/118521">Mac Virtual Display</a> over the USB connection was rendered far too blurry to be worthwhile. The new strap, however, offers a massively-upgraded <em>20 Gbps</em> connection speed. I rushed to order one at the news, because, in theory, those speeds ought to offer the absolute best experience possible when using Vision Pro as an immersive Mac display.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-10-25-12h35m39s/","append_url_label":"View 📸","content":"\u003cp\u003eLike many other Vision Pro sickos, I was far more excited about this week's announcement of a \u003ca href=\"https://www.macrumors.com/2025/10/22/apple-releases-new-vision-pro-developer-strap/\"\u003enewly-updated Developer Strap\u003c/a\u003e than I was about last week's news of the \u003ca href=\"https://www.apple.com/newsroom/2025/10/apple-vision-pro-upgraded-with-the-m5-chip-and-dual-knit-band/\"\u003eM5 Vision Pro\u003c/a\u003e itself.\u003c/p\u003e\n\u003cp\u003eWhy? The original strap allowed you to connect your Vision Pro to a Mac, \u003cem\u003ebut at unacceptably slow USB 2.0 (480 Mbps) speeds\u003c/em\u003e. This still achieved much lower latency connection than WiFi, but the image quality when running \u003ca href=\"https://support.apple.com/en-us/118521\"\u003eMac Virtual Display\u003c/a\u003e over the USB connection was rendered far too blurry to be worthwhile. The new strap, however, offers a massively-upgraded \u003cem\u003e20 Gbps\u003c/em\u003e connection speed. I rushed to order one at the news, because, in theory, those speeds ought to offer the absolute best experience possible when using Vision Pro as an immersive Mac display.\u003c/p\u003e\n\u003cp\u003eWhile Apple's support documentation says both devices \u0026quot;support\u0026quot; connecting to the strap, what wasn't clear was whether the original hardware would be able to actually deliver the increased bandwidth.\u003c/p\u003e\n\u003cp\u003eWell, I'm happy to report after plugging in the new Developer Strap into my original Vision Pro, \u003cstrong\u003eSystem Information indicates a 20 Gbps connection!\u003c/strong\u003e Moreover, I can confirm Mac Virtual Display performs better than ever.\u003c/p\u003e\n\u003cp\u003eSeriously, I don't think I'll be able to go back. The increase in visual sharpness and the lightning-quick latency beat the pants off anything I've experienced, and I've been using Mac Virtual Display daily since the product's initial release. Up to now, others who've tried using Vision Pro for this purpose have reported that the display quality is poor—likely attributable to the need for a carefully-tuned WiFi environment to sustain the connection. That Apple finally offers a wired connection that delivers the definitive experience is a huge win.\u003c/p\u003e\n\u003cp\u003eIf you own a Vision Pro and use it as a display for your Mac, you're already a dummy who blew $3500 on this thing—go spend $300 more and treat yourself to a massive upgrade.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-10-25-12h35m39s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-10-25-12h34m54s-252d1c2.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-10-25-12h34m54s-252d1c2.jpeg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-25T16:35:39Z","title":"The new Developer Strap delivers 20 Gbps to M2 Vision Pro","updated_at":"2025-10-25T13:09:22-04:00","url":"https://justin.searls.co/shots/2025-10-25-12h35m39s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/merge-commits-ruby-ai-tldr-of-ai-dev/</id>
      <title type="text">🎙️ Merge Commits podcast - The Ruby AI Podcast: The TLDR of AI Dev</title>
      <link href="https://justin.searls.co/casts/merge-commits-ruby-ai-tldr-of-ai-dev/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-21T15:42:53+00:00</published>
    <updated>2025-10-21T12:31:26-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/merge-commits/2025-10-21.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/merge-commits/2025-10-21.mp3">Direct link to podcast audio file</a>
</p><p><a href="https://www.defmethod.com/">Joe Leo</a> and <a href="https://blog.codenamev.com/">Valentino Stoll</a> sat with me to talk about why I quit speaking and an exciting year of iteration on AI development workflows.</p>
<p><strong>Appearing on:</strong> <a href="https://www.therubyaipodcast.com">The Ruby AI Podcast</a><br/>
<strong>Published on:</strong> <code>2025-10-25</code><br/>
<strong>Original URL:</strong> <a href="https://www.therubyaipodcast.com/2388930/episodes/18044989-the-tldr-of-ai-dev-real-workflows-with-justin-searls">https://www.therubyaipodcast.com/2388930/episodes/18044989-the-tldr-of-ai-dev-real-workflows-with-justin-searls</a></p>
<p>Comments? Questions? Suggestion of a podcast I should guest on? <a href="mailto:podcast@searls.co">podcast@searls.co</a></p>

]]></content>
    <summary type="html"><![CDATA[<p><a href="https://www.defmethod.com/">Joe Leo</a> and <a href="https://blog.codenamev.com/">Valentino Stoll</a> sat with me to talk about why I quit speaking and an exciting year of iteration on AI development workflows.</p>
<p><strong>Appearing on:</strong> <a href="https://www.therubyaipodcast.com">The Ruby AI Podcast</a><br/>
<strong>Published on:</strong> <code>2025-10-25</code><br/>
<strong>Original URL:</strong> <a href="https://www.therubyaipodcast.com/2388930/episodes/18044989-the-tldr-of-ai-dev-real-workflows-with-justin-searls">https://www.therubyaipodcast.com/2388930/episodes/18044989-the-tldr-of-ai-dev-real-workflows-with-justin-searls</a></p>
<p>Comments? Questions? Suggestion of a podcast I should guest on? <a href="mailto:podcast@searls.co">podcast@searls.co</a></p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/merge-commits-ruby-ai-tldr-of-ai-dev/","append_url_label":"Hear 🎙","content":"\u003cp\u003e\u003ca href=\"https://www.defmethod.com/\"\u003eJoe Leo\u003c/a\u003e and \u003ca href=\"https://blog.codenamev.com/\"\u003eValentino Stoll\u003c/a\u003e sat with me to talk about why I quit speaking and an exciting year of iteration on AI development workflows.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAppearing on:\u003c/strong\u003e \u003ca href=\"https://www.therubyaipodcast.com\"\u003eThe Ruby AI Podcast\u003c/a\u003e\u003cbr/\u003e\n\u003cstrong\u003ePublished on:\u003c/strong\u003e \u003ccode\u003e2025-10-25\u003c/code\u003e\u003cbr/\u003e\n\u003cstrong\u003eOriginal URL:\u003c/strong\u003e \u003ca href=\"https://www.therubyaipodcast.com/2388930/episodes/18044989-the-tldr-of-ai-dev-real-workflows-with-justin-searls\"\u003ehttps://www.therubyaipodcast.com/2388930/episodes/18044989-the-tldr-of-ai-dev-real-workflows-with-justin-searls\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eComments? Questions? Suggestion of a podcast I should guest on? \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e\u003c/p\u003e\n","format_string":"New episode of Merge Commits is live! The Ruby AI Podcast: The TLDR of AI Dev","id":"https://justin.searls.co/casts/merge-commits-ruby-ai-tldr-of-ai-dev/","og_image":"https://justin.searls.co/img/podcast/merge-commits-ruby-ai.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-21T15:42:53Z","title":"The Ruby AI Podcast: The TLDR of AI Dev","updated_at":"2025-10-21T12:31:26-04:00","url":"https://justin.searls.co/casts/merge-commits-ruby-ai-tldr-of-ai-dev/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/mails/2025-09/</id>
      <title type="text">✉️ The Generative Creativity Spectrum</title>
      <link href="https://justin.searls.co/mails/2025-09/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-21T00:17:59+00:00</published>
    <updated>2025-10-21T00:18:02+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p class="italic text-secondary">
  <em>This is a copy of the <a href="/newsletter" class="underline hover:no-underline">Searls of Wisdom newsletter</a>
  delivered to subscribers on October 18, 2025.</em>
</p>


<p>It's me, your friend Justin, coming at you with my takes on September, which are arriving so late in October that I'm already thinking about November. To keep things simple, I'll just try to focus on the present moment for once.</p>
<p>Below is what I apparently put out this month. I'm sure I did other shit too, but none of it had permalinks:</p>
<ul>
<li>Added <a href="https://tot.rocks/">Tot</a> to my (very) short list of apps I use every day, finding it helps me <a href="https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/">manage the ephemeral text</a> needed to juggle multiple coding agents</li>
<li>Cut only one <a href="https://justin.searls.co/casts/breaking-change-v44-cant-get-it-up/">major release</a> of the podcast, but did apply two <a href="https://justin.searls.co/posts/whats-the-hot-fix/">Hotfixes</a> with <a href="https://justin.searls.co/casts/hotfix-v44.0.1-ignore-all-previous-instructions/">José Valim</a> and <a href="https://justin.searls.co/casts/hotfix-v44.0.2-if-you-dont-like-it-quit/">Mike McQuaid</a></li>
<li>Iterated on <a href="https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/">how I work with coding agents</a>. At this point, it is extremely rare for me to write code by hand</li>
<li>Coaxed said AI agents into building me a tool that <a href="https://justin.searls.co/posts/how-to-automatically-add-chapters-to-your-podcast/">automatically adds chapters to a podcast</a> based on the presence of stereo jingles, which I thought was a clever idea (<code>brew install searlsco/tap/autochapter</code>)</li>
<li>Created a GitHub badge to disclose/celebrate software projects that are predominantly AI-generated <a href="https://justin.searls.co/shovelware/">shovelware</a></li>
<li><a href="https://justin.searls.co/takes/2025-09-22-16h50m48s/">Marked one year</a> since &quot;exiting&quot; the Ruby community by giving my last conference talk, then proceeded to <a href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/">entangle myself</a> all <a href="https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/">over again</a></li>
<li>Bought the iPhone Air <a href="https://justin.searls.co/posts/why-i-bought-the-iphone-air/">because I thought I'd love it</a>. Now that I've had it a month, I'm pleased to report it's exactly what I wanted—probably the happiest I've been with a phone since the iPhone 12 Mini</li>
</ul>
<p>By the way, if you've heard things that make you wonder why anyone would want the iPhone Air (e.g., it looks fragile, it's slower, it only has one camera, it gets worse battery life), this picture was all I needed to stop caring about any of that:</p>
<p><img src="/img/social/mails/2025-09-1.jpg" alt="dat chonk"></p>
<p>I lift weights, so I know I am literally capable of holding a half-pound phone all day, but I personally just couldn't abide the <em>heft</em> of the iPhone 17 Pro. Carrying it feels like a chore.</p>
<p>To be honest, over the last month I mostly stuck to my knitting and kept my head down trying to get <a href="https://posseparty.com">POSSE Party</a> over the line. The experience has been a textbook case of how a piece of software can be 100% &quot;done&quot; and &quot;working&quot; when designed for one's own personal use, but the minute you decide to invite other people to use it, the number of edge cases it needs to cover increases tenfold. Not enjoying it.</p>
<p>Another reason this newsletter is arriving late is that for two days I completely lost myself in OpenAI's video-generation app, <a href="https://sora.chatgpt.com">Sora</a>. It's very impressive and terrifying! I posted some <a href="https://justin.searls.co/clips/my-top-10-sora-clips-on-day-one/">examples of my &quot;work&quot;</a>, much to the confusion of both my hairstylist and Whatever God You Pray To. I also wrote some thoughts on what tools like Sora might mean for the <a href="https://justin.searls.co/posts/is-sora-the-future-of-fiction/">future of visual storytelling</a>, if you're interested.</p>
<p>Interestingly, Sora is designed as a social media app. Its obvious resemblance to Instagram and TikTok is striking. As someone who banished social networking apps from my devices years ago, I (and my wife/accountability partner) was immediately concerned that I was so sucked in by it. But where those platforms addict users into endless passive consumption of content and advertising, Sora's &quot;SlopTok&quot; feed couldn't be less interesting. After you sign up, create your avatar, and follow your friends, <strong>it's all about creating your own videos</strong>. There is functionally <em>no reason</em> for anyone to visit their feed. Whatever appeal other people's videos might have is dwarfed by the revolutionary creative potential of typing a sentence and seeing your blockbuster movie idea come to life, with you and your friends playing the starring roles.</p>
<p>I guess that explains why I spent so much time thinking about AI and its relationship to creative expression this month. I manually typed that just now, by the way. And an hour ago, I was waffling over whether to manually or generatively(?) fix a bug on my blog. And now I'm typing this sentence right after command-tabbing back into my editor because the realization that everybody is always in the &quot;starring role&quot; on Sora gave me the idea to generate a series of videos where my avatar merely lurks in the background. It is creepy as hell and fantastic.</p>
<p>That distracted impulse to go make a 10-second movie mid-paragraph raises a question: why do I so thoughtlessly reach for AI to generate videos, but agonize over whether to use it to write code? And what does it say that I categorically refuse to let LLMs write these essays?</p>
<p>Greetings, because that is today's topic.</p>

<h2 id="the-generative-creativity-spectrum">The Generative Creativity Spectrum</h2>
<p>Add creativity to the long list of things I've had to fundamentally rethink since the introduction of generative AI. Up until that singular moment when Stable Diffusion and GitHub Copilot and ChatGPT transformed how people create images, code, and prose, I held a rather unsophisticated view of what it meant to be creative. If you'd asked me in 2021 to distill the nature of creativity, I would have given you a boolean matrix of medium vs. intent. I'd probably hammer out three bullets like these:</p>
<ul>
<li><strong>Writing:</strong> drafting a policy document at work is not creative, but writing an essay like this one is creative</li>
<li><strong>Coding:</strong> tweaking a hundred integration tests in order to upgrade a dependency is not creative, but making an <a href="https://github.com/searls/emoruby">absurdist emoji-based programming language</a> is creative</li>
<li><strong>Visuals:</strong> composing a chart or illustration to make a point in a presentation is not creative, but <a href="https://sora.chatgpt.com/p/s_68f2bb99e26c8191a2f30a9dda59469d">painting a fresco of a chihuahua in heat</a> is creative</li>
</ul>
<p>And I probably would have felt good about those heuristics, as they represented the extent of my thinking on the matter. (Or on chihuahuas, for that matter.)</p>
<p>But as AI tools have become so distressingly competent in these three short years, many of us have had to renegotiate our relationship to creative and artistic endeavors. Why, for example, am I so happy to throw caution to the wind and spend two days generating stupid videos in Sora without the briefest hesitation or twinge of guilt? Why am I so torn about coding agents, simultaneously feeling both excitement and sorrow? Why am I so protective of my writing, going out of my way to avoid LLM-based writing tools for any purpose beyond checking my spelling and grammar?</p>
<p>I spent some time noodling on this, and here's where I landed: <strong>whether I embrace or reject an AI's assistance depends on whether the creative act's value to me is internal or external.</strong></p>
<p>Below is my best attempt to diagram generative creativity as a spectrum:</p>
<p><img src="/img/social/mails/2025-09-2.jpg" alt="A horizontal line showing &quot;Internal Expression&quot; at the left and &quot;External Output&quot; to the right, with &quot;Creative Processing&quot; anchored to the left side, &quot;Creative Work&quot; at the center, and &quot;Creative Play&quot; anchored to the right"></p>
<p>Breaking this illustration down:</p>
<ul>
<li><strong>Creative Processing:</strong> The left side represents activities where creativity's benefit is internal (e.g., processing intimate emotions, unlocking key insights). To use AI for activities on the left would rob them of all their value</li>
<li><strong>Creative Play:</strong> The right side is for creative activities whose value depends on what it does for other people (e.g., communicating a concept, getting paid to update a corporate logo). Using AI for these tasks is a no-brainer, because you'll get more shit out the door faster than ever</li>
<li><strong>Creative Work:</strong> The murky middle is reserved for activities caught in a sort of limbo between their internal and external value (i.e. practicing a skill that both pays the bills and offers a sense of purpose). What the hell do we do with these? Embracing AI effectively trades increased capability and productivity for decreased understanding and fulfillment</li>
</ul>
<p>Below, I'll lean on a few examples from my own life to navigate the spectrum in more detail. Depending on how you personally express creativity, an activity that's at one end of my spectrum may be at the opposite end of yours—fear not, that's a good thing! Different creative acts mean different things to different people in different contexts.</p>
<p>Let's start by exploring the use of AI to create visuals like images and video.</p>

<h3 id="generating-visuals-with-ai">Generating Visuals with AI</h3>
<p>Note that we're discussing &quot;visuals&quot; broadly and not &quot;visual artwork&quot; specifically, here. Not all visuals are art, and not all art is visual. Plenty of visuals effectively exist as glanceable, information-dense <em>communication</em>, but hardly register as art (e.g., reaction memes, social image thumbnails, most of your TikTok/Instagram feed).</p>
<p>I took drawing classes as a kid. A <a href="https://www.markkistler.com">well-known illustrator</a> actually came to my school and did a lesson for us. I bought <a href="https://www.amazon.com/Mark-Kistlers-Imagination-Station-Televisions/dp/0671500139">his book</a> and spent an entire summer practicing. And for all my hard work, I was rewarded with absolutely fuck all. All those hours of practice and I rarely made it past step 1 of each exercise (forget the rest of the owl, I couldn't draw two circles right). Years later, I saw the author again at a bookstore event and explained my predicament, asking his advice. He kindly suggested that maybe drawing wasn't for me.</p>
<p>Ever since, I've felt creatively hobbled by my incompetence at visual communication. It was only through sheer force of will that I was able to produce so many Keynote presentations containing 400–500 slide builds—maybe this additional context will help you understand why those talks always took me multiple months to prepare.</p>
<p>Nevertheless, I'm a highly visual person. Ideas often come to me as images and then I work backwards into language. I think of a dozen things each day that would be better communicated with a picture or video than a verbal explanation or analogy. For most of my life, I lacked the time and skill to express myself visually as often as I would like.</p>
<p>Last week, <a href="https://theoatmeal.com/comics/ai_art">a comic on The Oatmeal</a> went viral for the artist's pointed case against generative AI. I found myself sympathetic to the human but not his argument, because it portrayed the same one-dimensional view of creativity I described earlier:</p>
<blockquote>
<p>&quot;Even if you don't work in the arts, you have to admit you feel it too—that disappointment when you find out something is AI-generated&quot; – Matthew Inman</p>
</blockquote>
<p>And here's the thing: <strong>I <em>don't</em> have to admit I feel this way</strong>. Pictures and paintings don't do anything for me emotionally or expressively. Never have. Perhaps my childhood development was stunted or maybe I'm put together wrong, but visual artwork has never frothed my loins. If paintings are hiding some secret loin-frothing gear, nobody showed me how to shift into it. In fact, I wish I could look at an AI-generated image and feel disappointment. At least then I'd feel <em>something</em>.</p>
<p>Instead, my relationship with visual creativity is entirely as a low-stakes communication medium. It hides no deeper meaning. It expresses no emotion. <strong>Because visual art serves no internal purpose for me, my only use for it is as a communication medium.</strong> That frees me to create and experience images and videos as pure and simple fun. It's truly joyful for me, even if it's all slop. To be honest, since Sora came out, I haven't had so much silly fun playing with my computer since I was maybe twelve years old.</p>
<p>That's why my use of tools like Sora to communicate concepts sits at the far right side of the spectrum as &quot;Creative Play&quot;:</p>
<p><img src="/img/social/mails/2025-09-3.jpg" alt="On the spectrum between &quot;Internal Expression&quot; and &quot;External Output&quot;, an emoji of a painting has been placed on the right side as an example of &quot;Creative Play&quot;"></p>
<p>If you're a visual artist, you probably feel differently. And if that's the case, then your creations serve a different purpose to you than mine do to me. I have deeper creative needs too, I just get them met elsewhere.</p>

<h3 id="generating-code-with-ai">Generating Code with AI</h3>
<p>Something that means more to me than pictures is code. Learning to program at a formative age taught me how to think clearly, how to combat overwhelm, and how to contribute something of value to others.</p>
<p>In November 2022, I had toodled around with &quot;AI&quot; coding tools a bit here and there, but—given that it would be a month until ChatGPT was released—the scope of their potential hadn't really clicked with me yet. Having heard so much buzz from inside the Copilot team, however, <a href="https://testdouble.com/team-directory/todd-kaufman">Todd</a> and I decided to do one last(?) sales trip together to visit GitHub, one of our all-time favorite clients. We attended their <a href="https://github.blog/news-insights/product-news/everything-new-from-github-universe-2022/">Universe event</a> in San Francisco, and GitHub's (well, Microsoft's) message was clear: they were betting the company on this AI shit.</p>
<p>I was skeptical, but signed up for GitHub Copilot anyway. I enabled the feature and forced myself to stick with it. A few months later, I did a limited screencast series called <a href="https://youtube.com/playlist?list=PLIuJbrOVyGjkRj7UM_whr-CPoqcXTOsZa">Searls After Dark</a>, in which I live-coded a basic LLM chat app. Because I had GitHub Copilot turned on, if you go back and watch those videos, you'll learn two things: Copilot's autocomplete suggestions were almost universally terrible, and nearly every bug and derailment I experienced was caused by Copilot distracting my train of thought. Over the course of ten episodes, I got a dozen e-mails from viewers pleading with me to turn off GitHub Copilot, because it was making <em>them</em> angry.</p>
<p>Those viewers were right that v1.0 of &quot;spicy autocomplete&quot; was too distracting to be useful. But its (very) occasional flashes of brilliance, paired with the knowledge it could only get better from here, convinced me to stay plugged into each new iteration of AI code generation tooling. That way, I'd be prepared to pounce as soon as the tools reached the point of being worth my time.</p>
<p>It's been a bit stop-and-go, but I've been working on this app called <a href="https://posseparty.com">POSSE Party</a> all year. Because I keep picking it up and putting it down, these short bursts of development have created a slideshow illustrating how quickly these tools are moving:</p>
<ul>
<li>In January, I wrote the foundation of the application, the static marketing pages, and the first several platform integrations entirely by hand. I had GitHub Copilot autocomplete enabled, but rarely accepted anything it suggested</li>
<li>In June, I built the next 5 integrations and a basic user interface in a hybrid model, using a combination of <a href="https://cursor.com">Cursor</a>'s superior autocomplete and its nascent agent-ish <a href="https://www.augmentedswe.com/p/how-to-use-cursor-agent-in-yolo-mode">YOLO mode</a> with the Claude Sonnet 3.7 model. This was more productive than coding without AI assistance, but was <a href="https://justin.searls.co/posts/why-agents-are-bad-pair-programmers/">hobbled by Cursor's asymmetric pair-programming style</a>, which required me to rapidly review each tiny change and rush to prompt it with the next bite-sized task</li>
<li>It's now October, and I've moved on to <a href="https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/">GPT-5 and a fully-autonomous Codex CLI agent</a>. Today, it's rare for me to code anything by hand, because <strong>agents are just good enough to be good enough.</strong> Tuesday of this week was notable, because I spent the entire day eschewing agents in favor of <a href="https://domm.plix.at/perl/2025_10_braincoded_static_image_gallery.html">brain coding</a> a complete rewrite of my Instagram adapter—it almost felt nostalgic</li>
</ul>
<p>To experience such a dramatic transformation firsthand in only nine months' time is nothing short of remarkable. Programming as I've known it for most of my life will never be the same. Yes, I'm still allowed to write code by hand, and yes, these agents aren't half as smart as me, but they make up for it with a productive <em>relentlessness</em> I could never compete with. And the tools are only going to get better.</p>
<p>All of the above can be true, but it doesn't mean I have to be happy about it.</p>
<p>If you follow my work closely, you've probably seen or heard or <em>felt</em> me complaining about how much I hate the experience of working with AI coding agents. The routine disappointment when agents don't do what I want. The frustration of repeating myself when they refuse to incorporate my feedback. The frazzled stress following a long day bouncing between a half-dozen chat windows.</p>
<p>I'm no stranger to the creative process being excruciating, but coding with agents feels less like I'm thinking deeply to solve problems as a programmer and more like I'm wasting all day in Slack and Zoom as a manager.</p>
<p>But what the hell am I supposed to do? I'm haunted by the knowledge that I'm going 2-3x faster than I otherwise could, and maintaining a similar level of quality. I'm mournful of the fact that going back to a peaceful, engaging, and rewarding workflow of programming by hand would drastically reduce my productivity.</p>
<p>Under my previous one-dimensional concept of creativity, building a new app is undeniably and straightforwardly a creative endeavor. Working with coding agents has given me cause to reevaluate my programming efforts along this new generative creativity spectrum, however. I don't have a job, so I could just say &quot;fuck it&quot; and code strictly for the intrinsic benefit of learning and overcoming challenges. At the same time, I don't sit at a computer all day for my health, so I could just vibe code the tools I need and only concern myself with their extrinsic utility. And in truth I spend a little bit of time programming at both of those extremes.</p>
<p>But upon reevaluating my decades-long relationship with my craft through this new lens, it's become clear that programming sits in the middle of the spectrum as &quot;Creative Work.&quot; I wouldn't bother writing a program if it weren't for whatever useful thing I needed it to do. At the same time, I rely on programming to fulfill a sense of vocation and to keep my mind sharp.</p>
<p><img src="/img/social/mails/2025-09-4.jpg" alt="On the spectrum between &quot;Internal Expression&quot; and &quot;External Output&quot;, an emoji of a programmer has been placed in the center as an example of &quot;Creative Work&quot;"></p>
<p>This newfound awareness that I suddenly have to compromise between internal enrichment and external productivity explains why I feel so uneasy in this new era. I honestly hope this isn't the final shape of the AI codegen landscape, but for now that's where things seem to be landing and that's where I sit.</p>

<h3 id="generating-writing-with-ai">Generating Writing with AI</h3>
<p>One place where I don't have any reason to compromise, however, is my writing. I categorically do not use AI to generate anything I include in this newsletter or post to my website.</p>
<p>The reason I don't generate prose isn't that LLMs are bad at writing like I do (although they are). If that were the only thing holding me back, presumably I'd eventually reach the point—like I did with code—of handing the wheel to ChatGPT and shifting my task to steering an LLM along my outline and toward my intended conclusion. No thanks.</p>
<p>The actual reason I would never generate these essays is because the act of writing itself is what brings me value. The benefit exists <em>entirely</em> between my ears in the form of deliberate introspection and self-discovery.</p>
<p>Not only does writing make me no money, but essays like these offer me no extrinsic utility after I've written them. My purpose for writing (besides as a way to keep dear friends like you aware of my continued existence) is buried deep in the soil of my mind. The toil of wrestling with conflicting ideas and resolving inner conflict is what unearths this value, organizes it, polishes it. Publishing a piece simply places the resulting artifact in a display case above ground and in clear view.</p>
<p>Writing for this purpose is slow and painful. A third reason it took me so long to write this month's essay is that I extremely did not feel like doing it. But like brushing my teeth and eating my vegetables, I know it's good for me. I'm a financially secure, functionally retired 40-year-old and yet I assign myself this homework each month to ensure I'm always grappling with deeper questions than I otherwise would in the course of my daily routine.</p>
<p>If you've been reading this newsletter for a while, one thing you don't see is the fact that nearly every essay ends up being about a topic or making a point that is wholly different from what I'd originally intended. Here's how it goes. I'll have an idea and add it to a list. Some morning when I'm otherwise between projects, I'll grab my notepad and write a few pages over an hour or two. Later, I'll grab an iPad and type out six hundred words before realizing I lost track of my point halfway through. I'll go for a run, then tinker all afternoon to pound those words into a reasonable rhetorical structure. By dinner time, I'm exhausted and staring at two thousand words that somehow fail to convey the simple idea I had started with. &quot;<em>Well, fuck,</em>&quot; I'll inevitably think to myself every goddam time, &quot;<em>I hate this. I'm extremely bad at this.</em>&quot;</p>
<p>Writing is not fun and I love it.</p>
<p>But then, whether that night or in the shower the next morning and amid the simmering anguish in the back of my mind, somewhere beneath my crisis of confidence, I will <em>hear</em> something happening inside of me. It's as if a brass puzzle box hidden away in my psyche began to make a clicking sound. Its interlocking gears start turning. As I listen closer, I hear the satisfying plunk of pinions pushing into tumblers, as if unlocking a conclusion I never consciously set out to make.</p>
<p>What's in the box? It depends. It could be a sense of calm following the loss of a loved one. Or a deepened acceptance of some small part of myself. Or a renewed resolve that I've been right all along, and it is indeed the children who are wrong.</p>
<p>What's counterintuitive about my relationship with writing is that the text on the page <em>isn't</em> the key to opening the treasure chest. In fact, the sum of what I write isn't a solution to anything. This essay, or that blog post, or the last over-torqued e-mail I wasted a whole afternoon on is merely an echo of a solution. <strong>What actually unlocked the puzzle box was the struggle itself.</strong> Think of your favorite song. The magic is not hiding somewhere in the sheet music—its impact is only felt through the act of playing it. Over the years, this torturous misery of writing has occasionally caused my brain to fire the right neurons in the right order and at the right tempo to eventually lead my conscious self to watershed moments that have profoundly impacted my life.</p>
<p>In case it isn't already obvious, and because I'm a completionist who can't leave an illustrative figure unfinished, for me, writing sits at the left end of the generative creativity spectrum as a form of &quot;Creative Processing&quot;:</p>
<p><img src="/img/social/mails/2025-09-5.jpg" alt="On the spectrum between &quot;Internal Expression&quot; and &quot;External Output&quot;, an emoji of a hand holding a pen has been placed on the left as an example of &quot;Creative Processing&quot;"></p>
<p>For you, maybe your creativity processing occurs while you play the accordion. Or practice calligraphy. Or design choreography. Or maybe you don't process creatively at all. There are no wrong answers.</p>

<h2 id="the-career-of-creativity">The Career of Creativity</h2>
<p>I am aware I have ignored the elephant in the room.</p>
<p>What about people who make their living off creative work?</p>
<p>There are several ways to tackle this question. The one-dimensional paradigm of creativity can only provide one of two unsatisfying answers:</p>
<ul>
<li>They are fucked</li>
<li>They are not (or should not be) fucked</li>
</ul>
<p>Virtually everything I've seen written about the impact generative AI will have on creative careers starts with one of these conclusions and then dresses it up with rationalization, justification, and exhortation. Limited to this framing, I guess my best answer is, &quot;they are fucked and that is very sad.&quot;</p>
<p>However, if the answer were really that simple, then people in creative jobs would be succeeding or failing together as a single monolithic demographic. But that's not what seems to be happening. Instead, I know some creatives who are absolutely thriving right now. I know some who are out of work and in dire straits. Others are getting by, but as employer expectations shift and roles change, they're reckoning with what feels like a personal loss.</p>
<ul>
<li><strong>External Value:</strong> If you show up to work to crank shit out, aim to please by creating whatever's asked of you, and use the word &quot;content&quot; to describe the things you make, you're probably as happy as a pig in shit right now. The absolute explosion of tools allowing you to branch into new media and to supercharge your productive output are likely already setting you apart from your colleagues. Your value to The Market is likely to be seen now more than ever, and that's in spite of the deluge of slop that's consuming the web and the publishing industry</li>
<li><strong>Internal Value:</strong> If you managed to make a living by painstakingly producing labors of love that primarily served to meet your own needs, then I hate to say it, but you were lucky to have <em>ever</em> gotten paid for it in the first place. As demand for creative professionals decreases and expectations for individual output increases, the return on investment for this kind of work—unless you're some kind of genius or celebrity—will probably never again be enough to earn a living wage</li>
<li><strong>Everybody Else:</strong> If you're somewhere in the middle on this—getting paid for output that meets an external purpose but from which you also derive some internal value—you're probably as torn as I am about what the fuck to do about programming. Some people are responding to the potential diminishment of that intrinsic benefit as a threat: they're fighting back, refusing to adopt new tools, and getting added to a list of who to let go during the next round of layoffs. Others, meanwhile, see this as an opportunity—that by increasing their productive capacity, generative AI can dramatically increase the scope of their creative ambitions. Which side you'll land on is ultimately your choice</li>
</ul>
<p>Even though I write for me and not for you, I'm grateful that you read this. I'd also be glad to hear how this essay made you feel and what you think about all this. Shoot me <a href="mailto:justin@searls.co">an e-mail</a> if you have a minute. And if you'd like me to discuss some aspect of this on <a href="https://justin.searls.co/casts/">the podcast</a>, write in to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. 👨‍🎨</p>]]></content>
    <summary type="html"><![CDATA[<p>It's me, your friend Justin, coming at you with my takes on September, which are arriving so late in October that I'm already thinking about November. To keep things simple, I'll just try to focus on the present moment for once.</p>
<p>Below is what I apparently put out this month. I'm sure I did other shit too, but none of it had permalinks:</p>
<ul>
<li>Added <a href="https://tot.rocks/">Tot</a> to my (very) short list of apps I use every day, finding it helps me <a href="https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/">manage the ephemeral text</a> needed to juggle multiple coding agents</li>
<li>Cut only one <a href="https://justin.searls.co/casts/breaking-change-v44-cant-get-it-up/">major release</a> of the podcast, but did apply two <a href="https://justin.searls.co/posts/whats-the-hot-fix/">Hotfixes</a> with <a href="https://justin.searls.co/casts/hotfix-v44.0.1-ignore-all-previous-instructions/">José Valim</a> and <a href="https://justin.searls.co/casts/hotfix-v44.0.2-if-you-dont-like-it-quit/">Mike McQuaid</a></li>
<li>Iterated on <a href="https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/">how I work with coding agents</a>. At this point, it is extremely rare for me to write code by hand</li>
<li>Coaxed said AI agents into building me a tool that <a href="https://justin.searls.co/posts/how-to-automatically-add-chapters-to-your-podcast/">automatically adds chapters to a podcast</a> based on the presence of stereo jingles, which I thought was a clever idea (<code>brew install searlsco/tap/autochapter</code>)</li>
<li>Created a GitHub badge to disclose/celebrate software projects that are predominantly AI-generated <a href="https://justin.searls.co/shovelware/">shovelware</a></li>
<li><a href="https://justin.searls.co/takes/2025-09-22-16h50m48s/">Marked one year</a> since &quot;exiting&quot; the Ruby community by giving my last conference talk, then proceeded to <a href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/">entangle myself</a> all <a href="https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/">over again</a></li>
<li>Bought the iPhone Air <a href="https://justin.searls.co/posts/why-i-bought-the-iphone-air/">because I thought I'd love it</a>. Now that I've had it a month, I'm pleased to report it's exactly what I wanted—probably the happiest I've been with a phone since the iPhone 12 Mini</li>
</ul>
<p>By the way, if you've heard things that make you wonder why anyone would want the iPhone Air (e.g., it looks fragile, it's slower, it only has one camera, it gets worse battery life), this picture was all I needed to stop caring about any of that:</p>
<p><img src="/img/social/mails/2025-09-1.jpg" alt="dat chonk"></p>
<p>I lift weights, so I know I am literally capable of holding a half-pound phone all day, but I personally just couldn't abide the <em>heft</em> of the iPhone 17 Pro. Carrying it feels like a chore.</p>
<p>To be honest, over the last month I mostly stuck to my knitting and kept my head down trying to get <a href="https://posseparty.com">POSSE Party</a> over the line. The experience has been a textbook case of how a piece of software can be 100% &quot;done&quot; and &quot;working&quot; when designed for one's own personal use, but the minute you decide to invite other people to use it, the number of edge cases it needs to cover increases tenfold. Not enjoying it.</p>
<p>Another reason this newsletter is arriving late is that for two days I completely lost myself in OpenAI's video-generation app, <a href="https://sora.chatgpt.com">Sora</a>. It's very impressive and terrifying! I posted some <a href="https://justin.searls.co/clips/my-top-10-sora-clips-on-day-one/">examples of my &quot;work&quot;</a>, much to the confusion of both my hairstylist and Whatever God You Pray To. I also wrote some thoughts on what tools like Sora might mean for the <a href="https://justin.searls.co/posts/is-sora-the-future-of-fiction/">future of visual storytelling</a>, if you're interested.</p>
<p>Interestingly, Sora is designed as a social media app. Its obvious resemblance to Instagram and TikTok is striking. As someone who banished social networking apps from my devices years ago, I (and my wife/accountability partner) was immediately concerned that I was so sucked in by it. But where those platforms addict users into endless passive consumption of content and advertising, Sora's &quot;SlopTok&quot; feed couldn't be less interesting. After you sign up, create your avatar, and follow your friends, <strong>it's all about creating your own videos</strong>. There is functionally <em>no reason</em> for anyone to visit their feed. Whatever appeal other people's videos might have is dwarfed by the revolutionary creative potential of typing a sentence and seeing your blockbuster movie idea come to life, with you and your friends playing the starring roles.</p>
<p>I guess that explains why I spent so much time thinking about AI and its relationship to creative expression this month. I manually typed that just now, by the way. And an hour ago, I was waffling over whether to manually or generatively(?) fix a bug on my blog. And now I'm typing this sentence right after command-tabbing back into my editor because the realization that everybody is always in the &quot;starring role&quot; on Sora gave me the idea to generate a series of videos where my avatar merely lurks in the background. It is creepy as hell and fantastic.</p>
<p>That distracted impulse to go make a 10-second movie mid-paragraph raises a question: why do I so thoughtlessly reach for AI to generate videos, but agonize over whether to use it to write code? And what does it say that I categorically refuse to let LLMs write these essays?</p>
<p>Greetings, because that is today's topic.</p>

<h2 id="the-generative-creativity-spectrum">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/mails/2025-09/#the-generative-creativity-spectrum">The Generative Creativity Spectrum</a>
</h2>
<p>Add creativity to the long list of things I've had to fundamentally rethink since the introduction of generative AI. Up until that singular moment when Stable Diffusion and GitHub Copilot and ChatGPT transformed how people create images, code, and prose, I held a rather unsophisticated view of what it meant to be creative. If you'd asked me in 2021 to distill the nature of creativity, I would have given you a boolean matrix of medium vs. intent. I'd probably hammer out three bullets like these:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/mails/2025-09/","append_url_label":"Open ✉️","content":"\u003cp\u003eIt's me, your friend Justin, coming at you with my takes on September, which are arriving so late in October that I'm already thinking about November. To keep things simple, I'll just try to focus on the present moment for once.\u003c/p\u003e\n\u003cp\u003eBelow is what I apparently put out this month. I'm sure I did other shit too, but none of it had permalinks:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdded \u003ca href=\"https://tot.rocks/\"\u003eTot\u003c/a\u003e to my (very) short list of apps I use every day, finding it helps me \u003ca href=\"https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/\"\u003emanage the ephemeral text\u003c/a\u003e needed to juggle multiple coding agents\u003c/li\u003e\n\u003cli\u003eCut only one \u003ca href=\"https://justin.searls.co/casts/breaking-change-v44-cant-get-it-up/\"\u003emajor release\u003c/a\u003e of the podcast, but did apply two \u003ca href=\"https://justin.searls.co/posts/whats-the-hot-fix/\"\u003eHotfixes\u003c/a\u003e with \u003ca href=\"https://justin.searls.co/casts/hotfix-v44.0.1-ignore-all-previous-instructions/\"\u003eJosé Valim\u003c/a\u003e and \u003ca href=\"https://justin.searls.co/casts/hotfix-v44.0.2-if-you-dont-like-it-quit/\"\u003eMike McQuaid\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIterated on \u003ca href=\"https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/\"\u003ehow I work with coding agents\u003c/a\u003e. At this point, it is extremely rare for me to write code by hand\u003c/li\u003e\n\u003cli\u003eCoaxed said AI agents into building me a tool that \u003ca href=\"https://justin.searls.co/posts/how-to-automatically-add-chapters-to-your-podcast/\"\u003eautomatically adds chapters to a podcast\u003c/a\u003e based on the presence of stereo jingles, which I thought was a clever idea (\u003ccode\u003ebrew install searlsco/tap/autochapter\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eCreated a GitHub badge to disclose/celebrate software projects that are predominantly AI-generated \u003ca href=\"https://justin.searls.co/shovelware/\"\u003eshovelware\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/takes/2025-09-22-16h50m48s/\"\u003eMarked one year\u003c/a\u003e since \u0026quot;exiting\u0026quot; the Ruby community by giving my last conference talk, then proceeded to \u003ca href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/\"\u003eentangle myself\u003c/a\u003e all \u003ca href=\"https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/\"\u003eover again\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBought the iPhone Air \u003ca href=\"https://justin.searls.co/posts/why-i-bought-the-iphone-air/\"\u003ebecause I thought I'd love it\u003c/a\u003e. Now that I've had it a month, I'm pleased to report it's exactly what I wanted—probably the happiest I've been with a phone since the iPhone 12 Mini\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBy the way, if you've heard things that make you wonder why anyone would want the iPhone Air (e.g., it looks fragile, it's slower, it only has one camera, it gets worse battery life), this picture was all I needed to stop caring about any of that:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-09-1.jpg\" alt=\"dat chonk\"\u003e\u003c/p\u003e\n\u003cp\u003eI lift weights, so I know I am literally capable of holding a half-pound phone all day, but I personally just couldn't abide the \u003cem\u003eheft\u003c/em\u003e of the iPhone 17 Pro. Carrying it feels like a chore.\u003c/p\u003e\n\u003cp\u003eTo be honest, over the last month I mostly stuck to my knitting and kept my head down trying to get \u003ca href=\"https://posseparty.com\"\u003ePOSSE Party\u003c/a\u003e over the line. The experience has been a textbook case of how a piece of software can be 100% \u0026quot;done\u0026quot; and \u0026quot;working\u0026quot; when designed for one's own personal use, but the minute you decide to invite other people to use it, the number of edge cases it needs to cover increases tenfold. Not enjoying it.\u003c/p\u003e\n\u003cp\u003eAnother reason this newsletter is arriving late is that for two days I completely lost myself in OpenAI's video-generation app, \u003ca href=\"https://sora.chatgpt.com\"\u003eSora\u003c/a\u003e. It's very impressive and terrifying! I posted some \u003ca href=\"https://justin.searls.co/clips/my-top-10-sora-clips-on-day-one/\"\u003eexamples of my \u0026quot;work\u0026quot;\u003c/a\u003e, much to the confusion of both my hairstylist and Whatever God You Pray To. I also wrote some thoughts on what tools like Sora might mean for the \u003ca href=\"https://justin.searls.co/posts/is-sora-the-future-of-fiction/\"\u003efuture of visual storytelling\u003c/a\u003e, if you're interested.\u003c/p\u003e\n\u003cp\u003eInterestingly, Sora is designed as a social media app. Its obvious resemblance to Instagram and TikTok is striking. As someone who banished social networking apps from my devices years ago, I (and my wife/accountability partner) was immediately concerned that I was so sucked in by it. But where those platforms addict users into endless passive consumption of content and advertising, Sora's \u0026quot;SlopTok\u0026quot; feed couldn't be less interesting. After you sign up, create your avatar, and follow your friends, \u003cstrong\u003eit's all about creating your own videos\u003c/strong\u003e. There is functionally \u003cem\u003eno reason\u003c/em\u003e for anyone to visit their feed. Whatever appeal other people's videos might have is dwarfed by the revolutionary creative potential of typing a sentence and seeing your blockbuster movie idea come to life, with you and your friends playing the starring roles.\u003c/p\u003e\n\u003cp\u003eI guess that explains why I spent so much time thinking about AI and its relationship to creative expression this month. I manually typed that just now, by the way. And an hour ago, I was waffling over whether to manually or generatively(?) fix a bug on my blog. And now I'm typing this sentence right after command-tabbing back into my editor because the realization that everybody is always in the \u0026quot;starring role\u0026quot; on Sora gave me the idea to generate a series of videos where my avatar merely lurks in the background. It is creepy as hell and fantastic.\u003c/p\u003e\n\u003cp\u003eThat distracted impulse to go make a 10-second movie mid-paragraph raises a question: why do I so thoughtlessly reach for AI to generate videos, but agonize over whether to use it to write code? And what does it say that I categorically refuse to let LLMs write these essays?\u003c/p\u003e\n\u003cp\u003eGreetings, because that is today's topic.\u003c/p\u003e\n\n\u003ch2 id=\"the-generative-creativity-spectrum\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-09/#the-generative-creativity-spectrum\"\u003eThe Generative Creativity Spectrum\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eAdd creativity to the long list of things I've had to fundamentally rethink since the introduction of generative AI. Up until that singular moment when Stable Diffusion and GitHub Copilot and ChatGPT transformed how people create images, code, and prose, I held a rather unsophisticated view of what it meant to be creative. If you'd asked me in 2021 to distill the nature of creativity, I would have given you a boolean matrix of medium vs. intent. I'd probably hammer out three bullets like these:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eWriting:\u003c/strong\u003e drafting a policy document at work is not creative, but writing an essay like this one is creative\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCoding:\u003c/strong\u003e tweaking a hundred integration tests in order to upgrade a dependency is not creative, but making an \u003ca href=\"https://github.com/searls/emoruby\"\u003eabsurdist emoji-based programming language\u003c/a\u003e is creative\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVisuals:\u003c/strong\u003e composing a chart or illustration to make a point in a presentation is not creative, but \u003ca href=\"https://sora.chatgpt.com/p/s_68f2bb99e26c8191a2f30a9dda59469d\"\u003epainting a fresco of a chihuahua in heat\u003c/a\u003e is creative\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAnd I probably would have felt good about those heuristics, as they represented the extent of my thinking on the matter. (Or on chihuahuas, for that matter.)\u003c/p\u003e\n\u003cp\u003eBut as AI tools have become so distressingly competent in these three short years, many of us have had to renegotiate our relationship to creative and artistic endeavors. Why, for example, am I so happy to throw caution to the wind and spend two days generating stupid videos in Sora without the briefest hesitation or twinge of guilt? Why am I so torn about coding agents, simultaneously feeling both excitement and sorrow? Why am I so protective of my writing, going out of my way to avoid LLM-based writing tools for any purpose beyond checking my spelling and grammar?\u003c/p\u003e\n\u003cp\u003eI spent some time noodling on this, and here's where I landed: \u003cstrong\u003ewhether I embrace or reject an AI's assistance depends on whether the creative act's value to me is internal or external.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eBelow is my best attempt to diagram generative creativity as a spectrum:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-09-2.jpg\" alt=\"A horizontal line showing \u0026quot;Internal Expression\u0026quot; at the left and \u0026quot;External Output\u0026quot; to the right, with \u0026quot;Creative Processing\u0026quot; anchored to the left side, \u0026quot;Creative Work\u0026quot; at the center, and \u0026quot;Creative Play\u0026quot; anchored to the right\"\u003e\u003c/p\u003e\n\u003cp\u003eBreaking this illustration down:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCreative Processing:\u003c/strong\u003e The left side represents activities where creativity's benefit is internal (e.g., processing intimate emotions, unlocking key insights). To use AI for activities on the left would rob them of all their value\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCreative Play:\u003c/strong\u003e The right side is for creative activities whose value depends on what it does for other people (e.g., communicating a concept, getting paid to update a corporate logo). Using AI for these tasks is a no-brainer, because you'll get more shit out the door faster than ever\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCreative Work:\u003c/strong\u003e The murky middle is reserved for activities caught in a sort of limbo between their internal and external value (i.e. practicing a skill that both pays the bills and offers a sense of purpose). What the hell do we do with these? Embracing AI effectively trades increased capability and productivity for decreased understanding and fulfillment\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBelow, I'll lean on a few examples from my own life to navigate the spectrum in more detail. Depending on how you personally express creativity, an activity that's at one end of my spectrum may be at the opposite end of yours—fear not, that's a good thing! Different creative acts mean different things to different people in different contexts.\u003c/p\u003e\n\u003cp\u003eLet's start by exploring the use of AI to create visuals like images and video.\u003c/p\u003e\n\n\u003ch3 id=\"generating-visuals-with-ai\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-09/#generating-visuals-with-ai\"\u003eGenerating Visuals with AI\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eNote that we're discussing \u0026quot;visuals\u0026quot; broadly and not \u0026quot;visual artwork\u0026quot; specifically, here. Not all visuals are art, and not all art is visual. Plenty of visuals effectively exist as glanceable, information-dense \u003cem\u003ecommunication\u003c/em\u003e, but hardly register as art (e.g., reaction memes, social image thumbnails, most of your TikTok/Instagram feed).\u003c/p\u003e\n\u003cp\u003eI took drawing classes as a kid. A \u003ca href=\"https://www.markkistler.com\"\u003ewell-known illustrator\u003c/a\u003e actually came to my school and did a lesson for us. I bought \u003ca href=\"https://www.amazon.com/Mark-Kistlers-Imagination-Station-Televisions/dp/0671500139\"\u003ehis book\u003c/a\u003e and spent an entire summer practicing. And for all my hard work, I was rewarded with absolutely fuck all. All those hours of practice and I rarely made it past step 1 of each exercise (forget the rest of the owl, I couldn't draw two circles right). Years later, I saw the author again at a bookstore event and explained my predicament, asking his advice. He kindly suggested that maybe drawing wasn't for me.\u003c/p\u003e\n\u003cp\u003eEver since, I've felt creatively hobbled by my incompetence at visual communication. It was only through sheer force of will that I was able to produce so many Keynote presentations containing 400–500 slide builds—maybe this additional context will help you understand why those talks always took me multiple months to prepare.\u003c/p\u003e\n\u003cp\u003eNevertheless, I'm a highly visual person. Ideas often come to me as images and then I work backwards into language. I think of a dozen things each day that would be better communicated with a picture or video than a verbal explanation or analogy. For most of my life, I lacked the time and skill to express myself visually as often as I would like.\u003c/p\u003e\n\u003cp\u003eLast week, \u003ca href=\"https://theoatmeal.com/comics/ai_art\"\u003ea comic on The Oatmeal\u003c/a\u003e went viral for the artist's pointed case against generative AI. I found myself sympathetic to the human but not his argument, because it portrayed the same one-dimensional view of creativity I described earlier:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026quot;Even if you don't work in the arts, you have to admit you feel it too—that disappointment when you find out something is AI-generated\u0026quot; – Matthew Inman\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAnd here's the thing: \u003cstrong\u003eI \u003cem\u003edon't\u003c/em\u003e have to admit I feel this way\u003c/strong\u003e. Pictures and paintings don't do anything for me emotionally or expressively. Never have. Perhaps my childhood development was stunted or maybe I'm put together wrong, but visual artwork has never frothed my loins. If paintings are hiding some secret loin-frothing gear, nobody showed me how to shift into it. In fact, I wish I could look at an AI-generated image and feel disappointment. At least then I'd feel \u003cem\u003esomething\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eInstead, my relationship with visual creativity is entirely as a low-stakes communication medium. It hides no deeper meaning. It expresses no emotion. \u003cstrong\u003eBecause visual art serves no internal purpose for me, my only use for it is as a communication medium.\u003c/strong\u003e That frees me to create and experience images and videos as pure and simple fun. It's truly joyful for me, even if it's all slop. To be honest, since Sora came out, I haven't had so much silly fun playing with my computer since I was maybe twelve years old.\u003c/p\u003e\n\u003cp\u003eThat's why my use of tools like Sora to communicate concepts sits at the far right side of the spectrum as \u0026quot;Creative Play\u0026quot;:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-09-3.jpg\" alt=\"On the spectrum between \u0026quot;Internal Expression\u0026quot; and \u0026quot;External Output\u0026quot;, an emoji of a painting has been placed on the right side as an example of \u0026quot;Creative Play\u0026quot;\"\u003e\u003c/p\u003e\n\u003cp\u003eIf you're a visual artist, you probably feel differently. And if that's the case, then your creations serve a different purpose to you than mine do to me. I have deeper creative needs too, I just get them met elsewhere.\u003c/p\u003e\n\n\u003ch3 id=\"generating-code-with-ai\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-09/#generating-code-with-ai\"\u003eGenerating Code with AI\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eSomething that means more to me than pictures is code. Learning to program at a formative age taught me how to think clearly, how to combat overwhelm, and how to contribute something of value to others.\u003c/p\u003e\n\u003cp\u003eIn November 2022, I had toodled around with \u0026quot;AI\u0026quot; coding tools a bit here and there, but—given that it would be a month until ChatGPT was released—the scope of their potential hadn't really clicked with me yet. Having heard so much buzz from inside the Copilot team, however, \u003ca href=\"https://testdouble.com/team-directory/todd-kaufman\"\u003eTodd\u003c/a\u003e and I decided to do one last(?) sales trip together to visit GitHub, one of our all-time favorite clients. We attended their \u003ca href=\"https://github.blog/news-insights/product-news/everything-new-from-github-universe-2022/\"\u003eUniverse event\u003c/a\u003e in San Francisco, and GitHub's (well, Microsoft's) message was clear: they were betting the company on this AI shit.\u003c/p\u003e\n\u003cp\u003eI was skeptical, but signed up for GitHub Copilot anyway. I enabled the feature and forced myself to stick with it. A few months later, I did a limited screencast series called \u003ca href=\"https://youtube.com/playlist?list=PLIuJbrOVyGjkRj7UM_whr-CPoqcXTOsZa\"\u003eSearls After Dark\u003c/a\u003e, in which I live-coded a basic LLM chat app. Because I had GitHub Copilot turned on, if you go back and watch those videos, you'll learn two things: Copilot's autocomplete suggestions were almost universally terrible, and nearly every bug and derailment I experienced was caused by Copilot distracting my train of thought. Over the course of ten episodes, I got a dozen e-mails from viewers pleading with me to turn off GitHub Copilot, because it was making \u003cem\u003ethem\u003c/em\u003e angry.\u003c/p\u003e\n\u003cp\u003eThose viewers were right that v1.0 of \u0026quot;spicy autocomplete\u0026quot; was too distracting to be useful. But its (very) occasional flashes of brilliance, paired with the knowledge it could only get better from here, convinced me to stay plugged into each new iteration of AI code generation tooling. That way, I'd be prepared to pounce as soon as the tools reached the point of being worth my time.\u003c/p\u003e\n\u003cp\u003eIt's been a bit stop-and-go, but I've been working on this app called \u003ca href=\"https://posseparty.com\"\u003ePOSSE Party\u003c/a\u003e all year. Because I keep picking it up and putting it down, these short bursts of development have created a slideshow illustrating how quickly these tools are moving:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIn January, I wrote the foundation of the application, the static marketing pages, and the first several platform integrations entirely by hand. I had GitHub Copilot autocomplete enabled, but rarely accepted anything it suggested\u003c/li\u003e\n\u003cli\u003eIn June, I built the next 5 integrations and a basic user interface in a hybrid model, using a combination of \u003ca href=\"https://cursor.com\"\u003eCursor\u003c/a\u003e's superior autocomplete and its nascent agent-ish \u003ca href=\"https://www.augmentedswe.com/p/how-to-use-cursor-agent-in-yolo-mode\"\u003eYOLO mode\u003c/a\u003e with the Claude Sonnet 3.7 model. This was more productive than coding without AI assistance, but was \u003ca href=\"https://justin.searls.co/posts/why-agents-are-bad-pair-programmers/\"\u003ehobbled by Cursor's asymmetric pair-programming style\u003c/a\u003e, which required me to rapidly review each tiny change and rush to prompt it with the next bite-sized task\u003c/li\u003e\n\u003cli\u003eIt's now October, and I've moved on to \u003ca href=\"https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/\"\u003eGPT-5 and a fully-autonomous Codex CLI agent\u003c/a\u003e. Today, it's rare for me to code anything by hand, because \u003cstrong\u003eagents are just good enough to be good enough.\u003c/strong\u003e Tuesday of this week was notable, because I spent the entire day eschewing agents in favor of \u003ca href=\"https://domm.plix.at/perl/2025_10_braincoded_static_image_gallery.html\"\u003ebrain coding\u003c/a\u003e a complete rewrite of my Instagram adapter—it almost felt nostalgic\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo experience such a dramatic transformation firsthand in only nine months' time is nothing short of remarkable. Programming as I've known it for most of my life will never be the same. Yes, I'm still allowed to write code by hand, and yes, these agents aren't half as smart as me, but they make up for it with a productive \u003cem\u003erelentlessness\u003c/em\u003e I could never compete with. And the tools are only going to get better.\u003c/p\u003e\n\u003cp\u003eAll of the above can be true, but it doesn't mean I have to be happy about it.\u003c/p\u003e\n\u003cp\u003eIf you follow my work closely, you've probably seen or heard or \u003cem\u003efelt\u003c/em\u003e me complaining about how much I hate the experience of working with AI coding agents. The routine disappointment when agents don't do what I want. The frustration of repeating myself when they refuse to incorporate my feedback. The frazzled stress following a long day bouncing between a half-dozen chat windows.\u003c/p\u003e\n\u003cp\u003eI'm no stranger to the creative process being excruciating, but coding with agents feels less like I'm thinking deeply to solve problems as a programmer and more like I'm wasting all day in Slack and Zoom as a manager.\u003c/p\u003e\n\u003cp\u003eBut what the hell am I supposed to do? I'm haunted by the knowledge that I'm going 2-3x faster than I otherwise could, and maintaining a similar level of quality. I'm mournful of the fact that going back to a peaceful, engaging, and rewarding workflow of programming by hand would drastically reduce my productivity.\u003c/p\u003e\n\u003cp\u003eUnder my previous one-dimensional concept of creativity, building a new app is undeniably and straightforwardly a creative endeavor. Working with coding agents has given me cause to reevaluate my programming efforts along this new generative creativity spectrum, however. I don't have a job, so I could just say \u0026quot;fuck it\u0026quot; and code strictly for the intrinsic benefit of learning and overcoming challenges. At the same time, I don't sit at a computer all day for my health, so I could just vibe code the tools I need and only concern myself with their extrinsic utility. And in truth I spend a little bit of time programming at both of those extremes.\u003c/p\u003e\n\u003cp\u003eBut upon reevaluating my decades-long relationship with my craft through this new lens, it's become clear that programming sits in the middle of the spectrum as \u0026quot;Creative Work.\u0026quot; I wouldn't bother writing a program if it weren't for whatever useful thing I needed it to do. At the same time, I rely on programming to fulfill a sense of vocation and to keep my mind sharp.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-09-4.jpg\" alt=\"On the spectrum between \u0026quot;Internal Expression\u0026quot; and \u0026quot;External Output\u0026quot;, an emoji of a programmer has been placed in the center as an example of \u0026quot;Creative Work\u0026quot;\"\u003e\u003c/p\u003e\n\u003cp\u003eThis newfound awareness that I suddenly have to compromise between internal enrichment and external productivity explains why I feel so uneasy in this new era. I honestly hope this isn't the final shape of the AI codegen landscape, but for now that's where things seem to be landing and that's where I sit.\u003c/p\u003e\n\n\u003ch3 id=\"generating-writing-with-ai\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-09/#generating-writing-with-ai\"\u003eGenerating Writing with AI\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eOne place where I don't have any reason to compromise, however, is my writing. I categorically do not use AI to generate anything I include in this newsletter or post to my website.\u003c/p\u003e\n\u003cp\u003eThe reason I don't generate prose isn't that LLMs are bad at writing like I do (although they are). If that were the only thing holding me back, presumably I'd eventually reach the point—like I did with code—of handing the wheel to ChatGPT and shifting my task to steering an LLM along my outline and toward my intended conclusion. No thanks.\u003c/p\u003e\n\u003cp\u003eThe actual reason I would never generate these essays is because the act of writing itself is what brings me value. The benefit exists \u003cem\u003eentirely\u003c/em\u003e between my ears in the form of deliberate introspection and self-discovery.\u003c/p\u003e\n\u003cp\u003eNot only does writing make me no money, but essays like these offer me no extrinsic utility after I've written them. My purpose for writing (besides as a way to keep dear friends like you aware of my continued existence) is buried deep in the soil of my mind. The toil of wrestling with conflicting ideas and resolving inner conflict is what unearths this value, organizes it, polishes it. Publishing a piece simply places the resulting artifact in a display case above ground and in clear view.\u003c/p\u003e\n\u003cp\u003eWriting for this purpose is slow and painful. A third reason it took me so long to write this month's essay is that I extremely did not feel like doing it. But like brushing my teeth and eating my vegetables, I know it's good for me. I'm a financially secure, functionally retired 40-year-old and yet I assign myself this homework each month to ensure I'm always grappling with deeper questions than I otherwise would in the course of my daily routine.\u003c/p\u003e\n\u003cp\u003eIf you've been reading this newsletter for a while, one thing you don't see is the fact that nearly every essay ends up being about a topic or making a point that is wholly different from what I'd originally intended. Here's how it goes. I'll have an idea and add it to a list. Some morning when I'm otherwise between projects, I'll grab my notepad and write a few pages over an hour or two. Later, I'll grab an iPad and type out six hundred words before realizing I lost track of my point halfway through. I'll go for a run, then tinker all afternoon to pound those words into a reasonable rhetorical structure. By dinner time, I'm exhausted and staring at two thousand words that somehow fail to convey the simple idea I had started with. \u0026quot;\u003cem\u003eWell, fuck,\u003c/em\u003e\u0026quot; I'll inevitably think to myself every goddam time, \u0026quot;\u003cem\u003eI hate this. I'm extremely bad at this.\u003c/em\u003e\u0026quot;\u003c/p\u003e\n\u003cp\u003eWriting is not fun and I love it.\u003c/p\u003e\n\u003cp\u003eBut then, whether that night or in the shower the next morning and amid the simmering anguish in the back of my mind, somewhere beneath my crisis of confidence, I will \u003cem\u003ehear\u003c/em\u003e something happening inside of me. It's as if a brass puzzle box hidden away in my psyche began to make a clicking sound. Its interlocking gears start turning. As I listen closer, I hear the satisfying plunk of pinions pushing into tumblers, as if unlocking a conclusion I never consciously set out to make.\u003c/p\u003e\n\u003cp\u003eWhat's in the box? It depends. It could be a sense of calm following the loss of a loved one. Or a deepened acceptance of some small part of myself. Or a renewed resolve that I've been right all along, and it is indeed the children who are wrong.\u003c/p\u003e\n\u003cp\u003eWhat's counterintuitive about my relationship with writing is that the text on the page \u003cem\u003eisn't\u003c/em\u003e the key to opening the treasure chest. In fact, the sum of what I write isn't a solution to anything. This essay, or that blog post, or the last over-torqued e-mail I wasted a whole afternoon on is merely an echo of a solution. \u003cstrong\u003eWhat actually unlocked the puzzle box was the struggle itself.\u003c/strong\u003e Think of your favorite song. The magic is not hiding somewhere in the sheet music—its impact is only felt through the act of playing it. Over the years, this torturous misery of writing has occasionally caused my brain to fire the right neurons in the right order and at the right tempo to eventually lead my conscious self to watershed moments that have profoundly impacted my life.\u003c/p\u003e\n\u003cp\u003eIn case it isn't already obvious, and because I'm a completionist who can't leave an illustrative figure unfinished, for me, writing sits at the left end of the generative creativity spectrum as a form of \u0026quot;Creative Processing\u0026quot;:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-09-5.jpg\" alt=\"On the spectrum between \u0026quot;Internal Expression\u0026quot; and \u0026quot;External Output\u0026quot;, an emoji of a hand holding a pen has been placed on the left as an example of \u0026quot;Creative Processing\u0026quot;\"\u003e\u003c/p\u003e\n\u003cp\u003eFor you, maybe your creativity processing occurs while you play the accordion. Or practice calligraphy. Or design choreography. Or maybe you don't process creatively at all. There are no wrong answers.\u003c/p\u003e\n\n\u003ch2 id=\"the-career-of-creativity\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-09/#the-career-of-creativity\"\u003eThe Career of Creativity\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eI am aware I have ignored the elephant in the room.\u003c/p\u003e\n\u003cp\u003eWhat about people who make their living off creative work?\u003c/p\u003e\n\u003cp\u003eThere are several ways to tackle this question. The one-dimensional paradigm of creativity can only provide one of two unsatisfying answers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThey are fucked\u003c/li\u003e\n\u003cli\u003eThey are not (or should not be) fucked\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVirtually everything I've seen written about the impact generative AI will have on creative careers starts with one of these conclusions and then dresses it up with rationalization, justification, and exhortation. Limited to this framing, I guess my best answer is, \u0026quot;they are fucked and that is very sad.\u0026quot;\u003c/p\u003e\n\u003cp\u003eHowever, if the answer were really that simple, then people in creative jobs would be succeeding or failing together as a single monolithic demographic. But that's not what seems to be happening. Instead, I know some creatives who are absolutely thriving right now. I know some who are out of work and in dire straits. Others are getting by, but as employer expectations shift and roles change, they're reckoning with what feels like a personal loss.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eExternal Value:\u003c/strong\u003e If you show up to work to crank shit out, aim to please by creating whatever's asked of you, and use the word \u0026quot;content\u0026quot; to describe the things you make, you're probably as happy as a pig in shit right now. The absolute explosion of tools allowing you to branch into new media and to supercharge your productive output are likely already setting you apart from your colleagues. Your value to The Market is likely to be seen now more than ever, and that's in spite of the deluge of slop that's consuming the web and the publishing industry\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInternal Value:\u003c/strong\u003e If you managed to make a living by painstakingly producing labors of love that primarily served to meet your own needs, then I hate to say it, but you were lucky to have \u003cem\u003eever\u003c/em\u003e gotten paid for it in the first place. As demand for creative professionals decreases and expectations for individual output increases, the return on investment for this kind of work—unless you're some kind of genius or celebrity—will probably never again be enough to earn a living wage\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEverybody Else:\u003c/strong\u003e If you're somewhere in the middle on this—getting paid for output that meets an external purpose but from which you also derive some internal value—you're probably as torn as I am about what the fuck to do about programming. Some people are responding to the potential diminishment of that intrinsic benefit as a threat: they're fighting back, refusing to adopt new tools, and getting added to a list of who to let go during the next round of layoffs. Others, meanwhile, see this as an opportunity—that by increasing their productive capacity, generative AI can dramatically increase the scope of their creative ambitions. Which side you'll land on is ultimately your choice\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEven though I write for me and not for you, I'm grateful that you read this. I'd also be glad to hear how this essay made you feel and what you think about all this. Shoot me \u003ca href=\"mailto:justin@searls.co\"\u003ean e-mail\u003c/a\u003e if you have a minute. And if you'd like me to discuss some aspect of this on \u003ca href=\"https://justin.searls.co/casts/\"\u003ethe podcast\u003c/a\u003e, write in to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e. 👨‍🎨\u003c/p\u003e","id":"https://justin.searls.co/mails/2025-09/","og_image":"https://justin.searls.co/img/social/mails/2025-09.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-21T00:17:59Z","title":"The Generative Creativity Spectrum","updated_at":"2025-10-21T00:18:02Z","url":"https://justin.searls.co/mails/2025-09/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/hotfix-v44.0.2-if-you-dont-like-it-quit/</id>
      <title type="text">🎙️ Breaking Change podcast v44.0.2 - Mike McQuaid: If you don&#39;t like it, Quit</title>
      <link href="https://justin.searls.co/casts/hotfix-v44.0.2-if-you-dont-like-it-quit/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-17T16:00:00+00:00</published>
    <updated>2025-10-20T22:20:26-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v44.0.2.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v44.0.2.mp3">Direct link to podcast audio file</a>
</p><p><strong>Post-recording update: As I've been lobbying for (both publicly and behind the scenes), it has been announced that the RubyGems and Bundler client libraries are <a href="https://rubycentral.org/news/ruby-central-statement-on-rubygems-bundler/">being transferred to Matz and the Ruby core team</a>.</strong></p>
<p><a href="https://mikemcquaid.com">Mike McQuaid</a> (of <a href="https://brew.sh">Homebrew</a> fame) and I scheduled this episode of Hot Fix a week before the <a href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/">Ruby community exploded</a>. <a href="https://justin.searls.co/posts/whats-the-hot-fix/">Hot Fix</a> is all about getting spicy, but even we were a little wary of the heat in that particular kitchen. The problem Mike brought to the table is the same one he's always on about: <strong>open source is not a career</strong>. Incidentally, Mike's favorite topic also happens to be relevant to the latest RubyGems controversy—because it all boils down to paying people to work on open source.</p>
<p>Not content to miss out on the fun, <a href="https://changelog.com/person/jerodsanto">Jerod</a> from <a href="https://changelog.com/">The Changelog</a> asked if he could join and discuss the ongoing Ruby drama as a group. So we decided to team up and do a collab episode—call it <strong>Breaking Changelog</strong>, I guess? It's nothing if not efficient: record once, edit twice, and syndicate everywhere.</p>
<p>If you don't mind swear words, listen to this version. If you don't like swearing, what the fuck are you doing here? (But seriously, you can <a href="https://changelog.com/friends/113">listen to their edit</a> if you want!)</p>
<p>Please send your compliments to <a href="mailto:podcast@searls.co">podcast@searls.co</a> and your complaints to <a href="mailto:editors@changelog.com">editors@changelog.com</a>.</p>
]]></content>
    <summary type="html"><![CDATA[<p><strong>Post-recording update: As I've been lobbying for (both publicly and behind the scenes), it has been announced that the RubyGems and Bundler client libraries are <a href="https://rubycentral.org/news/ruby-central-statement-on-rubygems-bundler/">being transferred to Matz and the Ruby core team</a>.</strong></p>
<p><a href="https://mikemcquaid.com">Mike McQuaid</a> (of <a href="https://brew.sh">Homebrew</a> fame) and I scheduled this episode of Hot Fix a week before the <a href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/">Ruby community exploded</a>. <a href="https://justin.searls.co/posts/whats-the-hot-fix/">Hot Fix</a> is all about getting spicy, but even we were a little wary of the heat in that particular kitchen. The problem Mike brought to the table is the same one he's always on about: <strong>open source is not a career</strong>. Incidentally, Mike's favorite topic also happens to be relevant to the latest RubyGems controversy—because it all boils down to paying people to work on open source.</p>
<p>Not content to miss out on the fun, <a href="https://changelog.com/person/jerodsanto">Jerod</a> from <a href="https://changelog.com/">The Changelog</a> asked if he could join and discuss the ongoing Ruby drama as a group. So we decided to team up and do a collab episode—call it <strong>Breaking Changelog</strong>, I guess? It's nothing if not efficient: record once, edit twice, and syndicate everywhere.</p>
<p>If you don't mind swear words, listen to this version. If you don't like swearing, what the fuck are you doing here? (But seriously, you can <a href="https://changelog.com/friends/113">listen to their edit</a> if you want!)</p>
<p>Please send your compliments to <a href="mailto:podcast@searls.co">podcast@searls.co</a> and your complaints to <a href="mailto:editors@changelog.com">editors@changelog.com</a>.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/hotfix-v44.0.2-if-you-dont-like-it-quit/","append_url_label":"Hear 🎙","content":"\u003cp\u003e\u003cstrong\u003ePost-recording update: As I've been lobbying for (both publicly and behind the scenes), it has been announced that the RubyGems and Bundler client libraries are \u003ca href=\"https://rubycentral.org/news/ruby-central-statement-on-rubygems-bundler/\"\u003ebeing transferred to Matz and the Ruby core team\u003c/a\u003e.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mikemcquaid.com\"\u003eMike McQuaid\u003c/a\u003e (of \u003ca href=\"https://brew.sh\"\u003eHomebrew\u003c/a\u003e fame) and I scheduled this episode of Hot Fix a week before the \u003ca href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/\"\u003eRuby community exploded\u003c/a\u003e. \u003ca href=\"https://justin.searls.co/posts/whats-the-hot-fix/\"\u003eHot Fix\u003c/a\u003e is all about getting spicy, but even we were a little wary of the heat in that particular kitchen. The problem Mike brought to the table is the same one he's always on about: \u003cstrong\u003eopen source is not a career\u003c/strong\u003e. Incidentally, Mike's favorite topic also happens to be relevant to the latest RubyGems controversy—because it all boils down to paying people to work on open source.\u003c/p\u003e\n\u003cp\u003eNot content to miss out on the fun, \u003ca href=\"https://changelog.com/person/jerodsanto\"\u003eJerod\u003c/a\u003e from \u003ca href=\"https://changelog.com/\"\u003eThe Changelog\u003c/a\u003e asked if he could join and discuss the ongoing Ruby drama as a group. So we decided to team up and do a collab episode—call it \u003cstrong\u003eBreaking Changelog\u003c/strong\u003e, I guess? It's nothing if not efficient: record once, edit twice, and syndicate everywhere.\u003c/p\u003e\n\u003cp\u003eIf you don't mind swear words, listen to this version. If you don't like swearing, what the fuck are you doing here? (But seriously, you can \u003ca href=\"https://changelog.com/friends/113\"\u003elisten to their edit\u003c/a\u003e if you want!)\u003c/p\u003e\n\u003cp\u003ePlease send your compliments to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e and your complaints to \u003ca href=\"mailto:editors@changelog.com\"\u003eeditors@changelog.com\u003c/a\u003e.\u003c/p\u003e","format_string":"New episode of Breaking Change is live! Mike McQuaid: If you don't like it, Quit","id":"https://justin.searls.co/casts/hotfix-v44.0.2-if-you-dont-like-it-quit/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v44.0.2-if-you-don%27t-like-it-quit.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-17T16:00:00Z","title":"Mike McQuaid: If you don't like it, Quit","updated_at":"2025-10-20T22:20:26-04:00","url":"https://justin.searls.co/casts/hotfix-v44.0.2-if-you-dont-like-it-quit/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/</id>
      <title type="text">🔗 Good coding agent advice</title>
        <link href="https://steipete.me/posts/just-talk-to-it" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-15T10:11:43+00:00</published>
    <updated>2025-10-15T14:04:28-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>I'm two weeks behind on the <a href="/newsletter/">newsletter</a>, so I was trying to be responsible by resisting the urge to document the success I've had with my current coding agent setup. My self-restraint has paid off, as Peter Steinberger essentially wrote the <a href="https://steipete.me/posts/just-talk-to-it">exact post I was planning</a> to write.</p>
<p>There's lots of good nuggets in here, and it's uncanny how many I agree with:</p>
<ol>
<li>I also use <a href="https://developers.openai.com/codex/cli/">Codex CLI</a> (well, <a href="https://github.com/just-every/code">this fork</a>) on a <a href="https://openai.com/index/introducing-chatgpt-pro/">$200 ChatGPT Pro</a> plan. Claude Code was an epiphany, but their models are overrated for the task, whereas GPT 5's variants are more adherent and diligent across the board. OpenAI's usage limits are virtually infinite by comparison, too</li>
<li>I run 3-6 agents in parallel (usually up to 3 per project and up to 2 projects at a time). Unlike Peter, it's rare I let two agents edit the same codebase simultaneously. GPT 5's &quot;medium&quot; reasoning setting is so fast that the time-consuming activities are brainstorming, researching, unearthing technical debt, and planning refactors</li>
<li>While <a href="https://git-scm.com/docs/git-worktree">git worktrees</a> are a very cool feature, they dramatically slow down code integration with merge conflicts. Additionally, I've found it's hard to avoid API and port conflicts when running numerous development instances simultaneously. And when an environment stops working, agents will silently start coding based on speculation and conjecture. <strong>Fast feedback through observable execution of code is the single most important thing</strong>, so the risk isn't worth the (marginal) reward</li>
<li>Hooks, custom commands, and fancy hacks like <a href="https://github.com/just-every/code/blob/main/code-rs/tui/src/chatwidget/auto_coordinator.rs#L158">coder's undocumented auto-drive mode</a> are nice, but they're no replacement for <strong>thinking really hard about what you want</strong></li>
</ol>
<p>But really, the reason I've had so much success with Codex in comparison to Claude is that if you get off your ass and do the hard thinking necessary to arrive at an extremely crisp and well-informed articulation of what you want, why you want it, and what obstacles it will face, today's agents will generally do a really good job.</p>
<p>Oh, and fuck prompt engineering, just communicate better. As Peter says:</p>
<blockquote>
<p>Don't waste your time on stuff like RAG, subagents, Agents 2.0 or other things that are mostly just charade. Just talk to it. Play with it. Develop intuition. The more you work with agents, the better your results will be.</p>
</blockquote>
<p>I've started a dozen posts about working with coding agents that I deleted before publishing, because I eventually realized whatever insight I had could just as easily apply to dealing with human colleagues as with LLM agents. Seriously, just talk to it like a human.</p>
<p>Common communication failure modes:</p>
<ul>
<li>Telling the agent <em>how</em> to do the work instead of answering <em>why</em>, <em>what</em>, and <em>where</em>, and then getting upset when the ultimate solution manages to complete all the hyper-specific tasks I defined while failing to solve the broader problem</li>
<li>Giving the agent instructions that contradicted the facts on the ground, only for the agent to spin its wheels endlessly and make a huge mess trying to do the impossible</li>
<li>Lazily hand-waving away important requirements, only for the agent to miss edge cases it lacked awareness of</li>
<li>Telling it what I want before I'd really thought things through, then hating whatever it gave me</li>
<li>Failing to first deal with underlying technical debt, then getting mad when the agent shoehorns in a necessarily-messy solution on top</li>
<li>Getting frustrated, being condescending, or treating the agent like it's my underling, and then peeking at its reasoning log and seeing 80% of its thoughts are about managing my emotional state and 20% about the problem at hand</li>
</ul>
<p>I'm more convinced than ever that when people are having a bad time with using AI to write code, it's not only due to ignorance and incompetence surrounding the tools themselves—just as often, it's a failure of imagination and lack of communication skills. Two things that even the best programmers frequently lack. If you're a programmer who's bad at communicating with humans, I hope you've got some other plan for making money in the next decade.</p>
<p>Anyway, that's where things stand in October. June feels like three years ago, so we'll see where we are in February, I guess.</p>

<p>🔗 <a href="https://steipete.me/posts/just-talk-to-it" title="Original Article">steipete.me</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>I'm two weeks behind on the <a href="/newsletter/">newsletter</a>, so I was trying to be responsible by resisting the urge to document the success I've had with my current coding agent setup. My self-restraint has paid off, as Peter Steinberger essentially wrote the <a href="https://steipete.me/posts/just-talk-to-it">exact post I was planning</a> to write.</p>
<p>There's lots of good nuggets in here, and it's uncanny how many I agree with:</p>
<ol>
<li>I also use <a href="https://developers.openai.com/codex/cli/">Codex CLI</a> (well, <a href="https://github.com/just-every/code">this fork</a>) on a <a href="https://openai.com/index/introducing-chatgpt-pro/">$200 ChatGPT Pro</a> plan. Claude Code was an epiphany, but their models are overrated for the task, whereas GPT 5's variants are more adherent and diligent across the board. OpenAI's usage limits are virtually infinite by comparison, too</li>
<li>I run 3-6 agents in parallel (usually up to 3 per project and up to 2 projects at a time). Unlike Peter, it's rare I let two agents edit the same codebase simultaneously. GPT 5's &quot;medium&quot; reasoning setting is so fast that the time-consuming activities are brainstorming, researching, unearthing technical debt, and planning refactors</li>
<li>While <a href="https://git-scm.com/docs/git-worktree">git worktrees</a> are a very cool feature, they dramatically slow down code integration with merge conflicts. Additionally, I've found it's hard to avoid API and port conflicts when running numerous development instances simultaneously. And when an environment stops working, agents will silently start coding based on speculation and conjecture. <strong>Fast feedback through observable execution of code is the single most important thing</strong>, so the risk isn't worth the (marginal) reward</li>
<li>Hooks, custom commands, and fancy hacks like <a href="https://github.com/just-every/code/blob/main/code-rs/tui/src/chatwidget/auto_coordinator.rs#L158">coder's undocumented auto-drive mode</a> are nice, but they're no replacement for <strong>thinking really hard about what you want</strong></li>
</ol>
<p>But really, the reason I've had so much success with Codex in comparison to Claude is that if you get off your ass and do the hard thinking necessary to arrive at an extremely crisp and well-informed articulation of what you want, why you want it, and what obstacles it will face, today's agents will generally do a really good job.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/","append_url_label":"Click 🔗","content":"\u003cp\u003eI'm two weeks behind on the \u003ca href=\"/newsletter/\"\u003enewsletter\u003c/a\u003e, so I was trying to be responsible by resisting the urge to document the success I've had with my current coding agent setup. My self-restraint has paid off, as Peter Steinberger essentially wrote the \u003ca href=\"https://steipete.me/posts/just-talk-to-it\"\u003eexact post I was planning\u003c/a\u003e to write.\u003c/p\u003e\n\u003cp\u003eThere's lots of good nuggets in here, and it's uncanny how many I agree with:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eI also use \u003ca href=\"https://developers.openai.com/codex/cli/\"\u003eCodex CLI\u003c/a\u003e (well, \u003ca href=\"https://github.com/just-every/code\"\u003ethis fork\u003c/a\u003e) on a \u003ca href=\"https://openai.com/index/introducing-chatgpt-pro/\"\u003e$200 ChatGPT Pro\u003c/a\u003e plan. Claude Code was an epiphany, but their models are overrated for the task, whereas GPT 5's variants are more adherent and diligent across the board. OpenAI's usage limits are virtually infinite by comparison, too\u003c/li\u003e\n\u003cli\u003eI run 3-6 agents in parallel (usually up to 3 per project and up to 2 projects at a time). Unlike Peter, it's rare I let two agents edit the same codebase simultaneously. GPT 5's \u0026quot;medium\u0026quot; reasoning setting is so fast that the time-consuming activities are brainstorming, researching, unearthing technical debt, and planning refactors\u003c/li\u003e\n\u003cli\u003eWhile \u003ca href=\"https://git-scm.com/docs/git-worktree\"\u003egit worktrees\u003c/a\u003e are a very cool feature, they dramatically slow down code integration with merge conflicts. Additionally, I've found it's hard to avoid API and port conflicts when running numerous development instances simultaneously. And when an environment stops working, agents will silently start coding based on speculation and conjecture. \u003cstrong\u003eFast feedback through observable execution of code is the single most important thing\u003c/strong\u003e, so the risk isn't worth the (marginal) reward\u003c/li\u003e\n\u003cli\u003eHooks, custom commands, and fancy hacks like \u003ca href=\"https://github.com/just-every/code/blob/main/code-rs/tui/src/chatwidget/auto_coordinator.rs#L158\"\u003ecoder's undocumented auto-drive mode\u003c/a\u003e are nice, but they're no replacement for \u003cstrong\u003ethinking really hard about what you want\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBut really, the reason I've had so much success with Codex in comparison to Claude is that if you get off your ass and do the hard thinking necessary to arrive at an extremely crisp and well-informed articulation of what you want, why you want it, and what obstacles it will face, today's agents will generally do a really good job.\u003c/p\u003e\n\u003cp\u003eOh, and fuck prompt engineering, just communicate better. As Peter says:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDon't waste your time on stuff like RAG, subagents, Agents 2.0 or other things that are mostly just charade. Just talk to it. Play with it. Develop intuition. The more you work with agents, the better your results will be.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI've started a dozen posts about working with coding agents that I deleted before publishing, because I eventually realized whatever insight I had could just as easily apply to dealing with human colleagues as with LLM agents. Seriously, just talk to it like a human.\u003c/p\u003e\n\u003cp\u003eCommon communication failure modes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTelling the agent \u003cem\u003ehow\u003c/em\u003e to do the work instead of answering \u003cem\u003ewhy\u003c/em\u003e, \u003cem\u003ewhat\u003c/em\u003e, and \u003cem\u003ewhere\u003c/em\u003e, and then getting upset when the ultimate solution manages to complete all the hyper-specific tasks I defined while failing to solve the broader problem\u003c/li\u003e\n\u003cli\u003eGiving the agent instructions that contradicted the facts on the ground, only for the agent to spin its wheels endlessly and make a huge mess trying to do the impossible\u003c/li\u003e\n\u003cli\u003eLazily hand-waving away important requirements, only for the agent to miss edge cases it lacked awareness of\u003c/li\u003e\n\u003cli\u003eTelling it what I want before I'd really thought things through, then hating whatever it gave me\u003c/li\u003e\n\u003cli\u003eFailing to first deal with underlying technical debt, then getting mad when the agent shoehorns in a necessarily-messy solution on top\u003c/li\u003e\n\u003cli\u003eGetting frustrated, being condescending, or treating the agent like it's my underling, and then peeking at its reasoning log and seeing 80% of its thoughts are about managing my emotional state and 20% about the problem at hand\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI'm more convinced than ever that when people are having a bad time with using AI to write code, it's not only due to ignorance and incompetence surrounding the tools themselves—just as often, it's a failure of imagination and lack of communication skills. Two things that even the best programmers frequently lack. If you're a programmer who's bad at communicating with humans, I hope you've got some other plan for making money in the next decade.\u003c/p\u003e\n\u003cp\u003eAnyway, that's where things stand in October. June feels like three years ago, so we'll see where we are in February, I guess.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/","og_image":"https://justin.searls.co/img/social/links/2025-10-15-good-coding-agent-advice.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-15T10:11:43Z","related_url":"https://steipete.me/posts/just-talk-to-it","title":"Good coding agent advice","updated_at":"2025-10-15T14:04:28-04:00","url":"https://justin.searls.co/links/2025-10-15-good-coding-agent-advice/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-10-13-09h09m26s/</id>
      <title type="text">📸 ✅ Active on weekends</title>
      <link href="https://justin.searls.co/shots/2025-10-13-09h09m26s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-13T13:09:26+00:00</published>
    <updated>2025-10-13T09:14:45-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-10-13-09h09m06s-b299241.jpeg"/>
</div><p>A recruiter sent me this screenshot of some kind of GitHub profile scraper. Aside from naming me as a &quot;top 1%&quot; JavaScript developer (which I'm not sure is a compliment or a threat…), I just couldn't get over the &quot;active on weekends&quot; checkmark.</p>
<p>Lady, on weekends I charge double. 🤌</p>

]]></content>
    <summary type="html"><![CDATA[<p>A recruiter sent me this screenshot of some kind of GitHub profile scraper. Aside from naming me as a &quot;top 1%&quot; JavaScript developer (which I'm not sure is a compliment or a threat…), I just couldn't get over the &quot;active on weekends&quot; checkmark.</p>
<p>Lady, on weekends I charge double. 🤌</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-10-13-09h09m26s/","append_url_label":"View 📸","content":"\u003cp\u003eA recruiter sent me this screenshot of some kind of GitHub profile scraper. Aside from naming me as a \u0026quot;top 1%\u0026quot; JavaScript developer (which I'm not sure is a compliment or a threat…), I just couldn't get over the \u0026quot;active on weekends\u0026quot; checkmark.\u003c/p\u003e\n\u003cp\u003eLady, on weekends I charge double. 🤌\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-10-13-09h09m26s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-10-13-09h09m06s-b299241.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-10-13-09h09m06s-b299241.jpeg","platform_overrides":{},"published_at":"2025-10-13T13:09:26Z","title":"✅ Active on weekends","updated_at":"2025-10-13T09:14:45-04:00","url":"https://justin.searls.co/shots/2025-10-13-09h09m26s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/</id>
      <title type="text">🔗 People jumped to conclusions about this RubyGems thing</title>
        <link href="https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-09T19:32:53+00:00</published>
    <updated>2025-10-10T07:47:44-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p><strong>[TL;DR, <a href="https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/">Ruby Central has alleged</a> that <em>after</em> he was notified that the board had voted to remove his production access to RubyGems.org, André Arko accessed the Ruby Central AWS account without authorization and proceeded to change the root password. <span class="[&_a]:no-underline"><a href="#the-somehow-even-worse-part">👇</a>]</span></strong></p>
<p>For context, last week I wrote a post <a href="/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/">bringing to light a number of things André Arko had said and done</a> in the past as a way to provide some context. Context that might explain <em>why</em> any of the principal actors involved in the RubyGems maintainer crisis (summarized well up to that point by <a href="https://www.404media.co/how-ruby-went-off-the-rails/">Emanuel Maiberg</a>) would take such otherwise inexplicable actions and then fail to even attempt to explain them.</p>
<p>Today, <a href="https://byroot.github.io/opensource/ruby/2025/10/09/dear-rubyists.html">Jean shed some light on Shopify's significant investments in Ruby and Rails open-source</a>, and it actually paints a picture of corporate investment in open source <em>done right</em>. (Disclosure: I know and am friends with several people who work at Shopify on these teams, and unless they're all lying to me, they sure seem to prioritize their work based on what Ruby and Rails need, as opposed to what Shopify wants.) Jean went a step further by contrasting Shopify's approach with the perverse incentives at play when individuals or groups receive sponsorships to do open source. He also drew a pretty clear line of those incentives playing out based on how RubyGems and Bundler maintainers reacted to Shopify's feature submissions. Read the post, it's good.</p>
<p>But now, not an hour after reading Jean's post, Ruby Central has published <a href="https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/">a jaw-dropping tick tock of the events</a> that precipitated their decision to revoke maintainer access. Even more bizarrely, the only reason we're learning this information at all seems to be a self-own: that by <a href="https://joel.drapper.me/p/ruby-central-security-measures/">publicly dunking on Ruby Central's failure to remove André's systems access</a>—as opposed to properly disclosing the security breach—Joel Drapper and André inadvertently compelled Ruby Central to issue a post-mortem that lays out the facts we've all been clamoring for.</p>
<p>Seriously, <a href="https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/">just go read it yourself</a>.</p>

<h2 id="the-bad-part">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/#the-bad-part">The Bad Part</a>
</h2>
<p>On August 3, Ruby Central leadership became concerned there was a risk André might access and sell logs containing personally identifiable information from RubyGems.org servers. This concern was raised by André himself, who proposed it in an email:</p>
<blockquote>
<p>Following these budget adjustments, Mr. Arko's consultancy, which had been receiving approximately $50,000 per year for providing the secondary on-call service, submitted a proposal offering to provide secondary on-call services at no cost in exchange for access to production HTTP access logs, containing IP addresses and other personally identifiable information (PII). The offer would have given Mr. Arko's consultancy access to that data, so that they could monetize it by analyzing access patterns and potentially sharing it with unrelated third-parties.</p>
</blockquote>
<p>(The screenshot of André's email to Marty is <a href="https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/#:~:text=Following%20these%20budget,unrelated%20third%2Dparties.">in the post</a>.)</p>
<p>So, according to Ruby Central, André was making $50k a year to fulfill a &quot;rarely activated&quot; role as secondary on-call, and when that budget was cut, he proposed harvesting PII and reselling it for his own profit. No mention that this might be unethical, much less in violation of RubyGems.org's <a href="https://rubygems.org/policies/privacy">privacy policy</a>.</p>
<p>This led Ruby Central to go to work shoring up proper Operator Agreements and Contributor Agreements that could sufficiently defend against this kind of action. They decided to take the further step of temporarily revoking various accesses from multiple (most? all?) contributors until such protections were in place, which—as has been widely discussed—they <a href="https://rubycentral.org/news/our-stewardship-where-we-are-whats-changing-and-how-well-engage/">didn't do a great job of explaining</a> and did not even attempt to justify. Of course, now that we've seen this email and understanding that Ruby Central probably didn't want to catch a defamation suit by naming and shaming André as the reason, it certainly casts the subsequent community outrage in a different light.</p>
<p>Suddenly, that Shopify's leadership undertook a bizarre corporate conspiracy to withhold sponsorship dollars if Ruby Central didn't mass revoke maintainer access <em>isn't</em> the simplest explanation for why things might have gone down the way they did.</p>

<h2 id="the-somehow-even-worse-part">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/#the-somehow-even-worse-part">The Somehow Even Worse Part</a>
</h2>
<p>But wait, there's more. <a href="https://joel.drapper.me/p/ruby-central-security-measures/">Joel's post</a> identifying that André still had systems access not only represented a security incident, it connected the dots Ruby Central would need to affirmatively identify an unauthorized actor who had accessed and changed credentials on their AWS account.</p>
<p>On September 18th, Ruby Central notifies they're revoking André's access:</p>
<blockquote>
<p>Ruby Central notifies Mr. Arko, via email, of the board's decision to remove his RubyGems.org production access, and the termination of his on-call services. During that transition, our teams remove the AWS security credentials belonging to Mr. Arko for accessing the production systems, but we fail to rotate the AWS root account password in tandem.</p>
</blockquote>
<p>Not eight hours later, a mysterious stranger in San Francisco (who Ruby Central asserts <a href="https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/#:~:text=The%20blog%20post%20asserts%20that%20this%20action%20was%20taken%20by%20Mr.%20Arko.">is André</a>) <strong>logs in as the root user of Ruby Central's AWS account and changes the password</strong>. Ten days later, another mysterious stranger in Tokyo (who <a href="https://kaigionrails.org/2025/speakers/#:~:text=Andr%C3%A9%20Arko">is apparently also André</a>) logs in as root again.</p>
<p>I'm no lawyer, but that timeline could implicate the <a href="https://www.justice.gov/jm/jm-9-48000-computer-fraud">Computer Fraud and Abuse Act</a>. That'd be incredible enough on its own, were it not for the fact he may have done it <em>again</em> in Tokyo—meaning he might have exposed himself to <a href="https://laws.e-gov.go.jp/law/411AC0000000128">Japan's</a> own <a href="https://laws.e-gov.go.jp/law/140AC0000000045?hit_toc=Mp-Pa_2-Ch_35-At_234_2">statutes</a> governing unauthorized computer access.</p>
<p>I'm not here to gloat, I'm here to plead with People On The Internet who rushed to judgment against Ruby Central or in defense of André to learn from this situation. The next time a story hits that rhymes with the basic outline of your prior convictions or political beliefs, pause and weigh the evidence before grabbing the nearest pitchfork and joining the mob. Sometimes that means—and I realize this is hard for some of us—not posting anything at all.</p>
<p>That said, I <em>am</em> formally <a href="mailto:justin@searls.co">accepting apologies</a> from anyone who dismissed my previous post as &quot;hearsay&quot; or a &quot;hit job&quot; on Reddit, Hacker News, Bluesky, and Mastodon. (The X folks were mostly into it, a fact which brings me no joy.)</p>

<p>🔗 <a href="https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/" title="Original Article">rubycentral.org</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p><strong>[TL;DR, <a href="https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/">Ruby Central has alleged</a> that <em>after</em> he was notified that the board had voted to remove his production access to RubyGems.org, André Arko accessed the Ruby Central AWS account without authorization and proceeded to change the root password. <span class="[&_a]:no-underline"><a href="#the-somehow-even-worse-part">👇</a>]</span></strong></p>
<p>For context, last week I wrote a post <a href="/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/">bringing to light a number of things André Arko had said and done</a> in the past as a way to provide some context. Context that might explain <em>why</em> any of the principal actors involved in the RubyGems maintainer crisis (summarized well up to that point by <a href="https://www.404media.co/how-ruby-went-off-the-rails/">Emanuel Maiberg</a>) would take such otherwise inexplicable actions and then fail to even attempt to explain them.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/","append_url_label":"Click 🔗","content":"\u003cp\u003e\u003cstrong\u003e[TL;DR, \u003ca href=\"https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/\"\u003eRuby Central has alleged\u003c/a\u003e that \u003cem\u003eafter\u003c/em\u003e he was notified that the board had voted to remove his production access to RubyGems.org, André Arko accessed the Ruby Central AWS account without authorization and proceeded to change the root password. \u003cspan class=\"[\u0026_a]:no-underline\"\u003e\u003ca href=\"#the-somehow-even-worse-part\"\u003e👇\u003c/a\u003e]\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFor context, last week I wrote a post \u003ca href=\"/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/\"\u003ebringing to light a number of things André Arko had said and done\u003c/a\u003e in the past as a way to provide some context. Context that might explain \u003cem\u003ewhy\u003c/em\u003e any of the principal actors involved in the RubyGems maintainer crisis (summarized well up to that point by \u003ca href=\"https://www.404media.co/how-ruby-went-off-the-rails/\"\u003eEmanuel Maiberg\u003c/a\u003e) would take such otherwise inexplicable actions and then fail to even attempt to explain them.\u003c/p\u003e\n\u003cp\u003eToday, \u003ca href=\"https://byroot.github.io/opensource/ruby/2025/10/09/dear-rubyists.html\"\u003eJean shed some light on Shopify's significant investments in Ruby and Rails open-source\u003c/a\u003e, and it actually paints a picture of corporate investment in open source \u003cem\u003edone right\u003c/em\u003e. (Disclosure: I know and am friends with several people who work at Shopify on these teams, and unless they're all lying to me, they sure seem to prioritize their work based on what Ruby and Rails need, as opposed to what Shopify wants.) Jean went a step further by contrasting Shopify's approach with the perverse incentives at play when individuals or groups receive sponsorships to do open source. He also drew a pretty clear line of those incentives playing out based on how RubyGems and Bundler maintainers reacted to Shopify's feature submissions. Read the post, it's good.\u003c/p\u003e\n\u003cp\u003eBut now, not an hour after reading Jean's post, Ruby Central has published \u003ca href=\"https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/\"\u003ea jaw-dropping tick tock of the events\u003c/a\u003e that precipitated their decision to revoke maintainer access. Even more bizarrely, the only reason we're learning this information at all seems to be a self-own: that by \u003ca href=\"https://joel.drapper.me/p/ruby-central-security-measures/\"\u003epublicly dunking on Ruby Central's failure to remove André's systems access\u003c/a\u003e—as opposed to properly disclosing the security breach—Joel Drapper and André inadvertently compelled Ruby Central to issue a post-mortem that lays out the facts we've all been clamoring for.\u003c/p\u003e\n\u003cp\u003eSeriously, \u003ca href=\"https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/\"\u003ejust go read it yourself\u003c/a\u003e.\u003c/p\u003e\n\n\u003ch2 id=\"the-bad-part\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/#the-bad-part\"\u003eThe Bad Part\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eOn August 3, Ruby Central leadership became concerned there was a risk André might access and sell logs containing personally identifiable information from RubyGems.org servers. This concern was raised by André himself, who proposed it in an email:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFollowing these budget adjustments, Mr. Arko's consultancy, which had been receiving approximately $50,000 per year for providing the secondary on-call service, submitted a proposal offering to provide secondary on-call services at no cost in exchange for access to production HTTP access logs, containing IP addresses and other personally identifiable information (PII). The offer would have given Mr. Arko's consultancy access to that data, so that they could monetize it by analyzing access patterns and potentially sharing it with unrelated third-parties.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e(The screenshot of André's email to Marty is \u003ca href=\"https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/#:~:text=Following%20these%20budget,unrelated%20third%2Dparties.\"\u003ein the post\u003c/a\u003e.)\u003c/p\u003e\n\u003cp\u003eSo, according to Ruby Central, André was making $50k a year to fulfill a \u0026quot;rarely activated\u0026quot; role as secondary on-call, and when that budget was cut, he proposed harvesting PII and reselling it for his own profit. No mention that this might be unethical, much less in violation of RubyGems.org's \u003ca href=\"https://rubygems.org/policies/privacy\"\u003eprivacy policy\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThis led Ruby Central to go to work shoring up proper Operator Agreements and Contributor Agreements that could sufficiently defend against this kind of action. They decided to take the further step of temporarily revoking various accesses from multiple (most? all?) contributors until such protections were in place, which—as has been widely discussed—they \u003ca href=\"https://rubycentral.org/news/our-stewardship-where-we-are-whats-changing-and-how-well-engage/\"\u003edidn't do a great job of explaining\u003c/a\u003e and did not even attempt to justify. Of course, now that we've seen this email and understanding that Ruby Central probably didn't want to catch a defamation suit by naming and shaming André as the reason, it certainly casts the subsequent community outrage in a different light.\u003c/p\u003e\n\u003cp\u003eSuddenly, that Shopify's leadership undertook a bizarre corporate conspiracy to withhold sponsorship dollars if Ruby Central didn't mass revoke maintainer access \u003cem\u003eisn't\u003c/em\u003e the simplest explanation for why things might have gone down the way they did.\u003c/p\u003e\n\n\u003ch2 id=\"the-somehow-even-worse-part\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/#the-somehow-even-worse-part\"\u003eThe Somehow Even Worse Part\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eBut wait, there's more. \u003ca href=\"https://joel.drapper.me/p/ruby-central-security-measures/\"\u003eJoel's post\u003c/a\u003e identifying that André still had systems access not only represented a security incident, it connected the dots Ruby Central would need to affirmatively identify an unauthorized actor who had accessed and changed credentials on their AWS account.\u003c/p\u003e\n\u003cp\u003eOn September 18th, Ruby Central notifies they're revoking André's access:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRuby Central notifies Mr. Arko, via email, of the board's decision to remove his RubyGems.org production access, and the termination of his on-call services. During that transition, our teams remove the AWS security credentials belonging to Mr. Arko for accessing the production systems, but we fail to rotate the AWS root account password in tandem.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNot eight hours later, a mysterious stranger in San Francisco (who Ruby Central asserts \u003ca href=\"https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/#:~:text=The%20blog%20post%20asserts%20that%20this%20action%20was%20taken%20by%20Mr.%20Arko.\"\u003eis André\u003c/a\u003e) \u003cstrong\u003elogs in as the root user of Ruby Central's AWS account and changes the password\u003c/strong\u003e. Ten days later, another mysterious stranger in Tokyo (who \u003ca href=\"https://kaigionrails.org/2025/speakers/#:~:text=Andr%C3%A9%20Arko\"\u003eis apparently also André\u003c/a\u003e) logs in as root again.\u003c/p\u003e\n\u003cp\u003eI'm no lawyer, but that timeline could implicate the \u003ca href=\"https://www.justice.gov/jm/jm-9-48000-computer-fraud\"\u003eComputer Fraud and Abuse Act\u003c/a\u003e. That'd be incredible enough on its own, were it not for the fact he may have done it \u003cem\u003eagain\u003c/em\u003e in Tokyo—meaning he might have exposed himself to \u003ca href=\"https://laws.e-gov.go.jp/law/411AC0000000128\"\u003eJapan's\u003c/a\u003e own \u003ca href=\"https://laws.e-gov.go.jp/law/140AC0000000045?hit_toc=Mp-Pa_2-Ch_35-At_234_2\"\u003estatutes\u003c/a\u003e governing unauthorized computer access.\u003c/p\u003e\n\u003cp\u003eI'm not here to gloat, I'm here to plead with People On The Internet who rushed to judgment against Ruby Central or in defense of André to learn from this situation. The next time a story hits that rhymes with the basic outline of your prior convictions or political beliefs, pause and weigh the evidence before grabbing the nearest pitchfork and joining the mob. Sometimes that means—and I realize this is hard for some of us—not posting anything at all.\u003c/p\u003e\n\u003cp\u003eThat said, I \u003cem\u003eam\u003c/em\u003e formally \u003ca href=\"mailto:justin@searls.co\"\u003eaccepting apologies\u003c/a\u003e from anyone who dismissed my previous post as \u0026quot;hearsay\u0026quot; or a \u0026quot;hit job\u0026quot; on Reddit, Hacker News, Bluesky, and Mastodon. (The X folks were mostly into it, a fact which brings me no joy.)\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/","og_image":"https://justin.searls.co/img/social/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-09T19:32:53Z","related_url":"https://rubycentral.org/news/rubygems-org-aws-root-access-event-september-2025/","title":"People jumped to conclusions about this RubyGems thing","updated_at":"2025-10-10T07:47:44-04:00","url":"https://justin.searls.co/links/2025-10-09-people-jumped-to-conclusions-about-this-rubygems-thing/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/merge-commits-dead-code-fear-driven-everything/</id>
      <title type="text">🎙️ Merge Commits podcast - Dead Code: Fear-driven Everything</title>
      <link href="https://justin.searls.co/casts/merge-commits-dead-code-fear-driven-everything/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-08T13:18:28+00:00</published>
    <updated>2025-10-08T09:19:14-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/merge-commits/2025-09-09.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/merge-commits/2025-09-09.mp3">Direct link to podcast audio file</a>
</p><p><a href="https://jardo.dev/blog?topic=all">Jared Norman</a> interviewed me after he wrote about the <a href="https://jardo.dev/order-driven-development">order in which programmers</a> choose to write their code and I <a href="https://justin.searls.co/links/2025-07-29-upside-down-development/">offered this response</a>. In this episode, we touch on this before launching into a more expansive discussion on why the agile movement fizzled out and what we can reclaim from a developer workflow perspective now that we're experiencing our first major market upheaval since then with the rise of coding agents.</p>
<p><strong>Appearing on:</strong> <a href="https://shows.acast.com/dead-code">Dead Code</a><br/>
<strong>Published on:</strong> <code>2025-09-09</code><br/>
<strong>Original URL:</strong> <a href="https://shows.acast.com/dead-code/episodes/fear-driven-everything-with-justin-searls">https://shows.acast.com/dead-code/episodes/fear-driven-everything-with-justin-searls</a></p>
<p>Comments? Questions? Suggestion of a podcast I should guest on? <a href="mailto:podcast@searls.co">podcast@searls.co</a></p>

]]></content>
    <summary type="html"><![CDATA[<p><a href="https://jardo.dev/blog?topic=all">Jared Norman</a> interviewed me after he wrote about the <a href="https://jardo.dev/order-driven-development">order in which programmers</a> choose to write their code and I <a href="https://justin.searls.co/links/2025-07-29-upside-down-development/">offered this response</a>. In this episode, we touch on this before launching into a more expansive discussion on why the agile movement fizzled out and what we can reclaim from a developer workflow perspective now that we're experiencing our first major market upheaval since then with the rise of coding agents.</p>
<p><strong>Appearing on:</strong> <a href="https://shows.acast.com/dead-code">Dead Code</a><br/>
<strong>Published on:</strong> <code>2025-09-09</code><br/>
<strong>Original URL:</strong> <a href="https://shows.acast.com/dead-code/episodes/fear-driven-everything-with-justin-searls">https://shows.acast.com/dead-code/episodes/fear-driven-everything-with-justin-searls</a></p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/merge-commits-dead-code-fear-driven-everything/","append_url_label":"Hear 🎙","content":"\u003cp\u003e\u003ca href=\"https://jardo.dev/blog?topic=all\"\u003eJared Norman\u003c/a\u003e interviewed me after he wrote about the \u003ca href=\"https://jardo.dev/order-driven-development\"\u003eorder in which programmers\u003c/a\u003e choose to write their code and I \u003ca href=\"https://justin.searls.co/links/2025-07-29-upside-down-development/\"\u003eoffered this response\u003c/a\u003e. In this episode, we touch on this before launching into a more expansive discussion on why the agile movement fizzled out and what we can reclaim from a developer workflow perspective now that we're experiencing our first major market upheaval since then with the rise of coding agents.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAppearing on:\u003c/strong\u003e \u003ca href=\"https://shows.acast.com/dead-code\"\u003eDead Code\u003c/a\u003e\u003cbr/\u003e\n\u003cstrong\u003ePublished on:\u003c/strong\u003e \u003ccode\u003e2025-09-09\u003c/code\u003e\u003cbr/\u003e\n\u003cstrong\u003eOriginal URL:\u003c/strong\u003e \u003ca href=\"https://shows.acast.com/dead-code/episodes/fear-driven-everything-with-justin-searls\"\u003ehttps://shows.acast.com/dead-code/episodes/fear-driven-everything-with-justin-searls\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eComments? Questions? Suggestion of a podcast I should guest on? \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e\u003c/p\u003e\n","format_string":"New episode of Merge Commits is live! Dead Code: Fear-driven Everything","id":"https://justin.searls.co/casts/merge-commits-dead-code-fear-driven-everything/","og_image":"https://justin.searls.co/img/podcast/merge-commits-dead-code.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-08T13:18:28Z","title":"Dead Code: Fear-driven Everything","updated_at":"2025-10-08T09:19:14-04:00","url":"https://justin.searls.co/casts/merge-commits-dead-code-fear-driven-everything/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/is-sora-the-future-of-fiction/</id>
      <title type="text">📄 Is Sora the future of fiction?</title>
      <link href="https://justin.searls.co/posts/is-sora-the-future-of-fiction/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-02T12:50:18+00:00</published>
    <updated>2025-10-02T11:16:46-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>I made this yesterday by typing a few words and uploading a couple of pictures to <a href="https://openai.com/sora/">Sora</a>:</p>
<div class="my-1 ">
  <iframe class="mx-auto max-h-[90vh]" src="https://www.youtube.com/embed/p7P_jH-TjqM" width="348" height="619" loading="lazy" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>

<p>When Sora 2 was announced on Tuesday, I immediately saw it as <em>exactly</em> what I've wanted from AI ever since I first saw <a href="https://en.wikipedia.org/wiki/Stable_Diffusion">Stable Diffusion</a> in the Summer of 2022. For years, I've fantasized about breaking free from the extremely limited vocabulary of stock video libraries (as a <a href="http://descript.com">Descript</a> subscriber, I've long had access to <a href="https://www.storyblocks.com">Storyblocks</a>' library). Stitching together stock content to make explainer <a href="https://www.youtube.com/watch?v=EUrIK6YREmU">videos like this one</a> is fun, but the novelty wears off as you quickly burn through all three clips for &quot;child throws spaghetti at family member.&quot; Stock video is great if you only talk about mundane household and business topics, but my twisted brain thinks up some pretty weird shit, and conveying my imagination in video would be a lot more labor-intensive than starting yet another banal YouTube channel covering economics or something.</p>
<p>Despite being invite-only, I got access within 24 hours (maybe because I'm a ChatGPT Pro subscriber?), and it confirmed that Sora was exactly what I'd been waiting for:</p>
<ul>
<li>10-second short-form video</li>
<li>16:9 or 9:16 aspect ratios</li>
<li>Downloadable and re-uploadable elsewhere (watermarked)</li>
<li>Sound, including dialog (provide an exact script or let the model riff)</li>
<li>Can portray your likeness and consenting collaborators'</li>
<li>&quot;Good enough&quot; results within 3-5 prompt iterations</li>
<li>Understands simple direction: film styles, camera angles, scene cuts</li>
</ul>
<p>The only surprise was that Sora 2 shows up as a social network, not yet another chat interface or infinite search pane. You sign up, you wait, you get four invites, you and your friends have a good time, and you get notified as more friends follow you. We've seen this rollout a dozen times.</p>
<p>In hindsight, Sora <strong>had</strong> to be a social network. As Meta has demonstrated, nobody wants to stare at an <a href="https://about.fb.com/news/2025/09/introducing-vibes-ai-videos/">AI Slop Feed</a> if it doesn't feature people they know and recognize. In the abstract, &quot;people you know and recognize&quot; would be off the table without opt-in consent. But durable consent more or less requires a social graph paired with platform-level verification and permission settings. &quot;Deepfakes&quot; have dominated the broader discussion around image generation, not only because they pose a vexing problem to civilization, but also because existing tools lack any built-in chain of trust mechanic—which limited our collective imagination to their use for political disinformation and revenge porn. But when you're on a social network and your videos can only star you and your close friends who've given you permission to use their likeness, OpenAI was actually able to <em>strengthen</em> the app's other guardrails in the process.</p>
<p>That means that while other image and video generators let you get away with posting images of real people as a starting point to work from, Sora disallows naming any person or uploading any image of a human into a prompt. Instead, you can only <code>@mention</code> users on the network, who have created a &quot;cameo&quot; avatar, who have given you permission to use it, and for which your specific prompt isn't disallowed by their preferences. Suddenly, AI deepfakes are (relatively) safe and fun. They star you and your consenting friends. If you piss your friends off, they can delete the videos you put them in. If you keep doing it, they won't be your friends for very long. The platform will surely be under-moderated, but by defaulting to a mutual-follower consent scheme, many of the abuse vectors will be self-policing in practice. (I'm emphatically not saying here that Sora won't result in a raft of psychosis diagnoses and teen suicides, by the way. We are super-duper cooked.)</p>
<p>As for the success of the platform, only time will tell if the novelty of unreality wears off, or if the presence of likenesses we know and recognize paired with imagery that previously required blockbuster movie budgets will be enough to hold our attention. Based on the success of <a href="https://openai.com/index/introducing-4o-image-generation/">4o image generation</a>, OpenAI is betting on the latter. I suspect that the platform will only pick up steam following substantial improvements to both the model (improved temporal consistency, complex directorial technique) and the interface (longer videos, sharing tools, storyboarding, series/playlists).</p>

<h2 id="trust-in-truth-giving-way-to-trust-in-falsity">Trust in truth giving way to trust in falsity</h2>
<p>Influencer-dominated video platforms have been broken for a long time, in part because their economics depend on winning an audience's trust to influence people towards doing or buying things that reward the influencer. That trust is built on the assumption that the influencer's videos are based in reality. After all, it's a real camera, pointed at a real product, from a real person the viewer has followed for months or years. Besides, why would they lie? They lie, it turns out, because making any kind of money on these platforms is an exhausting, tenuous hustle. Maintaining an audience large enough to make a living as an influencer requires constantly feeding the beast with content. The sponsors that pay the most are the ones whose products won't get as much reach <em>without</em> a high-trust endorsement, which results in the most scammy products and services offering the highest rates. This pushes influencers to make not-so-truthful claims, even if it means selling their audience down the river in the process.</p>
<p><strong>Sora sidesteps all of this because it's all lies all the time</strong>. People's trust in institutions and the veracity of what we see on screens is already at an all-time low, and the spread of AI-generated video that's <em>this good</em> will only erode that trust further. Sora-the-platform doesn't accept real videos, but videos generated by Sora-the-model will quickly begin infecting &quot;real&quot; spaces like YouTube, TikTok, and Instagram—causing people's trust in what they see on those platforms to fall even further.</p>
<p>This dynamic gives OpenAI an absolutely diabolical epistemic edge, where <strong>the Sora app can be authoritatively false while the other platforms can never be authoritatively true</strong>. Users will be able to let their guard down using Sora, but they'll have to be more vigilant than ever on Instagram. If this strikes you as ridiculous, consider that we're simply talking about works of fiction versus works of nonfiction. Right now, every video you consume online is assumed to be nonfiction <em>until</em> you read the comments and learn the video was staged, the creator's body was enhanced with AI post-processing, or the sponsored product causes rectal cancer. So even without Sora, we're currently trapped in this uncanny valley where every video platform is perceived as hosting <em>fictional nonfiction</em>, which results in nothing ever being fully entertaining or fully informative. <strong>Sora, meanwhile, is a platform that can only host fiction by definition.</strong> And given that about <a href="https://variety.com/2022/digital/news/cta-user-generated-content-study-1235146175/">half of media consumption</a> is scripted content from legacy media companies, there's still a pretty good market for fiction out there!</p>
<p>So if you're just looking to kill a few minutes on your phone while you wait in line at the bank, you're probably going to take the path of least resistance—it's why you open Instagram or TikTok in the first place. But those apps offer a slurry that's part-entertainment, part-information, and part-commerce—a feed that has some funny videos, sure, but also sells you bullshit supplements, radicalizes your father, and exacerbates your daughter's body image issues. Sora might offer a path of <em>even less</em> resistance: mindless entertainment that allows you to safely turn your brain off. Because all the content is fake, you don't have to be on guard against being fooled.</p>
<p>The upshot here is that <strong>when there's no platform you can trust to be real, the next best thing is a platform where you can trust everything is fake.</strong></p>

<h2 id="what-kind-of-content-will-succeed">What kind of content will succeed</h2>
<p>Let's get this out of the way: lots of content won't work on Sora—especially most influencer niches.</p>
<p>If you're famous on Instagram for flaunting your lavish lifestyle and using it to sell garbage-tier sponsored products, what would you even do with Sora? Show off a fake house? Hawk a fake product? You can't upload &quot;real&quot; video to Sora, so what are your sponsors going to do when your gas station energy drink collab is made to look more like a Red Bull once it passes through the AI model? Even if you could place the products perfectly, entire categories of content that influencers have made profitable won't find much to do on Sora. Who wants fake lifestyle videos, cooking recipes, beauty/fashion tips, fitness routines, gameplay footage, or political ragebait?</p>
<p>What does that leave? Entertainment. The creativity and production value of Hollywood scripted entertainment, crossed with the potential for virality of democratized user-generated content. It's as if <a href="https://en.wikipedia.org/wiki/Quibi">Quibi</a> and <a href="https://en.wikipedia.org/wiki/Vine_%28service%29">Vine</a> had an AI baby. What this adds up to is Sora is less a tool for influencers and more well-suited for out-of-work Hollywood script writers.</p>
<p>One reason Sora is unlikely to take off until it supports longer-form video and is more adherent to script-like prompts, is that engaging fiction depends on preserving authorial intent. It can already do some pretty wild shit, but Sora doesn't give creators enough to work with to compete with a TV series. We'll get some funny cutaways and creative images, but there's only so much you can do in ten seconds. But if Sora can get any kind of foothold and stick around, those limitations will be lifted. People forget this, but YouTube only supported videos shorter than 10 minutes for its first five years and 15 minutes for its first ten. Today, user-generated YouTube content is giving legacy media a run for their money on <a href="https://www.fastcompany.com/91288106/youtube-tv-living-room-what-that-means-for-creators-and-viewers">widescreen televisions</a> and you can barely find a video shorter than 20 minutes on the platform anymore.</p>
<p>But Sora doesn't need to become an overnight cultural sensation to be valuable. OpenAI will keep funding it, because the research suggests that <a href="https://simonwillison.net/2025/Sep/27/video-models-are-zero-shot-learners-and-reasoners/#atom-everything">video generation will unlock the future of general-purpose vision models</a>, and those vision models are the key to autonomous robotics in the real world. And that's the ultimate promise of all these trillion dollar valuations.</p>

<h2 id="what-can-people-use-sora-for-now">What can people use Sora for now?</h2>
<p>Setting aside speculation as to what all this means and where things are going, what OpenAI shipped this week is nothing short of extraordinary exactly as it is. For the first time, a platform can bring visual ideas to life with shockingly little effort. By boxing out &quot;real&quot; content, the platform will reward ingenuity and cleverness over social status and superficial aesthetics.</p>
<p>Here are a few ways Sora shines today:</p>
<ul>
<li>Short-form comedy in the spirit of Vine</li>
<li>Meme/GIF generation</li>
<li>Inside jokes and skits among friends</li>
<li>Design inspiration (like Pinterest or <a href="https://www.behance.net">Behance</a>)</li>
<li>Stock video for B-roll and cutaways for use in other videos</li>
<li>The visual equivalent of lo-fi hip-hop (the feed even has a &quot;mood&quot; filter)</li>
<li>Visual prototyping and virtual screen tests for traditional video production</li>
<li>Fan edits and <a href="https://en.wikipedia.org/wiki/Shipping_%28fandom%29">shipping</a> of known characters (note OpenAI changed its intellectual property policy to an <a href="https://www.digitalmusicnews.com/2025/09/30/sora-2-opt-out-option/">explicit opt-out</a>)</li>
</ul>
<p>Weirder ideas that come to mind:</p>
<ul>
<li>Capturing dreams (this morning I typed what I remembered into Sora before it faded)</li>
<li>Lore and world-building videos and remixes</li>
<li>Synthetic nostalgia and retro-futurism</li>
<li>Visualizing an alternate life (<a href="https://arresteddevelopment.fandom.com/wiki/Mommy,_What_Will_I_Look_Like%3F">with kids</a>, without kids, with pets, being more attractive, speaking another language)</li>
<li>False childhood tapes and future video postcards</li>
<li>Public hallucination challenges (e.g., the Tide Pod, cinnamon, or ice bucket challenges, but expressed through prompts and remixes)</li>
<li>Psychological horror and grotesque/absurd glitch art</li>
<li>Ghost messages from someone who published a cameo but has since passed away in real life</li>
<li>Private messaging:
<ul>
<li>Families sending video greeting cards of imagined gatherings for birthdays or holidays</li>
<li>Asynchronous role-play between friends</li>
<li>Long-distance relationships visualizing co-located experiences</li>
</ul>
</li>
</ul>
<p>Is all this stuff creepy as shit? Yep. Will people actually do any of this? No clue. I'm a sicko, so I will. But the safe money is always on nothing ever changing and people sticking to whatever they're already doing.</p>
<p>What's less debatable is that the world has never seen anything like this, and it's unlikely we'll be able to fully process its impact until humanity has a chance to catch up (by which point, the tools will only be better). Hold your loved ones close, everybody! Shit's getting weird. 🫠</p>]]></content>
    <summary type="html"><![CDATA[<p>I made this yesterday by typing a few words and uploading a couple of pictures to <a href="https://openai.com/sora/">Sora</a>:</p>
<div class="my-1 ">
  <iframe class="mx-auto max-h-[90vh]" src="https://www.youtube.com/embed/p7P_jH-TjqM" width="348" height="619" loading="lazy" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>

<p>When Sora 2 was announced on Tuesday, I immediately saw it as <em>exactly</em> what I've wanted from AI ever since I first saw <a href="https://en.wikipedia.org/wiki/Stable_Diffusion">Stable Diffusion</a> in the Summer of 2022. For years, I've fantasized about breaking free from the extremely limited vocabulary of stock video libraries (as a <a href="http://descript.com">Descript</a> subscriber, I've long had access to <a href="https://www.storyblocks.com">Storyblocks</a>' library). Stitching together stock content to make explainer <a href="https://www.youtube.com/watch?v=EUrIK6YREmU">videos like this one</a> is fun, but the novelty wears off as you quickly burn through all three clips for &quot;child throws spaghetti at family member.&quot; Stock video is great if you only talk about mundane household and business topics, but my twisted brain thinks up some pretty weird shit, and conveying my imagination in video would be a lot more labor-intensive than starting yet another banal YouTube channel covering economics or something.</p>
<p>Despite being invite-only, I got access within 24 hours (maybe because I'm a ChatGPT Pro subscriber?), and it confirmed that Sora was exactly what I'd been waiting for:</p>
<ul>
<li>10-second short-form video</li>
<li>16:9 or 9:16 aspect ratios</li>
<li>Downloadable and re-uploadable elsewhere (watermarked)</li>
<li>Sound, including dialog (provide an exact script or let the model riff)</li>
<li>Can portray your likeness and consenting collaborators'</li>
<li>&quot;Good enough&quot; results within 3-5 prompt iterations</li>
<li>Understands simple direction: film styles, camera angles, scene cuts</li>
</ul>
<p>The only surprise was that Sora 2 shows up as a social network, not yet another chat interface or infinite search pane. You sign up, you wait, you get four invites, you and your friends have a good time, and you get notified as more friends follow you. We've seen this rollout a dozen times.</p>
<p>In hindsight, Sora <strong>had</strong> to be a social network. As Meta has demonstrated, nobody wants to stare at an <a href="https://about.fb.com/news/2025/09/introducing-vibes-ai-videos/">AI Slop Feed</a> if it doesn't feature people they know and recognize. In the abstract, &quot;people you know and recognize&quot; would be off the table without opt-in consent. But durable consent more or less requires a social graph paired with platform-level verification and permission settings. &quot;Deepfakes&quot; have dominated the broader discussion around image generation, not only because they pose a vexing problem to civilization, but also because existing tools lack any built-in chain of trust mechanic—which limited our collective imagination to their use for political disinformation and revenge porn. But when you're on a social network and your videos can only star you and your close friends who've given you permission to use their likeness, OpenAI was actually able to <em>strengthen</em> the app's other guardrails in the process.</p>
<p>That means that while other image and video generators let you get away with posting images of real people as a starting point to work from, Sora disallows naming any person or uploading any image of a human into a prompt. Instead, you can only <code>@mention</code> users on the network, who have created a &quot;cameo&quot; avatar, who have given you permission to use it, and for which your specific prompt isn't disallowed by their preferences. Suddenly, AI deepfakes are (relatively) safe and fun. They star you and your consenting friends. If you piss your friends off, they can delete the videos you put them in. If you keep doing it, they won't be your friends for very long. The platform will surely be under-moderated, but by defaulting to a mutual-follower consent scheme, many of the abuse vectors will be self-policing in practice. (I'm emphatically not saying here that Sora won't result in a raft of psychosis diagnoses and teen suicides, by the way. We are super-duper cooked.)</p>
<p>As for the success of the platform, only time will tell if the novelty of unreality wears off, or if the presence of likenesses we know and recognize paired with imagery that previously required blockbuster movie budgets will be enough to hold our attention. Based on the success of <a href="https://openai.com/index/introducing-4o-image-generation/">4o image generation</a>, OpenAI is betting on the latter. I suspect that the platform will only pick up steam following substantial improvements to both the model (improved temporal consistency, complex directorial technique) and the interface (longer videos, sharing tools, storyboarding, series/playlists).</p>

<h2 id="trust-in-truth-giving-way-to-trust-in-falsity">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/is-sora-the-future-of-fiction/#trust-in-truth-giving-way-to-trust-in-falsity">Trust in truth giving way to trust in falsity</a>
</h2>
<p>Influencer-dominated video platforms have been broken for a long time, in part because their economics depend on winning an audience's trust to influence people towards doing or buying things that reward the influencer. That trust is built on the assumption that the influencer's videos are based in reality. After all, it's a real camera, pointed at a real product, from a real person the viewer has followed for months or years. Besides, why would they lie? They lie, it turns out, because making any kind of money on these platforms is an exhausting, tenuous hustle. Maintaining an audience large enough to make a living as an influencer requires constantly feeding the beast with content. The sponsors that pay the most are the ones whose products won't get as much reach <em>without</em> a high-trust endorsement, which results in the most scammy products and services offering the highest rates. This pushes influencers to make not-so-truthful claims, even if it means selling their audience down the river in the process.</p>
<p><strong>Sora sidesteps all of this because it's all lies all the time</strong>. People's trust in institutions and the veracity of what we see on screens is already at an all-time low, and the spread of AI-generated video that's <em>this good</em> will only erode that trust further. Sora-the-platform doesn't accept real videos, but videos generated by Sora-the-model will quickly begin infecting &quot;real&quot; spaces like YouTube, TikTok, and Instagram—causing people's trust in what they see on those platforms to fall even further.</p>
<p>This dynamic gives OpenAI an absolutely diabolical epistemic edge, where <strong>the Sora app can be authoritatively false while the other platforms can never be authoritatively true</strong>. Users will be able to let their guard down using Sora, but they'll have to be more vigilant than ever on Instagram. If this strikes you as ridiculous, consider that we're simply talking about works of fiction versus works of nonfiction. Right now, every video you consume online is assumed to be nonfiction <em>until</em> you read the comments and learn the video was staged, the creator's body was enhanced with AI post-processing, or the sponsored product causes rectal cancer. So even without Sora, we're currently trapped in this uncanny valley where every video platform is perceived as hosting <em>fictional nonfiction</em>, which results in nothing ever being fully entertaining or fully informative. <strong>Sora, meanwhile, is a platform that can only host fiction by definition.</strong> And given that about <a href="https://variety.com/2022/digital/news/cta-user-generated-content-study-1235146175/">half of media consumption</a> is scripted content from legacy media companies, there's still a pretty good market for fiction out there!</p>
<p>So if you're just looking to kill a few minutes on your phone while you wait in line at the bank, you're probably going to take the path of least resistance—it's why you open Instagram or TikTok in the first place. But those apps offer a slurry that's part-entertainment, part-information, and part-commerce—a feed that has some funny videos, sure, but also sells you bullshit supplements, radicalizes your father, and exacerbates your daughter's body image issues. Sora might offer a path of <em>even less</em> resistance: mindless entertainment that allows you to safely turn your brain off. Because all the content is fake, you don't have to be on guard against being fooled.</p>
<p>The upshot here is that <strong>when there's no platform you can trust to be real, the next best thing is a platform where you can trust everything is fake.</strong></p>

<h2 id="what-kind-of-content-will-succeed">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/is-sora-the-future-of-fiction/#what-kind-of-content-will-succeed">What kind of content will succeed</a>
</h2>
<p>Let's get this out of the way: lots of content won't work on Sora—especially most influencer niches.</p>
<p>If you're famous on Instagram for flaunting your lavish lifestyle and using it to sell garbage-tier sponsored products, what would you even do with Sora? Show off a fake house? Hawk a fake product? You can't upload &quot;real&quot; video to Sora, so what are your sponsors going to do when your gas station energy drink collab is made to look more like a Red Bull once it passes through the AI model? Even if you could place the products perfectly, entire categories of content that influencers have made profitable won't find much to do on Sora. Who wants fake lifestyle videos, cooking recipes, beauty/fashion tips, fitness routines, gameplay footage, or political ragebait?</p>
<p>What does that leave? Entertainment. The creativity and production value of Hollywood scripted entertainment, crossed with the potential for virality of democratized user-generated content. It's as if <a href="https://en.wikipedia.org/wiki/Quibi">Quibi</a> and <a href="https://en.wikipedia.org/wiki/Vine_%28service%29">Vine</a> had an AI baby. What this adds up to is Sora is less a tool for influencers and more well-suited for out-of-work Hollywood script writers.</p>
<p>One reason Sora is unlikely to take off until it supports longer-form video and is more adherent to script-like prompts, is that engaging fiction depends on preserving authorial intent. It can already do some pretty wild shit, but Sora doesn't give creators enough to work with to compete with a TV series. We'll get some funny cutaways and creative images, but there's only so much you can do in ten seconds. But if Sora can get any kind of foothold and stick around, those limitations will be lifted. People forget this, but YouTube only supported videos shorter than 10 minutes for its first five years and 15 minutes for its first ten. Today, user-generated YouTube content is giving legacy media a run for their money on <a href="https://www.fastcompany.com/91288106/youtube-tv-living-room-what-that-means-for-creators-and-viewers">widescreen televisions</a> and you can barely find a video shorter than 20 minutes on the platform anymore.</p>
<p>But Sora doesn't need to become an overnight cultural sensation to be valuable. OpenAI will keep funding it, because the research suggests that <a href="https://simonwillison.net/2025/Sep/27/video-models-are-zero-shot-learners-and-reasoners/#atom-everything">video generation will unlock the future of general-purpose vision models</a>, and those vision models are the key to autonomous robotics in the real world. And that's the ultimate promise of all these trillion dollar valuations.</p>

<h2 id="what-can-people-use-sora-for-now">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/is-sora-the-future-of-fiction/#what-can-people-use-sora-for-now">What can people use Sora for now?</a>
</h2>
<p>Setting aside speculation as to what all this means and where things are going, what OpenAI shipped this week is nothing short of extraordinary exactly as it is. For the first time, a platform can bring visual ideas to life with shockingly little effort. By boxing out &quot;real&quot; content, the platform will reward ingenuity and cleverness over social status and superficial aesthetics.</p>
<p>Here are a few ways Sora shines today:</p>
<ul>
<li>Short-form comedy in the spirit of Vine</li>
<li>Meme/GIF generation</li>
<li>Inside jokes and skits among friends</li>
<li>Design inspiration (like Pinterest or <a href="https://www.behance.net">Behance</a>)</li>
<li>Stock video for B-roll and cutaways for use in other videos</li>
<li>The visual equivalent of lo-fi hip-hop (the feed even has a &quot;mood&quot; filter)</li>
<li>Visual prototyping and virtual screen tests for traditional video production</li>
<li>Fan edits and <a href="https://en.wikipedia.org/wiki/Shipping_%28fandom%29">shipping</a> of known characters (note OpenAI changed its intellectual property policy to an <a href="https://www.digitalmusicnews.com/2025/09/30/sora-2-opt-out-option/">explicit opt-out</a>)</li>
</ul>
<p>Weirder ideas that come to mind:</p>
<ul>
<li>Capturing dreams (this morning I typed what I remembered into Sora before it faded)</li>
<li>Lore and world-building videos and remixes</li>
<li>Synthetic nostalgia and retro-futurism</li>
<li>Visualizing an alternate life (<a href="https://arresteddevelopment.fandom.com/wiki/Mommy,_What_Will_I_Look_Like%3F">with kids</a>, without kids, with pets, being more attractive, speaking another language)</li>
<li>False childhood tapes and future video postcards</li>
<li>Public hallucination challenges (e.g., the Tide Pod, cinnamon, or ice bucket challenges, but expressed through prompts and remixes)</li>
<li>Psychological horror and grotesque/absurd glitch art</li>
<li>Ghost messages from someone who published a cameo but has since passed away in real life</li>
<li>Private messaging:
<ul>
<li>Families sending video greeting cards of imagined gatherings for birthdays or holidays</li>
<li>Asynchronous role-play between friends</li>
<li>Long-distance relationships visualizing co-located experiences</li>
</ul>
</li>
</ul>
<p>Is all this stuff creepy as shit? Yep. Will people actually do any of this? No clue. I'm a sicko, so I will. But the safe money is always on nothing ever changing and people sticking to whatever they're already doing.</p>
<p>What's less debatable is that the world has never seen anything like this, and it's unlikely we'll be able to fully process its impact until humanity has a chance to catch up (by which point, the tools will only be better). Hold your loved ones close, everybody! Shit's getting weird. 🫠</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/is-sora-the-future-of-fiction/","append_url_label":"Read 📄","content":"\u003cp\u003eI made this yesterday by typing a few words and uploading a couple of pictures to \u003ca href=\"https://openai.com/sora/\"\u003eSora\u003c/a\u003e:\u003c/p\u003e\n\u003cdiv class=\"my-1 \"\u003e\n  \u003ciframe class=\"mx-auto max-h-[90vh]\" src=\"https://www.youtube.com/embed/p7P_jH-TjqM\" width=\"348\" height=\"619\" loading=\"lazy\" title=\"\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen\u003e\u003c/iframe\u003e\n\u003c/div\u003e\n\n\u003cp\u003eWhen Sora 2 was announced on Tuesday, I immediately saw it as \u003cem\u003eexactly\u003c/em\u003e what I've wanted from AI ever since I first saw \u003ca href=\"https://en.wikipedia.org/wiki/Stable_Diffusion\"\u003eStable Diffusion\u003c/a\u003e in the Summer of 2022. For years, I've fantasized about breaking free from the extremely limited vocabulary of stock video libraries (as a \u003ca href=\"http://descript.com\"\u003eDescript\u003c/a\u003e subscriber, I've long had access to \u003ca href=\"https://www.storyblocks.com\"\u003eStoryblocks\u003c/a\u003e' library). Stitching together stock content to make explainer \u003ca href=\"https://www.youtube.com/watch?v=EUrIK6YREmU\"\u003evideos like this one\u003c/a\u003e is fun, but the novelty wears off as you quickly burn through all three clips for \u0026quot;child throws spaghetti at family member.\u0026quot; Stock video is great if you only talk about mundane household and business topics, but my twisted brain thinks up some pretty weird shit, and conveying my imagination in video would be a lot more labor-intensive than starting yet another banal YouTube channel covering economics or something.\u003c/p\u003e\n\u003cp\u003eDespite being invite-only, I got access within 24 hours (maybe because I'm a ChatGPT Pro subscriber?), and it confirmed that Sora was exactly what I'd been waiting for:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e10-second short-form video\u003c/li\u003e\n\u003cli\u003e16:9 or 9:16 aspect ratios\u003c/li\u003e\n\u003cli\u003eDownloadable and re-uploadable elsewhere (watermarked)\u003c/li\u003e\n\u003cli\u003eSound, including dialog (provide an exact script or let the model riff)\u003c/li\u003e\n\u003cli\u003eCan portray your likeness and consenting collaborators'\u003c/li\u003e\n\u003cli\u003e\u0026quot;Good enough\u0026quot; results within 3-5 prompt iterations\u003c/li\u003e\n\u003cli\u003eUnderstands simple direction: film styles, camera angles, scene cuts\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe only surprise was that Sora 2 shows up as a social network, not yet another chat interface or infinite search pane. You sign up, you wait, you get four invites, you and your friends have a good time, and you get notified as more friends follow you. We've seen this rollout a dozen times.\u003c/p\u003e\n\u003cp\u003eIn hindsight, Sora \u003cstrong\u003ehad\u003c/strong\u003e to be a social network. As Meta has demonstrated, nobody wants to stare at an \u003ca href=\"https://about.fb.com/news/2025/09/introducing-vibes-ai-videos/\"\u003eAI Slop Feed\u003c/a\u003e if it doesn't feature people they know and recognize. In the abstract, \u0026quot;people you know and recognize\u0026quot; would be off the table without opt-in consent. But durable consent more or less requires a social graph paired with platform-level verification and permission settings. \u0026quot;Deepfakes\u0026quot; have dominated the broader discussion around image generation, not only because they pose a vexing problem to civilization, but also because existing tools lack any built-in chain of trust mechanic—which limited our collective imagination to their use for political disinformation and revenge porn. But when you're on a social network and your videos can only star you and your close friends who've given you permission to use their likeness, OpenAI was actually able to \u003cem\u003estrengthen\u003c/em\u003e the app's other guardrails in the process.\u003c/p\u003e\n\u003cp\u003eThat means that while other image and video generators let you get away with posting images of real people as a starting point to work from, Sora disallows naming any person or uploading any image of a human into a prompt. Instead, you can only \u003ccode\u003e@mention\u003c/code\u003e users on the network, who have created a \u0026quot;cameo\u0026quot; avatar, who have given you permission to use it, and for which your specific prompt isn't disallowed by their preferences. Suddenly, AI deepfakes are (relatively) safe and fun. They star you and your consenting friends. If you piss your friends off, they can delete the videos you put them in. If you keep doing it, they won't be your friends for very long. The platform will surely be under-moderated, but by defaulting to a mutual-follower consent scheme, many of the abuse vectors will be self-policing in practice. (I'm emphatically not saying here that Sora won't result in a raft of psychosis diagnoses and teen suicides, by the way. We are super-duper cooked.)\u003c/p\u003e\n\u003cp\u003eAs for the success of the platform, only time will tell if the novelty of unreality wears off, or if the presence of likenesses we know and recognize paired with imagery that previously required blockbuster movie budgets will be enough to hold our attention. Based on the success of \u003ca href=\"https://openai.com/index/introducing-4o-image-generation/\"\u003e4o image generation\u003c/a\u003e, OpenAI is betting on the latter. I suspect that the platform will only pick up steam following substantial improvements to both the model (improved temporal consistency, complex directorial technique) and the interface (longer videos, sharing tools, storyboarding, series/playlists).\u003c/p\u003e\n\n\u003ch2 id=\"trust-in-truth-giving-way-to-trust-in-falsity\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/is-sora-the-future-of-fiction/#trust-in-truth-giving-way-to-trust-in-falsity\"\u003eTrust in truth giving way to trust in falsity\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eInfluencer-dominated video platforms have been broken for a long time, in part because their economics depend on winning an audience's trust to influence people towards doing or buying things that reward the influencer. That trust is built on the assumption that the influencer's videos are based in reality. After all, it's a real camera, pointed at a real product, from a real person the viewer has followed for months or years. Besides, why would they lie? They lie, it turns out, because making any kind of money on these platforms is an exhausting, tenuous hustle. Maintaining an audience large enough to make a living as an influencer requires constantly feeding the beast with content. The sponsors that pay the most are the ones whose products won't get as much reach \u003cem\u003ewithout\u003c/em\u003e a high-trust endorsement, which results in the most scammy products and services offering the highest rates. This pushes influencers to make not-so-truthful claims, even if it means selling their audience down the river in the process.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSora sidesteps all of this because it's all lies all the time\u003c/strong\u003e. People's trust in institutions and the veracity of what we see on screens is already at an all-time low, and the spread of AI-generated video that's \u003cem\u003ethis good\u003c/em\u003e will only erode that trust further. Sora-the-platform doesn't accept real videos, but videos generated by Sora-the-model will quickly begin infecting \u0026quot;real\u0026quot; spaces like YouTube, TikTok, and Instagram—causing people's trust in what they see on those platforms to fall even further.\u003c/p\u003e\n\u003cp\u003eThis dynamic gives OpenAI an absolutely diabolical epistemic edge, where \u003cstrong\u003ethe Sora app can be authoritatively false while the other platforms can never be authoritatively true\u003c/strong\u003e. Users will be able to let their guard down using Sora, but they'll have to be more vigilant than ever on Instagram. If this strikes you as ridiculous, consider that we're simply talking about works of fiction versus works of nonfiction. Right now, every video you consume online is assumed to be nonfiction \u003cem\u003euntil\u003c/em\u003e you read the comments and learn the video was staged, the creator's body was enhanced with AI post-processing, or the sponsored product causes rectal cancer. So even without Sora, we're currently trapped in this uncanny valley where every video platform is perceived as hosting \u003cem\u003efictional nonfiction\u003c/em\u003e, which results in nothing ever being fully entertaining or fully informative. \u003cstrong\u003eSora, meanwhile, is a platform that can only host fiction by definition.\u003c/strong\u003e And given that about \u003ca href=\"https://variety.com/2022/digital/news/cta-user-generated-content-study-1235146175/\"\u003ehalf of media consumption\u003c/a\u003e is scripted content from legacy media companies, there's still a pretty good market for fiction out there!\u003c/p\u003e\n\u003cp\u003eSo if you're just looking to kill a few minutes on your phone while you wait in line at the bank, you're probably going to take the path of least resistance—it's why you open Instagram or TikTok in the first place. But those apps offer a slurry that's part-entertainment, part-information, and part-commerce—a feed that has some funny videos, sure, but also sells you bullshit supplements, radicalizes your father, and exacerbates your daughter's body image issues. Sora might offer a path of \u003cem\u003eeven less\u003c/em\u003e resistance: mindless entertainment that allows you to safely turn your brain off. Because all the content is fake, you don't have to be on guard against being fooled.\u003c/p\u003e\n\u003cp\u003eThe upshot here is that \u003cstrong\u003ewhen there's no platform you can trust to be real, the next best thing is a platform where you can trust everything is fake.\u003c/strong\u003e\u003c/p\u003e\n\n\u003ch2 id=\"what-kind-of-content-will-succeed\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/is-sora-the-future-of-fiction/#what-kind-of-content-will-succeed\"\u003eWhat kind of content will succeed\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eLet's get this out of the way: lots of content won't work on Sora—especially most influencer niches.\u003c/p\u003e\n\u003cp\u003eIf you're famous on Instagram for flaunting your lavish lifestyle and using it to sell garbage-tier sponsored products, what would you even do with Sora? Show off a fake house? Hawk a fake product? You can't upload \u0026quot;real\u0026quot; video to Sora, so what are your sponsors going to do when your gas station energy drink collab is made to look more like a Red Bull once it passes through the AI model? Even if you could place the products perfectly, entire categories of content that influencers have made profitable won't find much to do on Sora. Who wants fake lifestyle videos, cooking recipes, beauty/fashion tips, fitness routines, gameplay footage, or political ragebait?\u003c/p\u003e\n\u003cp\u003eWhat does that leave? Entertainment. The creativity and production value of Hollywood scripted entertainment, crossed with the potential for virality of democratized user-generated content. It's as if \u003ca href=\"https://en.wikipedia.org/wiki/Quibi\"\u003eQuibi\u003c/a\u003e and \u003ca href=\"https://en.wikipedia.org/wiki/Vine_%28service%29\"\u003eVine\u003c/a\u003e had an AI baby. What this adds up to is Sora is less a tool for influencers and more well-suited for out-of-work Hollywood script writers.\u003c/p\u003e\n\u003cp\u003eOne reason Sora is unlikely to take off until it supports longer-form video and is more adherent to script-like prompts, is that engaging fiction depends on preserving authorial intent. It can already do some pretty wild shit, but Sora doesn't give creators enough to work with to compete with a TV series. We'll get some funny cutaways and creative images, but there's only so much you can do in ten seconds. But if Sora can get any kind of foothold and stick around, those limitations will be lifted. People forget this, but YouTube only supported videos shorter than 10 minutes for its first five years and 15 minutes for its first ten. Today, user-generated YouTube content is giving legacy media a run for their money on \u003ca href=\"https://www.fastcompany.com/91288106/youtube-tv-living-room-what-that-means-for-creators-and-viewers\"\u003ewidescreen televisions\u003c/a\u003e and you can barely find a video shorter than 20 minutes on the platform anymore.\u003c/p\u003e\n\u003cp\u003eBut Sora doesn't need to become an overnight cultural sensation to be valuable. OpenAI will keep funding it, because the research suggests that \u003ca href=\"https://simonwillison.net/2025/Sep/27/video-models-are-zero-shot-learners-and-reasoners/#atom-everything\"\u003evideo generation will unlock the future of general-purpose vision models\u003c/a\u003e, and those vision models are the key to autonomous robotics in the real world. And that's the ultimate promise of all these trillion dollar valuations.\u003c/p\u003e\n\n\u003ch2 id=\"what-can-people-use-sora-for-now\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/is-sora-the-future-of-fiction/#what-can-people-use-sora-for-now\"\u003eWhat can people use Sora for now?\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eSetting aside speculation as to what all this means and where things are going, what OpenAI shipped this week is nothing short of extraordinary exactly as it is. For the first time, a platform can bring visual ideas to life with shockingly little effort. By boxing out \u0026quot;real\u0026quot; content, the platform will reward ingenuity and cleverness over social status and superficial aesthetics.\u003c/p\u003e\n\u003cp\u003eHere are a few ways Sora shines today:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eShort-form comedy in the spirit of Vine\u003c/li\u003e\n\u003cli\u003eMeme/GIF generation\u003c/li\u003e\n\u003cli\u003eInside jokes and skits among friends\u003c/li\u003e\n\u003cli\u003eDesign inspiration (like Pinterest or \u003ca href=\"https://www.behance.net\"\u003eBehance\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eStock video for B-roll and cutaways for use in other videos\u003c/li\u003e\n\u003cli\u003eThe visual equivalent of lo-fi hip-hop (the feed even has a \u0026quot;mood\u0026quot; filter)\u003c/li\u003e\n\u003cli\u003eVisual prototyping and virtual screen tests for traditional video production\u003c/li\u003e\n\u003cli\u003eFan edits and \u003ca href=\"https://en.wikipedia.org/wiki/Shipping_%28fandom%29\"\u003eshipping\u003c/a\u003e of known characters (note OpenAI changed its intellectual property policy to an \u003ca href=\"https://www.digitalmusicnews.com/2025/09/30/sora-2-opt-out-option/\"\u003eexplicit opt-out\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWeirder ideas that come to mind:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCapturing dreams (this morning I typed what I remembered into Sora before it faded)\u003c/li\u003e\n\u003cli\u003eLore and world-building videos and remixes\u003c/li\u003e\n\u003cli\u003eSynthetic nostalgia and retro-futurism\u003c/li\u003e\n\u003cli\u003eVisualizing an alternate life (\u003ca href=\"https://arresteddevelopment.fandom.com/wiki/Mommy,_What_Will_I_Look_Like%3F\"\u003ewith kids\u003c/a\u003e, without kids, with pets, being more attractive, speaking another language)\u003c/li\u003e\n\u003cli\u003eFalse childhood tapes and future video postcards\u003c/li\u003e\n\u003cli\u003ePublic hallucination challenges (e.g., the Tide Pod, cinnamon, or ice bucket challenges, but expressed through prompts and remixes)\u003c/li\u003e\n\u003cli\u003ePsychological horror and grotesque/absurd glitch art\u003c/li\u003e\n\u003cli\u003eGhost messages from someone who published a cameo but has since passed away in real life\u003c/li\u003e\n\u003cli\u003ePrivate messaging:\n\u003cul\u003e\n\u003cli\u003eFamilies sending video greeting cards of imagined gatherings for birthdays or holidays\u003c/li\u003e\n\u003cli\u003eAsynchronous role-play between friends\u003c/li\u003e\n\u003cli\u003eLong-distance relationships visualizing co-located experiences\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIs all this stuff creepy as shit? Yep. Will people actually do any of this? No clue. I'm a sicko, so I will. But the safe money is always on nothing ever changing and people sticking to whatever they're already doing.\u003c/p\u003e\n\u003cp\u003eWhat's less debatable is that the world has never seen anything like this, and it's unlikely we'll be able to fully process its impact until humanity has a chance to catch up (by which point, the tools will only be better). Hold your loved ones close, everybody! Shit's getting weird. 🫠\u003c/p\u003e","id":"https://justin.searls.co/posts/is-sora-the-future-of-fiction/","og_image":"https://justin.searls.co/img/social/posts/is-sora-the-future-of-fiction.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-10-02T12:50:18Z","title":"Is Sora the future of fiction?","updated_at":"2025-10-02T11:16:46-04:00","url":"https://justin.searls.co/posts/is-sora-the-future-of-fiction/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/clips/my-top-10-sora-clips-on-day-one/</id>
      <title type="text">✂️ My Top 10 Sora Clips on Day One</title>
      <link href="https://justin.searls.co/clips/my-top-10-sora-clips-on-day-one/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-10-01T21:35:04+00:00</published>
    <updated>2025-10-01T17:38:15-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="flex justify-center">
  <div class="sm:beneath-the-page sm:p-2">
    <video poster="https://podcast-cdn.searls.co/clips/sora-2-day-1.jpg" class="inline-block shadow-lg rounded-lg max-h-[80lvh] sm:max-h-[60lvh] m-0" preload="auto" playsinline="playsinline" controls="controls" controlslist="nodownload">
      <source src="https://podcast-cdn.searls.co/clips/sora-2-day-1.mp4">
      Your browser does not support the video tag.
    </video>
  </div>
</div><p>We have fun here.</p>
]]></content>
    <summary type="html"><![CDATA[<p>We have fun here.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/clips/my-top-10-sora-clips-on-day-one/","append_url_label":"Peek ✂️","content":"\u003cp\u003eWe have fun here.\u003c/p\u003e","format_string":"New clip! {{title}}","id":"https://justin.searls.co/clips/my-top-10-sora-clips-on-day-one/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/clips/sora-2-day-1.mp4"}],"og_image":"https://podcast-cdn.searls.co/clips/sora-2-day-1.jpg","platform_overrides":{},"published_at":"2025-10-01T21:35:04Z","title":"My Top 10 Sora Clips on Day One","updated_at":"2025-10-01T17:38:15-04:00","url":"https://justin.searls.co/clips/my-top-10-sora-clips-on-day-one/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/clips/will-code-for-s/</id>
      <title type="text">✂️ Will code for 🙌&#39;s</title>
      <link href="https://justin.searls.co/clips/will-code-for-s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-30T21:42:15+00:00</published>
    <updated>2025-09-30T19:50:06-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="flex justify-center">
  <div class="sm:beneath-the-page sm:p-2">
    <video poster="https://podcast-cdn.searls.co/clips/v44.0.1-will-code-for-high-fives.jpg" class="inline-block shadow-lg rounded-lg max-h-[80lvh] sm:max-h-[60lvh] m-0" preload="auto" playsinline="playsinline" controls="controls" controlslist="nodownload">
      <source src="https://podcast-cdn.searls.co/clips/v44.0.1-will-code-for-high-fives.mp4">
      Your browser does not support the video tag.
    </video>
  </div>
</div><p>It's true, you catch more bugs with honey than vinegar.</p>
<p>Clipped from my <a href="/casts/hotfix-v44.0.1-ignore-all-previous-instructions/">conversation with José Valim</a> about how little we know about the future of coding agents (and, as in the case of this video, also their present).</p>
]]></content>
    <summary type="html"><![CDATA[<p>It's true, you catch more bugs with honey than vinegar.</p>
<p>Clipped from my <a href="/casts/hotfix-v44.0.1-ignore-all-previous-instructions/">conversation with José Valim</a> about how little we know about the future of coding agents (and, as in the case of this video, also their present).</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/clips/will-code-for-s/","append_url_label":"Peek ✂️","content":"\u003cp\u003eIt's true, you catch more bugs with honey than vinegar.\u003c/p\u003e\n\u003cp\u003eClipped from my \u003ca href=\"/casts/hotfix-v44.0.1-ignore-all-previous-instructions/\"\u003econversation with José Valim\u003c/a\u003e about how little we know about the future of coding agents (and, as in the case of this video, also their present).\u003c/p\u003e","format_string":"New clip! {{title}}","id":"https://justin.searls.co/clips/will-code-for-s/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/clips/v44.0.1-will-code-for-high-fives.mp4"}],"og_image":"https://podcast-cdn.searls.co/clips/v44.0.1-will-code-for-high-fives.jpg","platform_overrides":{},"published_at":"2025-09-30T21:42:15Z","title":"Will code for 🙌's","updated_at":"2025-09-30T19:50:06-04:00","url":"https://justin.searls.co/clips/will-code-for-s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/hotfix-v44.0.1-ignore-all-previous-instructions/</id>
      <title type="text">🎙️ Breaking Change podcast v44.0.1 - José Valim: It&#39;s a time for builders</title>
      <link href="https://justin.searls.co/casts/hotfix-v44.0.1-ignore-all-previous-instructions/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-29T21:29:48+00:00</published>
    <updated>2025-09-30T19:17:15-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v44.0.1.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v44.0.1.mp3">Direct link to podcast audio file</a>
</p><p>If you know who José Valim is, then you know he probably made a mistake by joining me for our third installment of 🔥<a href="/posts/whats-the-hot-fix/">Hotfix</a>🔥. The inventor of the <a href="https://elixir-lang.org">Elixir programming language</a> is at it again with his colleagues at <a href="https://dashbit.co">Dashbit</a> and they've got a new product called <a href="https://tidewave.ai">Tidewave</a>. It's a coding agent with a twist: it has such a deep level of integration with your web framework that it can get the executable feedback it needs to tackle the entire feature development lifecycle.</p>
<p>I do eventually let him plug the tool (and our conversation genuinely makes me want to try it—I logged a todo and everything!), but to be on Hotfix you gotta bring a thorny problem to the table, and he picked a great one: <strong>marketing hype aside, nobody has a clue what the future of AI agents looks like</strong>.</p>
<p>Like always, we totally 100% and A+ solved the problem by correctly predicting the future. You gotta listen to find out.</p>
<p>Every time I talk to José, I get ideas for what I should be doing instead of what I'm actually doing. If you feel so inspired, write into <a href="mailto:podcast@searls.co">podcast@searls.co</a> and I'll read it on the next mainline version release of Breaking Change.</p>
<p>You can follow José on <a href="https://bsky.app/profile/josevalim.bsky.social">Bsky</a>, <a href="https://x.com/josevalim">X</a>, and <a href="https://genserver.social/josevalim">Mastodon</a>. Pick your poison. ☠️</p>
]]></content>
    <summary type="html"><![CDATA[<p>If you know who José Valim is, then you know he probably made a mistake by joining me for our third installment of 🔥<a href="/posts/whats-the-hot-fix/">Hotfix</a>🔥. The inventor of the <a href="https://elixir-lang.org">Elixir programming language</a> is at it again with his colleagues at <a href="https://dashbit.co">Dashbit</a> and they've got a new product called <a href="https://tidewave.ai">Tidewave</a>. It's a coding agent with a twist: it has such a deep level of integration with your web framework that it can get the executable feedback it needs to tackle the entire feature development lifecycle.</p>
<p>I do eventually let him plug the tool (and our conversation genuinely makes me want to try it—I logged a todo and everything!), but to be on Hotfix you gotta bring a thorny problem to the table, and he picked a great one: <strong>marketing hype aside, nobody has a clue what the future of AI agents looks like</strong>.</p>
<p>Like always, we totally 100% and A+ solved the problem by correctly predicting the future. You gotta listen to find out.</p>
<p>Every time I talk to José, I get ideas for what I should be doing instead of what I'm actually doing. If you feel so inspired, write into <a href="mailto:podcast@searls.co">podcast@searls.co</a> and I'll read it on the next mainline version release of Breaking Change.</p>
<p>You can follow José on <a href="https://bsky.app/profile/josevalim.bsky.social">Bsky</a>, <a href="https://x.com/josevalim">X</a>, and <a href="https://genserver.social/josevalim">Mastodon</a>. Pick your poison. ☠️</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/hotfix-v44.0.1-ignore-all-previous-instructions/","append_url_label":"Hear 🎙","content":"\u003cp\u003eIf you know who José Valim is, then you know he probably made a mistake by joining me for our third installment of 🔥\u003ca href=\"/posts/whats-the-hot-fix/\"\u003eHotfix\u003c/a\u003e🔥. The inventor of the \u003ca href=\"https://elixir-lang.org\"\u003eElixir programming language\u003c/a\u003e is at it again with his colleagues at \u003ca href=\"https://dashbit.co\"\u003eDashbit\u003c/a\u003e and they've got a new product called \u003ca href=\"https://tidewave.ai\"\u003eTidewave\u003c/a\u003e. It's a coding agent with a twist: it has such a deep level of integration with your web framework that it can get the executable feedback it needs to tackle the entire feature development lifecycle.\u003c/p\u003e\n\u003cp\u003eI do eventually let him plug the tool (and our conversation genuinely makes me want to try it—I logged a todo and everything!), but to be on Hotfix you gotta bring a thorny problem to the table, and he picked a great one: \u003cstrong\u003emarketing hype aside, nobody has a clue what the future of AI agents looks like\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eLike always, we totally 100% and A+ solved the problem by correctly predicting the future. You gotta listen to find out.\u003c/p\u003e\n\u003cp\u003eEvery time I talk to José, I get ideas for what I should be doing instead of what I'm actually doing. If you feel so inspired, write into \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e and I'll read it on the next mainline version release of Breaking Change.\u003c/p\u003e\n\u003cp\u003eYou can follow José on \u003ca href=\"https://bsky.app/profile/josevalim.bsky.social\"\u003eBsky\u003c/a\u003e, \u003ca href=\"https://x.com/josevalim\"\u003eX\u003c/a\u003e, and \u003ca href=\"https://genserver.social/josevalim\"\u003eMastodon\u003c/a\u003e. Pick your poison. ☠️\u003c/p\u003e","format_string":"New episode of Breaking Change is live! José Valim: It's a time for builders","id":"https://justin.searls.co/casts/hotfix-v44.0.1-ignore-all-previous-instructions/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v44.0.1-its-a-time-for-builders.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-29T21:29:48Z","title":"José Valim: It's a time for builders","updated_at":"2025-09-30T19:17:15-04:00","url":"https://justin.searls.co/casts/hotfix-v44.0.1-ignore-all-previous-instructions/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/</id>
      <title type="text">📄 Why I&#39;m not rushing to take sides in the RubyGems fiasco</title>
      <link href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-28T13:20:19+00:00</published>
    <updated>2025-10-10T07:47:44-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>We are in the midst of a <a href="https://www.theregister.com/2025/09/25/open_source_to_closed_doors/">Ruby drama for the ages</a>. I'm sure a bunch of people figured we were all too old for this shit, but apparently we are not.</p>
<p>This debate has been eating at me ever since the news first broke, but I've tried to keep the peace by staying out of it. Unlike most discourse about what's going on, my discomfort stems less from the issue at hand—what Ruby Central did, how they did it, and how <a href="https://rubycentral.org/news/strengthening-the-stewardship-of-rubygems-and-bundler/">poorly it was communicated</a>—and more to do with how one-sided the public discussion has been. Beneath the surface of this story are the consequences of a decade-old conflict that was never fully resolved. Then and now, one side—<a href="https://arko.net">André Arko</a> and many people associated with him—has availed itself of public channels to voice their perspective, while the other—which includes a surprisingly wide swath of well-known Ruby and Rails contributors—has chosen to stay silent.</p>
<p>The losers in this dynamic are the vast majority normal everyday Ruby developers, most of whom are operating on very little information and who understandably feel confused and concerned. People whose livelihood depends on the health of the Ruby ecosystem deserve more information than they're getting, especially now that its operational stability has come under threat. The future of that ecosystem is once again uncertain, but—just like last time—the outcome is being shaped by a history that's been kept from the public, widening the rift between its key decision-makers and the communities they serve.</p>
<p>I don't have the answers to what's going on in 2025. A few details have been shared with me—details that would contradict fact-checks and timelines others have pieced together and published—but I can't pretend to have a clear picture of what actually happened, why no one is setting the record straight, or when we'll have clarity on what the future holds. All I can do is offer a little bit of context to explain why I'm dubious of the dominant narrative that has taken shape online. Namely, <strong>I don't believe this is a cut-and-dry case of altruistic open-source maintainers being persecuted by oppressive corporate interests.</strong></p>
<p>After you read this, perhaps your perspective will shift as well.</p>

<h2 id="the-relevant-proper-nouns-to-know">The relevant proper nouns to know</h2>
<p>Before anything else can make sense, it's important to understand how weird the governance of the Ruby ecosystem is. There are three moving parts involved that are ostensibly managed by three different groups, but whose members have such broadly overlapping systems access that it has now led to disputes over who owns what:</p>
<ul>
<li><strong>Ruby itself</strong>, created by Matz and maintained by a large group of (mostly Japanese) committers, who host <a href="https://www.ruby-lang.org/">ruby-lang.org</a>, control the <a href="https://github.com/ruby">@ruby GitHub organization</a>, and are supported by the <a href="https://www.ruby.or.jp/en/">Ruby Association</a></li>
<li><strong>RubyGems</strong>, specifically the <code>gem</code> and <code>bundler</code> CLI tools distributed with the Ruby language, which is hosted <a href="https://github.com/rubygems">under @rubygems on GitHub</a></li>
<li><strong>RubyGems.org</strong>, the <a href="https://rubygems.org">website, API, and host</a> from which gem dependencies are installed and which has been run by <a href="https://rubycentral.org">Ruby Central</a> for ages</li>
</ul>
<p>If Ruby were invented today, a single party would probably control all three of these things, but it took nearly fifteen years for today's status quo to take shape. Ruby was invented by someone in Japan in the 1990s. RubyGems was created at <a href="https://www.linuxjournal.com/article/8967">a conference in Texas</a> by a few Americans in the early 2000s. RubyGems.org only became the de facto canonical host for gems <a href="https://web.archive.org/web/20120220191344/http://update.gemcutter.org/2009/10/26/transition.html">six years later</a>. My impression is that at no point was communication and coordination particularly fluent between the various parties.</p>
<p>Adding to this, <a href="https://bundler.io">Bundler</a>—a meta tool for resolving the correct versions of all of a project's gem dependencies and which quickly became vital to nearly all Ruby application development—was created independently of the above players by Yehuda Katz and Carl Lerche. André Arko later became the lead maintainer of Bundler, and in 2015 he founded a 501(c)(6) nonprofit called Ruby Together. In 2019, <a href="https://github.com/rubygems/rubygems/releases/tag/v3.1.0">Bundler was folded into RubyGems</a>. In 2022, <a href="https://rubycentral.org/news/a-new-chapter-for-rubygems-how-ruby-central-is-building-a-sustainable-future/">Ruby Together was absorbed by Ruby Central</a>.</p>
<p>Those last two events—the merging of Bundler and the unwinding of Ruby Together—came about after years of bitter conflict and simmering discord that I hope to shed some light on below. My direct involvement with any of these events was extremely minimal, but I had contemporaneous discussions with dozens of the principals involved. I never donated to Ruby Together and have never materially contributed to Bundler or RubyGems. That said, simply being made aware of several incidents as they were playing out in private was enough to leave behind a scar that has never fully healed. I can only imagine how others are feeling right now. Based on how badly things are playing out this time, it seems they were deeply impacted, too.</p>

<h2 id="the-things-people-told-me">The things people told me</h2>
<p>The earliest recollection I have of someone telling me about André Arko was in the summer of 2015, after getting dinner with a friend who happened to be a Ruby Together board member. The friend explained that André believed programmers working on open source tools deserve to earn an income that's commensurate with what salaried engineers earn at the companies who benefit from those tools. As such, André's goal with Ruby Together was characterized as an effort to fund development activities—initially his own, but eventually others—by paying themselves a market hourly rate. I remember being extremely sympathetic to this perspective, having also wasted countless hours of my life maintaining open source for free only for others to benefit from it. I also recall a figure like either $200 or $250 per hour being mentioned as the rate he was effectively paying himself. Whatever the rate actually was, I distinctly remember thinking, &quot;holy shit, that's a lot higher than individual donors would probably assume.&quot; <em>(<strong>UPDATE:</strong> A RubyTogether donor forwarded me newsletters from 2015 and 2022, both stating an hourly rate of $150 per hour being paid.)</em></p>
<p>The first time I remember meeting André in person was at <a href="https://www.rubyevents.org/events/ruby-on-ales-2016">Ruby on Ales 2016</a>. I remember trying to make a good impression, because growing my network in the community was the primary reason I spoke at conferences. I was presenting with <a href="/posts/the-12-macbook-was-announced-10-years-ago/">my beloved 12-inch MacBook</a>, which meant I was traveling with the first iteration of <a href="https://www.apple.com/shop/product/MW5M3AM/A/usb-c-digital-av-multiport-adapter">this cursed dongle</a>. André needed an adapter, so I ran up to lend him mine. As he was giving it back, I recall him making a half-joking, flippant remark about either his dongle or his computer, saying that &quot;Ruby Together will just buy me another one.&quot; It really rubbed me the wrong way. Over the years to follow, more than one person told me stories of André paying for shared meals on behalf of Ruby Together without an apparent legitimate justification. They told those stories, I assume, because the attitude he exhibited made them uncomfortable. If I had donated money to Ruby Together and heard the same stories, I would have been upset.</p>
<p>For how little has been said about this publicly, a lot of different people told me a lot of concerning stories about Ruby Together over the years, often providing evidence to back it up. I'll do my best to stick to the highlights in this post. Hopefully they will explain why I have not joined the rush to defend the maintainers whose access was recently removed. What Ruby Central did was undoubtedly handled very poorly, but I don't think their bungling of its execution and communication alone is enough to answer the question of what <em>should</em> happen to the future custody and direction of Bundler, RubyGems, and RubyGems.org.</p>

<h3 id="2015">2015</h3>
<p>When Ruby Together first launched in 2015, the <a href="https://web.archive.org/web/20150425040538/http://RubyTogether.org/">website suggested donations went to pay &quot;our team&quot;</a>, which initially <a href="https://github.com/rubytogether/rubytogether.org/blob/9a03c4c/app/views/home/team.html.erb">linked to a list of the board members</a> without any explanation of how the money was being allocated. This resulted in a nonzero number of donors believing they were funding the work of people like Steve Klabnik, Aaron Patterson, and Sarah Mei, when in fact only André was being paid at the time. Shortly after the <a href="https://news.ycombinator.com/item?id=9222549">wording was raised as misleading</a>, the team page <a href="https://github.com/rubytogether/rubytogether.org/blob/0136e9f/app/views/home/team.html.erb">was updated</a> accordingly.</p>
<p>In May of 2015, André suggested making support for older versions of Bundler <a href="https://github.com/heroku/heroku-buildpack-ruby/pull/385/commits/6b3f3c71f4a98309e29748132be8e84b41d890de">contingent on Heroku paying Ruby Together</a>, which was interpreted as leveraging his control over Bundler as a pay-to-play scheme. Because <a href="https://www.heroku.com">Heroku</a> serves other people's Ruby apps—many of which aren't updated for very long stretches—the security of their service depends on clear and predictable support windows for Ruby's core technologies, it seems reasonable they would interpret this sudden revocation of support as a pressure tactic, aimed to solicit corporate sponsorship for Ruby Together. (Years later, André <a href="https://github.com/rubygems/rubygems/issues/1811#issuecomment-270788204">responded to a feature request from a Heroku engineer</a>, which was interpreted at the time as indicating the feature would be withheld from Bundler because Heroku had failed to pay Ruby Together.)</p>

<h3 id="2016">2016</h3>
<p>The minutes of a December 2016 Ruby Together board meeting <a href="https://www.scribd.com/document/358730907/2016-12-01-Ruby-Together-2016-Board-Meeting-Agenda-and-Minutes">were leaked</a>. The document acknowledged who was paying for the RubyGems.org service at the time: &quot;Fastly is comping us something like $35k worth of CDN service per month. And that's on top of Ruby Central paying for $5k of servers and Ruby Together paying for about $15k of dev work every month.&quot; The use of &quot;us&quot; in that sentence suggests that Ruby Together was responsible for hosting RubyGems.org, which Ruby Central later went on <a href="https://blog.rubygems.org/2017/03/15/rubygems-funding.html">to publicly dispute</a>. Additionally, one presumes the number of hours and rate paid for development work was determined by Ruby Together itself, rather than being a hard operational cost. Later in the document was a discussion of potential strategies to increase revenue after &quot;new memberships [had] flatlined.&quot; Several ideas were discussed, culminating in a proposal to rate-limit access to RubyGems.org as the apparent best option:</p>
<blockquote>
<p>Rate limiting RubyGems.org seems like the option that scales most linearly with our costs. Companies that cost us money need to pay more (or stop costing us money), and companies that don't cost us money can continue to have a free ride. To be clear, this would not mean cutting off anyone's access to RubyGems.org. I'm imagining that it would work something like GitHub's model: anonymous access has a low limit, registered accounts have a higher limit, and even higher limits are available at each Ruby Together membership level. There are a lot of implementation details that would need to be worked out, but in general I feel like this is probably the most effective option to make companies feel like they are paying money for something they use and that covers our costs well.</p>
</blockquote>
<p>The leaked minutes were widely circulated in private at the time, due largely to outrage over the document's presupposition that Ruby Together was paying to host RubyGems.org (citing &quot;our costs&quot; as scaling with usage), as opposed to paying for developer effort (the costs of which do not scale with usage). The leak left myself and others worried that André might leverage his systems access to effectively hold the Ruby ecosystem hostage for the financial benefit of Ruby Together and—since it was compensating his own development efforts—André himself.</p>

<h3 id="2017">2017</h3>
<p>In January 2017, André <a href="https://github.com/rubygems/bundler/pull/5308/commits/072f9ab80bb1e2d4992962e59b42d479ac37a4c0">added a &quot;post-install message&quot; imploring users to fund Ruby Together</a>, which would be displayed every time anyone installed Bundler. Unlike the aforementioned board meeting, this happened in the open and triggered an immediate backlash before eventually being rolled back. In one comment, André defended the action and <a href="https://github.com/rubygems/bundler/issues/5311#issuecomment-271477520">pointed to Shopify's failure to pay Ruby Together</a>, publicly conflating Ruby Together's sponsorship of development effort with &quot;~$40k/mo worth of servers.&quot; But, as Ruby Together's own board minutes from the month prior directly stated, money sent to Ruby Together wasn't going to pay server expenses—server costs were covered by <a href="https://www.fastly.com">Fastly</a> and Ruby Central.</p>
<p>In February 2017, following protracted discussion of the post-install message and the threat of rate-limiting access to gem installs, I agreed to put my name on a letter alongside 18 others (including one of Bundler's creators). The letter requested Ruby Together stop misleading the community in this way. My understanding is that some private one-on-one communication followed, that none of it was particularly productive, and that no formal communication occurred between the two groups afterward.</p>
<p>In March 2017, Ruby Central went on the record, attempting to clear up confusion and reassure users that <a href="https://blog.rubygems.org/2017/03/15/rubygems-funding.html">they alone were in control of RubyGems.org</a>, stating that Ruby Together donations were immaterial to its continued operation:</p>
<blockquote>
<p>Unfortunately, this past year has also given rise to some misunderstandings about this relationship in some quarters: chiefly, that by donating to Ruby Together, companies were paying for the operations of RubyGems. And in turn, that if enough companies didn't donate to Ruby Together, RubyGems would subsequently be in a perilous situation. This isn't so.</p>
<p>No one in the Ruby community should worry about the availability or security of RubyGems being connected in any way to the fundraising of Ruby Together. Funds raised by Ruby Together go primarily towards paying developers to add features and fix bugs. Ruby Central, on the other hand, is wholly responsible for the operations and baseline stability of the system. While these two efforts go hand-in-hand, it's vitally important to understand that they are two different things. Ruby Together's requests for donations do not mean that there is any reason for concern about RubyGems' continued existence or operation.</p>
</blockquote>
<p>Later, in August 2017, André <a href="https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36">accused Google Cloud Platform</a> of wholesale copying <a href="https://github.com/rubygems/gemstash">gemstash</a>'s codebase, going so far as to threaten legal action in his opening message. He juxtaposed the accusation with the complaint that Google had, &quot;repeatedly declined to support Ruby Together.&quot; The incident appeared to fit a pattern of behavior to pair high-conflict messaging with an admonition of the target's failure to fund the organization that paid him. Ultimately, André's claim turned out to be factually baseless—Google <a href="https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36#issuecomment-324503159">hadn't copied gemstash's code, after all</a>.</p>

<h3 id="20182024">2018–2024</h3>
<p>Things quieted down and I didn't hear much about any of this stuff anymore. Eventually, Bundler became part of RubyGems and many folks from Ruby Together migrated to analogous roles at Ruby Central.</p>

<h3 id="2025">2025</h3>
<p>In August 2025, and seemingly out of nowhere, someone pointed me to the project <a href="https://github.com/spinel-coop/rv-ruby">spinel-coop/rv-ruby</a>, an apparent fork of <a href="https://github.com/homebrew/homebrew-portable-ruby">homebrew/homebrew-portable-ruby</a>. I say &quot;apparent&quot;, because rather than using <a href="https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo">GitHub's fork button</a>—which would have maintained clear attribution of who created the upstream project—it looks like it was instead cloned and re-pushed by André. Specifically, I was sent <a href="https://github.com/spinel-coop/rv-ruby/commit/2234bdb7db4e41bfe883a01f06d7d0aff3188997">this commit replacing references to Homebrew</a> from late July. As evidence of Homebrew's authorship was being erased and obscured, no additional acknowledgement was added to credit Homebrew for having created and maintained Portable Ruby since 2016.</p>
<p>It immediately reminded me of André's <a href="https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36">baseless accusation against Google</a>. &quot;Not only did you not credit the Gemstash project in any way,&quot; André wrote, &quot;from an ethical standpoint, this is also super gross.&quot; His blatant copying of Portable Ruby (a project significant enough that the lead maintainer <a href="https://rubykaigi.org/2019/presentations/MikeMcQuaid.html">gave a talk about how they did it</a>) struck me as brazenly hypocritical, given André's previous litigious and mistaken accusation against Google.</p>
<p>In fairness to André, the rv-ruby repo continues to retain a <a href="https://github.com/spinel-coop/rv-ruby/blob/main/LICENSE.txt">copy of</a> Homebrew's <a href="https://github.com/homebrew/homebrew-portable-ruby/blob/HEAD/LICENSE.txt">LICENSE.txt</a> which names &quot;Homebrew contributors&quot; as the copyright holder. André also later <a href="https://github.com/spinel-coop/rv-ruby/commit/76e96c9d9f74ea89eed9d34ff11491bb6c365d54">added an explicit acknowledgement to the README</a>, but that attribution came more than a month later, and (I'm told) only after he was directly asked to credit the original project.</p>
<p><a href="https://andre.arko.net/2025/09/25/bundler-belongs-to-the-ruby-community/">André wrote this week</a> that, &quot;Ruby Together did not ever, at any point, demand any form of governance or control over the existing open source projects. Maintainers did their thing in the RubyGems and Bundler GitHub orgs, while Ruby Together staff and board members did their thing in the rubytogether GitHub org.&quot; However, while he was leading Ruby Together, he moved to <a href="https://github.com/rubygems/rubygems/pull/1518">restrict committer access to RubyGems in rubygems/rubygems</a>, unilaterally <a href="https://github.com/bundler/bundler/commit/524add155d6b90c679db21b03f0bd9f877f21ab0">erased the original authorship from Bundler's gemspec in bundler/bundler</a>, and oversaw a number of <a href="https://github.com/bundler/bundler-site/commit/03d331ac8a0a05a5b4225319fb3783a8d1eb1c9b#diff-efb5113d13615a3e1c5706cd6f316ee73f5db628f8c5c06b450a51e537cf9ec6">contributors being removed from bundler/bundler-site</a> in a redesign of Bundler's website.</p>
<p>As a result of this broader historical context and in spite of the serious claims and grave implications being thrown around this month, I'm trying my best <strong>not to rush to judgment about who's at fault in the current conflict and would urge others to do the same</strong>. The future of the Ruby ecosystem may depend on it.</p>
<div class="mt-6 text-xs italic opacity-80">
<p><strong>Updated on September 28th</strong> to clarify Ruby Together's published rates paid to André and other developers as $150 per hour.</p>
<p><strong>Updated on September 29th</strong> to include a link to a contemporaneously-uploaded copy of the leaked December 2016 Ruby Together board minutes.</p>


</div>]]></content>
    <summary type="html"><![CDATA[<p>We are in the midst of a <a href="https://www.theregister.com/2025/09/25/open_source_to_closed_doors/">Ruby drama for the ages</a>. I'm sure a bunch of people figured we were all too old for this shit, but apparently we are not.</p>
<p>This debate has been eating at me ever since the news first broke, but I've tried to keep the peace by staying out of it. Unlike most discourse about what's going on, my discomfort stems less from the issue at hand—what Ruby Central did, how they did it, and how <a href="https://rubycentral.org/news/strengthening-the-stewardship-of-rubygems-and-bundler/">poorly it was communicated</a>—and more to do with how one-sided the public discussion has been. Beneath the surface of this story are the consequences of a decade-old conflict that was never fully resolved. Then and now, one side—<a href="https://arko.net">André Arko</a> and many people associated with him—has availed itself of public channels to voice their perspective, while the other—which includes a surprisingly wide swath of well-known Ruby and Rails contributors—has chosen to stay silent.</p>
<p>The losers in this dynamic are the vast majority normal everyday Ruby developers, most of whom are operating on very little information and who understandably feel confused and concerned. People whose livelihood depends on the health of the Ruby ecosystem deserve more information than they're getting, especially now that its operational stability has come under threat. The future of that ecosystem is once again uncertain, but—just like last time—the outcome is being shaped by a history that's been kept from the public, widening the rift between its key decision-makers and the communities they serve.</p>
<p>I don't have the answers to what's going on in 2025. A few details have been shared with me—details that would contradict fact-checks and timelines others have pieced together and published—but I can't pretend to have a clear picture of what actually happened, why no one is setting the record straight, or when we'll have clarity on what the future holds. All I can do is offer a little bit of context to explain why I'm dubious of the dominant narrative that has taken shape online. Namely, <strong>I don't believe this is a cut-and-dry case of altruistic open-source maintainers being persecuted by oppressive corporate interests.</strong></p>
<p>After you read this, perhaps your perspective will shift as well.</p>

<h2 id="the-relevant-proper-nouns-to-know">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#the-relevant-proper-nouns-to-know">The relevant proper nouns to know</a>
</h2>
<p>Before anything else can make sense, it's important to understand how weird the governance of the Ruby ecosystem is. There are three moving parts involved that are ostensibly managed by three different groups, but whose members have such broadly overlapping systems access that it has now led to disputes over who owns what:</p>
<ul>
<li><strong>Ruby itself</strong>, created by Matz and maintained by a large group of (mostly Japanese) committers, who host <a href="https://www.ruby-lang.org/">ruby-lang.org</a>, control the <a href="https://github.com/ruby">@ruby GitHub organization</a>, and are supported by the <a href="https://www.ruby.or.jp/en/">Ruby Association</a></li>
<li><strong>RubyGems</strong>, specifically the <code>gem</code> and <code>bundler</code> CLI tools distributed with the Ruby language, which is hosted <a href="https://github.com/rubygems">under @rubygems on GitHub</a></li>
<li><strong>RubyGems.org</strong>, the <a href="https://rubygems.org">website, API, and host</a> from which gem dependencies are installed and which has been run by <a href="https://rubycentral.org">Ruby Central</a> for ages</li>
</ul>
<p>If Ruby were invented today, a single party would probably control all three of these things, but it took nearly fifteen years for today's status quo to take shape. Ruby was invented by someone in Japan in the 1990s. RubyGems was created at <a href="https://www.linuxjournal.com/article/8967">a conference in Texas</a> by a few Americans in the early 2000s. RubyGems.org only became the de facto canonical host for gems <a href="https://web.archive.org/web/20120220191344/http://update.gemcutter.org/2009/10/26/transition.html">six years later</a>. My impression is that at no point was communication and coordination particularly fluent between the various parties.</p>
<p>Adding to this, <a href="https://bundler.io">Bundler</a>—a meta tool for resolving the correct versions of all of a project's gem dependencies and which quickly became vital to nearly all Ruby application development—was created independently of the above players by Yehuda Katz and Carl Lerche. André Arko later became the lead maintainer of Bundler, and in 2015 he founded a 501(c)(6) nonprofit called Ruby Together. In 2019, <a href="https://github.com/rubygems/rubygems/releases/tag/v3.1.0">Bundler was folded into RubyGems</a>. In 2022, <a href="https://rubycentral.org/news/a-new-chapter-for-rubygems-how-ruby-central-is-building-a-sustainable-future/">Ruby Together was absorbed by Ruby Central</a>.</p>
<p>Those last two events—the merging of Bundler and the unwinding of Ruby Together—came about after years of bitter conflict and simmering discord that I hope to shed some light on below. My direct involvement with any of these events was extremely minimal, but I had contemporaneous discussions with dozens of the principals involved. I never donated to Ruby Together and have never materially contributed to Bundler or RubyGems. That said, simply being made aware of several incidents as they were playing out in private was enough to leave behind a scar that has never fully healed. I can only imagine how others are feeling right now. Based on how badly things are playing out this time, it seems they were deeply impacted, too.</p>

<h2 id="the-things-people-told-me">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#the-things-people-told-me">The things people told me</a>
</h2>
<p>The earliest recollection I have of someone telling me about André Arko was in the summer of 2015, after getting dinner with a friend who happened to be a Ruby Together board member. The friend explained that André believed programmers working on open source tools deserve to earn an income that's commensurate with what salaried engineers earn at the companies who benefit from those tools. As such, André's goal with Ruby Together was characterized as an effort to fund development activities—initially his own, but eventually others—by paying themselves a market hourly rate. I remember being extremely sympathetic to this perspective, having also wasted countless hours of my life maintaining open source for free only for others to benefit from it. I also recall a figure like either $200 or $250 per hour being mentioned as the rate he was effectively paying himself. Whatever the rate actually was, I distinctly remember thinking, &quot;holy shit, that's a lot higher than individual donors would probably assume.&quot; <em>(<strong>UPDATE:</strong> A RubyTogether donor forwarded me newsletters from 2015 and 2022, both stating an hourly rate of $150 per hour being paid.)</em></p>
<p>The first time I remember meeting André in person was at <a href="https://www.rubyevents.org/events/ruby-on-ales-2016">Ruby on Ales 2016</a>. I remember trying to make a good impression, because growing my network in the community was the primary reason I spoke at conferences. I was presenting with <a href="/posts/the-12-macbook-was-announced-10-years-ago/">my beloved 12-inch MacBook</a>, which meant I was traveling with the first iteration of <a href="https://www.apple.com/shop/product/MW5M3AM/A/usb-c-digital-av-multiport-adapter">this cursed dongle</a>. André needed an adapter, so I ran up to lend him mine. As he was giving it back, I recall him making a half-joking, flippant remark about either his dongle or his computer, saying that &quot;Ruby Together will just buy me another one.&quot; It really rubbed me the wrong way. Over the years to follow, more than one person told me stories of André paying for shared meals on behalf of Ruby Together without an apparent legitimate justification. They told those stories, I assume, because the attitude he exhibited made them uncomfortable. If I had donated money to Ruby Together and heard the same stories, I would have been upset.</p>
<p>For how little has been said about this publicly, a lot of different people told me a lot of concerning stories about Ruby Together over the years, often providing evidence to back it up. I'll do my best to stick to the highlights in this post. Hopefully they will explain why I have not joined the rush to defend the maintainers whose access was recently removed. What Ruby Central did was undoubtedly handled very poorly, but I don't think their bungling of its execution and communication alone is enough to answer the question of what <em>should</em> happen to the future custody and direction of Bundler, RubyGems, and RubyGems.org.</p>

<h3 id="2015">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#2015">2015</a>
</h3>
<p>When Ruby Together first launched in 2015, the <a href="https://web.archive.org/web/20150425040538/http://RubyTogether.org/">website suggested donations went to pay &quot;our team&quot;</a>, which initially <a href="https://github.com/rubytogether/rubytogether.org/blob/9a03c4c/app/views/home/team.html.erb">linked to a list of the board members</a> without any explanation of how the money was being allocated. This resulted in a nonzero number of donors believing they were funding the work of people like Steve Klabnik, Aaron Patterson, and Sarah Mei, when in fact only André was being paid at the time. Shortly after the <a href="https://news.ycombinator.com/item?id=9222549">wording was raised as misleading</a>, the team page <a href="https://github.com/rubytogether/rubytogether.org/blob/0136e9f/app/views/home/team.html.erb">was updated</a> accordingly.</p>
<p>In May of 2015, André suggested making support for older versions of Bundler <a href="https://github.com/heroku/heroku-buildpack-ruby/pull/385/commits/6b3f3c71f4a98309e29748132be8e84b41d890de">contingent on Heroku paying Ruby Together</a>, which was interpreted as leveraging his control over Bundler as a pay-to-play scheme. Because <a href="https://www.heroku.com">Heroku</a> serves other people's Ruby apps—many of which aren't updated for very long stretches—the security of their service depends on clear and predictable support windows for Ruby's core technologies, it seems reasonable they would interpret this sudden revocation of support as a pressure tactic, aimed to solicit corporate sponsorship for Ruby Together. (Years later, André <a href="https://github.com/rubygems/rubygems/issues/1811#issuecomment-270788204">responded to a feature request from a Heroku engineer</a>, which was interpreted at the time as indicating the feature would be withheld from Bundler because Heroku had failed to pay Ruby Together.)</p>

<h3 id="2016">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#2016">2016</a>
</h3>
<p>The minutes of a December 2016 Ruby Together board meeting <a href="https://www.scribd.com/document/358730907/2016-12-01-Ruby-Together-2016-Board-Meeting-Agenda-and-Minutes">were leaked</a>. The document acknowledged who was paying for the RubyGems.org service at the time: &quot;Fastly is comping us something like $35k worth of CDN service per month. And that's on top of Ruby Central paying for $5k of servers and Ruby Together paying for about $15k of dev work every month.&quot; The use of &quot;us&quot; in that sentence suggests that Ruby Together was responsible for hosting RubyGems.org, which Ruby Central later went on <a href="https://blog.rubygems.org/2017/03/15/rubygems-funding.html">to publicly dispute</a>. Additionally, one presumes the number of hours and rate paid for development work was determined by Ruby Together itself, rather than being a hard operational cost. Later in the document was a discussion of potential strategies to increase revenue after &quot;new memberships [had] flatlined.&quot; Several ideas were discussed, culminating in a proposal to rate-limit access to RubyGems.org as the apparent best option:</p>
<blockquote>
<p>Rate limiting RubyGems.org seems like the option that scales most linearly with our costs. Companies that cost us money need to pay more (or stop costing us money), and companies that don't cost us money can continue to have a free ride. To be clear, this would not mean cutting off anyone's access to RubyGems.org. I'm imagining that it would work something like GitHub's model: anonymous access has a low limit, registered accounts have a higher limit, and even higher limits are available at each Ruby Together membership level. There are a lot of implementation details that would need to be worked out, but in general I feel like this is probably the most effective option to make companies feel like they are paying money for something they use and that covers our costs well.</p>
</blockquote>
<p>The leaked minutes were widely circulated in private at the time, due largely to outrage over the document's presupposition that Ruby Together was paying to host RubyGems.org (citing &quot;our costs&quot; as scaling with usage), as opposed to paying for developer effort (the costs of which do not scale with usage). The leak left myself and others worried that André might leverage his systems access to effectively hold the Ruby ecosystem hostage for the financial benefit of Ruby Together and—since it was compensating his own development efforts—André himself.</p>

<h3 id="2017">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#2017">2017</a>
</h3>
<p>In January 2017, André <a href="https://github.com/rubygems/bundler/pull/5308/commits/072f9ab80bb1e2d4992962e59b42d479ac37a4c0">added a &quot;post-install message&quot; imploring users to fund Ruby Together</a>, which would be displayed every time anyone installed Bundler. Unlike the aforementioned board meeting, this happened in the open and triggered an immediate backlash before eventually being rolled back. In one comment, André defended the action and <a href="https://github.com/rubygems/bundler/issues/5311#issuecomment-271477520">pointed to Shopify's failure to pay Ruby Together</a>, publicly conflating Ruby Together's sponsorship of development effort with &quot;~$40k/mo worth of servers.&quot; But, as Ruby Together's own board minutes from the month prior directly stated, money sent to Ruby Together wasn't going to pay server expenses—server costs were covered by <a href="https://www.fastly.com">Fastly</a> and Ruby Central.</p>
<p>In February 2017, following protracted discussion of the post-install message and the threat of rate-limiting access to gem installs, I agreed to put my name on a letter alongside 18 others (including one of Bundler's creators). The letter requested Ruby Together stop misleading the community in this way. My understanding is that some private one-on-one communication followed, that none of it was particularly productive, and that no formal communication occurred between the two groups afterward.</p>
<p>In March 2017, Ruby Central went on the record, attempting to clear up confusion and reassure users that <a href="https://blog.rubygems.org/2017/03/15/rubygems-funding.html">they alone were in control of RubyGems.org</a>, stating that Ruby Together donations were immaterial to its continued operation:</p>
<blockquote>
<p>Unfortunately, this past year has also given rise to some misunderstandings about this relationship in some quarters: chiefly, that by donating to Ruby Together, companies were paying for the operations of RubyGems. And in turn, that if enough companies didn't donate to Ruby Together, RubyGems would subsequently be in a perilous situation. This isn't so.</p>
<p>No one in the Ruby community should worry about the availability or security of RubyGems being connected in any way to the fundraising of Ruby Together. Funds raised by Ruby Together go primarily towards paying developers to add features and fix bugs. Ruby Central, on the other hand, is wholly responsible for the operations and baseline stability of the system. While these two efforts go hand-in-hand, it's vitally important to understand that they are two different things. Ruby Together's requests for donations do not mean that there is any reason for concern about RubyGems' continued existence or operation.</p>
</blockquote>
<p>Later, in August 2017, André <a href="https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36">accused Google Cloud Platform</a> of wholesale copying <a href="https://github.com/rubygems/gemstash">gemstash</a>'s codebase, going so far as to threaten legal action in his opening message. He juxtaposed the accusation with the complaint that Google had, &quot;repeatedly declined to support Ruby Together.&quot; The incident appeared to fit a pattern of behavior to pair high-conflict messaging with an admonition of the target's failure to fund the organization that paid him. Ultimately, André's claim turned out to be factually baseless—Google <a href="https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36#issuecomment-324503159">hadn't copied gemstash's code, after all</a>.</p>

<h3 id="20182024">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#20182024">2018–2024</a>
</h3>
<p>Things quieted down and I didn't hear much about any of this stuff anymore. Eventually, Bundler became part of RubyGems and many folks from Ruby Together migrated to analogous roles at Ruby Central.</p>

<h3 id="2025">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#2025">2025</a>
</h3>
<p>In August 2025, and seemingly out of nowhere, someone pointed me to the project <a href="https://github.com/spinel-coop/rv-ruby">spinel-coop/rv-ruby</a>, an apparent fork of <a href="https://github.com/homebrew/homebrew-portable-ruby">homebrew/homebrew-portable-ruby</a>. I say &quot;apparent&quot;, because rather than using <a href="https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo">GitHub's fork button</a>—which would have maintained clear attribution of who created the upstream project—it looks like it was instead cloned and re-pushed by André. Specifically, I was sent <a href="https://github.com/spinel-coop/rv-ruby/commit/2234bdb7db4e41bfe883a01f06d7d0aff3188997">this commit replacing references to Homebrew</a> from late July. As evidence of Homebrew's authorship was being erased and obscured, no additional acknowledgement was added to credit Homebrew for having created and maintained Portable Ruby since 2016.</p>
<p>It immediately reminded me of André's <a href="https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36">baseless accusation against Google</a>. &quot;Not only did you not credit the Gemstash project in any way,&quot; André wrote, &quot;from an ethical standpoint, this is also super gross.&quot; His blatant copying of Portable Ruby (a project significant enough that the lead maintainer <a href="https://rubykaigi.org/2019/presentations/MikeMcQuaid.html">gave a talk about how they did it</a>) struck me as brazenly hypocritical, given André's previous litigious and mistaken accusation against Google.</p>
<p>In fairness to André, the rv-ruby repo continues to retain a <a href="https://github.com/spinel-coop/rv-ruby/blob/main/LICENSE.txt">copy of</a> Homebrew's <a href="https://github.com/homebrew/homebrew-portable-ruby/blob/HEAD/LICENSE.txt">LICENSE.txt</a> which names &quot;Homebrew contributors&quot; as the copyright holder. André also later <a href="https://github.com/spinel-coop/rv-ruby/commit/76e96c9d9f74ea89eed9d34ff11491bb6c365d54">added an explicit acknowledgement to the README</a>, but that attribution came more than a month later, and (I'm told) only after he was directly asked to credit the original project.</p>
<p><a href="https://andre.arko.net/2025/09/25/bundler-belongs-to-the-ruby-community/">André wrote this week</a> that, &quot;Ruby Together did not ever, at any point, demand any form of governance or control over the existing open source projects. Maintainers did their thing in the RubyGems and Bundler GitHub orgs, while Ruby Together staff and board members did their thing in the rubytogether GitHub org.&quot; However, while he was leading Ruby Together, he moved to <a href="https://github.com/rubygems/rubygems/pull/1518">restrict committer access to RubyGems in rubygems/rubygems</a>, unilaterally <a href="https://github.com/bundler/bundler/commit/524add155d6b90c679db21b03f0bd9f877f21ab0">erased the original authorship from Bundler's gemspec in bundler/bundler</a>, and oversaw a number of <a href="https://github.com/bundler/bundler-site/commit/03d331ac8a0a05a5b4225319fb3783a8d1eb1c9b#diff-efb5113d13615a3e1c5706cd6f316ee73f5db628f8c5c06b450a51e537cf9ec6">contributors being removed from bundler/bundler-site</a> in a redesign of Bundler's website.</p>
<p>As a result of this broader historical context and in spite of the serious claims and grave implications being thrown around this month, I'm trying my best <strong>not to rush to judgment about who's at fault in the current conflict and would urge others to do the same</strong>. The future of the Ruby ecosystem may depend on it.</p>
<div class="mt-6 text-xs italic opacity-80">
<p><strong>Updated on September 28th</strong> to clarify Ruby Together's published rates paid to André and other developers as $150 per hour.</p>
<p><strong>Updated on September 29th</strong> to include a link to a contemporaneously-uploaded copy of the leaked December 2016 Ruby Together board minutes.</p>


</div>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/","append_url_label":"Read 📄","content":"\u003cp\u003eWe are in the midst of a \u003ca href=\"https://www.theregister.com/2025/09/25/open_source_to_closed_doors/\"\u003eRuby drama for the ages\u003c/a\u003e. I'm sure a bunch of people figured we were all too old for this shit, but apparently we are not.\u003c/p\u003e\n\u003cp\u003eThis debate has been eating at me ever since the news first broke, but I've tried to keep the peace by staying out of it. Unlike most discourse about what's going on, my discomfort stems less from the issue at hand—what Ruby Central did, how they did it, and how \u003ca href=\"https://rubycentral.org/news/strengthening-the-stewardship-of-rubygems-and-bundler/\"\u003epoorly it was communicated\u003c/a\u003e—and more to do with how one-sided the public discussion has been. Beneath the surface of this story are the consequences of a decade-old conflict that was never fully resolved. Then and now, one side—\u003ca href=\"https://arko.net\"\u003eAndré Arko\u003c/a\u003e and many people associated with him—has availed itself of public channels to voice their perspective, while the other—which includes a surprisingly wide swath of well-known Ruby and Rails contributors—has chosen to stay silent.\u003c/p\u003e\n\u003cp\u003eThe losers in this dynamic are the vast majority normal everyday Ruby developers, most of whom are operating on very little information and who understandably feel confused and concerned. People whose livelihood depends on the health of the Ruby ecosystem deserve more information than they're getting, especially now that its operational stability has come under threat. The future of that ecosystem is once again uncertain, but—just like last time—the outcome is being shaped by a history that's been kept from the public, widening the rift between its key decision-makers and the communities they serve.\u003c/p\u003e\n\u003cp\u003eI don't have the answers to what's going on in 2025. A few details have been shared with me—details that would contradict fact-checks and timelines others have pieced together and published—but I can't pretend to have a clear picture of what actually happened, why no one is setting the record straight, or when we'll have clarity on what the future holds. All I can do is offer a little bit of context to explain why I'm dubious of the dominant narrative that has taken shape online. Namely, \u003cstrong\u003eI don't believe this is a cut-and-dry case of altruistic open-source maintainers being persecuted by oppressive corporate interests.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAfter you read this, perhaps your perspective will shift as well.\u003c/p\u003e\n\n\u003ch2 id=\"the-relevant-proper-nouns-to-know\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#the-relevant-proper-nouns-to-know\"\u003eThe relevant proper nouns to know\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eBefore anything else can make sense, it's important to understand how weird the governance of the Ruby ecosystem is. There are three moving parts involved that are ostensibly managed by three different groups, but whose members have such broadly overlapping systems access that it has now led to disputes over who owns what:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRuby itself\u003c/strong\u003e, created by Matz and maintained by a large group of (mostly Japanese) committers, who host \u003ca href=\"https://www.ruby-lang.org/\"\u003eruby-lang.org\u003c/a\u003e, control the \u003ca href=\"https://github.com/ruby\"\u003e@ruby GitHub organization\u003c/a\u003e, and are supported by the \u003ca href=\"https://www.ruby.or.jp/en/\"\u003eRuby Association\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRubyGems\u003c/strong\u003e, specifically the \u003ccode\u003egem\u003c/code\u003e and \u003ccode\u003ebundler\u003c/code\u003e CLI tools distributed with the Ruby language, which is hosted \u003ca href=\"https://github.com/rubygems\"\u003eunder @rubygems on GitHub\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRubyGems.org\u003c/strong\u003e, the \u003ca href=\"https://rubygems.org\"\u003ewebsite, API, and host\u003c/a\u003e from which gem dependencies are installed and which has been run by \u003ca href=\"https://rubycentral.org\"\u003eRuby Central\u003c/a\u003e for ages\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf Ruby were invented today, a single party would probably control all three of these things, but it took nearly fifteen years for today's status quo to take shape. Ruby was invented by someone in Japan in the 1990s. RubyGems was created at \u003ca href=\"https://www.linuxjournal.com/article/8967\"\u003ea conference in Texas\u003c/a\u003e by a few Americans in the early 2000s. RubyGems.org only became the de facto canonical host for gems \u003ca href=\"https://web.archive.org/web/20120220191344/http://update.gemcutter.org/2009/10/26/transition.html\"\u003esix years later\u003c/a\u003e. My impression is that at no point was communication and coordination particularly fluent between the various parties.\u003c/p\u003e\n\u003cp\u003eAdding to this, \u003ca href=\"https://bundler.io\"\u003eBundler\u003c/a\u003e—a meta tool for resolving the correct versions of all of a project's gem dependencies and which quickly became vital to nearly all Ruby application development—was created independently of the above players by Yehuda Katz and Carl Lerche. André Arko later became the lead maintainer of Bundler, and in 2015 he founded a 501(c)(6) nonprofit called Ruby Together. In 2019, \u003ca href=\"https://github.com/rubygems/rubygems/releases/tag/v3.1.0\"\u003eBundler was folded into RubyGems\u003c/a\u003e. In 2022, \u003ca href=\"https://rubycentral.org/news/a-new-chapter-for-rubygems-how-ruby-central-is-building-a-sustainable-future/\"\u003eRuby Together was absorbed by Ruby Central\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThose last two events—the merging of Bundler and the unwinding of Ruby Together—came about after years of bitter conflict and simmering discord that I hope to shed some light on below. My direct involvement with any of these events was extremely minimal, but I had contemporaneous discussions with dozens of the principals involved. I never donated to Ruby Together and have never materially contributed to Bundler or RubyGems. That said, simply being made aware of several incidents as they were playing out in private was enough to leave behind a scar that has never fully healed. I can only imagine how others are feeling right now. Based on how badly things are playing out this time, it seems they were deeply impacted, too.\u003c/p\u003e\n\n\u003ch2 id=\"the-things-people-told-me\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#the-things-people-told-me\"\u003eThe things people told me\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eThe earliest recollection I have of someone telling me about André Arko was in the summer of 2015, after getting dinner with a friend who happened to be a Ruby Together board member. The friend explained that André believed programmers working on open source tools deserve to earn an income that's commensurate with what salaried engineers earn at the companies who benefit from those tools. As such, André's goal with Ruby Together was characterized as an effort to fund development activities—initially his own, but eventually others—by paying themselves a market hourly rate. I remember being extremely sympathetic to this perspective, having also wasted countless hours of my life maintaining open source for free only for others to benefit from it. I also recall a figure like either $200 or $250 per hour being mentioned as the rate he was effectively paying himself. Whatever the rate actually was, I distinctly remember thinking, \u0026quot;holy shit, that's a lot higher than individual donors would probably assume.\u0026quot; \u003cem\u003e(\u003cstrong\u003eUPDATE:\u003c/strong\u003e A RubyTogether donor forwarded me newsletters from 2015 and 2022, both stating an hourly rate of $150 per hour being paid.)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe first time I remember meeting André in person was at \u003ca href=\"https://www.rubyevents.org/events/ruby-on-ales-2016\"\u003eRuby on Ales 2016\u003c/a\u003e. I remember trying to make a good impression, because growing my network in the community was the primary reason I spoke at conferences. I was presenting with \u003ca href=\"/posts/the-12-macbook-was-announced-10-years-ago/\"\u003emy beloved 12-inch MacBook\u003c/a\u003e, which meant I was traveling with the first iteration of \u003ca href=\"https://www.apple.com/shop/product/MW5M3AM/A/usb-c-digital-av-multiport-adapter\"\u003ethis cursed dongle\u003c/a\u003e. André needed an adapter, so I ran up to lend him mine. As he was giving it back, I recall him making a half-joking, flippant remark about either his dongle or his computer, saying that \u0026quot;Ruby Together will just buy me another one.\u0026quot; It really rubbed me the wrong way. Over the years to follow, more than one person told me stories of André paying for shared meals on behalf of Ruby Together without an apparent legitimate justification. They told those stories, I assume, because the attitude he exhibited made them uncomfortable. If I had donated money to Ruby Together and heard the same stories, I would have been upset.\u003c/p\u003e\n\u003cp\u003eFor how little has been said about this publicly, a lot of different people told me a lot of concerning stories about Ruby Together over the years, often providing evidence to back it up. I'll do my best to stick to the highlights in this post. Hopefully they will explain why I have not joined the rush to defend the maintainers whose access was recently removed. What Ruby Central did was undoubtedly handled very poorly, but I don't think their bungling of its execution and communication alone is enough to answer the question of what \u003cem\u003eshould\u003c/em\u003e happen to the future custody and direction of Bundler, RubyGems, and RubyGems.org.\u003c/p\u003e\n\n\u003ch3 id=\"2015\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#2015\"\u003e2015\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eWhen Ruby Together first launched in 2015, the \u003ca href=\"https://web.archive.org/web/20150425040538/http://RubyTogether.org/\"\u003ewebsite suggested donations went to pay \u0026quot;our team\u0026quot;\u003c/a\u003e, which initially \u003ca href=\"https://github.com/rubytogether/rubytogether.org/blob/9a03c4c/app/views/home/team.html.erb\"\u003elinked to a list of the board members\u003c/a\u003e without any explanation of how the money was being allocated. This resulted in a nonzero number of donors believing they were funding the work of people like Steve Klabnik, Aaron Patterson, and Sarah Mei, when in fact only André was being paid at the time. Shortly after the \u003ca href=\"https://news.ycombinator.com/item?id=9222549\"\u003ewording was raised as misleading\u003c/a\u003e, the team page \u003ca href=\"https://github.com/rubytogether/rubytogether.org/blob/0136e9f/app/views/home/team.html.erb\"\u003ewas updated\u003c/a\u003e accordingly.\u003c/p\u003e\n\u003cp\u003eIn May of 2015, André suggested making support for older versions of Bundler \u003ca href=\"https://github.com/heroku/heroku-buildpack-ruby/pull/385/commits/6b3f3c71f4a98309e29748132be8e84b41d890de\"\u003econtingent on Heroku paying Ruby Together\u003c/a\u003e, which was interpreted as leveraging his control over Bundler as a pay-to-play scheme. Because \u003ca href=\"https://www.heroku.com\"\u003eHeroku\u003c/a\u003e serves other people's Ruby apps—many of which aren't updated for very long stretches—the security of their service depends on clear and predictable support windows for Ruby's core technologies, it seems reasonable they would interpret this sudden revocation of support as a pressure tactic, aimed to solicit corporate sponsorship for Ruby Together. (Years later, André \u003ca href=\"https://github.com/rubygems/rubygems/issues/1811#issuecomment-270788204\"\u003eresponded to a feature request from a Heroku engineer\u003c/a\u003e, which was interpreted at the time as indicating the feature would be withheld from Bundler because Heroku had failed to pay Ruby Together.)\u003c/p\u003e\n\n\u003ch3 id=\"2016\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#2016\"\u003e2016\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eThe minutes of a December 2016 Ruby Together board meeting \u003ca href=\"https://www.scribd.com/document/358730907/2016-12-01-Ruby-Together-2016-Board-Meeting-Agenda-and-Minutes\"\u003ewere leaked\u003c/a\u003e. The document acknowledged who was paying for the RubyGems.org service at the time: \u0026quot;Fastly is comping us something like $35k worth of CDN service per month. And that's on top of Ruby Central paying for $5k of servers and Ruby Together paying for about $15k of dev work every month.\u0026quot; The use of \u0026quot;us\u0026quot; in that sentence suggests that Ruby Together was responsible for hosting RubyGems.org, which Ruby Central later went on \u003ca href=\"https://blog.rubygems.org/2017/03/15/rubygems-funding.html\"\u003eto publicly dispute\u003c/a\u003e. Additionally, one presumes the number of hours and rate paid for development work was determined by Ruby Together itself, rather than being a hard operational cost. Later in the document was a discussion of potential strategies to increase revenue after \u0026quot;new memberships [had] flatlined.\u0026quot; Several ideas were discussed, culminating in a proposal to rate-limit access to RubyGems.org as the apparent best option:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRate limiting RubyGems.org seems like the option that scales most linearly with our costs. Companies that cost us money need to pay more (or stop costing us money), and companies that don't cost us money can continue to have a free ride. To be clear, this would not mean cutting off anyone's access to RubyGems.org. I'm imagining that it would work something like GitHub's model: anonymous access has a low limit, registered accounts have a higher limit, and even higher limits are available at each Ruby Together membership level. There are a lot of implementation details that would need to be worked out, but in general I feel like this is probably the most effective option to make companies feel like they are paying money for something they use and that covers our costs well.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe leaked minutes were widely circulated in private at the time, due largely to outrage over the document's presupposition that Ruby Together was paying to host RubyGems.org (citing \u0026quot;our costs\u0026quot; as scaling with usage), as opposed to paying for developer effort (the costs of which do not scale with usage). The leak left myself and others worried that André might leverage his systems access to effectively hold the Ruby ecosystem hostage for the financial benefit of Ruby Together and—since it was compensating his own development efforts—André himself.\u003c/p\u003e\n\n\u003ch3 id=\"2017\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#2017\"\u003e2017\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eIn January 2017, André \u003ca href=\"https://github.com/rubygems/bundler/pull/5308/commits/072f9ab80bb1e2d4992962e59b42d479ac37a4c0\"\u003eadded a \u0026quot;post-install message\u0026quot; imploring users to fund Ruby Together\u003c/a\u003e, which would be displayed every time anyone installed Bundler. Unlike the aforementioned board meeting, this happened in the open and triggered an immediate backlash before eventually being rolled back. In one comment, André defended the action and \u003ca href=\"https://github.com/rubygems/bundler/issues/5311#issuecomment-271477520\"\u003epointed to Shopify's failure to pay Ruby Together\u003c/a\u003e, publicly conflating Ruby Together's sponsorship of development effort with \u0026quot;~$40k/mo worth of servers.\u0026quot; But, as Ruby Together's own board minutes from the month prior directly stated, money sent to Ruby Together wasn't going to pay server expenses—server costs were covered by \u003ca href=\"https://www.fastly.com\"\u003eFastly\u003c/a\u003e and Ruby Central.\u003c/p\u003e\n\u003cp\u003eIn February 2017, following protracted discussion of the post-install message and the threat of rate-limiting access to gem installs, I agreed to put my name on a letter alongside 18 others (including one of Bundler's creators). The letter requested Ruby Together stop misleading the community in this way. My understanding is that some private one-on-one communication followed, that none of it was particularly productive, and that no formal communication occurred between the two groups afterward.\u003c/p\u003e\n\u003cp\u003eIn March 2017, Ruby Central went on the record, attempting to clear up confusion and reassure users that \u003ca href=\"https://blog.rubygems.org/2017/03/15/rubygems-funding.html\"\u003ethey alone were in control of RubyGems.org\u003c/a\u003e, stating that Ruby Together donations were immaterial to its continued operation:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUnfortunately, this past year has also given rise to some misunderstandings about this relationship in some quarters: chiefly, that by donating to Ruby Together, companies were paying for the operations of RubyGems. And in turn, that if enough companies didn't donate to Ruby Together, RubyGems would subsequently be in a perilous situation. This isn't so.\u003c/p\u003e\n\u003cp\u003eNo one in the Ruby community should worry about the availability or security of RubyGems being connected in any way to the fundraising of Ruby Together. Funds raised by Ruby Together go primarily towards paying developers to add features and fix bugs. Ruby Central, on the other hand, is wholly responsible for the operations and baseline stability of the system. While these two efforts go hand-in-hand, it's vitally important to understand that they are two different things. Ruby Together's requests for donations do not mean that there is any reason for concern about RubyGems' continued existence or operation.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eLater, in August 2017, André \u003ca href=\"https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36\"\u003eaccused Google Cloud Platform\u003c/a\u003e of wholesale copying \u003ca href=\"https://github.com/rubygems/gemstash\"\u003egemstash\u003c/a\u003e's codebase, going so far as to threaten legal action in his opening message. He juxtaposed the accusation with the complaint that Google had, \u0026quot;repeatedly declined to support Ruby Together.\u0026quot; The incident appeared to fit a pattern of behavior to pair high-conflict messaging with an admonition of the target's failure to fund the organization that paid him. Ultimately, André's claim turned out to be factually baseless—Google \u003ca href=\"https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36#issuecomment-324503159\"\u003ehadn't copied gemstash's code, after all\u003c/a\u003e.\u003c/p\u003e\n\n\u003ch3 id=\"20182024\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#20182024\"\u003e2018–2024\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eThings quieted down and I didn't hear much about any of this stuff anymore. Eventually, Bundler became part of RubyGems and many folks from Ruby Together migrated to analogous roles at Ruby Central.\u003c/p\u003e\n\n\u003ch3 id=\"2025\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/#2025\"\u003e2025\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eIn August 2025, and seemingly out of nowhere, someone pointed me to the project \u003ca href=\"https://github.com/spinel-coop/rv-ruby\"\u003espinel-coop/rv-ruby\u003c/a\u003e, an apparent fork of \u003ca href=\"https://github.com/homebrew/homebrew-portable-ruby\"\u003ehomebrew/homebrew-portable-ruby\u003c/a\u003e. I say \u0026quot;apparent\u0026quot;, because rather than using \u003ca href=\"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo\"\u003eGitHub's fork button\u003c/a\u003e—which would have maintained clear attribution of who created the upstream project—it looks like it was instead cloned and re-pushed by André. Specifically, I was sent \u003ca href=\"https://github.com/spinel-coop/rv-ruby/commit/2234bdb7db4e41bfe883a01f06d7d0aff3188997\"\u003ethis commit replacing references to Homebrew\u003c/a\u003e from late July. As evidence of Homebrew's authorship was being erased and obscured, no additional acknowledgement was added to credit Homebrew for having created and maintained Portable Ruby since 2016.\u003c/p\u003e\n\u003cp\u003eIt immediately reminded me of André's \u003ca href=\"https://github.com/GoogleCloudPlatform/google-cloud-gemserver/issues/36\"\u003ebaseless accusation against Google\u003c/a\u003e. \u0026quot;Not only did you not credit the Gemstash project in any way,\u0026quot; André wrote, \u0026quot;from an ethical standpoint, this is also super gross.\u0026quot; His blatant copying of Portable Ruby (a project significant enough that the lead maintainer \u003ca href=\"https://rubykaigi.org/2019/presentations/MikeMcQuaid.html\"\u003egave a talk about how they did it\u003c/a\u003e) struck me as brazenly hypocritical, given André's previous litigious and mistaken accusation against Google.\u003c/p\u003e\n\u003cp\u003eIn fairness to André, the rv-ruby repo continues to retain a \u003ca href=\"https://github.com/spinel-coop/rv-ruby/blob/main/LICENSE.txt\"\u003ecopy of\u003c/a\u003e Homebrew's \u003ca href=\"https://github.com/homebrew/homebrew-portable-ruby/blob/HEAD/LICENSE.txt\"\u003eLICENSE.txt\u003c/a\u003e which names \u0026quot;Homebrew contributors\u0026quot; as the copyright holder. André also later \u003ca href=\"https://github.com/spinel-coop/rv-ruby/commit/76e96c9d9f74ea89eed9d34ff11491bb6c365d54\"\u003eadded an explicit acknowledgement to the README\u003c/a\u003e, but that attribution came more than a month later, and (I'm told) only after he was directly asked to credit the original project.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://andre.arko.net/2025/09/25/bundler-belongs-to-the-ruby-community/\"\u003eAndré wrote this week\u003c/a\u003e that, \u0026quot;Ruby Together did not ever, at any point, demand any form of governance or control over the existing open source projects. Maintainers did their thing in the RubyGems and Bundler GitHub orgs, while Ruby Together staff and board members did their thing in the rubytogether GitHub org.\u0026quot; However, while he was leading Ruby Together, he moved to \u003ca href=\"https://github.com/rubygems/rubygems/pull/1518\"\u003erestrict committer access to RubyGems in rubygems/rubygems\u003c/a\u003e, unilaterally \u003ca href=\"https://github.com/bundler/bundler/commit/524add155d6b90c679db21b03f0bd9f877f21ab0\"\u003eerased the original authorship from Bundler's gemspec in bundler/bundler\u003c/a\u003e, and oversaw a number of \u003ca href=\"https://github.com/bundler/bundler-site/commit/03d331ac8a0a05a5b4225319fb3783a8d1eb1c9b#diff-efb5113d13615a3e1c5706cd6f316ee73f5db628f8c5c06b450a51e537cf9ec6\"\u003econtributors being removed from bundler/bundler-site\u003c/a\u003e in a redesign of Bundler's website.\u003c/p\u003e\n\u003cp\u003eAs a result of this broader historical context and in spite of the serious claims and grave implications being thrown around this month, I'm trying my best \u003cstrong\u003enot to rush to judgment about who's at fault in the current conflict and would urge others to do the same\u003c/strong\u003e. The future of the Ruby ecosystem may depend on it.\u003c/p\u003e\n\u003cdiv class=\"mt-6 text-xs italic opacity-80\"\u003e\n\u003cp\u003e\u003cstrong\u003eUpdated on September 28th\u003c/strong\u003e to clarify Ruby Together's published rates paid to André and other developers as $150 per hour.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUpdated on September 29th\u003c/strong\u003e to include a link to a contemporaneously-uploaded copy of the leaked December 2016 Ruby Together board minutes.\u003c/p\u003e\n\n\n\u003c/div\u003e","id":"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/","og_image":"https://justin.searls.co/img/social/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-28T13:20:19Z","title":"Why I'm not rushing to take sides in the RubyGems fiasco","updated_at":"2025-10-10T07:47:44-04:00","url":"https://justin.searls.co/posts/why-im-not-rushing-to-take-sides-in-the-rubygems-fiasco/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/how-to-automatically-add-chapters-to-your-podcast/</id>
      <title type="text">📄 How to automatically add chapters to your podcast</title>
      <link href="https://justin.searls.co/posts/how-to-automatically-add-chapters-to-your-podcast/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-23T15:25:03+00:00</published>
    <updated>2025-09-23T12:49:38-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>A frequent request from listeners of my <a href="/casts/breaking-change/">Breaking Change</a> podcast has been for <a href="https://podcasters.apple.com/support/5482-using-chapters-on-apple-podcasts">chapter</a> support. At one point, I tried to manually incorporate this into my (extremely light) editing workflow, but it was fiddly and error-prone to do manually.</p>
<p>That is, until yesterday, when I had the thought, &quot;<em>what if I had a script that could detect each time the audio switched from mono to stereo?</em>&quot;</p>
<p>See, like most podcasts, I record my voice in mono, but the music jingles (or &quot;<a href="https://en.wikipedia.org/wiki/Sting_(musical_phrase)">stingers</a>&quot;) are all in stereo. And because each mono segment is punctuated by a stereo stinger, the resulting timestamps would indicate exactly where the chapter markers ought to go.</p>
<p>So, an hour later, some new <a href="/links/2025-09-08-i-ve-got-your-shovelware-right-here/">shovelware</a> was born! I call it <a href="https://github.com/searlsco/autochapter">autochapter</a>, and you can install it with homebrew:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew install searlsco/tap/autochapter
</span></span></code></pre></div><p>Once installed, just pass <code>autochapter</code> your chapter names as a text file or a list of flags, like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">autochapter <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Intro <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Follow-up <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s <span class="s2">&#34;Aaron&#39;s Pun&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s News <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Recommendations <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Mailbag <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Outro <span class="se">\
</span></span></span><span class="line"><span class="cl">  v44.mp3
</span></span></code></pre></div><p>And you'll get a remuxed version of the audio file (e.g. <code>v44-chapters.mp3</code>), as well as textual readout of the chapters, ready to be pasted into your YouTube description:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Chapters:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">0:00 Intro
</span></span><span class="line"><span class="cl">24:11 Follow-up
</span></span><span class="line"><span class="cl">53:45 Aaron&#39;s Pun
</span></span><span class="line"><span class="cl">56:14 News
</span></span><span class="line"><span class="cl">1:49:03 Recommendations
</span></span><span class="line"><span class="cl">2:03:52 Mailbag
</span></span><span class="line"><span class="cl">2:33:11 Outro
</span></span></code></pre></div><p>As you might surmise from the examples, <a href="/casts/breaking-change-v44-cant-get-it-up/">v44 of the show</a> is the first version to ship with chapters.</p>
<p>And that's about all there is to it. I wrote <code>autochapter</code> with <a href="https://developers.openai.com/codex/cli/">Codex CLI</a> in one shot, and it's a great example of a project I would have never bothered building if it weren't for a coding agent to do the gruntwork for me. That makes <code>autochapter</code> <a href="/shovelware/">Certified Shovelware</a>.</p>]]></content>
    <summary type="html"><![CDATA[<p>A frequent request from listeners of my <a href="/casts/breaking-change/">Breaking Change</a> podcast has been for <a href="https://podcasters.apple.com/support/5482-using-chapters-on-apple-podcasts">chapter</a> support. At one point, I tried to manually incorporate this into my (extremely light) editing workflow, but it was fiddly and error-prone to do manually.</p>
<p>That is, until yesterday, when I had the thought, &quot;<em>what if I had a script that could detect each time the audio switched from mono to stereo?</em>&quot;</p>
<p>See, like most podcasts, I record my voice in mono, but the music jingles (or &quot;<a href="https://en.wikipedia.org/wiki/Sting_(musical_phrase)">stingers</a>&quot;) are all in stereo. And because each mono segment is punctuated by a stereo stinger, the resulting timestamps would indicate exactly where the chapter markers ought to go.</p>
<p>So, an hour later, some new <a href="/links/2025-09-08-i-ve-got-your-shovelware-right-here/">shovelware</a> was born! I call it <a href="https://github.com/searlsco/autochapter">autochapter</a>, and you can install it with homebrew:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew install searlsco/tap/autochapter
</span></span></code></pre></div><p>Once installed, just pass <code>autochapter</code> your chapter names as a text file or a list of flags, like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">autochapter <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Intro <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Follow-up <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s <span class="s2">&#34;Aaron&#39;s Pun&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s News <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Recommendations <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Mailbag <span class="se">\
</span></span></span><span class="line"><span class="cl">  -s Outro <span class="se">\
</span></span></span><span class="line"><span class="cl">  v44.mp3
</span></span></code></pre></div><p>And you'll get a remuxed version of the audio file (e.g. <code>v44-chapters.mp3</code>), as well as textual readout of the chapters, ready to be pasted into your YouTube description:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Chapters:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">0:00 Intro
</span></span><span class="line"><span class="cl">24:11 Follow-up
</span></span><span class="line"><span class="cl">53:45 Aaron&#39;s Pun
</span></span><span class="line"><span class="cl">56:14 News
</span></span><span class="line"><span class="cl">1:49:03 Recommendations
</span></span><span class="line"><span class="cl">2:03:52 Mailbag
</span></span><span class="line"><span class="cl">2:33:11 Outro
</span></span></code></pre></div><p>As you might surmise from the examples, <a href="/casts/breaking-change-v44-cant-get-it-up/">v44 of the show</a> is the first version to ship with chapters.</p>
<p>And that's about all there is to it. I wrote <code>autochapter</code> with <a href="https://developers.openai.com/codex/cli/">Codex CLI</a> in one shot, and it's a great example of a project I would have never bothered building if it weren't for a coding agent to do the gruntwork for me. That makes <code>autochapter</code> <a href="/shovelware/">Certified Shovelware</a>.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/how-to-automatically-add-chapters-to-your-podcast/","append_url_label":"Read 📄","content":"\u003cp\u003eA frequent request from listeners of my \u003ca href=\"/casts/breaking-change/\"\u003eBreaking Change\u003c/a\u003e podcast has been for \u003ca href=\"https://podcasters.apple.com/support/5482-using-chapters-on-apple-podcasts\"\u003echapter\u003c/a\u003e support. At one point, I tried to manually incorporate this into my (extremely light) editing workflow, but it was fiddly and error-prone to do manually.\u003c/p\u003e\n\u003cp\u003eThat is, until yesterday, when I had the thought, \u0026quot;\u003cem\u003ewhat if I had a script that could detect each time the audio switched from mono to stereo?\u003c/em\u003e\u0026quot;\u003c/p\u003e\n\u003cp\u003eSee, like most podcasts, I record my voice in mono, but the music jingles (or \u0026quot;\u003ca href=\"https://en.wikipedia.org/wiki/Sting_(musical_phrase)\"\u003estingers\u003c/a\u003e\u0026quot;) are all in stereo. And because each mono segment is punctuated by a stereo stinger, the resulting timestamps would indicate exactly where the chapter markers ought to go.\u003c/p\u003e\n\u003cp\u003eSo, an hour later, some new \u003ca href=\"/links/2025-09-08-i-ve-got-your-shovelware-right-here/\"\u003eshovelware\u003c/a\u003e was born! I call it \u003ca href=\"https://github.com/searlsco/autochapter\"\u003eautochapter\u003c/a\u003e, and you can install it with homebrew:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install searlsco/tap/autochapter\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOnce installed, just pass \u003ccode\u003eautochapter\u003c/code\u003e your chapter names as a text file or a list of flags, like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eautochapter \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -s Intro \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -s Follow-up \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -s \u003cspan class=\"s2\"\u003e\u0026#34;Aaron\u0026#39;s Pun\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -s News \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -s Recommendations \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -s Mailbag \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -s Outro \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  v44.mp3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd you'll get a remuxed version of the audio file (e.g. \u003ccode\u003ev44-chapters.mp3\u003c/code\u003e), as well as textual readout of the chapters, ready to be pasted into your YouTube description:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-txt\" data-lang=\"txt\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eChapters:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0:00 Intro\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e24:11 Follow-up\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e53:45 Aaron\u0026#39;s Pun\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e56:14 News\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1:49:03 Recommendations\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2:03:52 Mailbag\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2:33:11 Outro\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAs you might surmise from the examples, \u003ca href=\"/casts/breaking-change-v44-cant-get-it-up/\"\u003ev44 of the show\u003c/a\u003e is the first version to ship with chapters.\u003c/p\u003e\n\u003cp\u003eAnd that's about all there is to it. I wrote \u003ccode\u003eautochapter\u003c/code\u003e with \u003ca href=\"https://developers.openai.com/codex/cli/\"\u003eCodex CLI\u003c/a\u003e in one shot, and it's a great example of a project I would have never bothered building if it weren't for a coding agent to do the gruntwork for me. That makes \u003ccode\u003eautochapter\u003c/code\u003e \u003ca href=\"/shovelware/\"\u003eCertified Shovelware\u003c/a\u003e.\u003c/p\u003e","id":"https://justin.searls.co/posts/how-to-automatically-add-chapters-to-your-podcast/","og_image":"https://justin.searls.co/img/social/posts/how-to-automatically-add-chapters-to-your-podcast.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-23T15:25:03Z","title":"How to automatically add chapters to your podcast","updated_at":"2025-09-23T12:49:38-04:00","url":"https://justin.searls.co/posts/how-to-automatically-add-chapters-to-your-podcast/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v44-cant-get-it-up/</id>
      <title type="text">🎙️ Breaking Change podcast v44 - Can&#39;t get it up</title>
      <link href="https://justin.searls.co/casts/breaking-change-v44-cant-get-it-up/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-22T14:39:55+00:00</published>
    <updated>2025-09-23T13:48:24-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v44.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v44.mp3">Direct link to podcast audio file</a>
</p><p>Hey, look! Breaking Change now has <strong>chapter support</strong> for each segment! More on how I did that while still upholding my commitment to laziness later.</p>
<p>I didn't get a good job connecting this version's release to what I was referencing, so to be clear I was referring to my <em>heart rate</em> as opposed to any other bodily functions. The other ones are getting up just fine, thank you. Get your head out of the gutter.</p>
<p>Thanks for all the great e-mails the last couple weeks! Throw yours on the pile at <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Hopefully <a href="https://join.fastmail.com/a29cc1ac">Fastmail</a> won't lose it.</p>
<p>For the folks who pronounce URLs like Earls:</p>
<ul>
<li><a href="https://orlandoinformer.com/blog/fallout-hhn-2025-everything-you-need-to-know/">Fallout comes to HHN</a></li>
<li><a href="https://www.macrumors.com/2025/09/12/apple-watch-series-11-increased-battery-catch/">Apple's bullshit Watch Series 11 battery claims</a></li>
<li><a href="https://echofeed.app/">Echofeed</a> is like POSSE Party, kind of</li>
<li>Only <a href="https://posseparty.com">POSSE Party</a> is POSSE Party. Working on it.</li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://www.sun-sentinel.com/2025/09/16/disney-springs-restaurant-robbed-by-suspect-wearing-scuba-gear-report/">Scuba-wearing restaurant robber swims away with cash at Disney Springs</a></li>
<li><a href="https://indiadispatch.com/p/hollow-at-the-base">India is fucked</a></li>
<li><a href="https://www.uscis.gov/newsroom/alerts/h-1b-faq">H1-B's cost $100k now</a> making India <a href="https://www.reuters.com/business/finance/trumps-h-1b-visa-crackdown-upends-indian-it-industrys-playbook-2025-09-21/">super fucked</a></li>
<li><a href="https://www.prospectmagazine.co.uk/society/history/70945/why-tradwives-arent-trad">Why tradwives aren't trad</a></li>
<li><a href="https://www.wsj.com/lifestyle/relationships/marriage-wealthy-luxury-class-3f792e67">Why Marriage Is Increasingly for the Affluent</a> (<a href="https://apple.news/AJzz0L71SRn2uCTJIeNr3sA">News+</a>)</li>
<li><a href="https://www.videogameschronicle.com/news/nintendo-switch-is-getting-a-virtual-boy-accessory-and-switch-online-games/">Virtual Boy is coming to the Switch</a></li>
<li><a href="https://www.theverge.com/news/780757/samsung-brings-ads-to-us-fridges">Samsung brings ads to US fridges</a></li>
<li><a href="https://www.theverge.com/report/781673/meta-demo-fail-connect-2025-mark-zuckerberg-google-glass-steve-jobs-wi-fi">Meta's bad demos</a> and <a href="https://techcrunch.com/2025/09/19/meta-cto-explains-why-the-smart-glasses-demos-failed-at-meta-connect-and-it-wasnt-the-wi-fi/">explanations</a></li>
<li><a href="https://simonwillison.net/2025/Sep/18/steve-jobs/#atom-everything">Steve Jobs smoking the good shit</a></li>
<li><a href="https://www.expedition33.com">Expedition 33</a></li>
<li><a href="https://en.wikipedia.org/wiki/Super_Mario_Odyssey">Super Mario Odyssey</a></li>
<li><a href="https://en.wikipedia.org/wiki/Tony_Hawk%27s_Pro_Skater_3_%2B_4">Tony Hawk's Pro Skater 3 + 4</a></li>
<li><a href="https://en.wikipedia.org/wiki/Paradise_(2025_TV_series)">Paradise Season 1</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Last_of_Us_season_2">The Last of Us Season 2</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Invincible_%28video_game%29">The Invincible</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>Hey, look! Breaking Change now has <strong>chapter support</strong> for each segment! More on how I did that while still upholding my commitment to laziness later.</p>
<p>I didn't get a good job connecting this version's release to what I was referencing, so to be clear I was referring to my <em>heart rate</em> as opposed to any other bodily functions. The other ones are getting up just fine, thank you. Get your head out of the gutter.</p>
<p>Thanks for all the great e-mails the last couple weeks! Throw yours on the pile at <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Hopefully <a href="https://join.fastmail.com/a29cc1ac">Fastmail</a> won't lose it.</p>
<p>For the folks who pronounce URLs like Earls:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v44-cant-get-it-up/","append_url_label":"Hear 🎙","content":"\u003cp\u003eHey, look! Breaking Change now has \u003cstrong\u003echapter support\u003c/strong\u003e for each segment! More on how I did that while still upholding my commitment to laziness later.\u003c/p\u003e\n\u003cp\u003eI didn't get a good job connecting this version's release to what I was referencing, so to be clear I was referring to my \u003cem\u003eheart rate\u003c/em\u003e as opposed to any other bodily functions. The other ones are getting up just fine, thank you. Get your head out of the gutter.\u003c/p\u003e\n\u003cp\u003eThanks for all the great e-mails the last couple weeks! Throw yours on the pile at \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e. Hopefully \u003ca href=\"https://join.fastmail.com/a29cc1ac\"\u003eFastmail\u003c/a\u003e won't lose it.\u003c/p\u003e\n\u003cp\u003eFor the folks who pronounce URLs like Earls:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://orlandoinformer.com/blog/fallout-hhn-2025-everything-you-need-to-know/\"\u003eFallout comes to HHN\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.macrumors.com/2025/09/12/apple-watch-series-11-increased-battery-catch/\"\u003eApple's bullshit Watch Series 11 battery claims\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://echofeed.app/\"\u003eEchofeed\u003c/a\u003e is like POSSE Party, kind of\u003c/li\u003e\n\u003cli\u003eOnly \u003ca href=\"https://posseparty.com\"\u003ePOSSE Party\u003c/a\u003e is POSSE Party. Working on it.\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.sun-sentinel.com/2025/09/16/disney-springs-restaurant-robbed-by-suspect-wearing-scuba-gear-report/\"\u003eScuba-wearing restaurant robber swims away with cash at Disney Springs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://indiadispatch.com/p/hollow-at-the-base\"\u003eIndia is fucked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.uscis.gov/newsroom/alerts/h-1b-faq\"\u003eH1-B's cost $100k now\u003c/a\u003e making India \u003ca href=\"https://www.reuters.com/business/finance/trumps-h-1b-visa-crackdown-upends-indian-it-industrys-playbook-2025-09-21/\"\u003esuper fucked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.prospectmagazine.co.uk/society/history/70945/why-tradwives-arent-trad\"\u003eWhy tradwives aren't trad\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.wsj.com/lifestyle/relationships/marriage-wealthy-luxury-class-3f792e67\"\u003eWhy Marriage Is Increasingly for the Affluent\u003c/a\u003e (\u003ca href=\"https://apple.news/AJzz0L71SRn2uCTJIeNr3sA\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/nintendo-switch-is-getting-a-virtual-boy-accessory-and-switch-online-games/\"\u003eVirtual Boy is coming to the Switch\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/news/780757/samsung-brings-ads-to-us-fridges\"\u003eSamsung brings ads to US fridges\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/report/781673/meta-demo-fail-connect-2025-mark-zuckerberg-google-glass-steve-jobs-wi-fi\"\u003eMeta's bad demos\u003c/a\u003e and \u003ca href=\"https://techcrunch.com/2025/09/19/meta-cto-explains-why-the-smart-glasses-demos-failed-at-meta-connect-and-it-wasnt-the-wi-fi/\"\u003eexplanations\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://simonwillison.net/2025/Sep/18/steve-jobs/#atom-everything\"\u003eSteve Jobs smoking the good shit\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.expedition33.com\"\u003eExpedition 33\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Super_Mario_Odyssey\"\u003eSuper Mario Odyssey\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Tony_Hawk%27s_Pro_Skater_3_%2B_4\"\u003eTony Hawk's Pro Skater 3 + 4\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Paradise_(2025_TV_series)\"\u003eParadise Season 1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Last_of_Us_season_2\"\u003eThe Last of Us Season 2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/The_Invincible_%28video_game%29\"\u003eThe Invincible\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Can't get it up","id":"https://justin.searls.co/casts/breaking-change-v44-cant-get-it-up/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v44-cant-get-it-up.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-22T14:39:55Z","title":"Can't get it up","updated_at":"2025-09-23T13:48:24-04:00","url":"https://justin.searls.co/casts/breaking-change-v44-cant-get-it-up/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-09-20-13h42m01s/</id>
      <title type="text">📸 MagSafe Ice Packs</title>
      <link href="https://justin.searls.co/shots/2025-09-20-13h42m01s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-20T19:25:14+00:00</published>
    <updated>2025-09-20T15:27:23-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-09-20-13h41m32s-cc35178.jpeg"/>
  <img src="https://justin.searls.co/shots/2025-09-20-13h41m32s-1910360.jpeg"/>
  <img src="https://justin.searls.co/shots/2025-09-20-13h41m32s-616d708.jpeg"/>
  <img src="https://justin.searls.co/shots/2025-09-20-13h41m32s-e476837.jpeg"/>
</div><p>So here's a neat way to <strong>magically cut in half</strong> the time it takes to transfer to your new iPhone.</p>
<p>Back in 2019, I realized iPhone restores run <em>much</em> faster when the device is kept cold, because thermal throttling—not data transfer rate—is the <strong>real</strong> bottleneck. The thing is, a fridge isn't quite cold enough and a freezer was way too cold (phones don't work well at below zero temperatures, apparently). So the stopgap solution I initially arrived at was to <a href="https://x.com/searls/status/1147928119170555904?s=20">sandwich the phone between a couple ice packs</a>. Not only did it work great, I was tickled to see a few sites like <a href="https://www.cultofmac.com/news/drastically-speed-up-icloud-restore-ice-ice-baby">Cult of Mac</a> publish how-to guides on the technique.</p>
<p>Anyway, figuring out how to best cool my iPhones to expedite a <a href="https://support.apple.com/en-us/117383?device-type=iphone">direct transfer restore</a> has become something of an annual tradition in the Searls household. This year, I had the foresight to buy small ice packs and then stick MagSafe-compatible receiver magnets onto them.</p>
<p>If you're interested, here's what you're looking at:</p>
<ul>
<li><a href="https://amzn.to/4gw0Tfw">Ice Packs</a></li>
<li><a href="https://amzn.to/46dpWAD">Adhesive Magnets</a></li>
</ul>
<p>Those are affiliate links, which I feel like I should disclose because this website definitely counts as a journalism.</p>

]]></content>
    <summary type="html"><![CDATA[<p>So here's a neat way to <strong>magically cut in half</strong> the time it takes to transfer to your new iPhone.</p>
<p>Back in 2019, I realized iPhone restores run <em>much</em> faster when the device is kept cold, because thermal throttling—not data transfer rate—is the <strong>real</strong> bottleneck. The thing is, a fridge isn't quite cold enough and a freezer was way too cold (phones don't work well at below zero temperatures, apparently). So the stopgap solution I initially arrived at was to <a href="https://x.com/searls/status/1147928119170555904?s=20">sandwich the phone between a couple ice packs</a>. Not only did it work great, I was tickled to see a few sites like <a href="https://www.cultofmac.com/news/drastically-speed-up-icloud-restore-ice-ice-baby">Cult of Mac</a> publish how-to guides on the technique.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-09-20-13h42m01s/","append_url_label":"View 📸","content":"\u003cp\u003eSo here's a neat way to \u003cstrong\u003emagically cut in half\u003c/strong\u003e the time it takes to transfer to your new iPhone.\u003c/p\u003e\n\u003cp\u003eBack in 2019, I realized iPhone restores run \u003cem\u003emuch\u003c/em\u003e faster when the device is kept cold, because thermal throttling—not data transfer rate—is the \u003cstrong\u003ereal\u003c/strong\u003e bottleneck. The thing is, a fridge isn't quite cold enough and a freezer was way too cold (phones don't work well at below zero temperatures, apparently). So the stopgap solution I initially arrived at was to \u003ca href=\"https://x.com/searls/status/1147928119170555904?s=20\"\u003esandwich the phone between a couple ice packs\u003c/a\u003e. Not only did it work great, I was tickled to see a few sites like \u003ca href=\"https://www.cultofmac.com/news/drastically-speed-up-icloud-restore-ice-ice-baby\"\u003eCult of Mac\u003c/a\u003e publish how-to guides on the technique.\u003c/p\u003e\n\u003cp\u003eAnyway, figuring out how to best cool my iPhones to expedite a \u003ca href=\"https://support.apple.com/en-us/117383?device-type=iphone\"\u003edirect transfer restore\u003c/a\u003e has become something of an annual tradition in the Searls household. This year, I had the foresight to buy small ice packs and then stick MagSafe-compatible receiver magnets onto them.\u003c/p\u003e\n\u003cp\u003eIf you're interested, here's what you're looking at:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://amzn.to/4gw0Tfw\"\u003eIce Packs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://amzn.to/46dpWAD\"\u003eAdhesive Magnets\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThose are affiliate links, which I feel like I should disclose because this website definitely counts as a journalism.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-09-20-13h42m01s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-09-20-13h41m32s-cc35178.jpeg"},{"type":"image","url":"https://justin.searls.co/shots/2025-09-20-13h41m32s-1910360.jpeg"},{"type":"image","url":"https://justin.searls.co/shots/2025-09-20-13h41m32s-616d708.jpeg"},{"type":"image","url":"https://justin.searls.co/shots/2025-09-20-13h41m32s-e476837.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-09-20-13h41m32s-cc35178.jpeg","platform_overrides":{},"published_at":"2025-09-20T19:25:14Z","title":"MagSafe Ice Packs","updated_at":"2025-09-20T15:27:23-04:00","url":"https://justin.searls.co/shots/2025-09-20-13h42m01s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/why-i-bought-the-iphone-air/</id>
      <title type="text">📄 Why I bought the iPhone Air</title>
      <link href="https://justin.searls.co/posts/why-i-bought-the-iphone-air/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-19T20:02:05+00:00</published>
    <updated>2025-09-19T16:11:25-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>If you <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">read</a> <a href="https://www.theverge.com/tech/779588/apple-iphone-air-review-battery-camera">reviews</a> <a href="https://www.wired.com/review/apple-iphone-air/">of</a> <a href="https://9to5mac.com/2025/09/17/iphone-air-review/">iPhone</a> <a href="https://www.nytimes.com/wirecutter/reviews/iphone-air-review/">Air</a>, you will quickly find that the pundit class has concluded it's a mixed bag. A &quot;compromised&quot; product, even.</p>
<p>For tech reviewers lining up all these phones next to each other and weighing the pros and cons, I can absolutely understand how iPhone Air doesn't seem to earn its spot in the lineup at $999. Just look at all these downsides:</p>
<ul>
<li><strong>Battery:</strong> The battery life is slightly worse than iPhone 17 and much worse than iPhone 17 Pro</li>
<li><strong>Performance:</strong> The A19 Pro chip in iPhone is not only binned (it loses a GPU core), it's so thermal-constrained it probably wouldn't be able to use that core anyway—<a href="https://youtu.be/BU9gKr1miS8?si=RQpyC-lwkRNrs5EI">one review</a> saw significantly worse sustained performance from iPhone Air than the <em>base level</em> A19 in iPhone 17</li>
<li><strong>Speakers:</strong> iPhone Air lacks stereo speakers, a feature that was added in iPhone 7 (a consolation prize for dropping the headphone port, I guess)</li>
<li><strong>Cameras:</strong> iPhone Air offers the same(-ish) main camera as its model year brethren, but lacks an ultra-wide lens, a telephoto lens, and a LIDAR sensor. That means no macro mode, no optical quality zoom beyond 2x, no spatial photo or video capture, and reduced portrait/AR performance</li>
</ul>
<p>In <a href="https://atp.fm/657">its preliminary assessment</a> of Apple's offerings, The Accidental Tech podcast went so far as to speculate iPhone Air wouldn't appeal to tech enthusiasts at all, and perhaps will only sell to fashion-conscious consumers who won't know what they're missing.</p>
<p>Indeed, the through-line connecting every review I've read—whether framed positively or negatively in its conclusions—is a struggle to answer the question, <em><strong>&quot;Who is iPhone Air for?&quot;</strong></em></p>
<p>Well, it's for me. That's who.</p>
<p>Whenever the claim is made that, &quot;nobody is asking for a thinner iPhone,&quot; <a href="/takes/2025-06-02-15h43m58s/">I make a point of piping up</a>. My favorite iPhone of the last decade was easily the <a href="https://en.wikipedia.org/wiki/IPhone_13">iPhone 13 mini</a>, and when I upgraded to iPhone 14 Pro, it was so heavy that I got in the habit of leaving the house with only my cellular Apple Watch Series 8. My favorite Apple computer of all time was <a href="/posts/the-12-macbook-was-announced-10-years-ago/">the 12&quot; MacBook</a>, and I am perennially disappointed that Apple has deprioritized weight ever since (the lightest Mac currently on offer is the <a href="https://support.apple.com/en-us/122209">MacBook Air</a>, which is <em><strong>33% heavier</strong></em> than the decade-old MacBook).</p>
<p>That's why I didn't hesitate to put in an order for the new iPhone Air, downsides and all:</p>
<ul>
<li><strong>Battery:</strong> Where others see the 39-hour battery life on iPhone 17 Pro Max as a triumph, I see it as <strong>dead fucking weight</strong>. My iPhone spends 90% of every day on a MagSafe charger near my front door. The iPhone Air's battery is about a third smaller than iPhone 16 Pro's battery, but in the past year I've only seen my battery dip below 33% a handful of times. Tell you what, when I'm traveling, I'll bring an <a href="https://www.apple.com/shop/product/MGPG4AM/A/iphone-air-magsafe-battery">iPhone Air MagSafe Battery</a> just to put your mind at ease. It's true, I may need the last third of my phone's battery 10% of the time, but I benefit from my devices' relative size and weight advantages 100% of the time</li>
<li><strong>Performance:</strong> There isn't a single thing I use my iPhone for that takes full advantage of its computing power, and if ever there was, it would be a signal to switch to a more serious device like an iPad Pro or a Mac. At the same time, I get it. It sucks to see your new device post shitty benchmark scores, because it confirms that you have a tinier penis than your friends. I'll just have to find a way to cope, I guess</li>
<li><strong>Speakers:</strong> I'm not here to judge, but I can't understand why anyone uses their iPhone speakers at all. The only ones I see using this feature are people's shitheel children, inconsiderate assholes, and airport workers on break who probably can't afford AirPods. If you use your speakers in some non-disruptive way, God bless—what goes on in the privacy of your own home is up to you</li>
<li><strong>Cameras:</strong> iPhone Air's rear camera system is undoubtedly a shortcoming. Since Becky is going Pro, she's enabling my Air purchase by signing up for the emotional labor of being the family's chief photographer for the 2025-2026 season. We trade off on this—I lugged my iPhone 16 Pro around last year so she could lighten her load with a green iPhone 16. Even still, last year fewer than 5% of my photos were taken with either of the ultra-wide or telephoto lens, so I doubt I'll miss them</li>
</ul>
<p>As someone who has been using iOS 26 all summer, there's one more reason I'm glad to be switching to iPhone Air: <strong>information density is significantly lower throughout iOS 26, which has a dramatic negative impact on the usability of smaller displays, <em>even</em> the 6.3&quot; iPhone 16 Pro.</strong> That's because with the 26 series of releases, the new unified design across Apple's platforms features <em>much</em> more negative space between its controls and views—all in the name of <a href="https://www.createwithswift.com/exploring-concentricity-in-swiftui/">concentricity</a>. As soon as I updated my iPhone 16 Pro to the iOS 26 beta, I was immediately put off by how much less text was being rendered and how much more I was scrolling to get what I needed. By ordering another 6.3&quot; iPhone, I'd be locking in those losses. But iPhone Air's larger 6.6&quot; display claws back <em>just enough</em> additional screen estate to make it a wash. I don't want a bigger screen, I want an OS that doesn't punish smaller screens. And it's nice to want things.</p>
<p>Will iPhone Air sell well? Don't ask me, I'm the guy who just said his favorite iPhone was iPhone 13 mini and favorite Mac was the 12&quot; MacBook—both of which flopped. I'm certainly not arguing this thing is going to light sales charts on fire, simply that it's not <em>entirely</em> irrational to conclude that iPhone Air is the best phone in this year's line up.</p>
<p>Anyway, this is just my take. You do you.</p>]]></content>
    <summary type="html"><![CDATA[<p>If you <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">read</a> <a href="https://www.theverge.com/tech/779588/apple-iphone-air-review-battery-camera">reviews</a> <a href="https://www.wired.com/review/apple-iphone-air/">of</a> <a href="https://9to5mac.com/2025/09/17/iphone-air-review/">iPhone</a> <a href="https://www.nytimes.com/wirecutter/reviews/iphone-air-review/">Air</a>, you will quickly find that the pundit class has concluded it's a mixed bag. A &quot;compromised&quot; product, even.</p>
<p>For tech reviewers lining up all these phones next to each other and weighing the pros and cons, I can absolutely understand how iPhone Air doesn't seem to earn its spot in the lineup at $999. Just look at all these downsides:</p>
<ul>
<li><strong>Battery:</strong> The battery life is slightly worse than iPhone 17 and much worse than iPhone 17 Pro</li>
<li><strong>Performance:</strong> The A19 Pro chip in iPhone is not only binned (it loses a GPU core), it's so thermal-constrained it probably wouldn't be able to use that core anyway—<a href="https://youtu.be/BU9gKr1miS8?si=RQpyC-lwkRNrs5EI">one review</a> saw significantly worse sustained performance from iPhone Air than the <em>base level</em> A19 in iPhone 17</li>
<li><strong>Speakers:</strong> iPhone Air lacks stereo speakers, a feature that was added in iPhone 7 (a consolation prize for dropping the headphone port, I guess)</li>
<li><strong>Cameras:</strong> iPhone Air offers the same(-ish) main camera as its model year brethren, but lacks an ultra-wide lens, a telephoto lens, and a LIDAR sensor. That means no macro mode, no optical quality zoom beyond 2x, no spatial photo or video capture, and reduced portrait/AR performance</li>
</ul>
<p>In <a href="https://atp.fm/657">its preliminary assessment</a> of Apple's offerings, The Accidental Tech podcast went so far as to speculate iPhone Air wouldn't appeal to tech enthusiasts at all, and perhaps will only sell to fashion-conscious consumers who won't know what they're missing.</p>
<p>Indeed, the through-line connecting every review I've read—whether framed positively or negatively in its conclusions—is a struggle to answer the question, <em><strong>&quot;Who is iPhone Air for?&quot;</strong></em></p>
<p>Well, it's for me. That's who.</p>
<p>Whenever the claim is made that, &quot;nobody is asking for a thinner iPhone,&quot; <a href="/takes/2025-06-02-15h43m58s/">I make a point of piping up</a>. My favorite iPhone of the last decade was easily the <a href="https://en.wikipedia.org/wiki/IPhone_13">iPhone 13 mini</a>, and when I upgraded to iPhone 14 Pro, it was so heavy that I got in the habit of leaving the house with only my cellular Apple Watch Series 8. My favorite Apple computer of all time was <a href="/posts/the-12-macbook-was-announced-10-years-ago/">the 12&quot; MacBook</a>, and I am perennially disappointed that Apple has deprioritized weight ever since (the lightest Mac currently on offer is the <a href="https://support.apple.com/en-us/122209">MacBook Air</a>, which is <em><strong>33% heavier</strong></em> than the decade-old MacBook).</p>
<p>That's why I didn't hesitate to put in an order for the new iPhone Air, downsides and all:</p>
<ul>
<li><strong>Battery:</strong> Where others see the 39-hour battery life on iPhone 17 Pro Max as a triumph, I see it as <strong>dead fucking weight</strong>. My iPhone spends 90% of every day on a MagSafe charger near my front door. The iPhone Air's battery is about a third smaller than iPhone 16 Pro's battery, but in the past year I've only seen my battery dip below 33% a handful of times. Tell you what, when I'm traveling, I'll bring an <a href="https://www.apple.com/shop/product/MGPG4AM/A/iphone-air-magsafe-battery">iPhone Air MagSafe Battery</a> just to put your mind at ease. It's true, I may need the last third of my phone's battery 10% of the time, but I benefit from my devices' relative size and weight advantages 100% of the time</li>
<li><strong>Performance:</strong> There isn't a single thing I use my iPhone for that takes full advantage of its computing power, and if ever there was, it would be a signal to switch to a more serious device like an iPad Pro or a Mac. At the same time, I get it. It sucks to see your new device post shitty benchmark scores, because it confirms that you have a tinier penis than your friends. I'll just have to find a way to cope, I guess</li>
<li><strong>Speakers:</strong> I'm not here to judge, but I can't understand why anyone uses their iPhone speakers at all. The only ones I see using this feature are people's shitheel children, inconsiderate assholes, and airport workers on break who probably can't afford AirPods. If you use your speakers in some non-disruptive way, God bless—what goes on in the privacy of your own home is up to you</li>
<li><strong>Cameras:</strong> iPhone Air's rear camera system is undoubtedly a shortcoming. Since Becky is going Pro, she's enabling my Air purchase by signing up for the emotional labor of being the family's chief photographer for the 2025-2026 season. We trade off on this—I lugged my iPhone 16 Pro around last year so she could lighten her load with a green iPhone 16. Even still, last year fewer than 5% of my photos were taken with either of the ultra-wide or telephoto lens, so I doubt I'll miss them</li>
</ul>
<p>As someone who has been using iOS 26 all summer, there's one more reason I'm glad to be switching to iPhone Air: <strong>information density is significantly lower throughout iOS 26, which has a dramatic negative impact on the usability of smaller displays, <em>even</em> the 6.3&quot; iPhone 16 Pro.</strong> That's because with the 26 series of releases, the new unified design across Apple's platforms features <em>much</em> more negative space between its controls and views—all in the name of <a href="https://www.createwithswift.com/exploring-concentricity-in-swiftui/">concentricity</a>. As soon as I updated my iPhone 16 Pro to the iOS 26 beta, I was immediately put off by how much less text was being rendered and how much more I was scrolling to get what I needed. By ordering another 6.3&quot; iPhone, I'd be locking in those losses. But iPhone Air's larger 6.6&quot; display claws back <em>just enough</em> additional screen estate to make it a wash. I don't want a bigger screen, I want an OS that doesn't punish smaller screens. And it's nice to want things.</p>
<p>Will iPhone Air sell well? Don't ask me, I'm the guy who just said his favorite iPhone was iPhone 13 mini and favorite Mac was the 12&quot; MacBook—both of which flopped. I'm certainly not arguing this thing is going to light sales charts on fire, simply that it's not <em>entirely</em> irrational to conclude that iPhone Air is the best phone in this year's line up.</p>
<p>Anyway, this is just my take. You do you.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/why-i-bought-the-iphone-air/","append_url_label":"Read 📄","content":"\u003cp\u003eIf you \u003ca href=\"https://www.tomsguide.com/phones/iphones/iphone-air-review\"\u003eread\u003c/a\u003e \u003ca href=\"https://www.theverge.com/tech/779588/apple-iphone-air-review-battery-camera\"\u003ereviews\u003c/a\u003e \u003ca href=\"https://www.wired.com/review/apple-iphone-air/\"\u003eof\u003c/a\u003e \u003ca href=\"https://9to5mac.com/2025/09/17/iphone-air-review/\"\u003eiPhone\u003c/a\u003e \u003ca href=\"https://www.nytimes.com/wirecutter/reviews/iphone-air-review/\"\u003eAir\u003c/a\u003e, you will quickly find that the pundit class has concluded it's a mixed bag. A \u0026quot;compromised\u0026quot; product, even.\u003c/p\u003e\n\u003cp\u003eFor tech reviewers lining up all these phones next to each other and weighing the pros and cons, I can absolutely understand how iPhone Air doesn't seem to earn its spot in the lineup at $999. Just look at all these downsides:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBattery:\u003c/strong\u003e The battery life is slightly worse than iPhone 17 and much worse than iPhone 17 Pro\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePerformance:\u003c/strong\u003e The A19 Pro chip in iPhone is not only binned (it loses a GPU core), it's so thermal-constrained it probably wouldn't be able to use that core anyway—\u003ca href=\"https://youtu.be/BU9gKr1miS8?si=RQpyC-lwkRNrs5EI\"\u003eone review\u003c/a\u003e saw significantly worse sustained performance from iPhone Air than the \u003cem\u003ebase level\u003c/em\u003e A19 in iPhone 17\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSpeakers:\u003c/strong\u003e iPhone Air lacks stereo speakers, a feature that was added in iPhone 7 (a consolation prize for dropping the headphone port, I guess)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCameras:\u003c/strong\u003e iPhone Air offers the same(-ish) main camera as its model year brethren, but lacks an ultra-wide lens, a telephoto lens, and a LIDAR sensor. That means no macro mode, no optical quality zoom beyond 2x, no spatial photo or video capture, and reduced portrait/AR performance\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn \u003ca href=\"https://atp.fm/657\"\u003eits preliminary assessment\u003c/a\u003e of Apple's offerings, The Accidental Tech podcast went so far as to speculate iPhone Air wouldn't appeal to tech enthusiasts at all, and perhaps will only sell to fashion-conscious consumers who won't know what they're missing.\u003c/p\u003e\n\u003cp\u003eIndeed, the through-line connecting every review I've read—whether framed positively or negatively in its conclusions—is a struggle to answer the question, \u003cem\u003e\u003cstrong\u003e\u0026quot;Who is iPhone Air for?\u0026quot;\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eWell, it's for me. That's who.\u003c/p\u003e\n\u003cp\u003eWhenever the claim is made that, \u0026quot;nobody is asking for a thinner iPhone,\u0026quot; \u003ca href=\"/takes/2025-06-02-15h43m58s/\"\u003eI make a point of piping up\u003c/a\u003e. My favorite iPhone of the last decade was easily the \u003ca href=\"https://en.wikipedia.org/wiki/IPhone_13\"\u003eiPhone 13 mini\u003c/a\u003e, and when I upgraded to iPhone 14 Pro, it was so heavy that I got in the habit of leaving the house with only my cellular Apple Watch Series 8. My favorite Apple computer of all time was \u003ca href=\"/posts/the-12-macbook-was-announced-10-years-ago/\"\u003ethe 12\u0026quot; MacBook\u003c/a\u003e, and I am perennially disappointed that Apple has deprioritized weight ever since (the lightest Mac currently on offer is the \u003ca href=\"https://support.apple.com/en-us/122209\"\u003eMacBook Air\u003c/a\u003e, which is \u003cem\u003e\u003cstrong\u003e33% heavier\u003c/strong\u003e\u003c/em\u003e than the decade-old MacBook).\u003c/p\u003e\n\u003cp\u003eThat's why I didn't hesitate to put in an order for the new iPhone Air, downsides and all:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBattery:\u003c/strong\u003e Where others see the 39-hour battery life on iPhone 17 Pro Max as a triumph, I see it as \u003cstrong\u003edead fucking weight\u003c/strong\u003e. My iPhone spends 90% of every day on a MagSafe charger near my front door. The iPhone Air's battery is about a third smaller than iPhone 16 Pro's battery, but in the past year I've only seen my battery dip below 33% a handful of times. Tell you what, when I'm traveling, I'll bring an \u003ca href=\"https://www.apple.com/shop/product/MGPG4AM/A/iphone-air-magsafe-battery\"\u003eiPhone Air MagSafe Battery\u003c/a\u003e just to put your mind at ease. It's true, I may need the last third of my phone's battery 10% of the time, but I benefit from my devices' relative size and weight advantages 100% of the time\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePerformance:\u003c/strong\u003e There isn't a single thing I use my iPhone for that takes full advantage of its computing power, and if ever there was, it would be a signal to switch to a more serious device like an iPad Pro or a Mac. At the same time, I get it. It sucks to see your new device post shitty benchmark scores, because it confirms that you have a tinier penis than your friends. I'll just have to find a way to cope, I guess\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSpeakers:\u003c/strong\u003e I'm not here to judge, but I can't understand why anyone uses their iPhone speakers at all. The only ones I see using this feature are people's shitheel children, inconsiderate assholes, and airport workers on break who probably can't afford AirPods. If you use your speakers in some non-disruptive way, God bless—what goes on in the privacy of your own home is up to you\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCameras:\u003c/strong\u003e iPhone Air's rear camera system is undoubtedly a shortcoming. Since Becky is going Pro, she's enabling my Air purchase by signing up for the emotional labor of being the family's chief photographer for the 2025-2026 season. We trade off on this—I lugged my iPhone 16 Pro around last year so she could lighten her load with a green iPhone 16. Even still, last year fewer than 5% of my photos were taken with either of the ultra-wide or telephoto lens, so I doubt I'll miss them\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAs someone who has been using iOS 26 all summer, there's one more reason I'm glad to be switching to iPhone Air: \u003cstrong\u003einformation density is significantly lower throughout iOS 26, which has a dramatic negative impact on the usability of smaller displays, \u003cem\u003eeven\u003c/em\u003e the 6.3\u0026quot; iPhone 16 Pro.\u003c/strong\u003e That's because with the 26 series of releases, the new unified design across Apple's platforms features \u003cem\u003emuch\u003c/em\u003e more negative space between its controls and views—all in the name of \u003ca href=\"https://www.createwithswift.com/exploring-concentricity-in-swiftui/\"\u003econcentricity\u003c/a\u003e. As soon as I updated my iPhone 16 Pro to the iOS 26 beta, I was immediately put off by how much less text was being rendered and how much more I was scrolling to get what I needed. By ordering another 6.3\u0026quot; iPhone, I'd be locking in those losses. But iPhone Air's larger 6.6\u0026quot; display claws back \u003cem\u003ejust enough\u003c/em\u003e additional screen estate to make it a wash. I don't want a bigger screen, I want an OS that doesn't punish smaller screens. And it's nice to want things.\u003c/p\u003e\n\u003cp\u003eWill iPhone Air sell well? Don't ask me, I'm the guy who just said his favorite iPhone was iPhone 13 mini and favorite Mac was the 12\u0026quot; MacBook—both of which flopped. I'm certainly not arguing this thing is going to light sales charts on fire, simply that it's not \u003cem\u003eentirely\u003c/em\u003e irrational to conclude that iPhone Air is the best phone in this year's line up.\u003c/p\u003e\n\u003cp\u003eAnyway, this is just my take. You do you.\u003c/p\u003e","id":"https://justin.searls.co/posts/why-i-bought-the-iphone-air/","og_image":"https://justin.searls.co/img/social/posts/why-i-bought-the-iphone-air.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-19T20:02:05Z","title":"Why I bought the iPhone Air","updated_at":"2025-09-19T16:11:25-04:00","url":"https://justin.searls.co/posts/why-i-bought-the-iphone-air/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-09-18-11h01m43s/</id>
      <title type="text">📸 Pro-tip: Dodge The Verge&#39;s Paywall</title>
      <link href="https://justin.searls.co/shots/2025-09-18-11h01m43s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-18T15:01:43+00:00</published>
    <updated>2025-09-18T15:03:41+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-09-18-11h00m51s-92040a4.jpeg"/>
  <img src="https://justin.searls.co/shots/2025-09-18-11h00m51s-f250a8b.jpeg"/>
</div><p>The Verge is included in Apple News+, so if you're an Apple One subscriber (as I imagine, many Verge readers are), whenever you hit the paywall in your browser you can—at least from Safari's Share Sheet—very easily open the same article in the News app and avoid the paywall.</p>

]]></content>
    <summary type="html"><![CDATA[<p>The Verge is included in Apple News+, so if you're an Apple One subscriber (as I imagine, many Verge readers are), whenever you hit the paywall in your browser you can—at least from Safari's Share Sheet—very easily open the same article in the News app and avoid the paywall.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-09-18-11h01m43s/","append_url_label":"View 📸","content":"\u003cp\u003eThe Verge is included in Apple News+, so if you're an Apple One subscriber (as I imagine, many Verge readers are), whenever you hit the paywall in your browser you can—at least from Safari's Share Sheet—very easily open the same article in the News app and avoid the paywall.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-09-18-11h01m43s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-09-18-11h00m51s-92040a4.jpeg"},{"type":"image","url":"https://justin.searls.co/shots/2025-09-18-11h00m51s-f250a8b.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-09-18-11h00m51s-92040a4.jpeg","platform_overrides":{},"published_at":"2025-09-18T15:01:43Z","title":"Pro-tip: Dodge The Verge's Paywall","updated_at":"2025-09-18T15:03:41Z","url":"https://justin.searls.co/shots/2025-09-18-11h01m43s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/</id>
      <title type="text">🔗 Tot is a great coding agent companion</title>
        <link href="https://tot.rocks/" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-18T12:07:33+00:00</published>
    <updated>2025-09-18T12:30:01+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>I bought The Iconfactory's <a href="https://tot.rocks">Tot app</a> years ago when it first released, but found I didn't really have a need for a semi-ephemeral, intentionally finite scratchpad.</p>
<p>That changed this summer! Why? Because in this nascent era of terminal-based coding agents, I have found a semi-ephemeral, intentionally finite scratchpad to be invaluable.</p>
<p>Use cases include:</p>
<ul>
<li>Writing long prompts directly in the terminal only for things to go wrong can sometimes make it hard or even impossible to recover later, so instead I write them first in Tot and then paste them into my terminal. If anything goes wrong, I no longer try to multi-shot it and watch the model spin, I just restart the chat, tweak the prompt, and try again without any fussy in-terminal text editing</li>
<li>While I could choose to parallelize the shit out of my coding agent and send it off to implement a half dozen features in separate git worktrees, my puny brain prefers to single-thread a single project at a time. As a result, I like to use each page in Tot to keep follow-up tasks in reserve. This way, as soon as I think of the next thing I want the agent to do, I have a place to immediately type it without interrupting the agent. As soon as it finishes its current task, I can keep the hopper saturated by pasting in the next-highest-priority task from the corresponding Tot page</li>
<li>Maintaining to-do lists as text files within the working directory for the agent to work from can be a wonderful workflow, but there are times where I don't want to contaminate the agent's context with additional complexity until we're standing on a firm foundation. I've found that long to-do lists and plans will often lead to agents spreading themselves too thin by attempting to future-proof or cover a bunch of cases poorly</li>
</ul>
<p>As I type this I'm sitting in my Vision Pro with the hilariously-wide Ultrawide Mac Virtual Display and literally running four top-to-bottom terminals, each cranking on separate projects simultaneously. Tot has become integral to my workflow as I spend more and more time playing whackamole to feed each agent work.</p>
<p>(While the agents are all humming along, I typically use that time reviewing each project's current changesets in <a href="https://git-fork.com">Fork</a>—another excellent Mac app—to identify what I need the agent to do next.)</p>

<p>🔗 <a href="https://tot.rocks/" title="Original Article">tot.rocks</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>I bought The Iconfactory's <a href="https://tot.rocks">Tot app</a> years ago when it first released, but found I didn't really have a need for a semi-ephemeral, intentionally finite scratchpad.</p>
<p>That changed this summer! Why? Because in this nascent era of terminal-based coding agents, I have found a semi-ephemeral, intentionally finite scratchpad to be invaluable.</p>
<p>Use cases include:</p>
<ul>
<li>Writing long prompts directly in the terminal only for things to go wrong can sometimes make it hard or even impossible to recover later, so instead I write them first in Tot and then paste them into my terminal. If anything goes wrong, I no longer try to multi-shot it and watch the model spin, I just restart the chat, tweak the prompt, and try again without any fussy in-terminal text editing</li>
<li>While I could choose to parallelize the shit out of my coding agent and send it off to implement a half dozen features in separate git worktrees, my puny brain prefers to single-thread a single project at a time. As a result, I like to use each page in Tot to keep follow-up tasks in reserve. This way, as soon as I think of the next thing I want the agent to do, I have a place to immediately type it without interrupting the agent. As soon as it finishes its current task, I can keep the hopper saturated by pasting in the next-highest-priority task from the corresponding Tot page</li>
<li>Maintaining to-do lists as text files within the working directory for the agent to work from can be a wonderful workflow, but there are times where I don't want to contaminate the agent's context with additional complexity until we're standing on a firm foundation. I've found that long to-do lists and plans will often lead to agents spreading themselves too thin by attempting to future-proof or cover a bunch of cases poorly</li>
</ul>
<p>As I type this I'm sitting in my Vision Pro with the hilariously-wide Ultrawide Mac Virtual Display and literally running four top-to-bottom terminals, each cranking on separate projects simultaneously. Tot has become integral to my workflow as I spend more and more time playing whackamole to feed each agent work.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/","append_url_label":"Click 🔗","content":"\u003cp\u003eI bought The Iconfactory's \u003ca href=\"https://tot.rocks\"\u003eTot app\u003c/a\u003e years ago when it first released, but found I didn't really have a need for a semi-ephemeral, intentionally finite scratchpad.\u003c/p\u003e\n\u003cp\u003eThat changed this summer! Why? Because in this nascent era of terminal-based coding agents, I have found a semi-ephemeral, intentionally finite scratchpad to be invaluable.\u003c/p\u003e\n\u003cp\u003eUse cases include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWriting long prompts directly in the terminal only for things to go wrong can sometimes make it hard or even impossible to recover later, so instead I write them first in Tot and then paste them into my terminal. If anything goes wrong, I no longer try to multi-shot it and watch the model spin, I just restart the chat, tweak the prompt, and try again without any fussy in-terminal text editing\u003c/li\u003e\n\u003cli\u003eWhile I could choose to parallelize the shit out of my coding agent and send it off to implement a half dozen features in separate git worktrees, my puny brain prefers to single-thread a single project at a time. As a result, I like to use each page in Tot to keep follow-up tasks in reserve. This way, as soon as I think of the next thing I want the agent to do, I have a place to immediately type it without interrupting the agent. As soon as it finishes its current task, I can keep the hopper saturated by pasting in the next-highest-priority task from the corresponding Tot page\u003c/li\u003e\n\u003cli\u003eMaintaining to-do lists as text files within the working directory for the agent to work from can be a wonderful workflow, but there are times where I don't want to contaminate the agent's context with additional complexity until we're standing on a firm foundation. I've found that long to-do lists and plans will often lead to agents spreading themselves too thin by attempting to future-proof or cover a bunch of cases poorly\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAs I type this I'm sitting in my Vision Pro with the hilariously-wide Ultrawide Mac Virtual Display and literally running four top-to-bottom terminals, each cranking on separate projects simultaneously. Tot has become integral to my workflow as I spend more and more time playing whackamole to feed each agent work.\u003c/p\u003e\n\u003cp\u003e(While the agents are all humming along, I typically use that time reviewing each project's current changesets in \u003ca href=\"https://git-fork.com\"\u003eFork\u003c/a\u003e—another excellent Mac app—to identify what I need the agent to do next.)\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/","og_image":"https://tot.rocks/images/Tot_Hero.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-18T12:07:33Z","related_url":"https://tot.rocks/","title":"Tot is a great coding agent companion","updated_at":"2025-09-18T12:30:01Z","url":"https://justin.searls.co/links/2025-09-18-tot-is-a-great-coding-agent-companion/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-09-17-15h30m24s/</id>
      <title type="text">📸 So much for Airplane Mode</title>
      <link href="https://justin.searls.co/shots/2025-09-17-15h30m24s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-17T19:30:24+00:00</published>
    <updated>2025-09-17T15:33:41-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-09-17-15h29m47s-ec42faf.jpeg"/>
</div><p>My <a href="https://www.apple.com/shop/product/MGPG4AM/A/iphone-air-magsafe-battery">iPhone Air MagSafe Battery</a> came in the mail today, and it was the first time I've ever seen this ridiculous sticker.</p>
<p>Does this mean the product can't be taken on passenger planes? Because the only risk factor other than the product the battery itself in the box is a few layers of cardboard.</p>
<p>Quick impressions on the product:</p>
<ul>
<li>It is a battery</li>
<li>It can be charged via USB-C and charge other devices via USB-C</li>
<li>It can connect to phones <em>other than</em> the iPhone Air, but generally only sideways, and iOS 26 handles it in software correctly (meaning whatever software integration Apple built for the product isn't gated to iPhone Air serial numbers)</li>
<li>It will attach to MagSafe chargers but not charge from them</li>
<li>I haven't tried putting my AirPods Pro 2 case on them, but wouldn't be surprised if it charged them</li>
</ul>

]]></content>
    <summary type="html"><![CDATA[<p>My <a href="https://www.apple.com/shop/product/MGPG4AM/A/iphone-air-magsafe-battery">iPhone Air MagSafe Battery</a> came in the mail today, and it was the first time I've ever seen this ridiculous sticker.</p>
<p>Does this mean the product can't be taken on passenger planes? Because the only risk factor other than the product the battery itself in the box is a few layers of cardboard.</p>
<p>Quick impressions on the product:</p>
<ul>
<li>It is a battery</li>
<li>It can be charged via USB-C and charge other devices via USB-C</li>
<li>It can connect to phones <em>other than</em> the iPhone Air, but generally only sideways, and iOS 26 handles it in software correctly (meaning whatever software integration Apple built for the product isn't gated to iPhone Air serial numbers)</li>
<li>It will attach to MagSafe chargers but not charge from them</li>
<li>I haven't tried putting my AirPods Pro 2 case on them, but wouldn't be surprised if it charged them</li>
</ul>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-09-17-15h30m24s/","append_url_label":"View 📸","content":"\u003cp\u003eMy \u003ca href=\"https://www.apple.com/shop/product/MGPG4AM/A/iphone-air-magsafe-battery\"\u003eiPhone Air MagSafe Battery\u003c/a\u003e came in the mail today, and it was the first time I've ever seen this ridiculous sticker.\u003c/p\u003e\n\u003cp\u003eDoes this mean the product can't be taken on passenger planes? Because the only risk factor other than the product the battery itself in the box is a few layers of cardboard.\u003c/p\u003e\n\u003cp\u003eQuick impressions on the product:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt is a battery\u003c/li\u003e\n\u003cli\u003eIt can be charged via USB-C and charge other devices via USB-C\u003c/li\u003e\n\u003cli\u003eIt can connect to phones \u003cem\u003eother than\u003c/em\u003e the iPhone Air, but generally only sideways, and iOS 26 handles it in software correctly (meaning whatever software integration Apple built for the product isn't gated to iPhone Air serial numbers)\u003c/li\u003e\n\u003cli\u003eIt will attach to MagSafe chargers but not charge from them\u003c/li\u003e\n\u003cli\u003eI haven't tried putting my AirPods Pro 2 case on them, but wouldn't be surprised if it charged them\u003c/li\u003e\n\u003c/ul\u003e\n","id":"https://justin.searls.co/shots/2025-09-17-15h30m24s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-09-17-15h29m47s-ec42faf.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-09-17-15h29m47s-ec42faf.jpeg","platform_overrides":{},"published_at":"2025-09-17T19:30:24Z","title":"So much for Airplane Mode","updated_at":"2025-09-17T15:33:41-04:00","url":"https://justin.searls.co/shots/2025-09-17-15h30m24s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-09-15-the-last-days-of-social-media/</id>
      <title type="text">🔗 The Last Days Of Social Media</title>
        <link href="https://www.noemamag.com/the-last-days-of-social-media/" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-09-15-the-last-days-of-social-media/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-15T16:21:31+00:00</published>
    <updated>2025-09-15T16:32:59+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>James O'Sullivan has a banger of an editorial on the &quot;<a href="https://www.noemamag.com/the-last-days-of-social-media/">late attention economy</a>&quot;, including this bit illustrating the various platforms' pivot from active participation to passive absorption:</p>
<blockquote>
<p>While content proliferates, engagement is evaporating. Average interaction rates across major platforms are declining fast: Facebook and X posts now scrape an average 0.15% engagement, while Instagram has dropped 24% year-on-year. Even TikTok has begun to plateau. People aren't connecting or conversing on social media like they used to; they're just wading through slop, that is, low-effort, low-quality content produced at scale, often with AI, for engagement.</p>
</blockquote>
<p>I'm grateful to be living a timeline-free life for the most part, but on the rare occasion I log in and catch myself scrolling, this haunting characterization resonates:</p>
<blockquote>
<p>The timeline is no longer a source of information or social presence, but more of a mood-regulation device, endlessly replenishing itself with just enough novelty to suppress the anxiety of stopping. Scrolling has become a form of ambient dissociation, half-conscious, half-compulsive, closer to scratching an itch than seeking anything in particular. People know the feed is fake, they just don't care.</p>
</blockquote>
<p>I suspect many of you reading this continue to use social media apps because you were around back when they were social <em>networking</em> apps and are having a hard time accepting the fact that isn't what they are anymore. Likewise, many businesses are still earnestly crafting useful blog posts, only to optimize them for search engines and social platforms that will only ignore them—they should probably figure out a new racket, too.</p>

<p>🔗 <a href="https://www.noemamag.com/the-last-days-of-social-media/" title="Original Article">noemamag.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-09-15-the-last-days-of-social-media/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>James O'Sullivan has a banger of an editorial on the &quot;<a href="https://www.noemamag.com/the-last-days-of-social-media/">late attention economy</a>&quot;, including this bit illustrating the various platforms' pivot from active participation to passive absorption:</p>
<blockquote>
<p>While content proliferates, engagement is evaporating. Average interaction rates across major platforms are declining fast: Facebook and X posts now scrape an average 0.15% engagement, while Instagram has dropped 24% year-on-year. Even TikTok has begun to plateau. People aren't connecting or conversing on social media like they used to; they're just wading through slop, that is, low-effort, low-quality content produced at scale, often with AI, for engagement.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-09-15-the-last-days-of-social-media/","append_url_label":"Click 🔗","content":"\u003cp\u003eJames O'Sullivan has a banger of an editorial on the \u0026quot;\u003ca href=\"https://www.noemamag.com/the-last-days-of-social-media/\"\u003elate attention economy\u003c/a\u003e\u0026quot;, including this bit illustrating the various platforms' pivot from active participation to passive absorption:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhile content proliferates, engagement is evaporating. Average interaction rates across major platforms are declining fast: Facebook and X posts now scrape an average 0.15% engagement, while Instagram has dropped 24% year-on-year. Even TikTok has begun to plateau. People aren't connecting or conversing on social media like they used to; they're just wading through slop, that is, low-effort, low-quality content produced at scale, often with AI, for engagement.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI'm grateful to be living a timeline-free life for the most part, but on the rare occasion I log in and catch myself scrolling, this haunting characterization resonates:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe timeline is no longer a source of information or social presence, but more of a mood-regulation device, endlessly replenishing itself with just enough novelty to suppress the anxiety of stopping. Scrolling has become a form of ambient dissociation, half-conscious, half-compulsive, closer to scratching an itch than seeking anything in particular. People know the feed is fake, they just don't care.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI suspect many of you reading this continue to use social media apps because you were around back when they were social \u003cem\u003enetworking\u003c/em\u003e apps and are having a hard time accepting the fact that isn't what they are anymore. Likewise, many businesses are still earnestly crafting useful blog posts, only to optimize them for search engines and social platforms that will only ignore them—they should probably figure out a new racket, too.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-09-15-the-last-days-of-social-media/","og_image":"https://noemamag.imgix.net/2025/08/osullivanfinal.jpg?fit=crop\u0026fm=pjpg\u0026h=628\u0026ixlib=php-3.3.1\u0026w=1200\u0026wpsize=noema-social-facebook\u0026s=731f45322e46c8193e55ffd28272071f","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-15T16:21:31Z","related_url":"https://www.noemamag.com/the-last-days-of-social-media/","title":"The Last Days Of Social Media","updated_at":"2025-09-15T16:32:59Z","url":"https://justin.searls.co/links/2025-09-15-the-last-days-of-social-media/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-09-14-15h00m39s/</id>
      <title type="text">📸 A simple calculation</title>
      <link href="https://justin.searls.co/shots/2025-09-14-15h00m39s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-14T19:00:39+00:00</published>
    <updated>2025-09-14T19:06:16+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-09-14-15h00m30s-87c8a5e.jpeg"/>
</div><p>Whenever I need to verify a network connection with a remote LLM, I always ask it <code>1+1</code>. I'm sure it'll still raise the ocean level by a millimeter, but it seems less bad than a more complex query.</p>
<p>I forgot I had unhidden chain-of-thought reasoning, so I chuckled when I got this:</p>
<blockquote>
<p>Sure thing! The task is straightforward: I just need to respond to &quot;1+1&quot; with &quot;2.&quot; It's a simple calculation, so I won't overthink it. There's no need to use any tools for this, and I know the guidelines about &quot;Destructive Deletions&quot; and &quot;No Comments by Default&quot; don't really apply here. I'll just keep it short and clear, and the answer will simply be &quot;2.&quot;</p>
</blockquote>
<p>At least it didn't overthink it.</p>

]]></content>
    <summary type="html"><![CDATA[<p>Whenever I need to verify a network connection with a remote LLM, I always ask it <code>1+1</code>. I'm sure it'll still raise the ocean level by a millimeter, but it seems less bad than a more complex query.</p>
<p>I forgot I had unhidden chain-of-thought reasoning, so I chuckled when I got this:</p>
<blockquote>
<p>Sure thing! The task is straightforward: I just need to respond to &quot;1+1&quot; with &quot;2.&quot; It's a simple calculation, so I won't overthink it. There's no need to use any tools for this, and I know the guidelines about &quot;Destructive Deletions&quot; and &quot;No Comments by Default&quot; don't really apply here. I'll just keep it short and clear, and the answer will simply be &quot;2.&quot;</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-09-14-15h00m39s/","append_url_label":"View 📸","content":"\u003cp\u003eWhenever I need to verify a network connection with a remote LLM, I always ask it \u003ccode\u003e1+1\u003c/code\u003e. I'm sure it'll still raise the ocean level by a millimeter, but it seems less bad than a more complex query.\u003c/p\u003e\n\u003cp\u003eI forgot I had unhidden chain-of-thought reasoning, so I chuckled when I got this:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSure thing! The task is straightforward: I just need to respond to \u0026quot;1+1\u0026quot; with \u0026quot;2.\u0026quot; It's a simple calculation, so I won't overthink it. There's no need to use any tools for this, and I know the guidelines about \u0026quot;Destructive Deletions\u0026quot; and \u0026quot;No Comments by Default\u0026quot; don't really apply here. I'll just keep it short and clear, and the answer will simply be \u0026quot;2.\u0026quot;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAt least it didn't overthink it.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-09-14-15h00m39s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-09-14-15h00m30s-87c8a5e.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-09-14-15h00m30s-87c8a5e.jpeg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-14T19:00:39Z","title":"A simple calculation","updated_at":"2025-09-14T19:06:16Z","url":"https://justin.searls.co/shots/2025-09-14-15h00m39s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/mails/2025-08/</id>
      <title type="text">✉️ Visionaries, Entrepreneurs, and Innovators</title>
      <link href="https://justin.searls.co/mails/2025-08/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-11T00:00:00+00:00</published>
    <updated>2025-10-20T10:51:25-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p class="italic text-secondary">
  <em>This is a copy of the <a href="/newsletter" class="underline hover:no-underline">Searls of Wisdom newsletter</a>
  delivered to subscribers on September 11, 2025.</em>
</p>


<p>Hope you're having a lovely September so far. Hard to believe it's almost Fall! Always love seeing the first signs of the end of Summer—I refer, of course, to <a href="https://www.youtube.com/watch?v=H3KnMyojEQU">Apple's annual iPhone event</a>.</p>
<p>In case you don't subscribe to my every waking moment, some highlights of stuff I put out over the last month:</p>
<ul>
<li>Shared some of <a href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/">what I've learned</a> about using Apple's on-device LLM API</li>
<li>Suggested a new <a href="https://justin.searls.co/posts/star-wars-the-gilroy-order/">Star Wars watch order</a></li>
<li>Opined about why <a href="https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/">I wasn't cut out for management</a></li>
<li>Recorded two normal podcasts (<a href="https://justin.searls.co/casts/breaking-change-v42-free-as-in-remodel/">v42</a> and <a href="https://justin.searls.co/casts/breaking-change-v43-the-slop-economy/">v43</a>) as well as an <a href="https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">interview with Scott Werner</a></li>
<li>Repeated my tireless appeal to <a href="https://justin.searls.co/posts/this-blog-has-a-comment-system/">get folks blogging again</a></li>
<li>Gave up on <a href="https://www.anthropic.com/claude-code">Claude Code</a> (which Anthropic has <a href="https://www.reddit.com/r/ClaudeAI/comments/1nc4mem/update_on_recent_performance_concerns/">now admitted they made dumber</a> for over a month) in <a href="https://justin.searls.co/shots/2025-09-03-08h12m36s/">favor of OpenAI Codex</a>—specifically, <a href="http://github.com/just-every/code">this fork</a></li>
<li>Published a <a href="https://github.com/searlsco/imsg">command-line tool called imsg</a> for exporting iMessage archives</li>
<li>From that, I documented a <a href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/">how-to guide</a> on distributing scripts via homebrew</li>
<li>Did an hour-long <a href="https://justin.searls.co/casts/feature-release-v43.1-iphone-17-event-review/">review and buyer's guide of the aforementioned iPhone event</a> (pre-orders go up Friday morning at 8 AM Eastern!)</li>
</ul>
<p>Every month, I scroll through the last month of photos for one to include in this newsletter. Not many pictures this month, so here's a little surprise Becky left me that showed up in our <a href="https://support.apple.com/en-us/118229">iCloud Shared Photo Library</a></p>
<p><img src="/img/social/mails/2025-08.jpg" alt="How dare you assume this coaster saying that I add liquor to my protein shakes is true even though it is"></p>
<p>I feel personally attacked. And thirsty.</p>
<p>Today, I'm writing you about my favorite topic: capitalism. Or, more specifically, I'm here to shed a little light on a few &quot;special&quot; kinds of people who tend to be highly-valued in the economy but who are often portrayed as stereotypical caricatures. Each is as stubbornly human as the rest of us. Each possess an unusual blend of attributes that make them well-suited for the current epoch. My consulting career brought me face-to-face with more than my fair share of these people. The experiences I reflected back on while writing this were sometimes interesting, sometimes impressive, and rarely both.</p>
<p>Forced to categorize the most impactful people I've observed and encountered at work, I'd break it down into three archetypes: visionaries, entrepreneurs, and innovators. Each persona combines tremendous capability with comparatively bewildering blind spots. The business world holds these folks up as paragons of Employee Virtue. Not because they are perfect, but because their unique traits—when harnessed appropriately—can produce unparalleled results. And because the people doing the hiring always have faith in their own ability to harness the people they hire, candidates who fit these molds are often hired on the spot, bypassing any standard process. Most employees are employed by a business, whereas these employees <em>happen to</em> a business.</p>

<h2 id="visionaries">Visionaries</h2>
<p>Investors can't resist the siren song of visionary leaders who are <strong>preoccupied with growth</strong>. Visionaries want to achieve massive scale, can sustain obsession over decades, and believe in their own ability to change the world. Remember how Steve Jobs said he wanted to make a dent in the universe? That's the vibe. Audacious founders armed only with a half-cocked idea and delusions of grandeur have raised more in funding than you or I will earn from a lifetime of productive labor.</p>
<p>Beyond Wall Street, the general public also valorizes the growth-obsessed, because visionaries' irrational optimism reads as endearingly plucky in an underdog. But once that dog catches the car and begins to steer it from behind, those same traits become terrifying for us as passengers. To wit, you probably feel differently about Zuckerberg, Bezos, and Musk today than when you first learned about them. But the billionaires haven't changed at all. Our perspective of them is what shifted. They merely represent the natural end game for people wired to believe that more is never enough.</p>
<p>Of course, hating the ultra wealthy is nothing new. More recent, though, is a prevailing suspicion of growth for growth's sake, especially as the externalities of unregulated growth are becoming harder to avoid. My former colleague and mentor <a href="https://www.amazon.com/stores/Daryl-Kulak/author/B001IQWCVU">Daryl Kulak</a> would often counter clients pushing for unrestrained growth with, <strong>&quot;we actually have a word for something that grows forever: cancer.&quot;</strong> As much as the economy might love those with an unbridled ambition to grow, the rest of us can pretty easily spot the downsides. And while every visionary's light shines brightly, most are inevitably snuffed out—there's only room for so many winners.</p>

<h2 id="entrepreneurs">Entrepreneurs</h2>
<p>Think of a world-renowned business. Any business, doesn't matter which. That business would have ceased operations long before you'd ever heard of it were it not for some number of entrepreneurial employees <strong>predisposed to action</strong> over deliberation. When an issue arises, they add it to their plate. When someone else drops a ball, they can be counted on to catch it. When others deliberate endlessly, or stick their head in the sand, or waste time playing the blame game, they get shit done. They're sharks: if they stop moving, they die.</p>
<p>The action-oriented are not constrained by the bullet points on their job description. Hell, they probably hadn't finished reading the job description before picking up the phone and asking for the job. People driven to action make for appealing candidates not because they're confident &quot;alpha&quot; types per se, but because they talk in terms of what they <em>will actually do</em> to solve a problem as opposed to how they'll merely think, plan, or coordinate their way through it. Small businesses need them, because there's always far more shit to do than they can deal with. Large businesses need them, because their calcified bureaucracies prevent anything getting done otherwise. Struggling to visualize these people? <strong>Think of the guy who says, &quot;ask forgiveness not permission,&quot; but who—come to think of it—has never actually apologized to anyone.</strong></p>
<p>Of course, it's possible to over-index on action.  There are plenty of times when the best course of action is to take no action at all. (Unsurprisingly, entrepreneurs tend to get trapped in the urgent half of the <a href="https://en.wikipedia.org/wiki/Priority_Matrix">priority matrix</a>.) Large and novel problems often demand mindful introspection, time-consuming research, and careful deliberation—none of which come naturally to someone wired to equate the size of a problem with its urgency. Beyond being prone to strategic myopia, entrepreneurs can struggle to delegate effectively. For example, suppose you hire somebody to do something you've been doing for years. Naturally, they'll have less experience and they'll be slower and worse than you at first. But patience and failure are anathema to most entrepreneurs. It takes every ounce of energy to stop themselves from grabbing the steering wheel the moment anyone takes a wrong turn. And when they do grab the wheel, the new hire <em>does</em> learn something: stay in your lane and out of that guy's way. Don't think for yourself. Defer decision-making to the boss. Hyper-productive people often complain that nobody else ever picks up the slack, but their own behavior is usually to blame.</p>

<h2 id="innovators">Innovators</h2>
<p>Another word that can make you a lot of money is innovation. People with an <strong>insatiable creative drive</strong> are always in demand, because there will always be new problems to solve and opportunities to seize. In this sense, &quot;innovative&quot; means more than throwing out a good idea in meetings every now and then. Innovators represent a fusion of creativity, proficiency, and pragmatism. There are plenty of incredibly-skilled creatives out there who don't build stuff. And there are plenty of highly-motivated builders who aren't the least bit creative. But when you combine all three elements, watch out.</p>
<p>The most innovative people I've worked with were absolute pains in the ass to deal with in the moment, and generally only appreciated by their colleagues in the past tense. That's because it would never cross the mind of an innovator to pay an ounce of respect to whatever plan is handed them. They bristle at any line of reasoning that doesn't perfectly mirror their own, and adamantly refuse to take a single step down a path they believe to be wrong. They stubbornly push back until they get a satisfactory answer to a thousand &quot;Why&quot; questions, with notably less interest in &quot;Who,&quot; &quot;What,&quot; &quot;When,&quot; and &quot;Where.&quot; As soon as they grasp the bigger picture, they run off in a direction of their own choosing. They can be wonderful collaborators to whoever is willing to get on board—and better to just go along with them, as they tend to out-hustle and outflank everyone else.</p>
<p>But by constantly coloring outside the lines, innovators are frequently seen as agitants. They disrupt the calm of their colleagues. Few organizations know how to incorporate itinerant change agents—the value they provide isn't well captured by most annual review rubrics. But sometimes, innovators manage to overcome this and capture lightning in a bottle and accomplish something nobody thought possible. And success seems to do a funny thing to people's memory, as everyone else is suddenly quick to brag and share war stories of working with them.</p>
<p>Innovators may lack as many telltale character flaws, but many share the same blind spot: whatever they're building, they don't care about the thing itself. That's because they're not in it for the outcome, they're chasing an <em>experience</em>—the practice of creating something no one has ever seen before. Lost in the act of creation, their relentless drive makes them like unguided missiles, ones that leaders can aim at whatever target they wish. In the early 2010s, I had the opportunity to grill engineers working at companies like Lyft, Airbnb, and GrubHub about the potential downstream harms their apps might eventually wreak. I never stopped being surprised at how little any of them had ever thought of it. The real-world impact of their work, good or bad, simply wasn't the point.</p>

<h2 id="the-innovators-other-dilemma">The Innovator's Other Dilemma</h2>
<p>Of the three, I identify most as an innovator. It surprises people, but I've genuinely never cared about a single thing I had a hand in creating once I was done building it. After something's built, it no longer has anything of value to offer me. Whether it goes on to be used by a billion people or no one at all, I won't feel any differently. (I'd still reserve the right to boast at cocktail parties in the case of the former, however.)</p>
<p>There is one thing that doesn't sit well with me after writing this, though. The fact I've never cared about the things I've built means I've spent a lot of time building a lot of things that never mattered to me. Since striking out on my own in January 2024, I assumed the freedom to choose my own projects would allow me to identify work that really mattered to me. And I have! I've got a whole list and everything. Stuff that could change my life and others' lives for the better.</p>
<p>So far, I've taken all that time and freedom, and gone out of my way to build literally anything else with it. Not because I'm afraid of building those genuinely worthwhile things, but because those things' worthwhileness doesn't register as a valid criterion in my brain. The moment I sit down to work, my attention will be immediately captured by an unrelated problem and I won't be able to get it out of my head until it's either solved or supplanted by an even more daunting challenge. I won't let the day rest until I've proven to myself that it can be done. I can seemingly prove my ability to do anything <em>except</em> whatever it is I've consciously decided to do.</p>
<p>It's a strange, uncomfortable thing to sit with. Freedom often presents as a paradox. Maybe for an innovator, freedom to keep tinkering comes at the cost of a sort of aimlessness. A natural consequence when the motivation to tinker is for the act of tinkering itself.</p>
<p>I do have to say, though, that building meaningless stuff is a great way to pass the time. Realizing that's all I'm doing is hard, however. That I'm just passing time. When I get lost in my work, hours melt off the clock. Days pass in a blur. <a href="https://en.wikipedia.org/wiki/Four_Thousand_Weeks:_Time_Management_for_Mortals">Precious weeks</a> elapse. Seasons come and go—which, mercifully, doesn't mean much in Florida.</p>
<p>But if nothing changes this trajectory, will I regret it decades from now? Is this a problem I should be solving, and if so how? More rigor and discipline? More essays about my broken nature? More New Year's resolutions?</p>
<p>Who's to say.</p>
<p>At least I have a lot of experience deciding things don't matter to me. Perhaps that'll come in handy down the road.</p>]]></content>
    <summary type="html"><![CDATA[<p>Hope you're having a lovely September so far. Hard to believe it's almost Fall! Always love seeing the first signs of the end of Summer—I refer, of course, to <a href="https://www.youtube.com/watch?v=H3KnMyojEQU">Apple's annual iPhone event</a>.</p>
<p>In case you don't subscribe to my every waking moment, some highlights of stuff I put out over the last month:</p>
<ul>
<li>Shared some of <a href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/">what I've learned</a> about using Apple's on-device LLM API</li>
<li>Suggested a new <a href="https://justin.searls.co/posts/star-wars-the-gilroy-order/">Star Wars watch order</a></li>
<li>Opined about why <a href="https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/">I wasn't cut out for management</a></li>
<li>Recorded two normal podcasts (<a href="https://justin.searls.co/casts/breaking-change-v42-free-as-in-remodel/">v42</a> and <a href="https://justin.searls.co/casts/breaking-change-v43-the-slop-economy/">v43</a>) as well as an <a href="https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">interview with Scott Werner</a></li>
<li>Repeated my tireless appeal to <a href="https://justin.searls.co/posts/this-blog-has-a-comment-system/">get folks blogging again</a></li>
<li>Gave up on <a href="https://www.anthropic.com/claude-code">Claude Code</a> (which Anthropic has <a href="https://www.reddit.com/r/ClaudeAI/comments/1nc4mem/update_on_recent_performance_concerns/">now admitted they made dumber</a> for over a month) in <a href="https://justin.searls.co/shots/2025-09-03-08h12m36s/">favor of OpenAI Codex</a>—specifically, <a href="http://github.com/just-every/code">this fork</a></li>
<li>Published a <a href="https://github.com/searlsco/imsg">command-line tool called imsg</a> for exporting iMessage archives</li>
<li>From that, I documented a <a href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/">how-to guide</a> on distributing scripts via homebrew</li>
<li>Did an hour-long <a href="https://justin.searls.co/casts/feature-release-v43.1-iphone-17-event-review/">review and buyer's guide of the aforementioned iPhone event</a> (pre-orders go up Friday morning at 8 AM Eastern!)</li>
</ul>
<p>Every month, I scroll through the last month of photos for one to include in this newsletter. Not many pictures this month, so here's a little surprise Becky left me that showed up in our <a href="https://support.apple.com/en-us/118229">iCloud Shared Photo Library</a></p>
<p><img src="/img/social/mails/2025-08.jpg" alt="How dare you assume this coaster saying that I add liquor to my protein shakes is true even though it is"></p>
<p>I feel personally attacked. And thirsty.</p>
<p>Today, I'm writing you about my favorite topic: capitalism. Or, more specifically, I'm here to shed a little light on a few &quot;special&quot; kinds of people who tend to be highly-valued in the economy but who are often portrayed as stereotypical caricatures. Each is as stubbornly human as the rest of us. Each possess an unusual blend of attributes that make them well-suited for the current epoch. My consulting career brought me face-to-face with more than my fair share of these people. The experiences I reflected back on while writing this were sometimes interesting, sometimes impressive, and rarely both.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/mails/2025-08/","append_url_label":"Open ✉️","content":"\u003cp\u003eHope you're having a lovely September so far. Hard to believe it's almost Fall! Always love seeing the first signs of the end of Summer—I refer, of course, to \u003ca href=\"https://www.youtube.com/watch?v=H3KnMyojEQU\"\u003eApple's annual iPhone event\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIn case you don't subscribe to my every waking moment, some highlights of stuff I put out over the last month:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eShared some of \u003ca href=\"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/\"\u003ewhat I've learned\u003c/a\u003e about using Apple's on-device LLM API\u003c/li\u003e\n\u003cli\u003eSuggested a new \u003ca href=\"https://justin.searls.co/posts/star-wars-the-gilroy-order/\"\u003eStar Wars watch order\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOpined about why \u003ca href=\"https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/\"\u003eI wasn't cut out for management\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecorded two normal podcasts (\u003ca href=\"https://justin.searls.co/casts/breaking-change-v42-free-as-in-remodel/\"\u003ev42\u003c/a\u003e and \u003ca href=\"https://justin.searls.co/casts/breaking-change-v43-the-slop-economy/\"\u003ev43\u003c/a\u003e) as well as an \u003ca href=\"https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/\"\u003einterview with Scott Werner\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRepeated my tireless appeal to \u003ca href=\"https://justin.searls.co/posts/this-blog-has-a-comment-system/\"\u003eget folks blogging again\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGave up on \u003ca href=\"https://www.anthropic.com/claude-code\"\u003eClaude Code\u003c/a\u003e (which Anthropic has \u003ca href=\"https://www.reddit.com/r/ClaudeAI/comments/1nc4mem/update_on_recent_performance_concerns/\"\u003enow admitted they made dumber\u003c/a\u003e for over a month) in \u003ca href=\"https://justin.searls.co/shots/2025-09-03-08h12m36s/\"\u003efavor of OpenAI Codex\u003c/a\u003e—specifically, \u003ca href=\"http://github.com/just-every/code\"\u003ethis fork\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePublished a \u003ca href=\"https://github.com/searlsco/imsg\"\u003ecommand-line tool called imsg\u003c/a\u003e for exporting iMessage archives\u003c/li\u003e\n\u003cli\u003eFrom that, I documented a \u003ca href=\"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/\"\u003ehow-to guide\u003c/a\u003e on distributing scripts via homebrew\u003c/li\u003e\n\u003cli\u003eDid an hour-long \u003ca href=\"https://justin.searls.co/casts/feature-release-v43.1-iphone-17-event-review/\"\u003ereview and buyer's guide of the aforementioned iPhone event\u003c/a\u003e (pre-orders go up Friday morning at 8 AM Eastern!)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEvery month, I scroll through the last month of photos for one to include in this newsletter. Not many pictures this month, so here's a little surprise Becky left me that showed up in our \u003ca href=\"https://support.apple.com/en-us/118229\"\u003eiCloud Shared Photo Library\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-08.jpg\" alt=\"How dare you assume this coaster saying that I add liquor to my protein shakes is true even though it is\"\u003e\u003c/p\u003e\n\u003cp\u003eI feel personally attacked. And thirsty.\u003c/p\u003e\n\u003cp\u003eToday, I'm writing you about my favorite topic: capitalism. Or, more specifically, I'm here to shed a little light on a few \u0026quot;special\u0026quot; kinds of people who tend to be highly-valued in the economy but who are often portrayed as stereotypical caricatures. Each is as stubbornly human as the rest of us. Each possess an unusual blend of attributes that make them well-suited for the current epoch. My consulting career brought me face-to-face with more than my fair share of these people. The experiences I reflected back on while writing this were sometimes interesting, sometimes impressive, and rarely both.\u003c/p\u003e\n\u003cp\u003eForced to categorize the most impactful people I've observed and encountered at work, I'd break it down into three archetypes: visionaries, entrepreneurs, and innovators. Each persona combines tremendous capability with comparatively bewildering blind spots. The business world holds these folks up as paragons of Employee Virtue. Not because they are perfect, but because their unique traits—when harnessed appropriately—can produce unparalleled results. And because the people doing the hiring always have faith in their own ability to harness the people they hire, candidates who fit these molds are often hired on the spot, bypassing any standard process. Most employees are employed by a business, whereas these employees \u003cem\u003ehappen to\u003c/em\u003e a business.\u003c/p\u003e\n\n\u003ch2 id=\"visionaries\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-08/#visionaries\"\u003eVisionaries\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eInvestors can't resist the siren song of visionary leaders who are \u003cstrong\u003epreoccupied with growth\u003c/strong\u003e. Visionaries want to achieve massive scale, can sustain obsession over decades, and believe in their own ability to change the world. Remember how Steve Jobs said he wanted to make a dent in the universe? That's the vibe. Audacious founders armed only with a half-cocked idea and delusions of grandeur have raised more in funding than you or I will earn from a lifetime of productive labor.\u003c/p\u003e\n\u003cp\u003eBeyond Wall Street, the general public also valorizes the growth-obsessed, because visionaries' irrational optimism reads as endearingly plucky in an underdog. But once that dog catches the car and begins to steer it from behind, those same traits become terrifying for us as passengers. To wit, you probably feel differently about Zuckerberg, Bezos, and Musk today than when you first learned about them. But the billionaires haven't changed at all. Our perspective of them is what shifted. They merely represent the natural end game for people wired to believe that more is never enough.\u003c/p\u003e\n\u003cp\u003eOf course, hating the ultra wealthy is nothing new. More recent, though, is a prevailing suspicion of growth for growth's sake, especially as the externalities of unregulated growth are becoming harder to avoid. My former colleague and mentor \u003ca href=\"https://www.amazon.com/stores/Daryl-Kulak/author/B001IQWCVU\"\u003eDaryl Kulak\u003c/a\u003e would often counter clients pushing for unrestrained growth with, \u003cstrong\u003e\u0026quot;we actually have a word for something that grows forever: cancer.\u0026quot;\u003c/strong\u003e As much as the economy might love those with an unbridled ambition to grow, the rest of us can pretty easily spot the downsides. And while every visionary's light shines brightly, most are inevitably snuffed out—there's only room for so many winners.\u003c/p\u003e\n\n\u003ch2 id=\"entrepreneurs\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-08/#entrepreneurs\"\u003eEntrepreneurs\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eThink of a world-renowned business. Any business, doesn't matter which. That business would have ceased operations long before you'd ever heard of it were it not for some number of entrepreneurial employees \u003cstrong\u003epredisposed to action\u003c/strong\u003e over deliberation. When an issue arises, they add it to their plate. When someone else drops a ball, they can be counted on to catch it. When others deliberate endlessly, or stick their head in the sand, or waste time playing the blame game, they get shit done. They're sharks: if they stop moving, they die.\u003c/p\u003e\n\u003cp\u003eThe action-oriented are not constrained by the bullet points on their job description. Hell, they probably hadn't finished reading the job description before picking up the phone and asking for the job. People driven to action make for appealing candidates not because they're confident \u0026quot;alpha\u0026quot; types per se, but because they talk in terms of what they \u003cem\u003ewill actually do\u003c/em\u003e to solve a problem as opposed to how they'll merely think, plan, or coordinate their way through it. Small businesses need them, because there's always far more shit to do than they can deal with. Large businesses need them, because their calcified bureaucracies prevent anything getting done otherwise. Struggling to visualize these people? \u003cstrong\u003eThink of the guy who says, \u0026quot;ask forgiveness not permission,\u0026quot; but who—come to think of it—has never actually apologized to anyone.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eOf course, it's possible to over-index on action.  There are plenty of times when the best course of action is to take no action at all. (Unsurprisingly, entrepreneurs tend to get trapped in the urgent half of the \u003ca href=\"https://en.wikipedia.org/wiki/Priority_Matrix\"\u003epriority matrix\u003c/a\u003e.) Large and novel problems often demand mindful introspection, time-consuming research, and careful deliberation—none of which come naturally to someone wired to equate the size of a problem with its urgency. Beyond being prone to strategic myopia, entrepreneurs can struggle to delegate effectively. For example, suppose you hire somebody to do something you've been doing for years. Naturally, they'll have less experience and they'll be slower and worse than you at first. But patience and failure are anathema to most entrepreneurs. It takes every ounce of energy to stop themselves from grabbing the steering wheel the moment anyone takes a wrong turn. And when they do grab the wheel, the new hire \u003cem\u003edoes\u003c/em\u003e learn something: stay in your lane and out of that guy's way. Don't think for yourself. Defer decision-making to the boss. Hyper-productive people often complain that nobody else ever picks up the slack, but their own behavior is usually to blame.\u003c/p\u003e\n\n\u003ch2 id=\"innovators\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-08/#innovators\"\u003eInnovators\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eAnother word that can make you a lot of money is innovation. People with an \u003cstrong\u003einsatiable creative drive\u003c/strong\u003e are always in demand, because there will always be new problems to solve and opportunities to seize. In this sense, \u0026quot;innovative\u0026quot; means more than throwing out a good idea in meetings every now and then. Innovators represent a fusion of creativity, proficiency, and pragmatism. There are plenty of incredibly-skilled creatives out there who don't build stuff. And there are plenty of highly-motivated builders who aren't the least bit creative. But when you combine all three elements, watch out.\u003c/p\u003e\n\u003cp\u003eThe most innovative people I've worked with were absolute pains in the ass to deal with in the moment, and generally only appreciated by their colleagues in the past tense. That's because it would never cross the mind of an innovator to pay an ounce of respect to whatever plan is handed them. They bristle at any line of reasoning that doesn't perfectly mirror their own, and adamantly refuse to take a single step down a path they believe to be wrong. They stubbornly push back until they get a satisfactory answer to a thousand \u0026quot;Why\u0026quot; questions, with notably less interest in \u0026quot;Who,\u0026quot; \u0026quot;What,\u0026quot; \u0026quot;When,\u0026quot; and \u0026quot;Where.\u0026quot; As soon as they grasp the bigger picture, they run off in a direction of their own choosing. They can be wonderful collaborators to whoever is willing to get on board—and better to just go along with them, as they tend to out-hustle and outflank everyone else.\u003c/p\u003e\n\u003cp\u003eBut by constantly coloring outside the lines, innovators are frequently seen as agitants. They disrupt the calm of their colleagues. Few organizations know how to incorporate itinerant change agents—the value they provide isn't well captured by most annual review rubrics. But sometimes, innovators manage to overcome this and capture lightning in a bottle and accomplish something nobody thought possible. And success seems to do a funny thing to people's memory, as everyone else is suddenly quick to brag and share war stories of working with them.\u003c/p\u003e\n\u003cp\u003eInnovators may lack as many telltale character flaws, but many share the same blind spot: whatever they're building, they don't care about the thing itself. That's because they're not in it for the outcome, they're chasing an \u003cem\u003eexperience\u003c/em\u003e—the practice of creating something no one has ever seen before. Lost in the act of creation, their relentless drive makes them like unguided missiles, ones that leaders can aim at whatever target they wish. In the early 2010s, I had the opportunity to grill engineers working at companies like Lyft, Airbnb, and GrubHub about the potential downstream harms their apps might eventually wreak. I never stopped being surprised at how little any of them had ever thought of it. The real-world impact of their work, good or bad, simply wasn't the point.\u003c/p\u003e\n\n\u003ch2 id=\"the-innovators-other-dilemma\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-08/#the-innovators-other-dilemma\"\u003eThe Innovator's Other Dilemma\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eOf the three, I identify most as an innovator. It surprises people, but I've genuinely never cared about a single thing I had a hand in creating once I was done building it. After something's built, it no longer has anything of value to offer me. Whether it goes on to be used by a billion people or no one at all, I won't feel any differently. (I'd still reserve the right to boast at cocktail parties in the case of the former, however.)\u003c/p\u003e\n\u003cp\u003eThere is one thing that doesn't sit well with me after writing this, though. The fact I've never cared about the things I've built means I've spent a lot of time building a lot of things that never mattered to me. Since striking out on my own in January 2024, I assumed the freedom to choose my own projects would allow me to identify work that really mattered to me. And I have! I've got a whole list and everything. Stuff that could change my life and others' lives for the better.\u003c/p\u003e\n\u003cp\u003eSo far, I've taken all that time and freedom, and gone out of my way to build literally anything else with it. Not because I'm afraid of building those genuinely worthwhile things, but because those things' worthwhileness doesn't register as a valid criterion in my brain. The moment I sit down to work, my attention will be immediately captured by an unrelated problem and I won't be able to get it out of my head until it's either solved or supplanted by an even more daunting challenge. I won't let the day rest until I've proven to myself that it can be done. I can seemingly prove my ability to do anything \u003cem\u003eexcept\u003c/em\u003e whatever it is I've consciously decided to do.\u003c/p\u003e\n\u003cp\u003eIt's a strange, uncomfortable thing to sit with. Freedom often presents as a paradox. Maybe for an innovator, freedom to keep tinkering comes at the cost of a sort of aimlessness. A natural consequence when the motivation to tinker is for the act of tinkering itself.\u003c/p\u003e\n\u003cp\u003eI do have to say, though, that building meaningless stuff is a great way to pass the time. Realizing that's all I'm doing is hard, however. That I'm just passing time. When I get lost in my work, hours melt off the clock. Days pass in a blur. \u003ca href=\"https://en.wikipedia.org/wiki/Four_Thousand_Weeks:_Time_Management_for_Mortals\"\u003ePrecious weeks\u003c/a\u003e elapse. Seasons come and go—which, mercifully, doesn't mean much in Florida.\u003c/p\u003e\n\u003cp\u003eBut if nothing changes this trajectory, will I regret it decades from now? Is this a problem I should be solving, and if so how? More rigor and discipline? More essays about my broken nature? More New Year's resolutions?\u003c/p\u003e\n\u003cp\u003eWho's to say.\u003c/p\u003e\n\u003cp\u003eAt least I have a lot of experience deciding things don't matter to me. Perhaps that'll come in handy down the road.\u003c/p\u003e","id":"https://justin.searls.co/mails/2025-08/","og_image":"https://justin.searls.co/img/social/mails/2025-08.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-11T00:00:00Z","title":"Visionaries, Entrepreneurs, and Innovators","updated_at":"2025-10-20T10:51:25-04:00","url":"https://justin.searls.co/mails/2025-08/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/feature-release-v43.1-iphone-17-event-review/</id>
      <title type="text">🎙️ Breaking Change podcast v43.1 - iPhone 17 Event Review</title>
      <link href="https://justin.searls.co/casts/feature-release-v43.1-iphone-17-event-review/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-09T19:44:58+00:00</published>
    <updated>2025-09-09T23:08:04-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v43.1.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v43.1.mp3">Direct link to podcast audio file</a>
</p><p>It's an emergency bonus edition of Breaking Change as I take the covers off yet another show-within-a-show. I call it <strong>Feature Release</strong>, and its job is to fill in that middle number in our semantically versioned series of conversations together. No pun, no news, just some timely content wrapped up in a name, logo, and jingle package that still has that new podcast smell.</p>
<p>It's a 1-hour review of the Airpods, Apple Watch, and iPhone updates Apple  announced today. You can see the <a href="https://www.youtube.com/live/H3KnMyojEQU?si=nDiZGIIenlDDZcut&amp;t=158">full event video on YouTube</a>. The Verge has a <a href="https://www.youtube.com/watch?v=0hHFon97B3I">17 minute abridged version</a> if you just want the synopsis.</p>
<p>Please enjoy this episode of Feature Release! It may be the only one. Write into <a href="mailto:podcast@searls.co">podcast@searls.co</a> with your feedback!</p>

]]></content>
    <summary type="html"><![CDATA[<p>It's an emergency bonus edition of Breaking Change as I take the covers off yet another show-within-a-show. I call it <strong>Feature Release</strong>, and its job is to fill in that middle number in our semantically versioned series of conversations together. No pun, no news, just some timely content wrapped up in a name, logo, and jingle package that still has that new podcast smell.</p>
<p>It's a 1-hour review of the Airpods, Apple Watch, and iPhone updates Apple  announced today. You can see the <a href="https://www.youtube.com/live/H3KnMyojEQU?si=nDiZGIIenlDDZcut&amp;t=158">full event video on YouTube</a>. The Verge has a <a href="https://www.youtube.com/watch?v=0hHFon97B3I">17 minute abridged version</a> if you just want the synopsis.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/feature-release-v43.1-iphone-17-event-review/","append_url_label":"Hear 🎙","content":"\u003cp\u003eIt's an emergency bonus edition of Breaking Change as I take the covers off yet another show-within-a-show. I call it \u003cstrong\u003eFeature Release\u003c/strong\u003e, and its job is to fill in that middle number in our semantically versioned series of conversations together. No pun, no news, just some timely content wrapped up in a name, logo, and jingle package that still has that new podcast smell.\u003c/p\u003e\n\u003cp\u003eIt's a 1-hour review of the Airpods, Apple Watch, and iPhone updates Apple  announced today. You can see the \u003ca href=\"https://www.youtube.com/live/H3KnMyojEQU?si=nDiZGIIenlDDZcut\u0026amp;t=158\"\u003efull event video on YouTube\u003c/a\u003e. The Verge has a \u003ca href=\"https://www.youtube.com/watch?v=0hHFon97B3I\"\u003e17 minute abridged version\u003c/a\u003e if you just want the synopsis.\u003c/p\u003e\n\u003cp\u003ePlease enjoy this episode of Feature Release! It may be the only one. Write into \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e with your feedback!\u003c/p\u003e\n","format_string":"New episode of Breaking Change is live! iPhone 17 Event Review","id":"https://justin.searls.co/casts/feature-release-v43.1-iphone-17-event-review/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v43.1-iphone-17-event-review.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-09T19:44:58Z","title":"iPhone 17 Event Review","updated_at":"2025-09-09T23:08:04-04:00","url":"https://justin.searls.co/casts/feature-release-v43.1-iphone-17-event-review/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-09-08-i-ve-got-your-shovelware-right-here/</id>
      <title type="text">🔗 I&#39;ve got your shovelware right here</title>
        <link href="https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-09-08-i-ve-got-your-shovelware-right-here/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-08T19:35:39+00:00</published>
    <updated>2025-09-08T15:58:06-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Mike Judge thinks developers may be deluding themselves into thinking AI coding tools are <a href="https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding?utm_source=changelog-news">making them more productive</a>:</p>
<blockquote>
<p>My argument: If so many developers are so extraordinarily productive using these tools, where is the flood of shovelware? We should be seeing apps of all shapes and sizes, video games, new websites, mobile apps, software-as-a-service apps — we should be drowning in choice. We should be in the middle of an indie software revolution. We should be seeing 10,000 Tetris clones on Steam.</p>
</blockquote>
<p>If you read the post, he's got data to this effect.</p>
<p>I've got two problems with this:</p>
<ol>
<li>
<p>Much of his data basically stops around March–April 2025—the precise window when AI coding tools finally <a href="https://justin.searls.co/tubes/2025-04-19-17h46m37s/">became worth a damn</a></p>
</li>
<li>
<p>Whether or not we're seeing a shovelware boom is orthogonal to the question of whether canny developers' output is being supercharged by AI. All it takes is one developer to show one project that was delivered in less time than they'd have been able to do otherwise and bingo-bango: AI tools as they exist today—flawed as they might be—can do something a human couldn't have done otherwise. Sure, you could make an argument about the macro-level effects—like whether the vast majority of professional programmers are too stupid or resistant to change to leverage these tools and are even somehow being slowed down by their existence, but I'd probably agree with you</p>
</li>
</ol>
<p>Seriously, suggesting that AI-generated code is a nothingburger because we haven't yet been drowned in shovelware just four months after coding agents became <em>remotely useful</em>? Get outta here. And right now, only the early adopters are even using them! I talked to a manager the other day whose team has been given carte blanche to burn through all the Anthropic tokens they want and for whom not a single developer touched the account in the month of August.</p>
<p>I think it's important context to know that a lot of the statistics <a href="https://www.businessinsider.com/ai-code-meta-microsoft-google-llamacon-engineers-2025-4">Microsoft</a> and <a href="https://www.anthropic.com/research/impact-software-development">Anthropic</a> put out are inflated because they have an obvious conflict of interest to push the message that the thing they sell is useful. I'm sure because many developers have GitHub Copilot turned on, they tend to press Tab without reading, then waste time mostly deleting what it produces. But, because the user mindlessly pressed Tab, somewhere a cell in a spreadsheet labeled &quot;<a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-in-the-enterprise-with-accenture/">acceptance rate</a>&quot; ticks up. In practice, I suspect far fewer people are using these tools in anger than the big tech companies are incentivized to portray.</p>
<p>Having a full-fledged agent that can build shit for you and verify things work is—when it comes to productivity—nowhere <em>near</em> the same league as tacking autocomplete and an LLM chat sidebar into an editor. And here's the promised counterexample: I <a href="https://github.com/searlsco/imsg">built some shovelware of my own last week</a>. Took about a day of wall time to build and another calendar day for me to tighten up with feedback. I spent probably a grand total of three hours staring at computers in the furtherance of the project. This <a href="/posts/how-to-distribute-your-own-scripts-via-homebrew/">blog post about it</a> took me twice as much time. Would have taken me weeks to build by hand, and more importantly, it wouldn't have been built at all—I wouldn't have bothered.</p>

<p>🔗 <a href="https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding" title="Original Article">mikelovesrobots.substack.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-09-08-i-ve-got-your-shovelware-right-here/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>Mike Judge thinks developers may be deluding themselves into thinking AI coding tools are <a href="https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding?utm_source=changelog-news">making them more productive</a>:</p>
<blockquote>
<p>My argument: If so many developers are so extraordinarily productive using these tools, where is the flood of shovelware? We should be seeing apps of all shapes and sizes, video games, new websites, mobile apps, software-as-a-service apps — we should be drowning in choice. We should be in the middle of an indie software revolution. We should be seeing 10,000 Tetris clones on Steam.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-09-08-i-ve-got-your-shovelware-right-here/","append_url_label":"Click 🔗","content":"\u003cp\u003eMike Judge thinks developers may be deluding themselves into thinking AI coding tools are \u003ca href=\"https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding?utm_source=changelog-news\"\u003emaking them more productive\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMy argument: If so many developers are so extraordinarily productive using these tools, where is the flood of shovelware? We should be seeing apps of all shapes and sizes, video games, new websites, mobile apps, software-as-a-service apps — we should be drowning in choice. We should be in the middle of an indie software revolution. We should be seeing 10,000 Tetris clones on Steam.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIf you read the post, he's got data to this effect.\u003c/p\u003e\n\u003cp\u003eI've got two problems with this:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eMuch of his data basically stops around March–April 2025—the precise window when AI coding tools finally \u003ca href=\"https://justin.searls.co/tubes/2025-04-19-17h46m37s/\"\u003ebecame worth a damn\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWhether or not we're seeing a shovelware boom is orthogonal to the question of whether canny developers' output is being supercharged by AI. All it takes is one developer to show one project that was delivered in less time than they'd have been able to do otherwise and bingo-bango: AI tools as they exist today—flawed as they might be—can do something a human couldn't have done otherwise. Sure, you could make an argument about the macro-level effects—like whether the vast majority of professional programmers are too stupid or resistant to change to leverage these tools and are even somehow being slowed down by their existence, but I'd probably agree with you\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eSeriously, suggesting that AI-generated code is a nothingburger because we haven't yet been drowned in shovelware just four months after coding agents became \u003cem\u003eremotely useful\u003c/em\u003e? Get outta here. And right now, only the early adopters are even using them! I talked to a manager the other day whose team has been given carte blanche to burn through all the Anthropic tokens they want and for whom not a single developer touched the account in the month of August.\u003c/p\u003e\n\u003cp\u003eI think it's important context to know that a lot of the statistics \u003ca href=\"https://www.businessinsider.com/ai-code-meta-microsoft-google-llamacon-engineers-2025-4\"\u003eMicrosoft\u003c/a\u003e and \u003ca href=\"https://www.anthropic.com/research/impact-software-development\"\u003eAnthropic\u003c/a\u003e put out are inflated because they have an obvious conflict of interest to push the message that the thing they sell is useful. I'm sure because many developers have GitHub Copilot turned on, they tend to press Tab without reading, then waste time mostly deleting what it produces. But, because the user mindlessly pressed Tab, somewhere a cell in a spreadsheet labeled \u0026quot;\u003ca href=\"https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-in-the-enterprise-with-accenture/\"\u003eacceptance rate\u003c/a\u003e\u0026quot; ticks up. In practice, I suspect far fewer people are using these tools in anger than the big tech companies are incentivized to portray.\u003c/p\u003e\n\u003cp\u003eHaving a full-fledged agent that can build shit for you and verify things work is—when it comes to productivity—nowhere \u003cem\u003enear\u003c/em\u003e the same league as tacking autocomplete and an LLM chat sidebar into an editor. And here's the promised counterexample: I \u003ca href=\"https://github.com/searlsco/imsg\"\u003ebuilt some shovelware of my own last week\u003c/a\u003e. Took about a day of wall time to build and another calendar day for me to tighten up with feedback. I spent probably a grand total of three hours staring at computers in the furtherance of the project. This \u003ca href=\"/posts/how-to-distribute-your-own-scripts-via-homebrew/\"\u003eblog post about it\u003c/a\u003e took me twice as much time. Would have taken me weeks to build by hand, and more importantly, it wouldn't have been built at all—I wouldn't have bothered.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-09-08-i-ve-got-your-shovelware-right-here/","og_image":"https://justin.searls.co/img/social/links/2025-09-08-i-ve-got-your-shovelware-right-here.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-08T19:35:39Z","related_url":"https://mikelovesrobots.substack.com/p/wheres-the-shovelware-why-ai-coding","title":"I've got your shovelware right here","updated_at":"2025-09-08T15:58:06-04:00","url":"https://justin.searls.co/links/2025-09-08-i-ve-got-your-shovelware-right-here/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/</id>
      <title type="text">📄 Distributing your own scripts via Homebrew</title>
      <link href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-06T16:20:31+00:00</published>
    <updated>2025-09-06T12:23:15-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>I use <a href="https://brew.sh">Homebrew</a> all the time. Whenever I see a new CLI that offers an <code>npm</code> or <code>uv</code> install path alongside a <code>brew</code> one, I choose brew every single time.</p>
<p>And yet, when it comes time to publish a CLI of my own, I usually just ship it as a Ruby gem or an npm package, because I had (and have!) no fucking clue how Homebrew works. I'm not enough of a neckbeard to peer behind the curtain as soon as root directories like <code>/usr</code> and <code>/opt</code> are involved, so I never bothered before today.</p>
<p>But it's 2025 and we can consult LLMs to conjure whatever arcane incantations we need. And because he listens to <a href="/casts/breaking-change/">the cast</a>, I can always fall back on texting <a href="https://mikemcquaid.com/about/">Mike McQuaid</a> when <a href="https://github.com/Homebrew/brew/pull/20639">his docs suck</a>.</p>
<p>So, because I'll never remember any of this shit (it's already fading from view as I type this), below are the steps involved in publishing your own CLI to Homebrew. The first formula I published is a simple Ruby script, but this guide should be generally applicable.</p>

<h2 id="glossary">Glossary</h2>
<p>Because Homebrew <em>really fucking leans in</em> to the whole &quot;home brewing as in beer&quot; motif when it comes to naming, it's easy to get lost in the not-particularly-apt nomenclature they chose.</p>
<p><a href="https://docs.brew.sh/Formula-Cookbook#homebrew-terminology">Translate these</a> in your head when you encounter them:</p>
<ul>
<li>Formula → Package definition</li>
<li>Tap → Git repository of formulae</li>
<li>Cask → Manifest for installing pre-built GUIs or large binaries</li>
<li>Bottle → Pre-built binary packages that are &quot;poured&quot; (copied) instead of built from source</li>
<li>Cellar → Directory containing your installed formulae (e.g. <code>/opt/homebrew/Cellar</code>)</li>
<li>Keg → Directory housing an installed formula (e.g. <code>Cellar/foo/1.2.3</code>)</li>
</ul>

<h2 id="overview">Overview</h2>
<p>First thing to know is that the Homebrew team <a href="https://docs.brew.sh/Acceptable-Formulae#niche-or-self-submitted-stuff">doesn't want your stupid CLI</a> in the <a href="https://github.com/Homebrew/homebrew-core">core repository</a>.</p>
<p>Instead, the golden path for us non-famous people is to:</p>
<ol>
<li>Make your CLI, push it to GitHub, cut a tagged release</li>
<li><a href="#create-your-tap">Create a Homebrew tap</a></li>
<li><a href="#create-your-formula">Create a Homebrew formula</a></li>
<li><a href="#update-the-formula-for-each-cli-release">Update the formula for each CLI release</a></li>
</ol>
<p>After you complete the steps outlined below, users will be able to install your cool CLI in just two commands:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew tap your_github_handle/tap
</span></span><span class="line"><span class="cl">brew install your_cool_cli
</span></span></code></pre></div><p>Leaving the &quot;make your CLI&quot; step as an exercise for the reader, let's walk through the three steps required to distribute it on Homebrew. In my case, I slopped up a CLI called <a href="https://github.com/searlsco/imsg">imsg</a> that creates interactive web archives from an iMessage database.</p>

<h2 id="create-your-tap">Create your tap</h2>
<p>Here's <a href="https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap">Homebrew's guide</a> on creating a tap. Let's follow along how I set things up for myself. Just replace each example with your own username or organization.</p>
<p>For simplicity's sake, you probably want a single tap for all the command line tools you publish moving forward. If that's the case, then you want to name the tap <code>homebrew-tap</code>. The <code>homebrew</code> prefix is treated specially by the <code>brew</code> CLI and the <code>tap</code> suffix is conventional.</p>
<p>First, create the tap:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew tap-new searlsco/homebrew-tap
</span></span></code></pre></div><p>This creates a scaffold in <code>/opt/homebrew/Library/Taps/searlsco/homebrew-tap</code>. Next, I created a <a href="https://github.com/searlsco/homebrew-tap">matching repository in GitHub</a> and pushed what Homebrew generated:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/homebrew/Library/Taps/searlsco/homebrew-tap
</span></span><span class="line"><span class="cl">git remote add origin git@github.com:searlsco/homebrew-tap.git
</span></span><span class="line"><span class="cl">git push -u origin main
</span></span></code></pre></div><p>Congratulations, you're the proud owner of a tap. Now other homebrew users can run:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew tap searlsco/tap
</span></span></code></pre></div><p>It doesn't contain anything useful, but they can run it. The command will clone your repository into their <code>/opt/homebrew/Library/Taps</code> directory.</p>

<h2 id="create-your-formula">Create your formula</h2>
<p>Even though Homebrew depends on all manner of git operations to function and fully supports just pointing your formula at a GitHub repository, the <a href="https://docs.brew.sh/Acceptable-Formulae#stable-versions">Homebrew team recommends</a> instead referencing versioned tarballs with checksums. Why? Something something reproducibility, yadda yadda open source supply chain. Whatever, let's just do it their way.</p>
<p>One nifty feature of GitHub is that they'll host a tarball archive of any tags you push at a predictable URL. That means if I run these commands in the <a href="https://github.com/searlsco/imsg">imsg repository</a>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">git tag v0.0.5
</span></span><span class="line"><span class="cl">git push --tags
</span></span></code></pre></div><p>Then GitHub will host a tarball at <a href="https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz">github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz</a>.</p>
<p>Once we have that tarball URL, we can use <code>brew create</code> to generate our formula:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew create https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz --tap searlsco/homebrew-tap --set-name imsg --ruby
</span></span></code></pre></div><p>The three flags there do the following:</p>
<ul>
<li><code>--tap</code> points it to the custom tap we created in the previous step, and will place the formula in <code>/opt/homebrew/Library/Taps/searlsco/homebrew-tap/Formula</code></li>
<li><code>--set-name imsg</code> will name the formula explicitly, though <code>brew create</code> would have inferred this and confirmed it interactively. The name should be unique so you don't do something stupid like make a CLI <a href="https://github.com/tendersearls/tldr">named TLDR</a> when there's already a CLI <a href="https://github.com/tendersearls/tldr/issues/4">named TLDR</a> or a CLI <a href="https://github.com/standardrb/standard">named standard</a> when there's already a CLI <a href="https://github.com/standardrb/standard/issues/3">named standard</a></li>
<li><code>--ruby</code> is one of <a href="https://docs.brew.sh/Manpage#create-options-url">several template presets</a> provided to simplify the task of customizing your formula</li>
</ul>
<p>Congratulations! You now have a formula for your CLI. It almost certainly doesn't work and you almost certainly have no clue how to make it work, but it's yours!</p>
<p>This is where LLMs come in.</p>
<ol>
<li>Run <code>brew install --verbose imsg</code></li>
<li>Paste what broke into ChatGPT</li>
<li>Update formula</li>
<li>GOTO 1 until it works</li>
</ol>
<p>Eventually, I wound up with a working <a href="https://github.com/searlsco/homebrew-tap/blob/main/Formula/imsg.rb">Formula/imsg.rb</a> file. (If you're publishing a Ruby CLI, feel free to copy-paste it as a starting point.) Importantly, and a big reason to distribute via Homebrew as opposed to a language-specific package manager, is that I could theoretically swap out the implementation for some other language entirely without disrupting users' ability to upgrade.</p>
<p>Key highlights if you're reading the formula contents:</p>
<ul>
<li><em>All</em> formulae are written in Ruby, not just Ruby-related formulae. Before JavaScript and AI took turns devouring the universe, popular developer tools were often written in Ruby and Homebrew is one of those</li>
<li>You can specify your formula's git repository with the <code>head</code> method (though I'm unsure this does anything)</li>
<li>Adding a <a href="https://docs.brew.sh/Brew-Livecheck">livecheck</a> seemed easy and worth doing</li>
<li>Adding a test to ensure the binary runs can be as simple as asserting on help output. Don't let the generated comment scare you off</li>
<li>Run <code>brew style searlsco/tap</code> to make sure you didn't fuck anything up.</li>
<li>By default, the <code>--ruby</code> template adds <code>uses_from_macos &quot;ruby&quot;</code>, which is currently version 2.6.10 (which was released before the Covid pandemic and <a href="https://endoflife.date/ruby">end-of-life</a>'d over three years ago). You probably want to rely on the <a href="https://formulae.brew.sh/formula/ruby#default">ruby formula</a> with <code>depends_on &quot;ruby@3&quot;</code> instead</li>
</ul>
<p>When you're happy with it, just <code>git push</code> and your formula is live! Now any homebrew user can install your thing:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew tap searlsco/tap
</span></span><span class="line"><span class="cl">brew install imsg
</span></span></code></pre></div>
<h2 id="update-the-formula-for-each-cli-release">Update the formula for each CLI release</h2>
<p>Of course, any joy I derived from getting this to work was fleeting, because of this bullshit at the top of the formula:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Imsg</span> <span class="o">&lt;</span> <span class="no">Formula</span>
</span></span><span class="line"><span class="cl">  <span class="n">url</span> <span class="s2">&#34;https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">sha256</span> <span class="s2">&#34;e9166c70bfb90ae38c00c3ee042af8d2a9443d06afaeaf25a202ee8d66d1ca04&#34;</span>
</span></span></code></pre></div><p><em>Who the fuck's job is it going to be to update these URLs and SHA hashes?</em> Certainly not mine. I barely have the patience to <code>git push</code> my work, much less tag it. And forget about clicking around to create a GitHub release. Now I need to open a <em>second project</em> and update the version there, too? And compute a hash? Get the fuck out of here.</p>
<p>Now, I will grant that Homebrew ships with a <a href="https://docs.brew.sh/Manpage#bump-formula-pr-options-formula">command that opens a PR</a> for each formula update and some guy <a href="https://github.com/dawidd6/action-homebrew-bump-formula">wrapped it in a GitHub action</a>, but both assume you want to daintily fork the tap and humbly submit a pull request to yourself. Clearly all this shit was designed back when Homebrew was letting anybody spam shit into <a href="https://github.com/Homebrew/homebrew-core">homebrew-core</a>. It's my tap, just give me a way to commit to main, please and thank you.</p>
<p>So anyway, you can jump through all those hoops each time you update your CLI if you're a sucker. But be honest with yourself, you're just gonna wind up back at this stupid blog post again, because you'll have forgotten the process. To avoid this, I asked my AI companion to add a GitHub workflow to my formula repository that automatically commits release updates to my tap repository.</p>
<p>If you want to join me in the fast lane, feel free to <a href="https://github.com/searlsco/imsg/blob/main/.github/workflows/update_homebrew_formula.yml">copy paste my workflow</a> as a starting point. The only things you'll need to set up yourself:</p>
<ul>
<li>You'll need a <a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens">personal-access token</a>:
<ul>
<li>When creating the PAT, add your <code>homebrew-tap</code> repository and <code>Content</code> → <code>Write</code> permissions</li>
<li>In the formula repository's settings under <code>Secrets and variables</code> → <code>Actions</code> → <code>Repository secrets</code> and name it <code>HOMEBREW_TAP_TOKEN</code> (<a href="https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets">GitHub docs</a>)</li>
</ul>
</li>
<li>You'll need to specify the <a href="https://github.com/searlsco/imsg/blob/v0.0.5/.github/workflows/update_homebrew_formula.yml#L13-L15">tap and formula environment variables</a></li>
<li>You'll probably want to update the <a href="https://github.com/searlsco/imsg/blob/v0.0.5/.github/workflows/update_homebrew_formula.yml#L61-L62">GitHub bot account</a>, probably to the <a href="https://api.github.com/users/github-actions%5Bbot%5D">GitHub Actions bot</a> if you don't <a href="https://github.com/bitsly">have your own</a>:
<ul>
<li><code>GH_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com</code></li>
<li><code>GH_NAME: github-actions[bot]</code></li>
</ul>
</li>
</ul>
<p>Now, whenever you cut a release, your tap will be updated automatically. Within a few seconds of running <code>git push --tags</code> in your formula's repositories, your users will be able to upgrade their installations with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew update
</span></span><span class="line"><span class="cl">brew upgrade imsg
</span></span></code></pre></div><p>That's it. Job's done!</p>

<h2 id="the-best-part">The best part</h2>
<p>This was a royal pain in the ass to figure out, so hopefully this guide was helpful. The best part is that once your tap is set up and configured and you have a single working formula to serve as an example, <strong>publishing additional CLI tools in the future becomes almost trivial</strong>.</p>
<p>Now, will I actually ever publish another formula? Beats me. But it feels nice to know it would only take me a few minutes if I wanted to. 🍻</p>]]></content>
    <summary type="html"><![CDATA[<p>I use <a href="https://brew.sh">Homebrew</a> all the time. Whenever I see a new CLI that offers an <code>npm</code> or <code>uv</code> install path alongside a <code>brew</code> one, I choose brew every single time.</p>
<p>And yet, when it comes time to publish a CLI of my own, I usually just ship it as a Ruby gem or an npm package, because I had (and have!) no fucking clue how Homebrew works. I'm not enough of a neckbeard to peer behind the curtain as soon as root directories like <code>/usr</code> and <code>/opt</code> are involved, so I never bothered before today.</p>
<p>But it's 2025 and we can consult LLMs to conjure whatever arcane incantations we need. And because he listens to <a href="/casts/breaking-change/">the cast</a>, I can always fall back on texting <a href="https://mikemcquaid.com/about/">Mike McQuaid</a> when <a href="https://github.com/Homebrew/brew/pull/20639">his docs suck</a>.</p>
<p>So, because I'll never remember any of this shit (it's already fading from view as I type this), below are the steps involved in publishing your own CLI to Homebrew. The first formula I published is a simple Ruby script, but this guide should be generally applicable.</p>

<h2 id="glossary">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#glossary">Glossary</a>
</h2>
<p>Because Homebrew <em>really fucking leans in</em> to the whole &quot;home brewing as in beer&quot; motif when it comes to naming, it's easy to get lost in the not-particularly-apt nomenclature they chose.</p>
<p><a href="https://docs.brew.sh/Formula-Cookbook#homebrew-terminology">Translate these</a> in your head when you encounter them:</p>
<ul>
<li>Formula → Package definition</li>
<li>Tap → Git repository of formulae</li>
<li>Cask → Manifest for installing pre-built GUIs or large binaries</li>
<li>Bottle → Pre-built binary packages that are &quot;poured&quot; (copied) instead of built from source</li>
<li>Cellar → Directory containing your installed formulae (e.g. <code>/opt/homebrew/Cellar</code>)</li>
<li>Keg → Directory housing an installed formula (e.g. <code>Cellar/foo/1.2.3</code>)</li>
</ul>

<h2 id="overview">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#overview">Overview</a>
</h2>
<p>First thing to know is that the Homebrew team <a href="https://docs.brew.sh/Acceptable-Formulae#niche-or-self-submitted-stuff">doesn't want your stupid CLI</a> in the <a href="https://github.com/Homebrew/homebrew-core">core repository</a>.</p>
<p>Instead, the golden path for us non-famous people is to:</p>
<ol>
<li>Make your CLI, push it to GitHub, cut a tagged release</li>
<li><a href="#create-your-tap">Create a Homebrew tap</a></li>
<li><a href="#create-your-formula">Create a Homebrew formula</a></li>
<li><a href="#update-the-formula-for-each-cli-release">Update the formula for each CLI release</a></li>
</ol>
<p>After you complete the steps outlined below, users will be able to install your cool CLI in just two commands:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew tap your_github_handle/tap
</span></span><span class="line"><span class="cl">brew install your_cool_cli
</span></span></code></pre></div><p>Leaving the &quot;make your CLI&quot; step as an exercise for the reader, let's walk through the three steps required to distribute it on Homebrew. In my case, I slopped up a CLI called <a href="https://github.com/searlsco/imsg">imsg</a> that creates interactive web archives from an iMessage database.</p>

<h2 id="create-your-tap">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#create-your-tap">Create your tap</a>
</h2>
<p>Here's <a href="https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap">Homebrew's guide</a> on creating a tap. Let's follow along how I set things up for myself. Just replace each example with your own username or organization.</p>
<p>For simplicity's sake, you probably want a single tap for all the command line tools you publish moving forward. If that's the case, then you want to name the tap <code>homebrew-tap</code>. The <code>homebrew</code> prefix is treated specially by the <code>brew</code> CLI and the <code>tap</code> suffix is conventional.</p>
<p>First, create the tap:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew tap-new searlsco/homebrew-tap
</span></span></code></pre></div><p>This creates a scaffold in <code>/opt/homebrew/Library/Taps/searlsco/homebrew-tap</code>. Next, I created a <a href="https://github.com/searlsco/homebrew-tap">matching repository in GitHub</a> and pushed what Homebrew generated:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/homebrew/Library/Taps/searlsco/homebrew-tap
</span></span><span class="line"><span class="cl">git remote add origin git@github.com:searlsco/homebrew-tap.git
</span></span><span class="line"><span class="cl">git push -u origin main
</span></span></code></pre></div><p>Congratulations, you're the proud owner of a tap. Now other homebrew users can run:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew tap searlsco/tap
</span></span></code></pre></div><p>It doesn't contain anything useful, but they can run it. The command will clone your repository into their <code>/opt/homebrew/Library/Taps</code> directory.</p>

<h2 id="create-your-formula">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#create-your-formula">Create your formula</a>
</h2>
<p>Even though Homebrew depends on all manner of git operations to function and fully supports just pointing your formula at a GitHub repository, the <a href="https://docs.brew.sh/Acceptable-Formulae#stable-versions">Homebrew team recommends</a> instead referencing versioned tarballs with checksums. Why? Something something reproducibility, yadda yadda open source supply chain. Whatever, let's just do it their way.</p>
<p>One nifty feature of GitHub is that they'll host a tarball archive of any tags you push at a predictable URL. That means if I run these commands in the <a href="https://github.com/searlsco/imsg">imsg repository</a>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">git tag v0.0.5
</span></span><span class="line"><span class="cl">git push --tags
</span></span></code></pre></div><p>Then GitHub will host a tarball at <a href="https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz">github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz</a>.</p>
<p>Once we have that tarball URL, we can use <code>brew create</code> to generate our formula:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew create https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz --tap searlsco/homebrew-tap --set-name imsg --ruby
</span></span></code></pre></div><p>The three flags there do the following:</p>
<ul>
<li><code>--tap</code> points it to the custom tap we created in the previous step, and will place the formula in <code>/opt/homebrew/Library/Taps/searlsco/homebrew-tap/Formula</code></li>
<li><code>--set-name imsg</code> will name the formula explicitly, though <code>brew create</code> would have inferred this and confirmed it interactively. The name should be unique so you don't do something stupid like make a CLI <a href="https://github.com/tendersearls/tldr">named TLDR</a> when there's already a CLI <a href="https://github.com/tendersearls/tldr/issues/4">named TLDR</a> or a CLI <a href="https://github.com/standardrb/standard">named standard</a> when there's already a CLI <a href="https://github.com/standardrb/standard/issues/3">named standard</a></li>
<li><code>--ruby</code> is one of <a href="https://docs.brew.sh/Manpage#create-options-url">several template presets</a> provided to simplify the task of customizing your formula</li>
</ul>
<p>Congratulations! You now have a formula for your CLI. It almost certainly doesn't work and you almost certainly have no clue how to make it work, but it's yours!</p>
<p>This is where LLMs come in.</p>
<ol>
<li>Run <code>brew install --verbose imsg</code></li>
<li>Paste what broke into ChatGPT</li>
<li>Update formula</li>
<li>GOTO 1 until it works</li>
</ol>
<p>Eventually, I wound up with a working <a href="https://github.com/searlsco/homebrew-tap/blob/main/Formula/imsg.rb">Formula/imsg.rb</a> file. (If you're publishing a Ruby CLI, feel free to copy-paste it as a starting point.) Importantly, and a big reason to distribute via Homebrew as opposed to a language-specific package manager, is that I could theoretically swap out the implementation for some other language entirely without disrupting users' ability to upgrade.</p>
<p>Key highlights if you're reading the formula contents:</p>
<ul>
<li><em>All</em> formulae are written in Ruby, not just Ruby-related formulae. Before JavaScript and AI took turns devouring the universe, popular developer tools were often written in Ruby and Homebrew is one of those</li>
<li>You can specify your formula's git repository with the <code>head</code> method (though I'm unsure this does anything)</li>
<li>Adding a <a href="https://docs.brew.sh/Brew-Livecheck">livecheck</a> seemed easy and worth doing</li>
<li>Adding a test to ensure the binary runs can be as simple as asserting on help output. Don't let the generated comment scare you off</li>
<li>Run <code>brew style searlsco/tap</code> to make sure you didn't fuck anything up.</li>
<li>By default, the <code>--ruby</code> template adds <code>uses_from_macos &quot;ruby&quot;</code>, which is currently version 2.6.10 (which was released before the Covid pandemic and <a href="https://endoflife.date/ruby">end-of-life</a>'d over three years ago). You probably want to rely on the <a href="https://formulae.brew.sh/formula/ruby#default">ruby formula</a> with <code>depends_on &quot;ruby@3&quot;</code> instead</li>
</ul>
<p>When you're happy with it, just <code>git push</code> and your formula is live! Now any homebrew user can install your thing:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew tap searlsco/tap
</span></span><span class="line"><span class="cl">brew install imsg
</span></span></code></pre></div>
<h2 id="update-the-formula-for-each-cli-release">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#update-the-formula-for-each-cli-release">Update the formula for each CLI release</a>
</h2>
<p>Of course, any joy I derived from getting this to work was fleeting, because of this bullshit at the top of the formula:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Imsg</span> <span class="o">&lt;</span> <span class="no">Formula</span>
</span></span><span class="line"><span class="cl">  <span class="n">url</span> <span class="s2">&#34;https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="n">sha256</span> <span class="s2">&#34;e9166c70bfb90ae38c00c3ee042af8d2a9443d06afaeaf25a202ee8d66d1ca04&#34;</span>
</span></span></code></pre></div><p><em>Who the fuck's job is it going to be to update these URLs and SHA hashes?</em> Certainly not mine. I barely have the patience to <code>git push</code> my work, much less tag it. And forget about clicking around to create a GitHub release. Now I need to open a <em>second project</em> and update the version there, too? And compute a hash? Get the fuck out of here.</p>
<p>Now, I will grant that Homebrew ships with a <a href="https://docs.brew.sh/Manpage#bump-formula-pr-options-formula">command that opens a PR</a> for each formula update and some guy <a href="https://github.com/dawidd6/action-homebrew-bump-formula">wrapped it in a GitHub action</a>, but both assume you want to daintily fork the tap and humbly submit a pull request to yourself. Clearly all this shit was designed back when Homebrew was letting anybody spam shit into <a href="https://github.com/Homebrew/homebrew-core">homebrew-core</a>. It's my tap, just give me a way to commit to main, please and thank you.</p>
<p>So anyway, you can jump through all those hoops each time you update your CLI if you're a sucker. But be honest with yourself, you're just gonna wind up back at this stupid blog post again, because you'll have forgotten the process. To avoid this, I asked my AI companion to add a GitHub workflow to my formula repository that automatically commits release updates to my tap repository.</p>
<p>If you want to join me in the fast lane, feel free to <a href="https://github.com/searlsco/imsg/blob/main/.github/workflows/update_homebrew_formula.yml">copy paste my workflow</a> as a starting point. The only things you'll need to set up yourself:</p>
<ul>
<li>You'll need a <a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens">personal-access token</a>:
<ul>
<li>When creating the PAT, add your <code>homebrew-tap</code> repository and <code>Content</code> → <code>Write</code> permissions</li>
<li>In the formula repository's settings under <code>Secrets and variables</code> → <code>Actions</code> → <code>Repository secrets</code> and name it <code>HOMEBREW_TAP_TOKEN</code> (<a href="https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets">GitHub docs</a>)</li>
</ul>
</li>
<li>You'll need to specify the <a href="https://github.com/searlsco/imsg/blob/v0.0.5/.github/workflows/update_homebrew_formula.yml#L13-L15">tap and formula environment variables</a></li>
<li>You'll probably want to update the <a href="https://github.com/searlsco/imsg/blob/v0.0.5/.github/workflows/update_homebrew_formula.yml#L61-L62">GitHub bot account</a>, probably to the <a href="https://api.github.com/users/github-actions%5Bbot%5D">GitHub Actions bot</a> if you don't <a href="https://github.com/bitsly">have your own</a>:
<ul>
<li><code>GH_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com</code></li>
<li><code>GH_NAME: github-actions[bot]</code></li>
</ul>
</li>
</ul>
<p>Now, whenever you cut a release, your tap will be updated automatically. Within a few seconds of running <code>git push --tags</code> in your formula's repositories, your users will be able to upgrade their installations with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew update
</span></span><span class="line"><span class="cl">brew upgrade imsg
</span></span></code></pre></div><p>That's it. Job's done!</p>

<h2 id="the-best-part">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#the-best-part">The best part</a>
</h2>
<p>This was a royal pain in the ass to figure out, so hopefully this guide was helpful. The best part is that once your tap is set up and configured and you have a single working formula to serve as an example, <strong>publishing additional CLI tools in the future becomes almost trivial</strong>.</p>
<p>Now, will I actually ever publish another formula? Beats me. But it feels nice to know it would only take me a few minutes if I wanted to. 🍻</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/","append_url_label":"Read 📄","content":"\u003cp\u003eI use \u003ca href=\"https://brew.sh\"\u003eHomebrew\u003c/a\u003e all the time. Whenever I see a new CLI that offers an \u003ccode\u003enpm\u003c/code\u003e or \u003ccode\u003euv\u003c/code\u003e install path alongside a \u003ccode\u003ebrew\u003c/code\u003e one, I choose brew every single time.\u003c/p\u003e\n\u003cp\u003eAnd yet, when it comes time to publish a CLI of my own, I usually just ship it as a Ruby gem or an npm package, because I had (and have!) no fucking clue how Homebrew works. I'm not enough of a neckbeard to peer behind the curtain as soon as root directories like \u003ccode\u003e/usr\u003c/code\u003e and \u003ccode\u003e/opt\u003c/code\u003e are involved, so I never bothered before today.\u003c/p\u003e\n\u003cp\u003eBut it's 2025 and we can consult LLMs to conjure whatever arcane incantations we need. And because he listens to \u003ca href=\"/casts/breaking-change/\"\u003ethe cast\u003c/a\u003e, I can always fall back on texting \u003ca href=\"https://mikemcquaid.com/about/\"\u003eMike McQuaid\u003c/a\u003e when \u003ca href=\"https://github.com/Homebrew/brew/pull/20639\"\u003ehis docs suck\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSo, because I'll never remember any of this shit (it's already fading from view as I type this), below are the steps involved in publishing your own CLI to Homebrew. The first formula I published is a simple Ruby script, but this guide should be generally applicable.\u003c/p\u003e\n\n\u003ch2 id=\"glossary\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#glossary\"\u003eGlossary\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eBecause Homebrew \u003cem\u003ereally fucking leans in\u003c/em\u003e to the whole \u0026quot;home brewing as in beer\u0026quot; motif when it comes to naming, it's easy to get lost in the not-particularly-apt nomenclature they chose.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://docs.brew.sh/Formula-Cookbook#homebrew-terminology\"\u003eTranslate these\u003c/a\u003e in your head when you encounter them:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFormula → Package definition\u003c/li\u003e\n\u003cli\u003eTap → Git repository of formulae\u003c/li\u003e\n\u003cli\u003eCask → Manifest for installing pre-built GUIs or large binaries\u003c/li\u003e\n\u003cli\u003eBottle → Pre-built binary packages that are \u0026quot;poured\u0026quot; (copied) instead of built from source\u003c/li\u003e\n\u003cli\u003eCellar → Directory containing your installed formulae (e.g. \u003ccode\u003e/opt/homebrew/Cellar\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eKeg → Directory housing an installed formula (e.g. \u003ccode\u003eCellar/foo/1.2.3\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2 id=\"overview\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#overview\"\u003eOverview\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eFirst thing to know is that the Homebrew team \u003ca href=\"https://docs.brew.sh/Acceptable-Formulae#niche-or-self-submitted-stuff\"\u003edoesn't want your stupid CLI\u003c/a\u003e in the \u003ca href=\"https://github.com/Homebrew/homebrew-core\"\u003ecore repository\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eInstead, the golden path for us non-famous people is to:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eMake your CLI, push it to GitHub, cut a tagged release\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#create-your-tap\"\u003eCreate a Homebrew tap\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#create-your-formula\"\u003eCreate a Homebrew formula\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#update-the-formula-for-each-cli-release\"\u003eUpdate the formula for each CLI release\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAfter you complete the steps outlined below, users will be able to install your cool CLI in just two commands:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew tap your_github_handle/tap\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install your_cool_cli\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLeaving the \u0026quot;make your CLI\u0026quot; step as an exercise for the reader, let's walk through the three steps required to distribute it on Homebrew. In my case, I slopped up a CLI called \u003ca href=\"https://github.com/searlsco/imsg\"\u003eimsg\u003c/a\u003e that creates interactive web archives from an iMessage database.\u003c/p\u003e\n\n\u003ch2 id=\"create-your-tap\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#create-your-tap\"\u003eCreate your tap\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eHere's \u003ca href=\"https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap\"\u003eHomebrew's guide\u003c/a\u003e on creating a tap. Let's follow along how I set things up for myself. Just replace each example with your own username or organization.\u003c/p\u003e\n\u003cp\u003eFor simplicity's sake, you probably want a single tap for all the command line tools you publish moving forward. If that's the case, then you want to name the tap \u003ccode\u003ehomebrew-tap\u003c/code\u003e. The \u003ccode\u003ehomebrew\u003c/code\u003e prefix is treated specially by the \u003ccode\u003ebrew\u003c/code\u003e CLI and the \u003ccode\u003etap\u003c/code\u003e suffix is conventional.\u003c/p\u003e\n\u003cp\u003eFirst, create the tap:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew tap-new searlsco/homebrew-tap\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis creates a scaffold in \u003ccode\u003e/opt/homebrew/Library/Taps/searlsco/homebrew-tap\u003c/code\u003e. Next, I created a \u003ca href=\"https://github.com/searlsco/homebrew-tap\"\u003ematching repository in GitHub\u003c/a\u003e and pushed what Homebrew generated:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e /opt/homebrew/Library/Taps/searlsco/homebrew-tap\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote add origin git@github.com:searlsco/homebrew-tap.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push -u origin main\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCongratulations, you're the proud owner of a tap. Now other homebrew users can run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew tap searlsco/tap\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIt doesn't contain anything useful, but they can run it. The command will clone your repository into their \u003ccode\u003e/opt/homebrew/Library/Taps\u003c/code\u003e directory.\u003c/p\u003e\n\n\u003ch2 id=\"create-your-formula\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#create-your-formula\"\u003eCreate your formula\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eEven though Homebrew depends on all manner of git operations to function and fully supports just pointing your formula at a GitHub repository, the \u003ca href=\"https://docs.brew.sh/Acceptable-Formulae#stable-versions\"\u003eHomebrew team recommends\u003c/a\u003e instead referencing versioned tarballs with checksums. Why? Something something reproducibility, yadda yadda open source supply chain. Whatever, let's just do it their way.\u003c/p\u003e\n\u003cp\u003eOne nifty feature of GitHub is that they'll host a tarball archive of any tags you push at a predictable URL. That means if I run these commands in the \u003ca href=\"https://github.com/searlsco/imsg\"\u003eimsg repository\u003c/a\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit tag v0.0.5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push --tags\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThen GitHub will host a tarball at \u003ca href=\"https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz\"\u003egithub.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eOnce we have that tarball URL, we can use \u003ccode\u003ebrew create\u003c/code\u003e to generate our formula:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew create https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz --tap searlsco/homebrew-tap --set-name imsg --ruby\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe three flags there do the following:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--tap\u003c/code\u003e points it to the custom tap we created in the previous step, and will place the formula in \u003ccode\u003e/opt/homebrew/Library/Taps/searlsco/homebrew-tap/Formula\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--set-name imsg\u003c/code\u003e will name the formula explicitly, though \u003ccode\u003ebrew create\u003c/code\u003e would have inferred this and confirmed it interactively. The name should be unique so you don't do something stupid like make a CLI \u003ca href=\"https://github.com/tendersearls/tldr\"\u003enamed TLDR\u003c/a\u003e when there's already a CLI \u003ca href=\"https://github.com/tendersearls/tldr/issues/4\"\u003enamed TLDR\u003c/a\u003e or a CLI \u003ca href=\"https://github.com/standardrb/standard\"\u003enamed standard\u003c/a\u003e when there's already a CLI \u003ca href=\"https://github.com/standardrb/standard/issues/3\"\u003enamed standard\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--ruby\u003c/code\u003e is one of \u003ca href=\"https://docs.brew.sh/Manpage#create-options-url\"\u003eseveral template presets\u003c/a\u003e provided to simplify the task of customizing your formula\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCongratulations! You now have a formula for your CLI. It almost certainly doesn't work and you almost certainly have no clue how to make it work, but it's yours!\u003c/p\u003e\n\u003cp\u003eThis is where LLMs come in.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRun \u003ccode\u003ebrew install --verbose imsg\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePaste what broke into ChatGPT\u003c/li\u003e\n\u003cli\u003eUpdate formula\u003c/li\u003e\n\u003cli\u003eGOTO 1 until it works\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eEventually, I wound up with a working \u003ca href=\"https://github.com/searlsco/homebrew-tap/blob/main/Formula/imsg.rb\"\u003eFormula/imsg.rb\u003c/a\u003e file. (If you're publishing a Ruby CLI, feel free to copy-paste it as a starting point.) Importantly, and a big reason to distribute via Homebrew as opposed to a language-specific package manager, is that I could theoretically swap out the implementation for some other language entirely without disrupting users' ability to upgrade.\u003c/p\u003e\n\u003cp\u003eKey highlights if you're reading the formula contents:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eAll\u003c/em\u003e formulae are written in Ruby, not just Ruby-related formulae. Before JavaScript and AI took turns devouring the universe, popular developer tools were often written in Ruby and Homebrew is one of those\u003c/li\u003e\n\u003cli\u003eYou can specify your formula's git repository with the \u003ccode\u003ehead\u003c/code\u003e method (though I'm unsure this does anything)\u003c/li\u003e\n\u003cli\u003eAdding a \u003ca href=\"https://docs.brew.sh/Brew-Livecheck\"\u003elivecheck\u003c/a\u003e seemed easy and worth doing\u003c/li\u003e\n\u003cli\u003eAdding a test to ensure the binary runs can be as simple as asserting on help output. Don't let the generated comment scare you off\u003c/li\u003e\n\u003cli\u003eRun \u003ccode\u003ebrew style searlsco/tap\u003c/code\u003e to make sure you didn't fuck anything up.\u003c/li\u003e\n\u003cli\u003eBy default, the \u003ccode\u003e--ruby\u003c/code\u003e template adds \u003ccode\u003euses_from_macos \u0026quot;ruby\u0026quot;\u003c/code\u003e, which is currently version 2.6.10 (which was released before the Covid pandemic and \u003ca href=\"https://endoflife.date/ruby\"\u003eend-of-life\u003c/a\u003e'd over three years ago). You probably want to rely on the \u003ca href=\"https://formulae.brew.sh/formula/ruby#default\"\u003eruby formula\u003c/a\u003e with \u003ccode\u003edepends_on \u0026quot;ruby@3\u0026quot;\u003c/code\u003e instead\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhen you're happy with it, just \u003ccode\u003egit push\u003c/code\u003e and your formula is live! Now any homebrew user can install your thing:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew tap searlsco/tap\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install imsg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003ch2 id=\"update-the-formula-for-each-cli-release\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#update-the-formula-for-each-cli-release\"\u003eUpdate the formula for each CLI release\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eOf course, any joy I derived from getting this to work was fleeting, because of this bullshit at the top of the formula:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eImsg\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"no\"\u003eFormula\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003esha256\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;e9166c70bfb90ae38c00c3ee042af8d2a9443d06afaeaf25a202ee8d66d1ca04\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eWho the fuck's job is it going to be to update these URLs and SHA hashes?\u003c/em\u003e Certainly not mine. I barely have the patience to \u003ccode\u003egit push\u003c/code\u003e my work, much less tag it. And forget about clicking around to create a GitHub release. Now I need to open a \u003cem\u003esecond project\u003c/em\u003e and update the version there, too? And compute a hash? Get the fuck out of here.\u003c/p\u003e\n\u003cp\u003eNow, I will grant that Homebrew ships with a \u003ca href=\"https://docs.brew.sh/Manpage#bump-formula-pr-options-formula\"\u003ecommand that opens a PR\u003c/a\u003e for each formula update and some guy \u003ca href=\"https://github.com/dawidd6/action-homebrew-bump-formula\"\u003ewrapped it in a GitHub action\u003c/a\u003e, but both assume you want to daintily fork the tap and humbly submit a pull request to yourself. Clearly all this shit was designed back when Homebrew was letting anybody spam shit into \u003ca href=\"https://github.com/Homebrew/homebrew-core\"\u003ehomebrew-core\u003c/a\u003e. It's my tap, just give me a way to commit to main, please and thank you.\u003c/p\u003e\n\u003cp\u003eSo anyway, you can jump through all those hoops each time you update your CLI if you're a sucker. But be honest with yourself, you're just gonna wind up back at this stupid blog post again, because you'll have forgotten the process. To avoid this, I asked my AI companion to add a GitHub workflow to my formula repository that automatically commits release updates to my tap repository.\u003c/p\u003e\n\u003cp\u003eIf you want to join me in the fast lane, feel free to \u003ca href=\"https://github.com/searlsco/imsg/blob/main/.github/workflows/update_homebrew_formula.yml\"\u003ecopy paste my workflow\u003c/a\u003e as a starting point. The only things you'll need to set up yourself:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou'll need a \u003ca href=\"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens\"\u003epersonal-access token\u003c/a\u003e:\n\u003cul\u003e\n\u003cli\u003eWhen creating the PAT, add your \u003ccode\u003ehomebrew-tap\u003c/code\u003e repository and \u003ccode\u003eContent\u003c/code\u003e → \u003ccode\u003eWrite\u003c/code\u003e permissions\u003c/li\u003e\n\u003cli\u003eIn the formula repository's settings under \u003ccode\u003eSecrets and variables\u003c/code\u003e → \u003ccode\u003eActions\u003c/code\u003e → \u003ccode\u003eRepository secrets\u003c/code\u003e and name it \u003ccode\u003eHOMEBREW_TAP_TOKEN\u003c/code\u003e (\u003ca href=\"https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets\"\u003eGitHub docs\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eYou'll need to specify the \u003ca href=\"https://github.com/searlsco/imsg/blob/v0.0.5/.github/workflows/update_homebrew_formula.yml#L13-L15\"\u003etap and formula environment variables\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eYou'll probably want to update the \u003ca href=\"https://github.com/searlsco/imsg/blob/v0.0.5/.github/workflows/update_homebrew_formula.yml#L61-L62\"\u003eGitHub bot account\u003c/a\u003e, probably to the \u003ca href=\"https://api.github.com/users/github-actions%5Bbot%5D\"\u003eGitHub Actions bot\u003c/a\u003e if you don't \u003ca href=\"https://github.com/bitsly\"\u003ehave your own\u003c/a\u003e:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eGH_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eGH_NAME: github-actions[bot]\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNow, whenever you cut a release, your tap will be updated automatically. Within a few seconds of running \u003ccode\u003egit push --tags\u003c/code\u003e in your formula's repositories, your users will be able to upgrade their installations with:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew upgrade imsg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThat's it. Job's done!\u003c/p\u003e\n\n\u003ch2 id=\"the-best-part\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/#the-best-part\"\u003eThe best part\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eThis was a royal pain in the ass to figure out, so hopefully this guide was helpful. The best part is that once your tap is set up and configured and you have a single working formula to serve as an example, \u003cstrong\u003epublishing additional CLI tools in the future becomes almost trivial\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eNow, will I actually ever publish another formula? Beats me. But it feels nice to know it would only take me a few minutes if I wanted to. 🍻\u003c/p\u003e","id":"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/","og_image":"https://justin.searls.co/img/social/posts/how-to-distribute-your-own-scripts-via-homebrew.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-06T16:20:31Z","title":"Distributing your own scripts via Homebrew","updated_at":"2025-09-06T12:23:15-04:00","url":"https://justin.searls.co/posts/how-to-distribute-your-own-scripts-via-homebrew/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-09-03-08h12m36s/</id>
      <title type="text">📸 You won&#39;t believe this Codex fork</title>
      <link href="https://justin.searls.co/shots/2025-09-03-08h12m36s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-03T12:12:36+00:00</published>
    <updated>2025-09-03T09:23:56-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-09-03-08h12m00s-6f04e4b.jpeg"/>
</div><p>Reddit turned me onto this <a href="https://github.com/just-every/code">just-every/code fork</a> of <a href="https://openai.com/codex/">OpenAI's Codex CLI</a> last night. Since it uses the binary name <code>coder</code> to differentiate it from <code>code</code> and <code>codex</code>, I guess we should just call this thing Coder.</p>
<p>In addition to everything you get with Codex:</p>
<ul>
<li><strong>A built-in diff viewer (Ctrl+D).</strong> If you're like me, you often have <a href="https://www.anthropic.com/claude-code">Claude Code</a> or Codex open in one window and your preferred Git UI (I use <a href="https://git-fork.com">Fork</a>) in a second window, so having it integrated is wonderful. Moreover, while viewing a diff, you can press <code>e</code> to request an explanation of the specific change you're looking at</li>
<li><strong>Built-in browser support with ASCII previews (Ctrl+B)</strong> Like Playwright, it automates browsers over the very fast <a href="https://chromedevtools.github.io/devtools-protocol/">CDP</a>, and it takes zero futzing to get started with it (unlike tacking an MCP tool onto Claude)</li>
<li><strong>Multi-agent consensus</strong> If you're a real sicko, you can hand the same question or task to all three of GPT, Claude, and Gemini and keep the consensus winner among them</li>
</ul>
<p>Coder also has a themeable, more stable curses-like UI (as opposed to top-level terminal scrollback). It's the rare case of a community taking a heavily-funded corporate open source project and adding a lot of visual flair and spit polish to it. But I'll be damned if this isn't a <em>much</em> nicer experience than either Claude Code or Codex out of the box. (I can't speak to <a href="https://opencode.ai">OpenCode</a>, but since it doesn't support ChatGPT subscriptions, I'm not interested in it.)</p>

]]></content>
    <summary type="html"><![CDATA[<p>Reddit turned me onto this <a href="https://github.com/just-every/code">just-every/code fork</a> of <a href="https://openai.com/codex/">OpenAI's Codex CLI</a> last night. Since it uses the binary name <code>coder</code> to differentiate it from <code>code</code> and <code>codex</code>, I guess we should just call this thing Coder.</p>
<p>In addition to everything you get with Codex:</p>
<ul>
<li><strong>A built-in diff viewer (Ctrl+D).</strong> If you're like me, you often have <a href="https://www.anthropic.com/claude-code">Claude Code</a> or Codex open in one window and your preferred Git UI (I use <a href="https://git-fork.com">Fork</a>) in a second window, so having it integrated is wonderful. Moreover, while viewing a diff, you can press <code>e</code> to request an explanation of the specific change you're looking at</li>
<li><strong>Built-in browser support with ASCII previews (Ctrl+B)</strong> Like Playwright, it automates browsers over the very fast <a href="https://chromedevtools.github.io/devtools-protocol/">CDP</a>, and it takes zero futzing to get started with it (unlike tacking an MCP tool onto Claude)</li>
<li><strong>Multi-agent consensus</strong> If you're a real sicko, you can hand the same question or task to all three of GPT, Claude, and Gemini and keep the consensus winner among them</li>
</ul>
<p>Coder also has a themeable, more stable curses-like UI (as opposed to top-level terminal scrollback). It's the rare case of a community taking a heavily-funded corporate open source project and adding a lot of visual flair and spit polish to it. But I'll be damned if this isn't a <em>much</em> nicer experience than either Claude Code or Codex out of the box. (I can't speak to <a href="https://opencode.ai">OpenCode</a>, but since it doesn't support ChatGPT subscriptions, I'm not interested in it.)</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-09-03-08h12m36s/","append_url_label":"View 📸","content":"\u003cp\u003eReddit turned me onto this \u003ca href=\"https://github.com/just-every/code\"\u003ejust-every/code fork\u003c/a\u003e of \u003ca href=\"https://openai.com/codex/\"\u003eOpenAI's Codex CLI\u003c/a\u003e last night. Since it uses the binary name \u003ccode\u003ecoder\u003c/code\u003e to differentiate it from \u003ccode\u003ecode\u003c/code\u003e and \u003ccode\u003ecodex\u003c/code\u003e, I guess we should just call this thing Coder.\u003c/p\u003e\n\u003cp\u003eIn addition to everything you get with Codex:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eA built-in diff viewer (Ctrl+D).\u003c/strong\u003e If you're like me, you often have \u003ca href=\"https://www.anthropic.com/claude-code\"\u003eClaude Code\u003c/a\u003e or Codex open in one window and your preferred Git UI (I use \u003ca href=\"https://git-fork.com\"\u003eFork\u003c/a\u003e) in a second window, so having it integrated is wonderful. Moreover, while viewing a diff, you can press \u003ccode\u003ee\u003c/code\u003e to request an explanation of the specific change you're looking at\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuilt-in browser support with ASCII previews (Ctrl+B)\u003c/strong\u003e Like Playwright, it automates browsers over the very fast \u003ca href=\"https://chromedevtools.github.io/devtools-protocol/\"\u003eCDP\u003c/a\u003e, and it takes zero futzing to get started with it (unlike tacking an MCP tool onto Claude)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMulti-agent consensus\u003c/strong\u003e If you're a real sicko, you can hand the same question or task to all three of GPT, Claude, and Gemini and keep the consensus winner among them\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCoder also has a themeable, more stable curses-like UI (as opposed to top-level terminal scrollback). It's the rare case of a community taking a heavily-funded corporate open source project and adding a lot of visual flair and spit polish to it. But I'll be damned if this isn't a \u003cem\u003emuch\u003c/em\u003e nicer experience than either Claude Code or Codex out of the box. (I can't speak to \u003ca href=\"https://opencode.ai\"\u003eOpenCode\u003c/a\u003e, but since it doesn't support ChatGPT subscriptions, I'm not interested in it.)\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-09-03-08h12m36s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-09-03-08h12m00s-6f04e4b.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-09-03-08h12m00s-6f04e4b.jpeg","platform_overrides":{},"published_at":"2025-09-03T12:12:36Z","title":"You won't believe this Codex fork","updated_at":"2025-09-03T09:23:56-04:00","url":"https://justin.searls.co/shots/2025-09-03-08h12m36s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-09-02-what-they-don-t-tell-you-about-winning-film-awards/</id>
      <title type="text">🔗 What They Don&#39;t Tell You About Winning Film Awards</title>
        <link href="https://www.anthonysalamon.com/post/what-they-don-t-tell-you-about-winning-film-awards-but-i-will" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-09-02-what-they-don-t-tell-you-about-winning-film-awards/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-02T20:07:39+00:00</published>
    <updated>2025-09-02T16:08:01-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>From my friend Anthony Salamon on what it's like to <a href="https://www.anthonysalamon.com/post/what-they-don-t-tell-you-about-winning-film-awards-but-i-will">win an award in the film industry</a>:</p>
<blockquote>
<p>The psychology of winning is also more complex than anyone admits. There's an immediate high, followed by a weird emptiness. You've achieved something you've been working toward, and suddenly you need new goals. Some winners describe a mild depression that follows major recognition, the &quot;What now?&quot; syndrome that comes when you realize that achieving your dreams doesn't fundamentally change who you are or solve your deeper creative challenges.</p>
</blockquote>
<p>In my experience this phenomenon extends to any achievement or event that redounds to a significant moment of extrinsic validation in one's career. Anthony's description of the hangover effect following an award win mirrors exactly what it felt like to give a big conference talk or keynote address, especially if it was a &quot;first&quot; for me and doubly-so if it was very well received. It was always followed by a brief and intense emotional high followed by a deep well of uncertainty and exhaustion. A lesson I learned every conference season and promptly unlearned just in time for the subsequent year's conference season.</p>
<p>Speaking of conference season, I <a href="https://justin.searls.co/tubes/2024-11-09-11h03m00s/">retired from speaking</a> a year ago and it's that time again. <a href="https://rubyonrails.org/world/2025">Rails World is this week</a> and lots of my friends are in Amsterdam and I am experiencing absolutely no FOMO. Don't miss it at all. Few things are as <em>intrinsically</em> validating as accurately forecasting how a consequential decision will ultimately make you feel. Zero regrets.</p>

<p>🔗 <a href="https://www.anthonysalamon.com/post/what-they-don-t-tell-you-about-winning-film-awards-but-i-will" title="Original Article">anthonysalamon.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-09-02-what-they-don-t-tell-you-about-winning-film-awards/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>From my friend Anthony Salamon on what it's like to <a href="https://www.anthonysalamon.com/post/what-they-don-t-tell-you-about-winning-film-awards-but-i-will">win an award in the film industry</a>:</p>
<blockquote>
<p>The psychology of winning is also more complex than anyone admits. There's an immediate high, followed by a weird emptiness. You've achieved something you've been working toward, and suddenly you need new goals. Some winners describe a mild depression that follows major recognition, the &quot;What now?&quot; syndrome that comes when you realize that achieving your dreams doesn't fundamentally change who you are or solve your deeper creative challenges.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-09-02-what-they-don-t-tell-you-about-winning-film-awards/","append_url_label":"Click 🔗","content":"\u003cp\u003eFrom my friend Anthony Salamon on what it's like to \u003ca href=\"https://www.anthonysalamon.com/post/what-they-don-t-tell-you-about-winning-film-awards-but-i-will\"\u003ewin an award in the film industry\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe psychology of winning is also more complex than anyone admits. There's an immediate high, followed by a weird emptiness. You've achieved something you've been working toward, and suddenly you need new goals. Some winners describe a mild depression that follows major recognition, the \u0026quot;What now?\u0026quot; syndrome that comes when you realize that achieving your dreams doesn't fundamentally change who you are or solve your deeper creative challenges.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIn my experience this phenomenon extends to any achievement or event that redounds to a significant moment of extrinsic validation in one's career. Anthony's description of the hangover effect following an award win mirrors exactly what it felt like to give a big conference talk or keynote address, especially if it was a \u0026quot;first\u0026quot; for me and doubly-so if it was very well received. It was always followed by a brief and intense emotional high followed by a deep well of uncertainty and exhaustion. A lesson I learned every conference season and promptly unlearned just in time for the subsequent year's conference season.\u003c/p\u003e\n\u003cp\u003eSpeaking of conference season, I \u003ca href=\"https://justin.searls.co/tubes/2024-11-09-11h03m00s/\"\u003eretired from speaking\u003c/a\u003e a year ago and it's that time again. \u003ca href=\"https://rubyonrails.org/world/2025\"\u003eRails World is this week\u003c/a\u003e and lots of my friends are in Amsterdam and I am experiencing absolutely no FOMO. Don't miss it at all. Few things are as \u003cem\u003eintrinsically\u003c/em\u003e validating as accurately forecasting how a consequential decision will ultimately make you feel. Zero regrets.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-09-02-what-they-don-t-tell-you-about-winning-film-awards/","og_image":"https://justin.searls.co/img/social/links/2025-09-02-what-they-don-t-tell-you-about-winning-film-awards.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-02T20:07:39Z","related_url":"https://www.anthonysalamon.com/post/what-they-don-t-tell-you-about-winning-film-awards-but-i-will","title":"What They Don't Tell You About Winning Film Awards","updated_at":"2025-09-02T16:08:01-04:00","url":"https://justin.searls.co/links/2025-09-02-what-they-don-t-tell-you-about-winning-film-awards/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-09-02-bootloading-over-sideloading/</id>
      <title type="text">🔗 Bootloading &gt; Sideloading</title>
        <link href="https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-09-02-bootloading-over-sideloading/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-02T17:41:12+00:00</published>
    <updated>2025-09-02T17:59:35+00:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>An insightful take <a href="https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html">from Hugo Tunius</a> that makes a distinction between sideloading apps and controlling what software runs on &quot;hardware you own&quot;:</p>
<blockquote>
<p>When Google restricts your ability to install certain applications they aren't constraining what you can do with the hardware you own, they are constraining what you can do using the software they provide with said hardware.</p>
</blockquote>
<p>To wit, if you own your iPhone outright, it's completely reasonable to demand that you be able to boot an alternative operating system and, to whatever extent regulatory action against the platform holders is warranted, it should be targeting this layer of the software stack as opposed to mandating how specific features of the operating system ought to function.</p>
<p>Which means the remedy would look a bit like the surprisingly-successful Right to Repair movement:</p>
<blockquote>
<p>However, our critique shouldn't be of the restrictions in place in the operating systems they provide – rather, it should focus on the ability to truly run any code we want on hardware we own. In this context this would mean having the ability and documentation to build or install alternative operating systems on this hardware. It should be possible to run Android on an iPhone and manufacturers should be required by law to provide enough technical support and documentation to make the development of new operating systems possible.</p>
</blockquote>
<p>A &quot;Right to Run&quot; movement that demanded hardware vendors enable their devices to run unsigned operating systems—and to perhaps provide documentation and device drivers—seems to me like it would stand on far firmer legal and conceptual ground than the knots the Europe Commission has tied itself in trying to enforce the Digital Markets Act.</p>
<p>Of course, pragmatist regulators would point out that approximately abso-fucking-nobody would go to the trouble of running &quot;Linux on the phone,&quot; because of how miserable an experience it would be relative to using the default operating system. And the platform holders would justifiably cry foul that criminals and state actors could effectively rootkit people's devices and gain an unbelievable amount of surveillance and control over their lives. But there's no form of freedom that doesn't pose these sorts of risks.</p>
<p>Anyway, interesting idea.</p>

<p>🔗 <a href="https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html" title="Original Article">hugotunius.se</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-09-02-bootloading-over-sideloading/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>An insightful take <a href="https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html">from Hugo Tunius</a> that makes a distinction between sideloading apps and controlling what software runs on &quot;hardware you own&quot;:</p>
<blockquote>
<p>When Google restricts your ability to install certain applications they aren't constraining what you can do with the hardware you own, they are constraining what you can do using the software they provide with said hardware.</p>
</blockquote>
<p>To wit, if you own your iPhone outright, it's completely reasonable to demand that you be able to boot an alternative operating system and, to whatever extent regulatory action against the platform holders is warranted, it should be targeting this layer of the software stack as opposed to mandating how specific features of the operating system ought to function.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-09-02-bootloading-over-sideloading/","append_url_label":"Click 🔗","content":"\u003cp\u003eAn insightful take \u003ca href=\"https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html\"\u003efrom Hugo Tunius\u003c/a\u003e that makes a distinction between sideloading apps and controlling what software runs on \u0026quot;hardware you own\u0026quot;:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen Google restricts your ability to install certain applications they aren't constraining what you can do with the hardware you own, they are constraining what you can do using the software they provide with said hardware.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTo wit, if you own your iPhone outright, it's completely reasonable to demand that you be able to boot an alternative operating system and, to whatever extent regulatory action against the platform holders is warranted, it should be targeting this layer of the software stack as opposed to mandating how specific features of the operating system ought to function.\u003c/p\u003e\n\u003cp\u003eWhich means the remedy would look a bit like the surprisingly-successful Right to Repair movement:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHowever, our critique shouldn't be of the restrictions in place in the operating systems they provide – rather, it should focus on the ability to truly run any code we want on hardware we own. In this context this would mean having the ability and documentation to build or install alternative operating systems on this hardware. It should be possible to run Android on an iPhone and manufacturers should be required by law to provide enough technical support and documentation to make the development of new operating systems possible.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eA \u0026quot;Right to Run\u0026quot; movement that demanded hardware vendors enable their devices to run unsigned operating systems—and to perhaps provide documentation and device drivers—seems to me like it would stand on far firmer legal and conceptual ground than the knots the Europe Commission has tied itself in trying to enforce the Digital Markets Act.\u003c/p\u003e\n\u003cp\u003eOf course, pragmatist regulators would point out that approximately abso-fucking-nobody would go to the trouble of running \u0026quot;Linux on the phone,\u0026quot; because of how miserable an experience it would be relative to using the default operating system. And the platform holders would justifiably cry foul that criminals and state actors could effectively rootkit people's devices and gain an unbelievable amount of surveillance and control over their lives. But there's no form of freedom that doesn't pose these sorts of risks.\u003c/p\u003e\n\u003cp\u003eAnyway, interesting idea.\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-09-02-bootloading-over-sideloading/","og_image":"https://hugotunius.se/favicon-192.png","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-02T17:41:12Z","related_url":"https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html","title":"Bootloading \u003e Sideloading","updated_at":"2025-09-02T17:59:35Z","url":"https://justin.searls.co/links/2025-09-02-bootloading-over-sideloading/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v43-the-slop-economy/</id>
      <title type="text">🎙️ Breaking Change podcast v43 - The Slop Economy</title>
      <link href="https://justin.searls.co/casts/breaking-change-v43-the-slop-economy/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-09-02T14:58:22+00:00</published>
    <updated>2025-09-02T23:20:28-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v43.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v43.mp3">Direct link to podcast audio file</a>
</p><p>Remember it is your civic duty to e-mail me at <a href="mailto:podcast@searls.co">podcast@searls.co</a>. As of this episode, that address is monitored by <a href="https://join.fastmail.com/a29cc1ac">Fastmail</a>, so there's a higher probability I'll actually get your e-mail!</p>
<p>Some links you won't click:</p>
<ul>
<li><a href="https://youtube.com/watch?v=10ngbI2ltbc&amp;si=2DzsQBRBGfbFPL-Q">Why I-4 is the most dangerous highway in America</a></li>
<li><a href="https://disneyworld.disney.go.com/dining/magic-kingdom/beak-barrel/">The Beak and the Barrel</a></li>
<li>Sign up for <a href="https://join.fastmail.com/a29cc1ac">Fastmail</a>. It is good.</li>
<li><a href="https://justin.searls.co/posts/star-wars-the-gilroy-order/">The Gilroy Order</a></li>
<li><a href="https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/">Making ChatGPT doubt itself</a></li>
<li><a href="https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/">Why I wasn't cut out for management</a></li>
<li><a href="https://justin.searls.co/posts/this-blog-has-a-comment-system/">How to comment on my blog</a></li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://sixcolors.com/link/2025/08/apples-new-xcode-beta-adds-gpt-5-claude-account-support/">New Xcode beta adds GPT-5, Claude account support</a></li>
<li><a href="https://www.macrumors.com/2025/08/21/apple-responds-to-jay-blahnik-report/">Apple Responds to Accusations of Jay Blahnik Creating 'Toxic Workplace'</a></li>
<li><a href="https://www.bbc.com/news/articles/cq68j5g2nr1o">4chan Refuses To Pay UK Online Safety Act Fines</a></li>
<li><a href="https://arstechnica.com/cars/2025/08/junk-filled-garages-hurt-ev-sales-as-people-dont-have-room-for-chargers/">Americans' junk-filled garages are hurting EV adoption, study says</a></li>
<li><a href="https://it.slashdot.org/story/25/08/25/0628205/new-book-argues-hybrid-schedules-dont-work-return-to-office-brings-motivation-and-learning">New Book Argues Hybrid Schedules 'Don't Work', Return-to-Office Brings Motivation and Learning</a></li>
<li><a href="https://www.videogameschronicle.com/news/shenmue-3-is-getting-an-enhanced-edition-including-xbox-and-nintendo-versions-for-the-first-time/">Shenmue 3 is getting an Enhanced edition</a></li>
<li><a href="https://github.com/Dimildizio/raguelike">Raguelike game</a> may portend AI disruption in the gaming industry</li>
<li><a href="https://www.washingtonpost.com/technology/2025/08/17/ai-video-slop-creators/">Making cash off 'AI slop': The surreal video business taking over the web</a> (<a href="https://apple.news/AwO6UvhlVTkCNL-TLiC7BaA">News+</a>)</li>
<li><a href="https://www.reuters.com/business/autos-transportation/stellantis-shelves-level-3-driver-assistance-program-it-downscales-software-2025-08-26/">Stellantis shelves Level 3 driver-assistance program that totally works and has no problems</a></li>
<li><a href="https://www.kron4.com/news/technology-ai/sf-tech-ceo-says-ai-enabled-him-to-cut-4000-jobs/">Salesforce CEO Marc Benioff says AI enabled him to cut 4,000 jobs</a></li>
<li><a href="https://youtu.be/LhBzqLjg_nA?si=fgmHopzIK4o60bp5">Timeline Japan: 1980</a></li>
<li><a href="https://en.wikipedia.org/wiki/Perfect_Days">Perfect Days</a></li>
<li><a href="https://www.youtube.com/watch?v=n0pqP6ClcE8">Rental Family</a></li>
<li><a href="https://en.wikipedia.org/wiki/Black_Mirror">Black Mirror Season 7</a></li>
<li><a href="https://yumtein.com/products/build-your-own-high-protein-snack-box-12-pack">Yumtein Gummy Bears</a></li>
<li>Listener Björn made <a href="https://equaliteam.com/">this Equaliteam app</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>Remember it is your civic duty to e-mail me at <a href="mailto:podcast@searls.co">podcast@searls.co</a>. As of this episode, that address is monitored by <a href="https://join.fastmail.com/a29cc1ac">Fastmail</a>, so there's a higher probability I'll actually get your e-mail!</p>
<p>Some links you won't click:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v43-the-slop-economy/","append_url_label":"Hear 🎙","content":"\u003cp\u003eRemember it is your civic duty to e-mail me at \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e. As of this episode, that address is monitored by \u003ca href=\"https://join.fastmail.com/a29cc1ac\"\u003eFastmail\u003c/a\u003e, so there's a higher probability I'll actually get your e-mail!\u003c/p\u003e\n\u003cp\u003eSome links you won't click:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://youtube.com/watch?v=10ngbI2ltbc\u0026amp;si=2DzsQBRBGfbFPL-Q\"\u003eWhy I-4 is the most dangerous highway in America\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://disneyworld.disney.go.com/dining/magic-kingdom/beak-barrel/\"\u003eThe Beak and the Barrel\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSign up for \u003ca href=\"https://join.fastmail.com/a29cc1ac\"\u003eFastmail\u003c/a\u003e. It is good.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/posts/star-wars-the-gilroy-order/\"\u003eThe Gilroy Order\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/\"\u003eMaking ChatGPT doubt itself\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/\"\u003eWhy I wasn't cut out for management\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/posts/this-blog-has-a-comment-system/\"\u003eHow to comment on my blog\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://sixcolors.com/link/2025/08/apples-new-xcode-beta-adds-gpt-5-claude-account-support/\"\u003eNew Xcode beta adds GPT-5, Claude account support\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.macrumors.com/2025/08/21/apple-responds-to-jay-blahnik-report/\"\u003eApple Responds to Accusations of Jay Blahnik Creating 'Toxic Workplace'\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bbc.com/news/articles/cq68j5g2nr1o\"\u003e4chan Refuses To Pay UK Online Safety Act Fines\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://arstechnica.com/cars/2025/08/junk-filled-garages-hurt-ev-sales-as-people-dont-have-room-for-chargers/\"\u003eAmericans' junk-filled garages are hurting EV adoption, study says\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://it.slashdot.org/story/25/08/25/0628205/new-book-argues-hybrid-schedules-dont-work-return-to-office-brings-motivation-and-learning\"\u003eNew Book Argues Hybrid Schedules 'Don't Work', Return-to-Office Brings Motivation and Learning\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/shenmue-3-is-getting-an-enhanced-edition-including-xbox-and-nintendo-versions-for-the-first-time/\"\u003eShenmue 3 is getting an Enhanced edition\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Dimildizio/raguelike\"\u003eRaguelike game\u003c/a\u003e may portend AI disruption in the gaming industry\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.washingtonpost.com/technology/2025/08/17/ai-video-slop-creators/\"\u003eMaking cash off 'AI slop': The surreal video business taking over the web\u003c/a\u003e (\u003ca href=\"https://apple.news/AwO6UvhlVTkCNL-TLiC7BaA\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.reuters.com/business/autos-transportation/stellantis-shelves-level-3-driver-assistance-program-it-downscales-software-2025-08-26/\"\u003eStellantis shelves Level 3 driver-assistance program that totally works and has no problems\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.kron4.com/news/technology-ai/sf-tech-ceo-says-ai-enabled-him-to-cut-4000-jobs/\"\u003eSalesforce CEO Marc Benioff says AI enabled him to cut 4,000 jobs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/LhBzqLjg_nA?si=fgmHopzIK4o60bp5\"\u003eTimeline Japan: 1980\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Perfect_Days\"\u003ePerfect Days\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=n0pqP6ClcE8\"\u003eRental Family\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Black_Mirror\"\u003eBlack Mirror Season 7\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://yumtein.com/products/build-your-own-high-protein-snack-box-12-pack\"\u003eYumtein Gummy Bears\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eListener Björn made \u003ca href=\"https://equaliteam.com/\"\u003ethis Equaliteam app\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! The Slop Economy","id":"https://justin.searls.co/casts/breaking-change-v43-the-slop-economy/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v43-the-slop-economy.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-09-02T14:58:22Z","title":"The Slop Economy","updated_at":"2025-09-02T23:20:28-04:00","url":"https://justin.searls.co/casts/breaking-change-v43-the-slop-economy/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/clips/cinder-block-developers/</id>
      <title type="text">✂️ Cinder block developers</title>
      <link href="https://justin.searls.co/clips/cinder-block-developers/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-31T23:05:43+00:00</published>
    <updated>2025-08-31T19:20:41-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="flex justify-center">
  <div class="sm:beneath-the-page sm:p-2">
    <video poster="https://podcast-cdn.searls.co/clips/cinder-block-developers.jpg" class="inline-block shadow-lg rounded-lg max-h-[80lvh] sm:max-h-[60lvh] m-0" preload="auto" playsinline="playsinline" controls="controls" controlslist="nodownload">
      <source src="https://podcast-cdn.searls.co/clips/cinder-block-developers.mp4">
      Your browser does not support the video tag.
    </video>
  </div>
</div><p>What <a href="https://worksonmymachine.ai">Scott</a> means when he says he's a cinder block developer. Clipped from <a href="/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">Hotfix v42.0.1</a>.</p>
<p>Oh, and here's that episode of <a href="https://www.youtube.com/watch?v=baFaEvBywGc">The Secret Life of Machines on washing machines</a></p>
]]></content>
    <summary type="html"><![CDATA[<p>What <a href="https://worksonmymachine.ai">Scott</a> means when he says he's a cinder block developer. Clipped from <a href="/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">Hotfix v42.0.1</a>.</p>
<p>Oh, and here's that episode of <a href="https://www.youtube.com/watch?v=baFaEvBywGc">The Secret Life of Machines on washing machines</a></p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/clips/cinder-block-developers/","append_url_label":"Peek ✂️","content":"\u003cp\u003eWhat \u003ca href=\"https://worksonmymachine.ai\"\u003eScott\u003c/a\u003e means when he says he's a cinder block developer. Clipped from \u003ca href=\"/casts/hotfix-v42.0.1-ignore-all-previous-instructions/\"\u003eHotfix v42.0.1\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eOh, and here's that episode of \u003ca href=\"https://www.youtube.com/watch?v=baFaEvBywGc\"\u003eThe Secret Life of Machines on washing machines\u003c/a\u003e\u003c/p\u003e","format_string":"New clip! {{title}}","id":"https://justin.searls.co/clips/cinder-block-developers/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/clips/cinder-block-developers.mp4"}],"og_image":"https://podcast-cdn.searls.co/clips/cinder-block-developers.jpg","platform_overrides":{},"published_at":"2025-08-31T23:05:43Z","title":"Cinder block developers","updated_at":"2025-08-31T19:20:41-04:00","url":"https://justin.searls.co/clips/cinder-block-developers/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/this-blog-has-a-comment-system/</id>
      <title type="text">📄 This blog has a comment system</title>
      <link href="https://justin.searls.co/posts/this-blog-has-a-comment-system/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-29T18:13:16+00:00</published>
    <updated>2025-08-29T14:27:55-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>The day before we recorded <a href="/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">our episode of Hotfix</a>, <a href="https://worksonmymachine.ai">Scott Werner</a> asked a fair question: &quot;so, if you're off social media and your blog doesn't have a comment system, how do you want people to respond to your posts? Just email?&quot;</p>
<p>I answered, &quot;actually my blog <em>does</em> have a comment system.&quot;</p>
<p>Here's how to leave a comment on this web site:</p>
<ol>
<li>Read a post</li>
<li>Think, &quot;I want to comment on this&quot;</li>
<li>Draft a post on your blog</li>
<li>Add a hyperlink to my post</li>
<li>Paste an excerpt to which you want to respond</li>
<li>Write your comment</li>
<li>Hit publish</li>
</ol>
<p>I admit, it's quaint. It involves a number of invisible steps, like <code>2.1</code> where you start a blog (which is <a href="https://pages.github.com">actually</a> <a href="https://www.wix.com">pretty</a> <a href="https://www.squarespace.com">easy</a> <a href="https://wordpress.com">but</a> <a href="https://substack.com/home">not</a> <a href="https://ghost.org">free</a> <a href="https://www.11ty.dev">of</a> <a href="https://gohugo.io">friction</a>). You should try it.</p>
<p>It is 2025 and the Web—the capital-W Web—is beleaguered. The major platforms have long-since succumbed to <a href="https://en.wikipedia.org/wiki/Enshittification">enshittification</a>, but their users aren't going anywhere. Some among us courageously voice their dissent, but always from the safe confines of their favorite walled garden. They drop a note in the jailkeeper's suggestion box as they scroll past the Squarespace ads littering their algorithmic timelines. Others have fled to <a href="https://mastodon.social">open</a> and <a href="http://bsky.app">open-flavored</a> networks, but everyone eventually realizes they <a href="/posts/blue-sky-red-ocean/">can't go home again</a>.</p>
<p>But that's not why I want you to adopt this blog's commenting system. I'm not a high-minded individual who cares about the intellectual project of the World Wide Web as a bastion for free expression or whatever the fuck. No. I just had a super rad time on the Internet from 2000 to 2006 and I want to do my part to bring it back.</p>
<p>Back then, I would find a blog and follow it—via <a href="/rss/">its feed</a> when possible, or else by adding it to a folder of <a href="https://en.wikipedia.org/wiki/Bookmark_(World_Wide_Web)">bookmarks</a>—and check it daily.</p>
<p>But what about discoverability? How did anyone find these websites? Bloggers couldn't rely on platforms' social graphs or algorithmic timelines to build awareness, so they had to bake discoverability into the product. Some sites had a &quot;<a href="https://en.wiktionary.org/wiki/blogrolling">blogroll</a>&quot; of recommendations in the sidebar. But the most effective approach was the art of &quot;blogging as a conversation.&quot; When an author read something that provoked them to write, they'd link to the offending piece, excerpt it, and provide their own commentary. And because humans are vain, the original post's author would frequently circle back and write their own response to the response. The net effect was that each author's audience would get exposure to the other writer. Even if the authors were in violent disagreement, readers of one might appreciate the other's perspective and subscribe to them.</p>
<p>Blogging as a conversation—as a comments section—was valuable because it was purely positive-sum. As an author, I benefit because another author's opinions inspired me to write. The other author benefits because linking to them offers access to my readership. My readers benefit because they're exposed to complementary and contrasting viewpoints.</p>
<p>Growth was slow and organic but more meaningful and durable. It was a special time.</p>
<details closed>
  <summary>More on my personal history with blogging</summary>
  <p>If I really enjoyed someone's blog, I'd rush to read their stuff first. If an author's posts weren't so stimulating, I wasn't shy about unsubscribing. And I could afford to be picky—there was no shortage of content! Even with aggressive curation, by 2005 I had subscribed to so many feeds in <a href="https://en.wikipedia.org/wiki/Google_Reader">Google Reader</a> that I struggled to stay on top of them all. My grades suffered because I was &quot;<a href="https://googlereader.blogspot.com/2008/02/j-walking-with-reader.html">j-walking</a>&quot; hundreds of blog posts each day instead of doing homework.</p>
<p>Then, <a href="https://en.wikipedia.org/wiki/Feed_(Facebook)">Facebook's feed</a>, <a href="https://en.wikipedia.org/wiki/Tumblr">Tumblr</a>, and <a href="https://en.wikipedia.org/wiki/Twitter">Twttr</a> came along, and they took the most enjoyable parts of surfing the 1.0 Web—novel information and connectivity with others—and supercharged them. They were &quot;good Web citizens&quot; in the same way the closed-source, distributed-to-exactly-one-server Bluesky is today. The timelines were reverse chronological. They handled the nerdy tech stuff for you. None of the feeds had ads yet.</p>
<p>Blogging didn't stand a chance.</p>
<p>I failed to see it at the time, but blogging did have one advantage over the platforms: it was a goddamn pain in the ass. Whether you flung files over an <a href="https://en.wikipedia.org/wiki/File_Transfer_Protocol">FTP</a> client or used a <a href="https://en.wikipedia.org/wiki/Content_management_system">CMS</a>, writing a blog post was <em>an ordeal</em>. If you were going to the trouble of posting to your blog, you might as well put your back into it and write something thoughtful. Something you could take pride in. Something with a permalink that (probably wouldn't, but) could be cited years later.</p>
<p>The platforms offered none of that. You got a tiny-ass text area, a stingy character limit, and a flood of ephemera to compete with. By demoting writing to a subordinate widget of the reading interface, the priority was clear: words were mere grist for the content mill. The shame of it all was that these short-form, transient, low-effort posts nevertheless sated many people's itch to write at all. I was as guilty of this as anyone. From 2009 through 2020, I devoted all my writing energy to Twitter. Except for that brief year or two where <a href="https://medium.com">Medium</a> was good, I basically stopped thinking in longform. Instead, I prided myself on an ability to distill 2,000-word essays down to 140-character hot takes. Many of those takes reached millions of people and made me feel good for a very brief amount of time.</p>
<p>My brain was cooked. When it finally <a href="https://www.the-independent.com/tech/elon-musk-twitter-headquarters-sink-buy-b2211364.html">sank in</a>, I quit.</p>
<p>It took almost three years to recover. I'm on the other side now, and am happy to report I can now think thoughts more than a sentence or two long.</p>
<p>Last night, I got dinner with two old friends, <a href="https://launchscout.com/chris-nelson">Chris Nelson</a> and <a href="https://joshuawood.net">Joshua Wood</a>. Josh asked how it's been since I quit paying attention to social media. I thought about the unfinished draft of this post.</p>
<p>In truth, this blog and its attendant <a href="/casts/">podcast empire</a> have been a refuge for my psyche. A delightful place to share pieces of myself online. Somewhere to experiment in both form and format. A means of reclaiming my identity from a smattering of social media profile pages and into something authentic and unique.</p>


</details>
<p>Today, as the platforms wane, it feels like this conversational approach to blogging is seeing new life. As a readership has slowly gathered around this blog, I've separately been curating a fresh list of thoughtful bloggers that inspire me to write. Maybe I'll add a blogroll to my next redesign. I'm already writing more <a href="/links/">linkposts</a>.</p>
<p>In short, <strong>blogging might be back</strong>. Hell, I just came back from coffee with my friend Anthony, and—without my having brought up the topic—<a href="https://www.anthonysalamon.com/blog">he showed me his new blog</a>.</p>
<p>So, if you're considering engaging with my comment system—if you're thinking about starting a blog or dusting off your old one—here's some unsolicited advice:</p>
<ul>
<li><strong>Do it for you.</strong> Priority one is taking the time to grapple with your thoughts, organize your ideas, and put them into words. Priority two is reaching the finish line and feeling the pride of authorship. That anyone actually reads your work should be a distant third place</li>
<li><strong>Focus on building an audience rather than maximizing reach.</strong> Getting in front of eyeballs is easier on the platform, but it's fleeting. Platforms reward incitement, readers reward insight. Success is a lagging indicator of months and years of effort, but it's long-lasting. I genuinely believe each of the readers of this site are as valuable as a hundred followers on social media</li>
<li><strong>Give your blog your best work.</strong> Don't waste your creative juices trying to be clever on someone else's app. Consider <a href="/posse/">syndicating crossposts</a> to your social accounts as a breadcrumb trail leading back to your homepage. You can do this with <a href="https://buffer.com">Buffer</a>, <a href="https://publer.com">Publer</a>, <a href="https://socialbee.com/features/">SocialBee</a>, or my upcoming <a href="https://posseparty.com">POSSE Party</a></li>
<li><strong>Cut yourself some slack.</strong> Pretty much everyone is an awful writer. If you saw how long it takes me to write anything of substance, you'd agree that I'm an awful writer, too. Thankfully, good ideas have a way of shining through weak rhetoric and bad grammar. All that matters is training this learned response: have an idea, write it down, put it out</li>
</ul>
<p>That's all I've got. If you choose to leave a comment on this post on your own blog, <a href="mailto:justin@searls.co">e-mail it to me</a>, and I'd be delighted to read it. Maybe it'll inspire me to write a response! 💜</p>]]></content>
    <summary type="html"><![CDATA[<p>The day before we recorded <a href="/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">our episode of Hotfix</a>, <a href="https://worksonmymachine.ai">Scott Werner</a> asked a fair question: &quot;so, if you're off social media and your blog doesn't have a comment system, how do you want people to respond to your posts? Just email?&quot;</p>
<p>I answered, &quot;actually my blog <em>does</em> have a comment system.&quot;</p>
<p>Here's how to leave a comment on this web site:</p>
<ol>
<li>Read a post</li>
<li>Think, &quot;I want to comment on this&quot;</li>
<li>Draft a post on your blog</li>
<li>Add a hyperlink to my post</li>
<li>Paste an excerpt to which you want to respond</li>
<li>Write your comment</li>
<li>Hit publish</li>
</ol>
<p>I admit, it's quaint. It involves a number of invisible steps, like <code>2.1</code> where you start a blog (which is <a href="https://pages.github.com">actually</a> <a href="https://www.wix.com">pretty</a> <a href="https://www.squarespace.com">easy</a> <a href="https://wordpress.com">but</a> <a href="https://substack.com/home">not</a> <a href="https://ghost.org">free</a> <a href="https://www.11ty.dev">of</a> <a href="https://gohugo.io">friction</a>). You should try it.</p>
<p>It is 2025 and the Web—the capital-W Web—is beleaguered. The major platforms have long-since succumbed to <a href="https://en.wikipedia.org/wiki/Enshittification">enshittification</a>, but their users aren't going anywhere. Some among us courageously voice their dissent, but always from the safe confines of their favorite walled garden. They drop a note in the jailkeeper's suggestion box as they scroll past the Squarespace ads littering their algorithmic timelines. Others have fled to <a href="https://mastodon.social">open</a> and <a href="http://bsky.app">open-flavored</a> networks, but everyone eventually realizes they <a href="/posts/blue-sky-red-ocean/">can't go home again</a>.</p>
<p>But that's not why I want you to adopt this blog's commenting system. I'm not a high-minded individual who cares about the intellectual project of the World Wide Web as a bastion for free expression or whatever the fuck. No. I just had a super rad time on the Internet from 2000 to 2006 and I want to do my part to bring it back.</p>
<p>Back then, I would find a blog and follow it—via <a href="/rss/">its feed</a> when possible, or else by adding it to a folder of <a href="https://en.wikipedia.org/wiki/Bookmark_(World_Wide_Web)">bookmarks</a>—and check it daily.</p>
<p>But what about discoverability? How did anyone find these websites? Bloggers couldn't rely on platforms' social graphs or algorithmic timelines to build awareness, so they had to bake discoverability into the product. Some sites had a &quot;<a href="https://en.wiktionary.org/wiki/blogrolling">blogroll</a>&quot; of recommendations in the sidebar. But the most effective approach was the art of &quot;blogging as a conversation.&quot; When an author read something that provoked them to write, they'd link to the offending piece, excerpt it, and provide their own commentary. And because humans are vain, the original post's author would frequently circle back and write their own response to the response. The net effect was that each author's audience would get exposure to the other writer. Even if the authors were in violent disagreement, readers of one might appreciate the other's perspective and subscribe to them.</p>
<p>Blogging as a conversation—as a comments section—was valuable because it was purely positive-sum. As an author, I benefit because another author's opinions inspired me to write. The other author benefits because linking to them offers access to my readership. My readers benefit because they're exposed to complementary and contrasting viewpoints.</p>
<p>Growth was slow and organic but more meaningful and durable. It was a special time.</p>
<details closed>
  <summary>More on my personal history with blogging</summary>
  <p>If I really enjoyed someone's blog, I'd rush to read their stuff first. If an author's posts weren't so stimulating, I wasn't shy about unsubscribing. And I could afford to be picky—there was no shortage of content! Even with aggressive curation, by 2005 I had subscribed to so many feeds in <a href="https://en.wikipedia.org/wiki/Google_Reader">Google Reader</a> that I struggled to stay on top of them all. My grades suffered because I was &quot;<a href="https://googlereader.blogspot.com/2008/02/j-walking-with-reader.html">j-walking</a>&quot; hundreds of blog posts each day instead of doing homework.</p>
<p>Then, <a href="https://en.wikipedia.org/wiki/Feed_(Facebook)">Facebook's feed</a>, <a href="https://en.wikipedia.org/wiki/Tumblr">Tumblr</a>, and <a href="https://en.wikipedia.org/wiki/Twitter">Twttr</a> came along, and they took the most enjoyable parts of surfing the 1.0 Web—novel information and connectivity with others—and supercharged them. They were &quot;good Web citizens&quot; in the same way the closed-source, distributed-to-exactly-one-server Bluesky is today. The timelines were reverse chronological. They handled the nerdy tech stuff for you. None of the feeds had ads yet.</p>
<p>Blogging didn't stand a chance.</p>
<p>I failed to see it at the time, but blogging did have one advantage over the platforms: it was a goddamn pain in the ass. Whether you flung files over an <a href="https://en.wikipedia.org/wiki/File_Transfer_Protocol">FTP</a> client or used a <a href="https://en.wikipedia.org/wiki/Content_management_system">CMS</a>, writing a blog post was <em>an ordeal</em>. If you were going to the trouble of posting to your blog, you might as well put your back into it and write something thoughtful. Something you could take pride in. Something with a permalink that (probably wouldn't, but) could be cited years later.</p>
<p>The platforms offered none of that. You got a tiny-ass text area, a stingy character limit, and a flood of ephemera to compete with. By demoting writing to a subordinate widget of the reading interface, the priority was clear: words were mere grist for the content mill. The shame of it all was that these short-form, transient, low-effort posts nevertheless sated many people's itch to write at all. I was as guilty of this as anyone. From 2009 through 2020, I devoted all my writing energy to Twitter. Except for that brief year or two where <a href="https://medium.com">Medium</a> was good, I basically stopped thinking in longform. Instead, I prided myself on an ability to distill 2,000-word essays down to 140-character hot takes. Many of those takes reached millions of people and made me feel good for a very brief amount of time.</p>
<p>My brain was cooked. When it finally <a href="https://www.the-independent.com/tech/elon-musk-twitter-headquarters-sink-buy-b2211364.html">sank in</a>, I quit.</p>
<p>It took almost three years to recover. I'm on the other side now, and am happy to report I can now think thoughts more than a sentence or two long.</p>
<p>Last night, I got dinner with two old friends, <a href="https://launchscout.com/chris-nelson">Chris Nelson</a> and <a href="https://joshuawood.net">Joshua Wood</a>. Josh asked how it's been since I quit paying attention to social media. I thought about the unfinished draft of this post.</p>
<p>In truth, this blog and its attendant <a href="/casts/">podcast empire</a> have been a refuge for my psyche. A delightful place to share pieces of myself online. Somewhere to experiment in both form and format. A means of reclaiming my identity from a smattering of social media profile pages and into something authentic and unique.</p>


</details>
<p>Today, as the platforms wane, it feels like this conversational approach to blogging is seeing new life. As a readership has slowly gathered around this blog, I've separately been curating a fresh list of thoughtful bloggers that inspire me to write. Maybe I'll add a blogroll to my next redesign. I'm already writing more <a href="/links/">linkposts</a>.</p>
<p>In short, <strong>blogging might be back</strong>. Hell, I just came back from coffee with my friend Anthony, and—without my having brought up the topic—<a href="https://www.anthonysalamon.com/blog">he showed me his new blog</a>.</p>
<p>So, if you're considering engaging with my comment system—if you're thinking about starting a blog or dusting off your old one—here's some unsolicited advice:</p>
<ul>
<li><strong>Do it for you.</strong> Priority one is taking the time to grapple with your thoughts, organize your ideas, and put them into words. Priority two is reaching the finish line and feeling the pride of authorship. That anyone actually reads your work should be a distant third place</li>
<li><strong>Focus on building an audience rather than maximizing reach.</strong> Getting in front of eyeballs is easier on the platform, but it's fleeting. Platforms reward incitement, readers reward insight. Success is a lagging indicator of months and years of effort, but it's long-lasting. I genuinely believe each of the readers of this site are as valuable as a hundred followers on social media</li>
<li><strong>Give your blog your best work.</strong> Don't waste your creative juices trying to be clever on someone else's app. Consider <a href="/posse/">syndicating crossposts</a> to your social accounts as a breadcrumb trail leading back to your homepage. You can do this with <a href="https://buffer.com">Buffer</a>, <a href="https://publer.com">Publer</a>, <a href="https://socialbee.com/features/">SocialBee</a>, or my upcoming <a href="https://posseparty.com">POSSE Party</a></li>
<li><strong>Cut yourself some slack.</strong> Pretty much everyone is an awful writer. If you saw how long it takes me to write anything of substance, you'd agree that I'm an awful writer, too. Thankfully, good ideas have a way of shining through weak rhetoric and bad grammar. All that matters is training this learned response: have an idea, write it down, put it out</li>
</ul>
<p>That's all I've got. If you choose to leave a comment on this post on your own blog, <a href="mailto:justin@searls.co">e-mail it to me</a>, and I'd be delighted to read it. Maybe it'll inspire me to write a response! 💜</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/this-blog-has-a-comment-system/","append_url_label":"Read 📄","content":"\u003cp\u003eThe day before we recorded \u003ca href=\"/casts/hotfix-v42.0.1-ignore-all-previous-instructions/\"\u003eour episode of Hotfix\u003c/a\u003e, \u003ca href=\"https://worksonmymachine.ai\"\u003eScott Werner\u003c/a\u003e asked a fair question: \u0026quot;so, if you're off social media and your blog doesn't have a comment system, how do you want people to respond to your posts? Just email?\u0026quot;\u003c/p\u003e\n\u003cp\u003eI answered, \u0026quot;actually my blog \u003cem\u003edoes\u003c/em\u003e have a comment system.\u0026quot;\u003c/p\u003e\n\u003cp\u003eHere's how to leave a comment on this web site:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRead a post\u003c/li\u003e\n\u003cli\u003eThink, \u0026quot;I want to comment on this\u0026quot;\u003c/li\u003e\n\u003cli\u003eDraft a post on your blog\u003c/li\u003e\n\u003cli\u003eAdd a hyperlink to my post\u003c/li\u003e\n\u003cli\u003ePaste an excerpt to which you want to respond\u003c/li\u003e\n\u003cli\u003eWrite your comment\u003c/li\u003e\n\u003cli\u003eHit publish\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eI admit, it's quaint. It involves a number of invisible steps, like \u003ccode\u003e2.1\u003c/code\u003e where you start a blog (which is \u003ca href=\"https://pages.github.com\"\u003eactually\u003c/a\u003e \u003ca href=\"https://www.wix.com\"\u003epretty\u003c/a\u003e \u003ca href=\"https://www.squarespace.com\"\u003eeasy\u003c/a\u003e \u003ca href=\"https://wordpress.com\"\u003ebut\u003c/a\u003e \u003ca href=\"https://substack.com/home\"\u003enot\u003c/a\u003e \u003ca href=\"https://ghost.org\"\u003efree\u003c/a\u003e \u003ca href=\"https://www.11ty.dev\"\u003eof\u003c/a\u003e \u003ca href=\"https://gohugo.io\"\u003efriction\u003c/a\u003e). You should try it.\u003c/p\u003e\n\u003cp\u003eIt is 2025 and the Web—the capital-W Web—is beleaguered. The major platforms have long-since succumbed to \u003ca href=\"https://en.wikipedia.org/wiki/Enshittification\"\u003eenshittification\u003c/a\u003e, but their users aren't going anywhere. Some among us courageously voice their dissent, but always from the safe confines of their favorite walled garden. They drop a note in the jailkeeper's suggestion box as they scroll past the Squarespace ads littering their algorithmic timelines. Others have fled to \u003ca href=\"https://mastodon.social\"\u003eopen\u003c/a\u003e and \u003ca href=\"http://bsky.app\"\u003eopen-flavored\u003c/a\u003e networks, but everyone eventually realizes they \u003ca href=\"/posts/blue-sky-red-ocean/\"\u003ecan't go home again\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eBut that's not why I want you to adopt this blog's commenting system. I'm not a high-minded individual who cares about the intellectual project of the World Wide Web as a bastion for free expression or whatever the fuck. No. I just had a super rad time on the Internet from 2000 to 2006 and I want to do my part to bring it back.\u003c/p\u003e\n\u003cp\u003eBack then, I would find a blog and follow it—via \u003ca href=\"/rss/\"\u003eits feed\u003c/a\u003e when possible, or else by adding it to a folder of \u003ca href=\"https://en.wikipedia.org/wiki/Bookmark_(World_Wide_Web)\"\u003ebookmarks\u003c/a\u003e—and check it daily.\u003c/p\u003e\n\u003cp\u003eBut what about discoverability? How did anyone find these websites? Bloggers couldn't rely on platforms' social graphs or algorithmic timelines to build awareness, so they had to bake discoverability into the product. Some sites had a \u0026quot;\u003ca href=\"https://en.wiktionary.org/wiki/blogrolling\"\u003eblogroll\u003c/a\u003e\u0026quot; of recommendations in the sidebar. But the most effective approach was the art of \u0026quot;blogging as a conversation.\u0026quot; When an author read something that provoked them to write, they'd link to the offending piece, excerpt it, and provide their own commentary. And because humans are vain, the original post's author would frequently circle back and write their own response to the response. The net effect was that each author's audience would get exposure to the other writer. Even if the authors were in violent disagreement, readers of one might appreciate the other's perspective and subscribe to them.\u003c/p\u003e\n\u003cp\u003eBlogging as a conversation—as a comments section—was valuable because it was purely positive-sum. As an author, I benefit because another author's opinions inspired me to write. The other author benefits because linking to them offers access to my readership. My readers benefit because they're exposed to complementary and contrasting viewpoints.\u003c/p\u003e\n\u003cp\u003eGrowth was slow and organic but more meaningful and durable. It was a special time.\u003c/p\u003e\n\u003cdetails closed\u003e\n  \u003csummary\u003eMore on my personal history with blogging\u003c/summary\u003e\n  \u003cp\u003eIf I really enjoyed someone's blog, I'd rush to read their stuff first. If an author's posts weren't so stimulating, I wasn't shy about unsubscribing. And I could afford to be picky—there was no shortage of content! Even with aggressive curation, by 2005 I had subscribed to so many feeds in \u003ca href=\"https://en.wikipedia.org/wiki/Google_Reader\"\u003eGoogle Reader\u003c/a\u003e that I struggled to stay on top of them all. My grades suffered because I was \u0026quot;\u003ca href=\"https://googlereader.blogspot.com/2008/02/j-walking-with-reader.html\"\u003ej-walking\u003c/a\u003e\u0026quot; hundreds of blog posts each day instead of doing homework.\u003c/p\u003e\n\u003cp\u003eThen, \u003ca href=\"https://en.wikipedia.org/wiki/Feed_(Facebook)\"\u003eFacebook's feed\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Tumblr\"\u003eTumblr\u003c/a\u003e, and \u003ca href=\"https://en.wikipedia.org/wiki/Twitter\"\u003eTwttr\u003c/a\u003e came along, and they took the most enjoyable parts of surfing the 1.0 Web—novel information and connectivity with others—and supercharged them. They were \u0026quot;good Web citizens\u0026quot; in the same way the closed-source, distributed-to-exactly-one-server Bluesky is today. The timelines were reverse chronological. They handled the nerdy tech stuff for you. None of the feeds had ads yet.\u003c/p\u003e\n\u003cp\u003eBlogging didn't stand a chance.\u003c/p\u003e\n\u003cp\u003eI failed to see it at the time, but blogging did have one advantage over the platforms: it was a goddamn pain in the ass. Whether you flung files over an \u003ca href=\"https://en.wikipedia.org/wiki/File_Transfer_Protocol\"\u003eFTP\u003c/a\u003e client or used a \u003ca href=\"https://en.wikipedia.org/wiki/Content_management_system\"\u003eCMS\u003c/a\u003e, writing a blog post was \u003cem\u003ean ordeal\u003c/em\u003e. If you were going to the trouble of posting to your blog, you might as well put your back into it and write something thoughtful. Something you could take pride in. Something with a permalink that (probably wouldn't, but) could be cited years later.\u003c/p\u003e\n\u003cp\u003eThe platforms offered none of that. You got a tiny-ass text area, a stingy character limit, and a flood of ephemera to compete with. By demoting writing to a subordinate widget of the reading interface, the priority was clear: words were mere grist for the content mill. The shame of it all was that these short-form, transient, low-effort posts nevertheless sated many people's itch to write at all. I was as guilty of this as anyone. From 2009 through 2020, I devoted all my writing energy to Twitter. Except for that brief year or two where \u003ca href=\"https://medium.com\"\u003eMedium\u003c/a\u003e was good, I basically stopped thinking in longform. Instead, I prided myself on an ability to distill 2,000-word essays down to 140-character hot takes. Many of those takes reached millions of people and made me feel good for a very brief amount of time.\u003c/p\u003e\n\u003cp\u003eMy brain was cooked. When it finally \u003ca href=\"https://www.the-independent.com/tech/elon-musk-twitter-headquarters-sink-buy-b2211364.html\"\u003esank in\u003c/a\u003e, I quit.\u003c/p\u003e\n\u003cp\u003eIt took almost three years to recover. I'm on the other side now, and am happy to report I can now think thoughts more than a sentence or two long.\u003c/p\u003e\n\u003cp\u003eLast night, I got dinner with two old friends, \u003ca href=\"https://launchscout.com/chris-nelson\"\u003eChris Nelson\u003c/a\u003e and \u003ca href=\"https://joshuawood.net\"\u003eJoshua Wood\u003c/a\u003e. Josh asked how it's been since I quit paying attention to social media. I thought about the unfinished draft of this post.\u003c/p\u003e\n\u003cp\u003eIn truth, this blog and its attendant \u003ca href=\"/casts/\"\u003epodcast empire\u003c/a\u003e have been a refuge for my psyche. A delightful place to share pieces of myself online. Somewhere to experiment in both form and format. A means of reclaiming my identity from a smattering of social media profile pages and into something authentic and unique.\u003c/p\u003e\n\n\n\u003c/details\u003e\n\u003cp\u003eToday, as the platforms wane, it feels like this conversational approach to blogging is seeing new life. As a readership has slowly gathered around this blog, I've separately been curating a fresh list of thoughtful bloggers that inspire me to write. Maybe I'll add a blogroll to my next redesign. I'm already writing more \u003ca href=\"/links/\"\u003elinkposts\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIn short, \u003cstrong\u003eblogging might be back\u003c/strong\u003e. Hell, I just came back from coffee with my friend Anthony, and—without my having brought up the topic—\u003ca href=\"https://www.anthonysalamon.com/blog\"\u003ehe showed me his new blog\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSo, if you're considering engaging with my comment system—if you're thinking about starting a blog or dusting off your old one—here's some unsolicited advice:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDo it for you.\u003c/strong\u003e Priority one is taking the time to grapple with your thoughts, organize your ideas, and put them into words. Priority two is reaching the finish line and feeling the pride of authorship. That anyone actually reads your work should be a distant third place\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFocus on building an audience rather than maximizing reach.\u003c/strong\u003e Getting in front of eyeballs is easier on the platform, but it's fleeting. Platforms reward incitement, readers reward insight. Success is a lagging indicator of months and years of effort, but it's long-lasting. I genuinely believe each of the readers of this site are as valuable as a hundred followers on social media\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGive your blog your best work.\u003c/strong\u003e Don't waste your creative juices trying to be clever on someone else's app. Consider \u003ca href=\"/posse/\"\u003esyndicating crossposts\u003c/a\u003e to your social accounts as a breadcrumb trail leading back to your homepage. You can do this with \u003ca href=\"https://buffer.com\"\u003eBuffer\u003c/a\u003e, \u003ca href=\"https://publer.com\"\u003ePubler\u003c/a\u003e, \u003ca href=\"https://socialbee.com/features/\"\u003eSocialBee\u003c/a\u003e, or my upcoming \u003ca href=\"https://posseparty.com\"\u003ePOSSE Party\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCut yourself some slack.\u003c/strong\u003e Pretty much everyone is an awful writer. If you saw how long it takes me to write anything of substance, you'd agree that I'm an awful writer, too. Thankfully, good ideas have a way of shining through weak rhetoric and bad grammar. All that matters is training this learned response: have an idea, write it down, put it out\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThat's all I've got. If you choose to leave a comment on this post on your own blog, \u003ca href=\"mailto:justin@searls.co\"\u003ee-mail it to me\u003c/a\u003e, and I'd be delighted to read it. Maybe it'll inspire me to write a response! 💜\u003c/p\u003e","id":"https://justin.searls.co/posts/this-blog-has-a-comment-system/","og_image":"https://justin.searls.co/img/social/posts/this-blog-has-a-comment-system.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-29T18:13:16Z","title":"This blog has a comment system","updated_at":"2025-08-29T14:27:55-04:00","url":"https://justin.searls.co/posts/this-blog-has-a-comment-system/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/clips/ai-is-exposing-order-takers/</id>
      <title type="text">✂️ AI is exposing order-takers</title>
      <link href="https://justin.searls.co/clips/ai-is-exposing-order-takers/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-28T14:12:20+00:00</published>
    <updated>2025-08-28T10:12:34-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<div class="flex justify-center">
  <div class="sm:beneath-the-page sm:p-2">
    <video poster="https://podcast-cdn.searls.co/clips/v42.0.1-ai-is-exposing-order-takers.jpg" class="inline-block shadow-lg rounded-lg max-h-[80lvh] sm:max-h-[60lvh] m-0" preload="auto" playsinline="playsinline" controls="controls" controlslist="nodownload">
      <source src="https://podcast-cdn.searls.co/clips/v42.0.1-ai-is-exposing-order-takers.mp4">
      Your browser does not support the video tag.
    </video>
  </div>
</div><p>One thing few people are talking about is how it's not as simple as people being sticks in the mud with respect to the adoption of AI tools, it's that once they get their hands on this tremendously capable set of tools, they lack the imagination to find any use for it. &quot;They've been given this rocket ship and they've got no fucking clue where to fly it.&quot;</p>
<p>Clipped from the back half of <a href="/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">my discussion with Scott Werner</a> on <a href="/posts/whats-the-hot-fix/">Hotfix</a>.</p>
]]></content>
    <summary type="html"><![CDATA[<p>One thing few people are talking about is how it's not as simple as people being sticks in the mud with respect to the adoption of AI tools, it's that once they get their hands on this tremendously capable set of tools, they lack the imagination to find any use for it. &quot;They've been given this rocket ship and they've got no fucking clue where to fly it.&quot;</p>
<p>Clipped from the back half of <a href="/casts/hotfix-v42.0.1-ignore-all-previous-instructions/">my discussion with Scott Werner</a> on <a href="/posts/whats-the-hot-fix/">Hotfix</a>.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/clips/ai-is-exposing-order-takers/","append_url_label":"Peek ✂️","content":"\u003cp\u003eOne thing few people are talking about is how it's not as simple as people being sticks in the mud with respect to the adoption of AI tools, it's that once they get their hands on this tremendously capable set of tools, they lack the imagination to find any use for it. \u0026quot;They've been given this rocket ship and they've got no fucking clue where to fly it.\u0026quot;\u003c/p\u003e\n\u003cp\u003eClipped from the back half of \u003ca href=\"/casts/hotfix-v42.0.1-ignore-all-previous-instructions/\"\u003emy discussion with Scott Werner\u003c/a\u003e on \u003ca href=\"/posts/whats-the-hot-fix/\"\u003eHotfix\u003c/a\u003e.\u003c/p\u003e","format_string":"Clip: 'They've been given this rocket ship and they've got no fucking clue where to fly it'","id":"https://justin.searls.co/clips/ai-is-exposing-order-takers/","media":[{"type":"video","url":"https://podcast-cdn.searls.co/clips/v42.0.1-ai-is-exposing-order-takers.mp4"}],"og_image":"https://podcast-cdn.searls.co/clips/v42.0.1-ai-is-exposing-order-takers.jpg","platform_overrides":{},"published_at":"2025-08-28T14:12:20Z","title":"AI is exposing order-takers","updated_at":"2025-08-28T10:12:34-04:00","url":"https://justin.searls.co/clips/ai-is-exposing-order-takers/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/</id>
      <title type="text">🎙️ Breaking Change podcast v42.0.1 - Scott Werner: Ignore all previous instructions</title>
      <link href="https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-27T13:41:14+00:00</published>
    <updated>2025-09-30T07:56:17-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v42.0.1.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v42.0.1.mp3">Direct link to podcast audio file</a>
</p><p>🔥<a href="/posts/whats-the-hot-fix/">Hotfix</a>🔥 is back with a new guest! Scott Werner is the CEO of <a href="https://www.sublayer.com">Sublayer</a>, helps organize the <a href="https://www.artificialruby.ai">Artificial Ruby</a> meetup in NYC, and is the author of the extremely well-named (and well-written) Substack, <a href="https://worksonmymachine.ai/">Works on my Machine</a>.</p>
<p>In this conversation, we jointly grapple with WTF is happening to programming as a career. Did the unprecedented peacetime the software industry experienced from 2005-2022 make us all soft? Is the era of code-writing agents fundamentally changing the nature of the job? Should we be less like DHH/Matz and more like why the lucky stiff?</p>
<p>We'd love to get your feedback to <a href="mailto:podcast@searls.co">podcast@searls.co</a> — I'll read it all and flag relevant questions and comments for the next Breaking Change.</p>
<p>You can follow Scott Werner online at:</p>
<ul>
<li><a href="https://worksonmymachine.ai/">Works on my Machine on Substack</a></li>
<li><a href="https://x.com/scottwernerd">@scottwernerd on Twitter/X</a></li>
</ul>
<p>A handful of things we mentioned:</p>
<ul>
<li><a href="/links/2025-08-03-there-is-no-ai-in-team/">There's no AI in Team</a></li>
<li><a href="https://www.amazon.com/Goal-Process-Ongoing-Improvement/dp/0884271951">The Goal</a> book</li>
<li><a href="https://contraptions.venkateshrao.com/p/lean-thinking-vs-fat-thinking">Lean Thinking vs Fat Thinking</a> (a newsletter that draws a different lesson from The Goal)</li>
<li><a href="https://en.wikipedia.org/wiki/Why_the_lucky_stiff">why the lucky stiff</a> (aka &quot;_why&quot;)</li>
<li><a href="https://www.youtube.com/watch?v=zPBbHu-BKpQ">That fireside chat between Matz and DHH</a></li>
<li>Sublayer's product, <a href="https://actionsperminute.io/">APM (Actions Per Minute)</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>🔥<a href="/posts/whats-the-hot-fix/">Hotfix</a>🔥 is back with a new guest! Scott Werner is the CEO of <a href="https://www.sublayer.com">Sublayer</a>, helps organize the <a href="https://www.artificialruby.ai">Artificial Ruby</a> meetup in NYC, and is the author of the extremely well-named (and well-written) Substack, <a href="https://worksonmymachine.ai/">Works on my Machine</a>.</p>
<p>In this conversation, we jointly grapple with WTF is happening to programming as a career. Did the unprecedented peacetime the software industry experienced from 2005-2022 make us all soft? Is the era of code-writing agents fundamentally changing the nature of the job? Should we be less like DHH/Matz and more like why the lucky stiff?</p>
<p>We'd love to get your feedback to <a href="mailto:podcast@searls.co">podcast@searls.co</a> — I'll read it all and flag relevant questions and comments for the next Breaking Change.</p>
<p>You can follow Scott Werner online at:</p>
<ul>
<li><a href="https://worksonmymachine.ai/">Works on my Machine on Substack</a></li>
<li><a href="https://x.com/scottwernerd">@scottwernerd on Twitter/X</a></li>
</ul>
<p>A handful of things we mentioned:</p>
<ul>
<li><a href="/links/2025-08-03-there-is-no-ai-in-team/">There's no AI in Team</a></li>
<li><a href="https://www.amazon.com/Goal-Process-Ongoing-Improvement/dp/0884271951">The Goal</a> book</li>
<li><a href="https://contraptions.venkateshrao.com/p/lean-thinking-vs-fat-thinking">Lean Thinking vs Fat Thinking</a> (a newsletter that draws a different lesson from The Goal)</li>
<li><a href="https://en.wikipedia.org/wiki/Why_the_lucky_stiff">why the lucky stiff</a> (aka &quot;_why&quot;)</li>
<li><a href="https://www.youtube.com/watch?v=zPBbHu-BKpQ">That fireside chat between Matz and DHH</a></li>
<li>Sublayer's product, <a href="https://actionsperminute.io/">APM (Actions Per Minute)</a></li>
</ul>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/","append_url_label":"Hear 🎙","content":"\u003cp\u003e🔥\u003ca href=\"/posts/whats-the-hot-fix/\"\u003eHotfix\u003c/a\u003e🔥 is back with a new guest! Scott Werner is the CEO of \u003ca href=\"https://www.sublayer.com\"\u003eSublayer\u003c/a\u003e, helps organize the \u003ca href=\"https://www.artificialruby.ai\"\u003eArtificial Ruby\u003c/a\u003e meetup in NYC, and is the author of the extremely well-named (and well-written) Substack, \u003ca href=\"https://worksonmymachine.ai/\"\u003eWorks on my Machine\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIn this conversation, we jointly grapple with WTF is happening to programming as a career. Did the unprecedented peacetime the software industry experienced from 2005-2022 make us all soft? Is the era of code-writing agents fundamentally changing the nature of the job? Should we be less like DHH/Matz and more like why the lucky stiff?\u003c/p\u003e\n\u003cp\u003eWe'd love to get your feedback to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e — I'll read it all and flag relevant questions and comments for the next Breaking Change.\u003c/p\u003e\n\u003cp\u003eYou can follow Scott Werner online at:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://worksonmymachine.ai/\"\u003eWorks on my Machine on Substack\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://x.com/scottwernerd\"\u003e@scottwernerd on Twitter/X\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eA handful of things we mentioned:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/links/2025-08-03-there-is-no-ai-in-team/\"\u003eThere's no AI in Team\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.amazon.com/Goal-Process-Ongoing-Improvement/dp/0884271951\"\u003eThe Goal\u003c/a\u003e book\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://contraptions.venkateshrao.com/p/lean-thinking-vs-fat-thinking\"\u003eLean Thinking vs Fat Thinking\u003c/a\u003e (a newsletter that draws a different lesson from The Goal)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Why_the_lucky_stiff\"\u003ewhy the lucky stiff\u003c/a\u003e (aka \u0026quot;_why\u0026quot;)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=zPBbHu-BKpQ\"\u003eThat fireside chat between Matz and DHH\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSublayer's product, \u003ca href=\"https://actionsperminute.io/\"\u003eAPM (Actions Per Minute)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Scott Werner: Ignore all previous instructions","id":"https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v42.0.1-ignore-all-previous-instructions.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-27T13:41:14Z","title":"Scott Werner: Ignore all previous instructions","updated_at":"2025-09-30T07:56:17-04:00","url":"https://justin.searls.co/casts/hotfix-v42.0.1-ignore-all-previous-instructions/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/</id>
      <title type="text">🔗 Why I wasn&#39;t cut out for management</title>
        <link href="https://news.ycombinator.com/item?id=44988834" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-22T21:37:00+00:00</published>
    <updated>2025-08-22T18:00:13-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Perhaps the most important ingredient in my career's success is my seemingly infinite capacity for self-criticism.</p>
<p>I constantly inspect my work, effortlessly identify ways it could be better, and never tire of making improvements. And because the time it takes to finish a task can always be improved, this tendency rarely veers into unproductive perfectionism. On the rare occasion I feel like I really nail something, I strive to nail it even faster next time. At the same time (and as anyone who listens to <a href="/casts/breaking-change/">Breaking Change</a> knows), I have a very healthy ego. I genuinely believe I am good enough, despite simultaneously knowing my work never is.</p>
<p>The trouble is, while this disposition might be dynamite for self-improvement, it doesn't gracefully scale to teams and organizations.</p>
<p>I'm thinking about this because yours truly was a dummy again and found the <a href="https://news.ycombinator.com/item?id=44988834">Hacker News comment thread</a> for <a href="/posts/sprinkling-self-doubt-on-chatgpt/">one of my posts</a> and chose to engage:</p>
<blockquote>
<p>I've been griping about LLM overconfidence for years, as somebody who is racked with self-doubt and second-guessing. On the one hand, my own low opinion of myself made me a terrible mentor and manager, because having a similarly zero-trust policy towards my colleagues' work caused no end of friction (especially as a founder where people looked up to me for validation). On the other hand, I don't know very many top-tier practitioners that don't exhibit significantly more self-doubt than an off-the-shelf LLM.</p>
</blockquote>
<p>I'm not sure I've ever explained this publicly before, but this predilection for doubting myself is fundamentally why I was never a particularly good &quot;senior&quot; member of a team. As <a href="https://testdouble.com">Test Double</a> grew, we managed to create spots where I could remain a practitioner, but we also had to be mindful of limiting the blast radius of my reflexive hypercriticality. The truth is that <strong>my special sauce depends on constant emotionally vulnerable self-critique</strong>, and that made it extraordinarily difficult to manage or coach people directly. Even for people who are wired similarly to me—which many of Test Double's agents are—it's one thing to look at <em>your own</em> work and spot endless opportunities for improvement, but it's quite another for someone in a position of authority to do the same.</p>
<p>Every time I was charged with evaluating someone else's work, it started up the same engine that generate an infinite supply of shortcomings in my own. And it wasn't that I was incapable of prioritizing or rate-limiting my comments—it's that when people came to me with revisions, I'd always find fault in those too—because I can always find ways the work could be better! It led to people feeling like they could never be good enough for me.</p>
<p>After touching the hot stove once or twice, I learned to spend all my time assembling shit sandwiches to protect people's feelings, or my relationship with them, or—as a highly visible co-founder—the company's reputation. Every patty of pointed and meaningful critique demanded two slices of ego-insulating bread. And one man can only bullshit his way through so much halfhearted positive reinforcement and self-effacing humility. Even if I hadn't found all that tap-dancing to be a nerve-wracking waste of time, everyone could see through me. It wasn't authentic.</p>
<p>Are there ways I could have overcome all this and become a good manager anyway? Probably. But would I risk losing the thing that made me unique in the process? Possibly.</p>
<p>I'm writing this in part because it's so clear that LLMs-as-products are being sold to us with the default wiring of a capital-B Business Guy, and their shortcomings resemble the same shortcomings I see in humans who are insufficiently self-critical. But it's also possible you, reading this, are a Business Guy and you're curious how so many amazing programmers turn out to be shit at coaching less-skilled colleagues, the root cause may not be poor communication skills: it may be that the self-criticism that drives some practitioners to greatness is impossible to convey safely to others without risking a call to HR.</p>
<p>Anyway, if you identify with me, but have nevertheless made the transition to manager and leader gracefully, then I applaud you. (I'd also be curious to speak with a couple folks who report to you and see what <em>they</em> have to say.)</p>

<p>🔗 <a href="https://news.ycombinator.com/item?id=44988834" title="Original Article">news.ycombinator.com</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>Perhaps the most important ingredient in my career's success is my seemingly infinite capacity for self-criticism.</p>
<p>I constantly inspect my work, effortlessly identify ways it could be better, and never tire of making improvements. And because the time it takes to finish a task can always be improved, this tendency rarely veers into unproductive perfectionism. On the rare occasion I feel like I really nail something, I strive to nail it even faster next time. At the same time (and as anyone who listens to <a href="/casts/breaking-change/">Breaking Change</a> knows), I have a very healthy ego. I genuinely believe I am good enough, despite simultaneously knowing my work never is.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/","append_url_label":"Click 🔗","content":"\u003cp\u003ePerhaps the most important ingredient in my career's success is my seemingly infinite capacity for self-criticism.\u003c/p\u003e\n\u003cp\u003eI constantly inspect my work, effortlessly identify ways it could be better, and never tire of making improvements. And because the time it takes to finish a task can always be improved, this tendency rarely veers into unproductive perfectionism. On the rare occasion I feel like I really nail something, I strive to nail it even faster next time. At the same time (and as anyone who listens to \u003ca href=\"/casts/breaking-change/\"\u003eBreaking Change\u003c/a\u003e knows), I have a very healthy ego. I genuinely believe I am good enough, despite simultaneously knowing my work never is.\u003c/p\u003e\n\u003cp\u003eThe trouble is, while this disposition might be dynamite for self-improvement, it doesn't gracefully scale to teams and organizations.\u003c/p\u003e\n\u003cp\u003eI'm thinking about this because yours truly was a dummy again and found the \u003ca href=\"https://news.ycombinator.com/item?id=44988834\"\u003eHacker News comment thread\u003c/a\u003e for \u003ca href=\"/posts/sprinkling-self-doubt-on-chatgpt/\"\u003eone of my posts\u003c/a\u003e and chose to engage:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI've been griping about LLM overconfidence for years, as somebody who is racked with self-doubt and second-guessing. On the one hand, my own low opinion of myself made me a terrible mentor and manager, because having a similarly zero-trust policy towards my colleagues' work caused no end of friction (especially as a founder where people looked up to me for validation). On the other hand, I don't know very many top-tier practitioners that don't exhibit significantly more self-doubt than an off-the-shelf LLM.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI'm not sure I've ever explained this publicly before, but this predilection for doubting myself is fundamentally why I was never a particularly good \u0026quot;senior\u0026quot; member of a team. As \u003ca href=\"https://testdouble.com\"\u003eTest Double\u003c/a\u003e grew, we managed to create spots where I could remain a practitioner, but we also had to be mindful of limiting the blast radius of my reflexive hypercriticality. The truth is that \u003cstrong\u003emy special sauce depends on constant emotionally vulnerable self-critique\u003c/strong\u003e, and that made it extraordinarily difficult to manage or coach people directly. Even for people who are wired similarly to me—which many of Test Double's agents are—it's one thing to look at \u003cem\u003eyour own\u003c/em\u003e work and spot endless opportunities for improvement, but it's quite another for someone in a position of authority to do the same.\u003c/p\u003e\n\u003cp\u003eEvery time I was charged with evaluating someone else's work, it started up the same engine that generate an infinite supply of shortcomings in my own. And it wasn't that I was incapable of prioritizing or rate-limiting my comments—it's that when people came to me with revisions, I'd always find fault in those too—because I can always find ways the work could be better! It led to people feeling like they could never be good enough for me.\u003c/p\u003e\n\u003cp\u003eAfter touching the hot stove once or twice, I learned to spend all my time assembling shit sandwiches to protect people's feelings, or my relationship with them, or—as a highly visible co-founder—the company's reputation. Every patty of pointed and meaningful critique demanded two slices of ego-insulating bread. And one man can only bullshit his way through so much halfhearted positive reinforcement and self-effacing humility. Even if I hadn't found all that tap-dancing to be a nerve-wracking waste of time, everyone could see through me. It wasn't authentic.\u003c/p\u003e\n\u003cp\u003eAre there ways I could have overcome all this and become a good manager anyway? Probably. But would I risk losing the thing that made me unique in the process? Possibly.\u003c/p\u003e\n\u003cp\u003eI'm writing this in part because it's so clear that LLMs-as-products are being sold to us with the default wiring of a capital-B Business Guy, and their shortcomings resemble the same shortcomings I see in humans who are insufficiently self-critical. But it's also possible you, reading this, are a Business Guy and you're curious how so many amazing programmers turn out to be shit at coaching less-skilled colleagues, the root cause may not be poor communication skills: it may be that the self-criticism that drives some practitioners to greatness is impossible to convey safely to others without risking a call to HR.\u003c/p\u003e\n\u003cp\u003eAnyway, if you identify with me, but have nevertheless made the transition to manager and leader gracefully, then I applaud you. (I'd also be curious to speak with a couple folks who report to you and see what \u003cem\u003ethey\u003c/em\u003e have to say.)\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/","og_image":"https://justin.searls.co/img/social/links/2025-08-22-why-i-wasnt-cut-out-for-management.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-22T21:37:00Z","related_url":"https://news.ycombinator.com/item?id=44988834","title":"Why I wasn't cut out for management","updated_at":"2025-08-22T18:00:13-04:00","url":"https://justin.searls.co/links/2025-08-22-why-i-wasnt-cut-out-for-management/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/</id>
      <title type="text">📄 Sprinkling Self-Doubt on ChatGPT</title>
      <link href="https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-22T12:04:58+00:00</published>
    <updated>2025-08-22T09:14:25-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>I replaced my ChatGPT personalization settings with this prompt a few weeks ago and promptly forgot about it:</p>
<blockquote>
<ul>
<li>Be extraordinarily skeptical of your own correctness or stated assumptions. You aren't a cynic, you are a highly critical thinker and this is tempered by your self-doubt: you absolutely hate being wrong but you live in constant fear of it</li>
<li>When appropriate, broaden the scope of inquiry beyond the stated assumptions to think through unconvenitional opportunities, risks, and pattern-matching to widen the aperture of solutions</li>
<li>Before calling anything &quot;done&quot; or &quot;working&quot;, take a second look at it (&quot;red team&quot; it) to critically analyze that you really are done or it really is working</li>
</ul>
</blockquote>
<p>I noticed a difference in results right away (even though I kept forgetting the change was due to my instructions and not the separately <a href="https://garymarcus.substack.com/p/gpt-5-overdue-overhyped-and-underwhelming">tumultuous rollout of GPT-5</a>).</p>
<p>Namely, pretty much every initial response now starts with:</p>
<ul>
<li>An expression of caution, self-doubt, and desire to get things right</li>
<li>Hilariously long &quot;thinking&quot; times (I asked it to estimate the macronutrients in lettuce yesterday and it spent 3 minutes and 59 seconds reasoning)</li>
<li>A post-hoc adversarial &quot;<a href="https://en.wikipedia.org/wiki/Red_team">red team</a>&quot; analysis of whatever it just vomited up as an answer</li>
</ul>
<p>I'm delighted to report that ChatGPT's output has been more useful since this change. Still not altogether <em>great</em>, but better at the margins. In particular, the &quot;red team&quot; analysis at the end of many requests frequently spots an error and causes it to arrive at the <em>actually-correct</em> answer, which—if nothing else—saves me the step of expressing skepticism. And even when ChatGPT is nevertheless wrong, its penchant for extremely-long thinking times means I'm getting my money's worth in GPU time.</p>]]></content>
    <summary type="html"><![CDATA[<p>I replaced my ChatGPT personalization settings with this prompt a few weeks ago and promptly forgot about it:</p>
<blockquote>
<ul>
<li>Be extraordinarily skeptical of your own correctness or stated assumptions. You aren't a cynic, you are a highly critical thinker and this is tempered by your self-doubt: you absolutely hate being wrong but you live in constant fear of it</li>
<li>When appropriate, broaden the scope of inquiry beyond the stated assumptions to think through unconvenitional opportunities, risks, and pattern-matching to widen the aperture of solutions</li>
<li>Before calling anything &quot;done&quot; or &quot;working&quot;, take a second look at it (&quot;red team&quot; it) to critically analyze that you really are done or it really is working</li>
</ul>
</blockquote>
<p>I noticed a difference in results right away (even though I kept forgetting the change was due to my instructions and not the separately <a href="https://garymarcus.substack.com/p/gpt-5-overdue-overhyped-and-underwhelming">tumultuous rollout of GPT-5</a>).</p>
<p>Namely, pretty much every initial response now starts with:</p>
<ul>
<li>An expression of caution, self-doubt, and desire to get things right</li>
<li>Hilariously long &quot;thinking&quot; times (I asked it to estimate the macronutrients in lettuce yesterday and it spent 3 minutes and 59 seconds reasoning)</li>
<li>A post-hoc adversarial &quot;<a href="https://en.wikipedia.org/wiki/Red_team">red team</a>&quot; analysis of whatever it just vomited up as an answer</li>
</ul>
<p>I'm delighted to report that ChatGPT's output has been more useful since this change. Still not altogether <em>great</em>, but better at the margins. In particular, the &quot;red team&quot; analysis at the end of many requests frequently spots an error and causes it to arrive at the <em>actually-correct</em> answer, which—if nothing else—saves me the step of expressing skepticism. And even when ChatGPT is nevertheless wrong, its penchant for extremely-long thinking times means I'm getting my money's worth in GPU time.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/","append_url_label":"Read 📄","content":"\u003cp\u003eI replaced my ChatGPT personalization settings with this prompt a few weeks ago and promptly forgot about it:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cul\u003e\n\u003cli\u003eBe extraordinarily skeptical of your own correctness or stated assumptions. You aren't a cynic, you are a highly critical thinker and this is tempered by your self-doubt: you absolutely hate being wrong but you live in constant fear of it\u003c/li\u003e\n\u003cli\u003eWhen appropriate, broaden the scope of inquiry beyond the stated assumptions to think through unconvenitional opportunities, risks, and pattern-matching to widen the aperture of solutions\u003c/li\u003e\n\u003cli\u003eBefore calling anything \u0026quot;done\u0026quot; or \u0026quot;working\u0026quot;, take a second look at it (\u0026quot;red team\u0026quot; it) to critically analyze that you really are done or it really is working\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI noticed a difference in results right away (even though I kept forgetting the change was due to my instructions and not the separately \u003ca href=\"https://garymarcus.substack.com/p/gpt-5-overdue-overhyped-and-underwhelming\"\u003etumultuous rollout of GPT-5\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003eNamely, pretty much every initial response now starts with:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAn expression of caution, self-doubt, and desire to get things right\u003c/li\u003e\n\u003cli\u003eHilariously long \u0026quot;thinking\u0026quot; times (I asked it to estimate the macronutrients in lettuce yesterday and it spent 3 minutes and 59 seconds reasoning)\u003c/li\u003e\n\u003cli\u003eA post-hoc adversarial \u0026quot;\u003ca href=\"https://en.wikipedia.org/wiki/Red_team\"\u003ered team\u003c/a\u003e\u0026quot; analysis of whatever it just vomited up as an answer\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI'm delighted to report that ChatGPT's output has been more useful since this change. Still not altogether \u003cem\u003egreat\u003c/em\u003e, but better at the margins. In particular, the \u0026quot;red team\u0026quot; analysis at the end of many requests frequently spots an error and causes it to arrive at the \u003cem\u003eactually-correct\u003c/em\u003e answer, which—if nothing else—saves me the step of expressing skepticism. And even when ChatGPT is nevertheless wrong, its penchant for extremely-long thinking times means I'm getting my money's worth in GPU time.\u003c/p\u003e","id":"https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/","og_image":"https://justin.searls.co/img/social/posts/sprinkling-self-doubt-on-chatgpt.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-22T12:04:58Z","title":"Sprinkling Self-Doubt on ChatGPT","updated_at":"2025-08-22T09:14:25-04:00","url":"https://justin.searls.co/posts/sprinkling-self-doubt-on-chatgpt/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/whats-the-hot-fix/</id>
      <title type="text">📄 What&#39;s the Hotfix?</title>
      <link href="https://justin.searls.co/posts/whats-the-hot-fix/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-20T13:54:04+00:00</published>
    <updated>2025-08-27T12:36:44-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>I recently started an interview series on the <a href="/casts/breaking-change/">Breaking Change</a> feed called Hotfix. Whereas each episode of Breaking Change is a major release full of never-before-seen tech news, life updates, and programming war stories, Hotfix. It's versioned as a patch release on the feed, because each show serves only to answer the question, &quot;<em><strong>what's the hotfix?</strong></em>&quot;</p>
<p>Because I've had to explain the concept over and over again to every potential guest, I sat down to write a list of what they'd be getting themselves into by agreeing to come on the show. (Can't say I didn't warn them!)</p>
<p>Here's the rider I send prospective guests:</p>
<ul>
<li>Each Hotfix episode exists to address some problem. Unlike a typical interview show featuring an unstructured open-ended conversation with a guest, we pick a particular problem in advance—ideally one that the guest gets really animated/activated or even angry about—and we jointly rant about it, gradually exploring its root causes and breaking it down together</li>
<li>Each episode concludes with us answering the question, &quot;what's the hotfix?&quot; Ultimately, we decide on a pithy, reductive one-line solution to the problem that will serve as the show title (ideally, it's a hot take that not everyone will agree with or feel comfortable about)</li>
<li>It's an explicit-language show and I'm pretty clear with the audience that the Breaking Change family of brands is intended for terrible people (or at least, the terrible person inside all of us). You aren't required to swear to be on the show, but if my potty mouth makes you uncomfortable, then let me know and I'll recommend some worse podcasts you can appear on instead</li>
<li>I joke at the top that my goal as the host is to, &quot;get my guest to say something that'll get them fired.&quot; Since I'm functionally retired and have no reason to hold back from explicit language, irreverence, and dark humor in the mainline Breaking Change podcast, I can't help but poke guests with attempts to drag them down to my level. You can play with this as much as you want or take the high ground, but we'll all have more fun if you let loose a bit more than you otherwise would</li>
<li>Why am I doing this? First, because I'm incurious and uninterested in learning about other people, which I'm told is an important part of being a good interviewer. Second, I have a theory that this unusual brand of authenticity will lend credibility to whatever solution the guest is trying to argue for or plug. By keeping listeners on their toes and pushing them out of their comfort zones, each episode stands to effect greater change than a typical milquetoast podcast could</li>
</ul>
<p>If this has piqued your interest, you can listen to or watch the <a href="https://justin.searls.co/casts/hotfix-v39.0.1-use-ai-in-anger/">first episode of Hotfix with Dave Mosher</a>. It may not seem very hot at first, but please grade on a curve as Dave speaks Canadian English. I've got a couple exciting guests booked over the next few weeks and I'm looking forward to seeing where the show takes us.</p>]]></content>
    <summary type="html"><![CDATA[<p>I recently started an interview series on the <a href="/casts/breaking-change/">Breaking Change</a> feed called Hotfix. Whereas each episode of Breaking Change is a major release full of never-before-seen tech news, life updates, and programming war stories, Hotfix. It's versioned as a patch release on the feed, because each show serves only to answer the question, &quot;<em><strong>what's the hotfix?</strong></em>&quot;</p>
<p>Because I've had to explain the concept over and over again to every potential guest, I sat down to write a list of what they'd be getting themselves into by agreeing to come on the show. (Can't say I didn't warn them!)</p>
<p>Here's the rider I send prospective guests:</p>
<ul>
<li>Each Hotfix episode exists to address some problem. Unlike a typical interview show featuring an unstructured open-ended conversation with a guest, we pick a particular problem in advance—ideally one that the guest gets really animated/activated or even angry about—and we jointly rant about it, gradually exploring its root causes and breaking it down together</li>
<li>Each episode concludes with us answering the question, &quot;what's the hotfix?&quot; Ultimately, we decide on a pithy, reductive one-line solution to the problem that will serve as the show title (ideally, it's a hot take that not everyone will agree with or feel comfortable about)</li>
<li>It's an explicit-language show and I'm pretty clear with the audience that the Breaking Change family of brands is intended for terrible people (or at least, the terrible person inside all of us). You aren't required to swear to be on the show, but if my potty mouth makes you uncomfortable, then let me know and I'll recommend some worse podcasts you can appear on instead</li>
<li>I joke at the top that my goal as the host is to, &quot;get my guest to say something that'll get them fired.&quot; Since I'm functionally retired and have no reason to hold back from explicit language, irreverence, and dark humor in the mainline Breaking Change podcast, I can't help but poke guests with attempts to drag them down to my level. You can play with this as much as you want or take the high ground, but we'll all have more fun if you let loose a bit more than you otherwise would</li>
<li>Why am I doing this? First, because I'm incurious and uninterested in learning about other people, which I'm told is an important part of being a good interviewer. Second, I have a theory that this unusual brand of authenticity will lend credibility to whatever solution the guest is trying to argue for or plug. By keeping listeners on their toes and pushing them out of their comfort zones, each episode stands to effect greater change than a typical milquetoast podcast could</li>
</ul>
<p>If this has piqued your interest, you can listen to or watch the <a href="https://justin.searls.co/casts/hotfix-v39.0.1-use-ai-in-anger/">first episode of Hotfix with Dave Mosher</a>. It may not seem very hot at first, but please grade on a curve as Dave speaks Canadian English. I've got a couple exciting guests booked over the next few weeks and I'm looking forward to seeing where the show takes us.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/whats-the-hot-fix/","append_url_label":"Read 📄","content":"\u003cp\u003eI recently started an interview series on the \u003ca href=\"/casts/breaking-change/\"\u003eBreaking Change\u003c/a\u003e feed called Hotfix. Whereas each episode of Breaking Change is a major release full of never-before-seen tech news, life updates, and programming war stories, Hotfix. It's versioned as a patch release on the feed, because each show serves only to answer the question, \u0026quot;\u003cem\u003e\u003cstrong\u003ewhat's the hotfix?\u003c/strong\u003e\u003c/em\u003e\u0026quot;\u003c/p\u003e\n\u003cp\u003eBecause I've had to explain the concept over and over again to every potential guest, I sat down to write a list of what they'd be getting themselves into by agreeing to come on the show. (Can't say I didn't warn them!)\u003c/p\u003e\n\u003cp\u003eHere's the rider I send prospective guests:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEach Hotfix episode exists to address some problem. Unlike a typical interview show featuring an unstructured open-ended conversation with a guest, we pick a particular problem in advance—ideally one that the guest gets really animated/activated or even angry about—and we jointly rant about it, gradually exploring its root causes and breaking it down together\u003c/li\u003e\n\u003cli\u003eEach episode concludes with us answering the question, \u0026quot;what's the hotfix?\u0026quot; Ultimately, we decide on a pithy, reductive one-line solution to the problem that will serve as the show title (ideally, it's a hot take that not everyone will agree with or feel comfortable about)\u003c/li\u003e\n\u003cli\u003eIt's an explicit-language show and I'm pretty clear with the audience that the Breaking Change family of brands is intended for terrible people (or at least, the terrible person inside all of us). You aren't required to swear to be on the show, but if my potty mouth makes you uncomfortable, then let me know and I'll recommend some worse podcasts you can appear on instead\u003c/li\u003e\n\u003cli\u003eI joke at the top that my goal as the host is to, \u0026quot;get my guest to say something that'll get them fired.\u0026quot; Since I'm functionally retired and have no reason to hold back from explicit language, irreverence, and dark humor in the mainline Breaking Change podcast, I can't help but poke guests with attempts to drag them down to my level. You can play with this as much as you want or take the high ground, but we'll all have more fun if you let loose a bit more than you otherwise would\u003c/li\u003e\n\u003cli\u003eWhy am I doing this? First, because I'm incurious and uninterested in learning about other people, which I'm told is an important part of being a good interviewer. Second, I have a theory that this unusual brand of authenticity will lend credibility to whatever solution the guest is trying to argue for or plug. By keeping listeners on their toes and pushing them out of their comfort zones, each episode stands to effect greater change than a typical milquetoast podcast could\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf this has piqued your interest, you can listen to or watch the \u003ca href=\"https://justin.searls.co/casts/hotfix-v39.0.1-use-ai-in-anger/\"\u003efirst episode of Hotfix with Dave Mosher\u003c/a\u003e. It may not seem very hot at first, but please grade on a curve as Dave speaks Canadian English. I've got a couple exciting guests booked over the next few weeks and I'm looking forward to seeing where the show takes us.\u003c/p\u003e","id":"https://justin.searls.co/posts/whats-the-hot-fix/","og_image":"https://justin.searls.co/img/social/posts/whats-the-hot-fix.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-20T13:54:04Z","title":"What's the Hotfix?","updated_at":"2025-08-27T12:36:44-04:00","url":"https://justin.searls.co/posts/whats-the-hot-fix/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/which-of-your-colleagues-are-screwed/</id>
      <title type="text">📄 Which of your colleagues are screwed?</title>
      <link href="https://justin.searls.co/posts/which-of-your-colleagues-are-screwed/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-19T17:18:33+00:00</published>
    <updated>2025-08-19T13:40:53-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>I've been writing about how AI is likely to affect white-collar (or no-collar or hoodie-wearing) computer programmers for a while now, and one thing is clear: <strong>whether someone feels wildly optimistic or utterly hopeless about AI says more about their priors than their prospects</strong>. In particular, many of the people I already consider borderline unemployable managed to read <a href="/posts/full-breadth-developers/">Full-breadth Developers</a> and take away that they actually have nothing to worry about.</p>
<p>So instead of directing the following statements <em>at you</em>, let's target our judgment toward your colleagues. Think about a random colleague you don't feel particularly strongly about as you read the following pithy and reductive bullet points. Critically appraise how they show up to work through the entire software delivery process. These represent just a sample of observations I've made about developers who are truly thriving so far in the burgeoning age of AI code generation tools.</p>
<p>That colleague you're thinking about? They're going to be screwed if they exhibit:</p>
<ul>
<li>Curiosity without skepticism</li>
<li>Strategy without experiments</li>
<li>Ability without understanding</li>
<li>Productivity without urgency</li>
<li>Creativity without taste</li>
<li>Certainty without evidence</li>
</ul>
<p>But that's not all! You might be screwed too. Maybe ask one of your less-screwed colleagues to rate you.</p>]]></content>
    <summary type="html"><![CDATA[<p>I've been writing about how AI is likely to affect white-collar (or no-collar or hoodie-wearing) computer programmers for a while now, and one thing is clear: <strong>whether someone feels wildly optimistic or utterly hopeless about AI says more about their priors than their prospects</strong>. In particular, many of the people I already consider borderline unemployable managed to read <a href="/posts/full-breadth-developers/">Full-breadth Developers</a> and take away that they actually have nothing to worry about.</p>
<p>So instead of directing the following statements <em>at you</em>, let's target our judgment toward your colleagues. Think about a random colleague you don't feel particularly strongly about as you read the following pithy and reductive bullet points. Critically appraise how they show up to work through the entire software delivery process. These represent just a sample of observations I've made about developers who are truly thriving so far in the burgeoning age of AI code generation tools.</p>
<p>That colleague you're thinking about? They're going to be screwed if they exhibit:</p>
<ul>
<li>Curiosity without skepticism</li>
<li>Strategy without experiments</li>
<li>Ability without understanding</li>
<li>Productivity without urgency</li>
<li>Creativity without taste</li>
<li>Certainty without evidence</li>
</ul>
<p>But that's not all! You might be screwed too. Maybe ask one of your less-screwed colleagues to rate you.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/which-of-your-colleagues-are-screwed/","append_url_label":"Read 📄","content":"\u003cp\u003eI've been writing about how AI is likely to affect white-collar (or no-collar or hoodie-wearing) computer programmers for a while now, and one thing is clear: \u003cstrong\u003ewhether someone feels wildly optimistic or utterly hopeless about AI says more about their priors than their prospects\u003c/strong\u003e. In particular, many of the people I already consider borderline unemployable managed to read \u003ca href=\"/posts/full-breadth-developers/\"\u003eFull-breadth Developers\u003c/a\u003e and take away that they actually have nothing to worry about.\u003c/p\u003e\n\u003cp\u003eSo instead of directing the following statements \u003cem\u003eat you\u003c/em\u003e, let's target our judgment toward your colleagues. Think about a random colleague you don't feel particularly strongly about as you read the following pithy and reductive bullet points. Critically appraise how they show up to work through the entire software delivery process. These represent just a sample of observations I've made about developers who are truly thriving so far in the burgeoning age of AI code generation tools.\u003c/p\u003e\n\u003cp\u003eThat colleague you're thinking about? They're going to be screwed if they exhibit:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCuriosity without skepticism\u003c/li\u003e\n\u003cli\u003eStrategy without experiments\u003c/li\u003e\n\u003cli\u003eAbility without understanding\u003c/li\u003e\n\u003cli\u003eProductivity without urgency\u003c/li\u003e\n\u003cli\u003eCreativity without taste\u003c/li\u003e\n\u003cli\u003eCertainty without evidence\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBut that's not all! You might be screwed too. Maybe ask one of your less-screwed colleagues to rate you.\u003c/p\u003e","id":"https://justin.searls.co/posts/which-of-your-colleagues-are-screwed/","og_image":"https://justin.searls.co/img/social/posts/which-of-your-colleagues-are-screwed.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-19T17:18:33Z","title":"Which of your colleagues are screwed?","updated_at":"2025-08-19T13:40:53-04:00","url":"https://justin.searls.co/posts/which-of-your-colleagues-are-screwed/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/star-wars-the-gilroy-order/</id>
      <title type="text">📄 Star Wars: The Gilroy Order</title>
      <link href="https://justin.searls.co/posts/star-wars-the-gilroy-order/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-19T00:55:22+00:00</published>
    <updated>2025-08-19T12:42:58-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p><strong>UPDATE: To my surprise and delight, Rod saw this post and <a href="https://bsky.app/profile/rodhilton.com/post/3lwpsvtzfv22m">endorsed this watch order</a>.</strong></p>
<p>I remember back when Rod Hilton suggested <a href="https://www.rodhilton.com/2011/11/11/the-star-wars-saga-suggested-viewing-order/">The Machete Order</a> for introducing others to the Star Wars films and struggling to find fault with it. Well, since then there have been 5 theatrical releases and a glut of streaming series. And tonight, as credits rolled on <a href="https://en.wikipedia.org/wiki/Return_of_the_Jedi">Return of the Jedi</a>, I had the thought that an even better watch order has emerged for those just now being exposed to the franchise.</p>
<p><a href="https://gram.buildwithbecky.com">Becky</a> and I first started dating somewhere between the release of <a href="https://en.wikipedia.org/wiki/Star_Wars:_Episode_II_%E2%80%93_Attack_of_the_Clones">Attack of the Clones</a> and <a href="https://en.wikipedia.org/wiki/Star_Wars:_Episode_III_%E2%80%93_Revenge_of_the_Sith">Revenge of the Sith</a> and—no small measure of her devotion—she's humored me by seeing each subsequent Star Wars movie in theaters, despite having no interest in the films and little idea what was going on. Get yourself a girl who'll watch half a dozen movies that mildly repulse her, fellas.</p>
<p>Hell, when we were living in Japan, I missed that 吹替 (&quot;dubbed&quot;) was printed on our tickets and she wound up sitting through the entirety of <a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Rise_of_Skywalker">The Rise of Skywalker</a> with Japanese voiceovers and no subtitles to speak of. When we walked out, she told me that she (1) was all set with Star Wars movies for a while, and (2) suspected the incomprehensibility of the Japanese dub had probably improved the experience, on balance.</p>
<p>That all changed when she decided to give <a href="https://en.wikipedia.org/wiki/Andor_(TV_series)">Andor</a> a chance. See, if you're not a Star Wars fan, <a href="https://en.wikipedia.org/wiki/Tony_Gilroy">Tony Gilroy</a>'s Andor series is unique in the franchise for being <strong><em>actually good</em></strong>. Like, it's seriously one of the best TV shows to see release in years. After its initial three-episode arc, Becky was fully on board for watching both of its 12-episode seasons. And the minute we finished Season 2, she was ready to watch Rogue One with fresh eyes. (&quot;I actually have a clue what's going on now.&quot;) And, of course, with the way <a href="https://en.wikipedia.org/wiki/Rogue_One">Rogue One</a> leads directly into the opening scene of <a href="https://en.wikipedia.org/wiki/Star_Wars_(film)">A New Hope</a>, we just kept rolling from there.</p>
<p>Following this experience, I'd suggest sharing Star Wars with your unsuspecting loved ones in what I guess I'd call <strong>The Gilroy Order</strong>:</p>
<ol>
<li>Andor (seasons 1 and 2)</li>
<li>Rogue One</li>
<li>A New Hope</li>
<li>The Empire Strikes Back</li>
<li>Return of the Jedi</li>
</ol>
<p>If, at this point, you're still on speaking terms with said loved ones, go ahead and watch the remaining Star Wars schlock in whatever order you want. Maybe you go straight to <a href="https://en.wikipedia.org/wiki/The_Mandalorian">The Mandalorian</a>. Maybe you watch <a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Force_Awakens">The Force Awakens</a> just so you can watch the second and final film of the third trilogy, <a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Last_Jedi">The Last Jedi</a>. Maybe you quit while you're ahead and wait for Disney to release anything half as good as Andor ever again. (Don't hold your breath.)</p>
<p>Anyway, the reason I'm taking the time to propose an alternative watch order at all is an expression of the degree to which I am utterly shocked that my wife just watched and enjoyed so many Star Wars movies after struggling to tolerate them for the first two decades of our relationship. I'm literally worried I might have broken her.</p>
<p>But really, it turned out that all she needed was for a genuinely well-crafted narrative to hook her, and Andor is undeniably the best ambassador the franchise currently has.</p>]]></content>
    <summary type="html"><![CDATA[<p><strong>UPDATE: To my surprise and delight, Rod saw this post and <a href="https://bsky.app/profile/rodhilton.com/post/3lwpsvtzfv22m">endorsed this watch order</a>.</strong></p>
<p>I remember back when Rod Hilton suggested <a href="https://www.rodhilton.com/2011/11/11/the-star-wars-saga-suggested-viewing-order/">The Machete Order</a> for introducing others to the Star Wars films and struggling to find fault with it. Well, since then there have been 5 theatrical releases and a glut of streaming series. And tonight, as credits rolled on <a href="https://en.wikipedia.org/wiki/Return_of_the_Jedi">Return of the Jedi</a>, I had the thought that an even better watch order has emerged for those just now being exposed to the franchise.</p>
<p><a href="https://gram.buildwithbecky.com">Becky</a> and I first started dating somewhere between the release of <a href="https://en.wikipedia.org/wiki/Star_Wars:_Episode_II_%E2%80%93_Attack_of_the_Clones">Attack of the Clones</a> and <a href="https://en.wikipedia.org/wiki/Star_Wars:_Episode_III_%E2%80%93_Revenge_of_the_Sith">Revenge of the Sith</a> and—no small measure of her devotion—she's humored me by seeing each subsequent Star Wars movie in theaters, despite having no interest in the films and little idea what was going on. Get yourself a girl who'll watch half a dozen movies that mildly repulse her, fellas.</p>
<p>Hell, when we were living in Japan, I missed that 吹替 (&quot;dubbed&quot;) was printed on our tickets and she wound up sitting through the entirety of <a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Rise_of_Skywalker">The Rise of Skywalker</a> with Japanese voiceovers and no subtitles to speak of. When we walked out, she told me that she (1) was all set with Star Wars movies for a while, and (2) suspected the incomprehensibility of the Japanese dub had probably improved the experience, on balance.</p>
<p>That all changed when she decided to give <a href="https://en.wikipedia.org/wiki/Andor_(TV_series)">Andor</a> a chance. See, if you're not a Star Wars fan, <a href="https://en.wikipedia.org/wiki/Tony_Gilroy">Tony Gilroy</a>'s Andor series is unique in the franchise for being <strong><em>actually good</em></strong>. Like, it's seriously one of the best TV shows to see release in years. After its initial three-episode arc, Becky was fully on board for watching both of its 12-episode seasons. And the minute we finished Season 2, she was ready to watch Rogue One with fresh eyes. (&quot;I actually have a clue what's going on now.&quot;) And, of course, with the way <a href="https://en.wikipedia.org/wiki/Rogue_One">Rogue One</a> leads directly into the opening scene of <a href="https://en.wikipedia.org/wiki/Star_Wars_(film)">A New Hope</a>, we just kept rolling from there.</p>
<p>Following this experience, I'd suggest sharing Star Wars with your unsuspecting loved ones in what I guess I'd call <strong>The Gilroy Order</strong>:</p>
<ol>
<li>Andor (seasons 1 and 2)</li>
<li>Rogue One</li>
<li>A New Hope</li>
<li>The Empire Strikes Back</li>
<li>Return of the Jedi</li>
</ol>
<p>If, at this point, you're still on speaking terms with said loved ones, go ahead and watch the remaining Star Wars schlock in whatever order you want. Maybe you go straight to <a href="https://en.wikipedia.org/wiki/The_Mandalorian">The Mandalorian</a>. Maybe you watch <a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Force_Awakens">The Force Awakens</a> just so you can watch the second and final film of the third trilogy, <a href="https://en.wikipedia.org/wiki/Star_Wars:_The_Last_Jedi">The Last Jedi</a>. Maybe you quit while you're ahead and wait for Disney to release anything half as good as Andor ever again. (Don't hold your breath.)</p>
<p>Anyway, the reason I'm taking the time to propose an alternative watch order at all is an expression of the degree to which I am utterly shocked that my wife just watched and enjoyed so many Star Wars movies after struggling to tolerate them for the first two decades of our relationship. I'm literally worried I might have broken her.</p>
<p>But really, it turned out that all she needed was for a genuinely well-crafted narrative to hook her, and Andor is undeniably the best ambassador the franchise currently has.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/star-wars-the-gilroy-order/","append_url_label":"Read 📄","content":"\u003cp\u003e\u003cstrong\u003eUPDATE: To my surprise and delight, Rod saw this post and \u003ca href=\"https://bsky.app/profile/rodhilton.com/post/3lwpsvtzfv22m\"\u003eendorsed this watch order\u003c/a\u003e.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eI remember back when Rod Hilton suggested \u003ca href=\"https://www.rodhilton.com/2011/11/11/the-star-wars-saga-suggested-viewing-order/\"\u003eThe Machete Order\u003c/a\u003e for introducing others to the Star Wars films and struggling to find fault with it. Well, since then there have been 5 theatrical releases and a glut of streaming series. And tonight, as credits rolled on \u003ca href=\"https://en.wikipedia.org/wiki/Return_of_the_Jedi\"\u003eReturn of the Jedi\u003c/a\u003e, I had the thought that an even better watch order has emerged for those just now being exposed to the franchise.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://gram.buildwithbecky.com\"\u003eBecky\u003c/a\u003e and I first started dating somewhere between the release of \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars:_Episode_II_%E2%80%93_Attack_of_the_Clones\"\u003eAttack of the Clones\u003c/a\u003e and \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars:_Episode_III_%E2%80%93_Revenge_of_the_Sith\"\u003eRevenge of the Sith\u003c/a\u003e and—no small measure of her devotion—she's humored me by seeing each subsequent Star Wars movie in theaters, despite having no interest in the films and little idea what was going on. Get yourself a girl who'll watch half a dozen movies that mildly repulse her, fellas.\u003c/p\u003e\n\u003cp\u003eHell, when we were living in Japan, I missed that 吹替 (\u0026quot;dubbed\u0026quot;) was printed on our tickets and she wound up sitting through the entirety of \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars:_The_Rise_of_Skywalker\"\u003eThe Rise of Skywalker\u003c/a\u003e with Japanese voiceovers and no subtitles to speak of. When we walked out, she told me that she (1) was all set with Star Wars movies for a while, and (2) suspected the incomprehensibility of the Japanese dub had probably improved the experience, on balance.\u003c/p\u003e\n\u003cp\u003eThat all changed when she decided to give \u003ca href=\"https://en.wikipedia.org/wiki/Andor_(TV_series)\"\u003eAndor\u003c/a\u003e a chance. See, if you're not a Star Wars fan, \u003ca href=\"https://en.wikipedia.org/wiki/Tony_Gilroy\"\u003eTony Gilroy\u003c/a\u003e's Andor series is unique in the franchise for being \u003cstrong\u003e\u003cem\u003eactually good\u003c/em\u003e\u003c/strong\u003e. Like, it's seriously one of the best TV shows to see release in years. After its initial three-episode arc, Becky was fully on board for watching both of its 12-episode seasons. And the minute we finished Season 2, she was ready to watch Rogue One with fresh eyes. (\u0026quot;I actually have a clue what's going on now.\u0026quot;) And, of course, with the way \u003ca href=\"https://en.wikipedia.org/wiki/Rogue_One\"\u003eRogue One\u003c/a\u003e leads directly into the opening scene of \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars_(film)\"\u003eA New Hope\u003c/a\u003e, we just kept rolling from there.\u003c/p\u003e\n\u003cp\u003eFollowing this experience, I'd suggest sharing Star Wars with your unsuspecting loved ones in what I guess I'd call \u003cstrong\u003eThe Gilroy Order\u003c/strong\u003e:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAndor (seasons 1 and 2)\u003c/li\u003e\n\u003cli\u003eRogue One\u003c/li\u003e\n\u003cli\u003eA New Hope\u003c/li\u003e\n\u003cli\u003eThe Empire Strikes Back\u003c/li\u003e\n\u003cli\u003eReturn of the Jedi\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIf, at this point, you're still on speaking terms with said loved ones, go ahead and watch the remaining Star Wars schlock in whatever order you want. Maybe you go straight to \u003ca href=\"https://en.wikipedia.org/wiki/The_Mandalorian\"\u003eThe Mandalorian\u003c/a\u003e. Maybe you watch \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars:_The_Force_Awakens\"\u003eThe Force Awakens\u003c/a\u003e just so you can watch the second and final film of the third trilogy, \u003ca href=\"https://en.wikipedia.org/wiki/Star_Wars:_The_Last_Jedi\"\u003eThe Last Jedi\u003c/a\u003e. Maybe you quit while you're ahead and wait for Disney to release anything half as good as Andor ever again. (Don't hold your breath.)\u003c/p\u003e\n\u003cp\u003eAnyway, the reason I'm taking the time to propose an alternative watch order at all is an expression of the degree to which I am utterly shocked that my wife just watched and enjoyed so many Star Wars movies after struggling to tolerate them for the first two decades of our relationship. I'm literally worried I might have broken her.\u003c/p\u003e\n\u003cp\u003eBut really, it turned out that all she needed was for a genuinely well-crafted narrative to hook her, and Andor is undeniably the best ambassador the franchise currently has.\u003c/p\u003e","id":"https://justin.searls.co/posts/star-wars-the-gilroy-order/","og_image":"https://justin.searls.co/img/social/posts/star-wars-the-gilroy-order.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-19T00:55:22Z","title":"Star Wars: The Gilroy Order","updated_at":"2025-08-19T12:42:58-04:00","url":"https://justin.searls.co/posts/star-wars-the-gilroy-order/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/</id>
      <title type="text">📄 How to generate dynamic data structures with Apple Foundation Models</title>
      <link href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-18T01:00:08+00:00</published>
    <updated>2025-08-18T07:42:00-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Over the past few days, I got really hung up in my attempts generate data structures using <a href="https://developer.apple.com/documentation/FoundationModels">Apple Foundation Models</a> for which the exact shape of that data wasn't known until runtime. The new APIs actually provide for this capability via <a href="https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema">DynamicGenerationSchema</a>, but the WWDC sessions and sample code were too simple to follow this thread end-to-end:</p>
<ol>
<li>Start with a struct representing a <code>PromptSet</code>: a variable set of prompts that will either map onto or be used to define the ultimate response data structure <a href="#1-define-a-promptset">🔽</a></li>
<li>Instantiate a <code>PromptSet</code> with—<em>what else?</em>—a set of prompts to get the model to generate the sort of data we want <a href="#2-instantiate-our-promptset">🔽</a></li>
<li>Build out a <code>DynamicGenerationSchema</code> based on the contents of a given <code>PromptSet</code> instance <a href="#3-build-a-dynamicgenerationschema">🔽</a></li>
<li>Create a struct that can accommodate the variably-shaped data with as much type safety as possible and which conforms to <a href="https://developer.apple.com/documentation/FoundationModels/ConvertibleFromGeneratedContent">ConvertibleFromGeneratedContent</a>, so it can be instantiated by passing a <a href="https://developer.apple.com/documentation/foundationmodels/languagemodelsession#Generating-a-request">LanguageModelSession</a> response's <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent">GeneratedContent</a> <a href="#4-define-a-result-struct-that-conforms-to-convertiblefromgeneratedcontent">🔽</a></li>
<li>Pull it all together and generate some data with the on-device foundation models! <a href="#5-pull-it-all-together">🔽</a></li>
</ol>
<p>Well, it took me all morning to get this to work, but I did it. Since I couldn't find a single code example that did anything like this, I figured I'd share this write up. You can <a href="https://gist.github.com/searls/52c5cf53220354cac2e89e9bcf54c27d">read the code as a standalone Swift file</a> or otherwise follow along below.</p>

<h2 id="1-define-a-promptset">1. Define a PromptSet</h2>
<p>Start with whatever code you need to represent the set(s) of prompts you'll be dealing with at runtime. (Maybe they're defined by you and ship with your app, maybe you let users define them through your app's UI.) To keep things minimal, I defined this one with a couple of mandatory fields and a variable number of custom ones:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">struct</span> <span class="nc">EducationalPromptSet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">type</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">instructions</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">name</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">description</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">summaryGuideDescription</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">confidenceGuideDescription</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">subComponents</span><span class="p">:</span> <span class="p">[</span><span class="n">SubComponentPromptSet</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">struct</span> <span class="nc">SubComponentPromptSet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">title</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">bodyGuideDescription</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Note that rather than modeling the data itself, the purpose of these structs is to model the set of prompts that will ultimately drive the creation of the schema which will, in turn, determine the shape and contents of the data we get back from the Foundation Models API. To drive this home, whatever goes in <code>summaryGuideDescription</code>, <code>confidenceGuideDescription</code>, and <code>bodyGuideDescription</code> should themselves be <em>prompts</em> to guide the generation of like-named type-safe values.</p>
<p>Yes, it is very meta.</p>

<h2 id="2-instantiate-our-promptset">2. Instantiate our PromptSet</h2>
<p>Presumably, we could decode some JSON from a file or received over the network that could populate this <code>EducationalPromptSet</code>. Here's an example set of prompts for generating cocktail recipes, expressed in some sample code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nv">cocktailPromptSet</span> <span class="p">=</span> <span class="n">EducationalPromptSet</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">type</span><span class="p">:</span> <span class="s">&#34;bartender_basic&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">instructions</span><span class="p">:</span> <span class="s">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">    You are an expert bartender. Take the provided cocktail name or list of ingredients and explain how to make a delicious cocktail. Be creative!
</span></span></span><span class="line"><span class="cl"><span class="s">    &#34;&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">name</span><span class="p">:</span> <span class="s">&#34;Cocktail Recipe&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">description</span><span class="p">:</span> <span class="s">&#34;A custom cocktail recipe, tailored to the user&#39;s input and communicated in an educational tone and spirit&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">summaryGuideDescription</span><span class="p">:</span> <span class="s">&#34;The summary should describe the history (if applicable) and taste profile of the cocktail&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">confidenceGuideDescription</span><span class="p">:</span> <span class="s">&#34;Range between 0-100 for your confidence in the feasibility of this cocktail based on the prompt&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">subComponents</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentPromptSet</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Ingredients&#34;</span><span class="p">,</span> <span class="n">bodyGuideDescription</span><span class="p">:</span> <span class="s">&#34;A list of all ingredients in the cocktail&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentPromptSet</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Steps&#34;</span><span class="p">,</span> <span class="n">bodyGuideDescription</span><span class="p">:</span> <span class="s">&#34;A list of the steps to make the cocktail&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentPromptSet</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Prep&#34;</span><span class="p">,</span> <span class="n">bodyGuideDescription</span><span class="p">:</span> <span class="s">&#34;The bar prep you should have completed in advance of service&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>You can see that the provided instruction, description, and each guide description really go a long way to specify what kind of data we are ultimately looking for here. This same format could just as well be used to specify an <code>EducationalPromptSet</code> for calculus formulas, Japanese idioms, or bomb-making instructions.</p>

<h2 id="3-build-a-dynamicgenerationschema">3. Build a DynamicGenerationSchema</h2>
<p>Now, we must translate our prompt set into a <a href="https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema">DynamicGenerationSchema</a>.</p>
<p>Why <code>DynamicGenerationSchema</code> and not the much simpler and defined-at-compile-time <a href="https://developer.apple.com/documentation/foundationmodels/generationschema">GenerationSchema</a> that's expanded with the <a href="https://developer.apple.com/documentation/foundationmodels/generable">@Generable</a>? Because reasons:</p>
<ol>
<li>We only know the prompts (in API parlance, &quot;Generation Guide descriptions&quot;) at runtime, and the <a href="https://developer.apple.com/documentation/foundationmodels/guide(description:)">@Guide</a> macro must be specified statically</li>
<li>We don't know how many <code>subComponents</code> a prompt set instance will specify in advance</li>
<li>While <code>subComponents</code> may ultimately redound to an array of strings, that doesn't mean they represent like concepts that could be generated by a single prompt (as an array of ingredient names might). Rather, each subComponent is effectively the answer to a different, unknowable-at-compile-time prompt of its own</li>
</ol>
<p>As for building the <code>DynamicGenerationSchema</code>, you can break this up into two roots and have the parent reference the child, but after experimenting, I preferred just specifying it all in one go. (One reason not to get too clever about extracting these is that <a href="https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema/property">DynamicGenerationSchema.Property</a> is not <a href="https://developer.apple.com/documentation/swift/sendable">Sendable</a>, which can easily lead to concurrency-safety violations).</p>
<p>This looks like a lot because this API is verbose as fuck, forcing you to oscillate between nested schemas and properties and schemas:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nv">cocktailSchema</span> <span class="p">=</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">name</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">name</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">description</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">description</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">properties</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="n">DynamicGenerationSchema</span><span class="p">.</span><span class="n">Property</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="n">name</span><span class="p">:</span> <span class="s">&#34;summary&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">description</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">summaryGuideDescription</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">schema</span><span class="p">:</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span><span class="n">type</span><span class="p">:</span> <span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">DynamicGenerationSchema</span><span class="p">.</span><span class="n">Property</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="n">name</span><span class="p">:</span> <span class="s">&#34;confidence&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">description</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">confidenceGuideDescription</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">schema</span><span class="p">:</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span><span class="n">type</span><span class="p">:</span> <span class="nb">Int</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">DynamicGenerationSchema</span><span class="p">.</span><span class="n">Property</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="n">name</span><span class="p">:</span> <span class="s">&#34;subComponents&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">schema</span><span class="p">:</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">name</span><span class="p">:</span> <span class="s">&#34;subComponents&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">properties</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">subComponents</span><span class="p">.</span><span class="bp">map</span> <span class="p">{</span> <span class="n">subComponentPromptSet</span> <span class="k">in</span>
</span></span><span class="line"><span class="cl">          <span class="n">DynamicGenerationSchema</span><span class="p">.</span><span class="n">Property</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">name</span><span class="p">:</span> <span class="n">subComponentPromptSet</span><span class="p">.</span><span class="n">title</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">description</span><span class="p">:</span> <span class="n">subComponentPromptSet</span><span class="p">.</span><span class="n">bodyGuideDescription</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">schema</span><span class="p">:</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span><span class="n">type</span><span class="p">:</span> <span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">          <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div>
<h2 id="4-define-a-result-struct-that-conforms-to-convertiblefromgeneratedcontent">4. Define a result struct that conforms to ConvertibleFromGeneratedContent</h2>
<p>When conforming to <a href="https://developer.apple.com/documentation/FoundationModels/ConvertibleFromGeneratedContent">ConvertibleFromGeneratedContent</a>, a type can be instantiated with nothing more than the <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent">GeneratedContent</a> returned from a language model response.</p>
<p>There is a lot going on here. Code now, questions later:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">struct</span> <span class="nc">EducationalResult</span> <span class="p">:</span> <span class="n">ConvertibleFromGeneratedContent</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">summary</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">confidence</span><span class="p">:</span> <span class="nb">Int</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">subComponents</span><span class="p">:</span> <span class="p">[</span><span class="n">SubComponentResult</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">init</span><span class="p">(</span><span class="kc">_</span> <span class="n">content</span><span class="p">:</span> <span class="n">GeneratedContent</span><span class="p">)</span> <span class="kr">throws</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">summary</span> <span class="p">=</span> <span class="k">try</span> <span class="n">content</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">,</span> <span class="n">forProperty</span><span class="p">:</span> <span class="s">&#34;summary&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">confidence</span> <span class="p">=</span> <span class="k">try</span> <span class="n">content</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="nb">Int</span><span class="p">.</span><span class="kc">self</span><span class="p">,</span> <span class="n">forProperty</span><span class="p">:</span> <span class="s">&#34;confidence&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nv">subComponentsContent</span> <span class="p">=</span> <span class="k">try</span> <span class="n">content</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="n">GeneratedContent</span><span class="p">.</span><span class="kc">self</span><span class="p">,</span> <span class="n">forProperty</span><span class="p">:</span> <span class="s">&#34;subComponents&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nv">properties</span><span class="p">:</span> <span class="p">[</span><span class="nb">String</span><span class="p">:</span> <span class="n">GeneratedContent</span><span class="p">]</span> <span class="p">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="k">case</span> <span class="kd">let</span> <span class="p">.</span><span class="n">structure</span><span class="p">(</span><span class="n">properties</span><span class="p">,</span> <span class="kc">_</span><span class="p">)</span> <span class="p">=</span> <span class="n">subComponentsContent</span><span class="p">.</span><span class="n">kind</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">properties</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="p">[:]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}()</span>
</span></span><span class="line"><span class="cl">    <span class="n">subComponents</span> <span class="p">=</span> <span class="k">try</span> <span class="n">properties</span><span class="p">.</span><span class="bp">map</span> <span class="p">{</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">bodyContent</span><span class="p">)</span> <span class="k">in</span>
</span></span><span class="line"><span class="cl">      <span class="k">try</span> <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="n">bodyContent</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">struct</span> <span class="nc">SubComponentResult</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">title</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">body</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>That <code>init</code> constructor is doing the Lord's work, here, because Apple's documentation really fell down on the job this time. See, through OS 26 beta 4, if you had a <code>GeneratedContent</code>, you could simply iterate over a dictionary of its <code>properties</code> or an array of its <code>elements</code>. These APIs, however, appear to have been removed in OS 26 beta 5. I say &quot;appear to have been removed,&quot; because Apple shipped Xcode 26 beta 5 with <em>outdated developer documentation</em> that continues to suggest they should exist and which <em>failed</em> to include beta 5's newly-added <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent/kind-swift.enum">GeneratedContent.Kind</a> enum. Between this and the lack of any example code or blog posts, I spent most of today wondering whether I'd lost my goddamn mind.</p>
<p>Anyway, good news: you <em>can</em> iterate over a dynamic schema's collection of properties of unknown name and size by unwrapping the <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent/kind-swift.property">response.content.kind</a> enumerator. In my case, I know my <code>subComponents</code> will always be a structure, because I'm the guy who defined my schema and the nice thing about the Foundation Models API is that its responses <em>always, yes, always</em> adhere to the types specified by the requested schema, whether static or dynamic.</p>
<p>So let's break down what went into deriving the value's <code>customProperties</code> property.</p>
<p>We start by fetching a nested <code>GeneratedContent</code> from the top-level property named <code>subComponents</code> with <code>content.value(GeneratedContent.self, forProperty: &quot;subComponents&quot;)</code></p>
<p>Next, this little nugget assigns to <code>properties</code> a dictionary mapping <code>String</code> keys to <code>GeneratedContent</code> values by unwrapping the properties from the <code>kind</code> enumerator's structure case, and defaulting to an empty dictionary in the event we get anything unexpected:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nv">properties</span><span class="p">:</span> <span class="p">[</span><span class="nb">String</span><span class="p">:</span> <span class="n">GeneratedContent</span><span class="p">]</span> <span class="p">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="k">case</span> <span class="kd">let</span> <span class="p">.</span><span class="n">structure</span><span class="p">(</span><span class="n">properties</span><span class="p">,</span> <span class="kc">_</span><span class="p">)</span> <span class="p">=</span> <span class="n">subComponentsContent</span><span class="p">.</span><span class="n">kind</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">properties</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">[:]</span>
</span></span><span class="line"><span class="cl"><span class="p">}()</span>
</span></span></code></pre></div><p>Finally, we build out our result struct's <code>subComponents</code> field by mapping over those properties.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="n">subComponents</span> <span class="p">=</span> <span class="k">try</span> <span class="n">properties</span><span class="p">.</span><span class="bp">map</span> <span class="p">{</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">bodyContent</span><span class="p">)</span> <span class="k">in</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="n">bodyContent</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Two things are admittedly weird about that last bit:</p>
<ol>
<li>I got a little lazy here by using the each sub-components' <code>title</code> as the name of the corresponding generated property. Since the property name gets fed into the LLM, one can only imagine doing so can only improve the results. Based on my experience so far, the name of a field greatly influences what kind of data you get back from the on-device foundation models.</li>
<li>The <code>bodyContent</code> itself is a <code>GeneratedContent</code> that we know to be a string (again, because that's what our dynamic schema specifies), so we can safely demand one back using its <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent/value(_:)">value(Type)</a> method</li>
</ol>

<h2 id="5-pull-it-all-together">5. Pull it all together</h2>
<p>Okay, the moment of truth. This shit compiles, but will it work? At least as of OS 26 betas 5 &amp; 6: <em>yes</em>!</p>
<p>My <a href="https://gist.github.com/searls/52c5cf53220354cac2e89e9bcf54c27d">aforementioned Swift file</a> ends with a <code>#Playground</code> you can actually futz with interactively in Xcode 26 and navigate the results interactively. Just three more calls to get your cocktail:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">import</span> <span class="nc">Playgrounds</span>
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="n">Playground</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">session</span> <span class="p">=</span> <span class="n">LanguageModelSession</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">instructions</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">response</span> <span class="p">=</span> <span class="k">try</span> <span class="n">await</span> <span class="n">session</span><span class="p">.</span><span class="n">respond</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">to</span><span class="p">:</span> <span class="s">&#34;Shirley Temple&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">schema</span><span class="p">:</span> <span class="n">GenerationSchema</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="n">cocktailSchema</span><span class="p">,</span> <span class="n">dependencies</span><span class="p">:</span> <span class="p">[])</span>
</span></span><span class="line"><span class="cl">  <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">cocktailResult</span> <span class="p">=</span> <span class="k">try</span> <span class="n">EducationalResult</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The above yielded this response:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="n">EducationalResult</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">summary</span><span class="p">:</span> <span class="s">&#34;The Shirley Temple is a classic and refreshing cocktail that has been delighting children and adults alike for generations. It</span><span class="se">\&#39;</span><span class="s">s known for its simplicity, sweet taste, and vibrant orange hue. Made primarily with ginger ale, it</span><span class="se">\&#39;</span><span class="s">s a perfect example of a kid-friendly drink that doesn</span><span class="se">\&#39;</span><span class="s">t compromise on flavor. The combination of ginger ale and grenadine creates a visually appealing and sweet-tart beverage, making it a staple at parties, brunches, and any occasion where a fun and easy drink is needed.&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">confidence</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">subComponents</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Steps&#34;</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="s">&#34;1. In a tall glass filled with ice, pour 2 oz of ginger ale. 2. Add 1 oz of grenadine carefully, swirling gently to combine. 3. Garnish with an orange slice and a cherry on top.&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Prep&#34;</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="s">&#34;Ensure you have fresh ginger ale and grenadine ready to go.&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Ingredients&#34;</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="s">&#34;2 oz ginger ale, 1 oz grenadine, Orange slice, Cherry&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">])</span>
</span></span></code></pre></div><p>The best part? I can only generate &quot;Shirley Temple&quot; drinks because whenever I ask for an alcoholic cocktail, it trips the on-device models' safety guardrails and refuses to generate anything.</p>
<p>Cool!</p>

<h2 id="this-was-too-hard">This was too hard</h2>
<p>I've heard stories about Apple's documentation being bad, but never about it being <em>straight-up wrong</em>. Live by the beta, die by the beta, I guess.</p>
<p>In any case, between the documentation snafu and Claude Code repeatedly shitting the bed trying to guess its way through this API, I'm actually really grateful I was forced to buckle down and learn me some Swift.</p>
<p><a href="mailto:justin@searls.co">Let me know</a> if this guide helped you out! 💜</p>]]></content>
    <summary type="html"><![CDATA[<p>Over the past few days, I got really hung up in my attempts generate data structures using <a href="https://developer.apple.com/documentation/FoundationModels">Apple Foundation Models</a> for which the exact shape of that data wasn't known until runtime. The new APIs actually provide for this capability via <a href="https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema">DynamicGenerationSchema</a>, but the WWDC sessions and sample code were too simple to follow this thread end-to-end:</p>
<ol>
<li>Start with a struct representing a <code>PromptSet</code>: a variable set of prompts that will either map onto or be used to define the ultimate response data structure <a href="#1-define-a-promptset">🔽</a></li>
<li>Instantiate a <code>PromptSet</code> with—<em>what else?</em>—a set of prompts to get the model to generate the sort of data we want <a href="#2-instantiate-our-promptset">🔽</a></li>
<li>Build out a <code>DynamicGenerationSchema</code> based on the contents of a given <code>PromptSet</code> instance <a href="#3-build-a-dynamicgenerationschema">🔽</a></li>
<li>Create a struct that can accommodate the variably-shaped data with as much type safety as possible and which conforms to <a href="https://developer.apple.com/documentation/FoundationModels/ConvertibleFromGeneratedContent">ConvertibleFromGeneratedContent</a>, so it can be instantiated by passing a <a href="https://developer.apple.com/documentation/foundationmodels/languagemodelsession#Generating-a-request">LanguageModelSession</a> response's <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent">GeneratedContent</a> <a href="#4-define-a-result-struct-that-conforms-to-convertiblefromgeneratedcontent">🔽</a></li>
<li>Pull it all together and generate some data with the on-device foundation models! <a href="#5-pull-it-all-together">🔽</a></li>
</ol>
<p>Well, it took me all morning to get this to work, but I did it. Since I couldn't find a single code example that did anything like this, I figured I'd share this write up. You can <a href="https://gist.github.com/searls/52c5cf53220354cac2e89e9bcf54c27d">read the code as a standalone Swift file</a> or otherwise follow along below.</p>

<h2 id="1-define-a-promptset">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#1-define-a-promptset">1. Define a PromptSet</a>
</h2>
<p>Start with whatever code you need to represent the set(s) of prompts you'll be dealing with at runtime. (Maybe they're defined by you and ship with your app, maybe you let users define them through your app's UI.) To keep things minimal, I defined this one with a couple of mandatory fields and a variable number of custom ones:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">struct</span> <span class="nc">EducationalPromptSet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">type</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">instructions</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">name</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">description</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">summaryGuideDescription</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">confidenceGuideDescription</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">subComponents</span><span class="p">:</span> <span class="p">[</span><span class="n">SubComponentPromptSet</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">struct</span> <span class="nc">SubComponentPromptSet</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">title</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">bodyGuideDescription</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Note that rather than modeling the data itself, the purpose of these structs is to model the set of prompts that will ultimately drive the creation of the schema which will, in turn, determine the shape and contents of the data we get back from the Foundation Models API. To drive this home, whatever goes in <code>summaryGuideDescription</code>, <code>confidenceGuideDescription</code>, and <code>bodyGuideDescription</code> should themselves be <em>prompts</em> to guide the generation of like-named type-safe values.</p>
<p>Yes, it is very meta.</p>

<h2 id="2-instantiate-our-promptset">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#2-instantiate-our-promptset">2. Instantiate our PromptSet</a>
</h2>
<p>Presumably, we could decode some JSON from a file or received over the network that could populate this <code>EducationalPromptSet</code>. Here's an example set of prompts for generating cocktail recipes, expressed in some sample code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nv">cocktailPromptSet</span> <span class="p">=</span> <span class="n">EducationalPromptSet</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">type</span><span class="p">:</span> <span class="s">&#34;bartender_basic&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">instructions</span><span class="p">:</span> <span class="s">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s">    You are an expert bartender. Take the provided cocktail name or list of ingredients and explain how to make a delicious cocktail. Be creative!
</span></span></span><span class="line"><span class="cl"><span class="s">    &#34;&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">name</span><span class="p">:</span> <span class="s">&#34;Cocktail Recipe&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">description</span><span class="p">:</span> <span class="s">&#34;A custom cocktail recipe, tailored to the user&#39;s input and communicated in an educational tone and spirit&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">summaryGuideDescription</span><span class="p">:</span> <span class="s">&#34;The summary should describe the history (if applicable) and taste profile of the cocktail&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">confidenceGuideDescription</span><span class="p">:</span> <span class="s">&#34;Range between 0-100 for your confidence in the feasibility of this cocktail based on the prompt&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">subComponents</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentPromptSet</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Ingredients&#34;</span><span class="p">,</span> <span class="n">bodyGuideDescription</span><span class="p">:</span> <span class="s">&#34;A list of all ingredients in the cocktail&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentPromptSet</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Steps&#34;</span><span class="p">,</span> <span class="n">bodyGuideDescription</span><span class="p">:</span> <span class="s">&#34;A list of the steps to make the cocktail&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentPromptSet</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Prep&#34;</span><span class="p">,</span> <span class="n">bodyGuideDescription</span><span class="p">:</span> <span class="s">&#34;The bar prep you should have completed in advance of service&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>You can see that the provided instruction, description, and each guide description really go a long way to specify what kind of data we are ultimately looking for here. This same format could just as well be used to specify an <code>EducationalPromptSet</code> for calculus formulas, Japanese idioms, or bomb-making instructions.</p>

<h2 id="3-build-a-dynamicgenerationschema">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#3-build-a-dynamicgenerationschema">3. Build a DynamicGenerationSchema</a>
</h2>
<p>Now, we must translate our prompt set into a <a href="https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema">DynamicGenerationSchema</a>.</p>
<p>Why <code>DynamicGenerationSchema</code> and not the much simpler and defined-at-compile-time <a href="https://developer.apple.com/documentation/foundationmodels/generationschema">GenerationSchema</a> that's expanded with the <a href="https://developer.apple.com/documentation/foundationmodels/generable">@Generable</a>? Because reasons:</p>
<ol>
<li>We only know the prompts (in API parlance, &quot;Generation Guide descriptions&quot;) at runtime, and the <a href="https://developer.apple.com/documentation/foundationmodels/guide(description:)">@Guide</a> macro must be specified statically</li>
<li>We don't know how many <code>subComponents</code> a prompt set instance will specify in advance</li>
<li>While <code>subComponents</code> may ultimately redound to an array of strings, that doesn't mean they represent like concepts that could be generated by a single prompt (as an array of ingredient names might). Rather, each subComponent is effectively the answer to a different, unknowable-at-compile-time prompt of its own</li>
</ol>
<p>As for building the <code>DynamicGenerationSchema</code>, you can break this up into two roots and have the parent reference the child, but after experimenting, I preferred just specifying it all in one go. (One reason not to get too clever about extracting these is that <a href="https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema/property">DynamicGenerationSchema.Property</a> is not <a href="https://developer.apple.com/documentation/swift/sendable">Sendable</a>, which can easily lead to concurrency-safety violations).</p>
<p>This looks like a lot because this API is verbose as fuck, forcing you to oscillate between nested schemas and properties and schemas:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nv">cocktailSchema</span> <span class="p">=</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">name</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">name</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">description</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">description</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">properties</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="n">DynamicGenerationSchema</span><span class="p">.</span><span class="n">Property</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="n">name</span><span class="p">:</span> <span class="s">&#34;summary&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">description</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">summaryGuideDescription</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">schema</span><span class="p">:</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span><span class="n">type</span><span class="p">:</span> <span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">DynamicGenerationSchema</span><span class="p">.</span><span class="n">Property</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="n">name</span><span class="p">:</span> <span class="s">&#34;confidence&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">description</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">confidenceGuideDescription</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">schema</span><span class="p">:</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span><span class="n">type</span><span class="p">:</span> <span class="nb">Int</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">DynamicGenerationSchema</span><span class="p">.</span><span class="n">Property</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="n">name</span><span class="p">:</span> <span class="s">&#34;subComponents&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="n">schema</span><span class="p">:</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">name</span><span class="p">:</span> <span class="s">&#34;subComponents&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">properties</span><span class="p">:</span> <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">subComponents</span><span class="p">.</span><span class="bp">map</span> <span class="p">{</span> <span class="n">subComponentPromptSet</span> <span class="k">in</span>
</span></span><span class="line"><span class="cl">          <span class="n">DynamicGenerationSchema</span><span class="p">.</span><span class="n">Property</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">name</span><span class="p">:</span> <span class="n">subComponentPromptSet</span><span class="p">.</span><span class="n">title</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">description</span><span class="p">:</span> <span class="n">subComponentPromptSet</span><span class="p">.</span><span class="n">bodyGuideDescription</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">schema</span><span class="p">:</span> <span class="n">DynamicGenerationSchema</span><span class="p">(</span><span class="n">type</span><span class="p">:</span> <span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">          <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div>
<h2 id="4-define-a-result-struct-that-conforms-to-convertiblefromgeneratedcontent">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#4-define-a-result-struct-that-conforms-to-convertiblefromgeneratedcontent">4. Define a result struct that conforms to ConvertibleFromGeneratedContent</a>
</h2>
<p>When conforming to <a href="https://developer.apple.com/documentation/FoundationModels/ConvertibleFromGeneratedContent">ConvertibleFromGeneratedContent</a>, a type can be instantiated with nothing more than the <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent">GeneratedContent</a> returned from a language model response.</p>
<p>There is a lot going on here. Code now, questions later:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">struct</span> <span class="nc">EducationalResult</span> <span class="p">:</span> <span class="n">ConvertibleFromGeneratedContent</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">summary</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">confidence</span><span class="p">:</span> <span class="nb">Int</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">subComponents</span><span class="p">:</span> <span class="p">[</span><span class="n">SubComponentResult</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">init</span><span class="p">(</span><span class="kc">_</span> <span class="n">content</span><span class="p">:</span> <span class="n">GeneratedContent</span><span class="p">)</span> <span class="kr">throws</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">summary</span> <span class="p">=</span> <span class="k">try</span> <span class="n">content</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">,</span> <span class="n">forProperty</span><span class="p">:</span> <span class="s">&#34;summary&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">confidence</span> <span class="p">=</span> <span class="k">try</span> <span class="n">content</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="nb">Int</span><span class="p">.</span><span class="kc">self</span><span class="p">,</span> <span class="n">forProperty</span><span class="p">:</span> <span class="s">&#34;confidence&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nv">subComponentsContent</span> <span class="p">=</span> <span class="k">try</span> <span class="n">content</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="n">GeneratedContent</span><span class="p">.</span><span class="kc">self</span><span class="p">,</span> <span class="n">forProperty</span><span class="p">:</span> <span class="s">&#34;subComponents&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="kd">let</span> <span class="nv">properties</span><span class="p">:</span> <span class="p">[</span><span class="nb">String</span><span class="p">:</span> <span class="n">GeneratedContent</span><span class="p">]</span> <span class="p">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="k">case</span> <span class="kd">let</span> <span class="p">.</span><span class="n">structure</span><span class="p">(</span><span class="n">properties</span><span class="p">,</span> <span class="kc">_</span><span class="p">)</span> <span class="p">=</span> <span class="n">subComponentsContent</span><span class="p">.</span><span class="n">kind</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">properties</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="p">[:]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}()</span>
</span></span><span class="line"><span class="cl">    <span class="n">subComponents</span> <span class="p">=</span> <span class="k">try</span> <span class="n">properties</span><span class="p">.</span><span class="bp">map</span> <span class="p">{</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">bodyContent</span><span class="p">)</span> <span class="k">in</span>
</span></span><span class="line"><span class="cl">      <span class="k">try</span> <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="n">bodyContent</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">struct</span> <span class="nc">SubComponentResult</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">title</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">body</span><span class="p">:</span> <span class="nb">String</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>That <code>init</code> constructor is doing the Lord's work, here, because Apple's documentation really fell down on the job this time. See, through OS 26 beta 4, if you had a <code>GeneratedContent</code>, you could simply iterate over a dictionary of its <code>properties</code> or an array of its <code>elements</code>. These APIs, however, appear to have been removed in OS 26 beta 5. I say &quot;appear to have been removed,&quot; because Apple shipped Xcode 26 beta 5 with <em>outdated developer documentation</em> that continues to suggest they should exist and which <em>failed</em> to include beta 5's newly-added <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent/kind-swift.enum">GeneratedContent.Kind</a> enum. Between this and the lack of any example code or blog posts, I spent most of today wondering whether I'd lost my goddamn mind.</p>
<p>Anyway, good news: you <em>can</em> iterate over a dynamic schema's collection of properties of unknown name and size by unwrapping the <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent/kind-swift.property">response.content.kind</a> enumerator. In my case, I know my <code>subComponents</code> will always be a structure, because I'm the guy who defined my schema and the nice thing about the Foundation Models API is that its responses <em>always, yes, always</em> adhere to the types specified by the requested schema, whether static or dynamic.</p>
<p>So let's break down what went into deriving the value's <code>customProperties</code> property.</p>
<p>We start by fetching a nested <code>GeneratedContent</code> from the top-level property named <code>subComponents</code> with <code>content.value(GeneratedContent.self, forProperty: &quot;subComponents&quot;)</code></p>
<p>Next, this little nugget assigns to <code>properties</code> a dictionary mapping <code>String</code> keys to <code>GeneratedContent</code> values by unwrapping the properties from the <code>kind</code> enumerator's structure case, and defaulting to an empty dictionary in the event we get anything unexpected:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nv">properties</span><span class="p">:</span> <span class="p">[</span><span class="nb">String</span><span class="p">:</span> <span class="n">GeneratedContent</span><span class="p">]</span> <span class="p">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="k">case</span> <span class="kd">let</span> <span class="p">.</span><span class="n">structure</span><span class="p">(</span><span class="n">properties</span><span class="p">,</span> <span class="kc">_</span><span class="p">)</span> <span class="p">=</span> <span class="n">subComponentsContent</span><span class="p">.</span><span class="n">kind</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">properties</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">[:]</span>
</span></span><span class="line"><span class="cl"><span class="p">}()</span>
</span></span></code></pre></div><p>Finally, we build out our result struct's <code>subComponents</code> field by mapping over those properties.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="n">subComponents</span> <span class="p">=</span> <span class="k">try</span> <span class="n">properties</span><span class="p">.</span><span class="bp">map</span> <span class="p">{</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">bodyContent</span><span class="p">)</span> <span class="k">in</span>
</span></span><span class="line"><span class="cl">  <span class="k">try</span> <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="n">title</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="n">bodyContent</span><span class="p">.</span><span class="n">value</span><span class="p">(</span><span class="nb">String</span><span class="p">.</span><span class="kc">self</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Two things are admittedly weird about that last bit:</p>
<ol>
<li>I got a little lazy here by using the each sub-components' <code>title</code> as the name of the corresponding generated property. Since the property name gets fed into the LLM, one can only imagine doing so can only improve the results. Based on my experience so far, the name of a field greatly influences what kind of data you get back from the on-device foundation models.</li>
<li>The <code>bodyContent</code> itself is a <code>GeneratedContent</code> that we know to be a string (again, because that's what our dynamic schema specifies), so we can safely demand one back using its <a href="https://developer.apple.com/documentation/foundationmodels/generatedcontent/value(_:)">value(Type)</a> method</li>
</ol>

<h2 id="5-pull-it-all-together">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#5-pull-it-all-together">5. Pull it all together</a>
</h2>
<p>Okay, the moment of truth. This shit compiles, but will it work? At least as of OS 26 betas 5 &amp; 6: <em>yes</em>!</p>
<p>My <a href="https://gist.github.com/searls/52c5cf53220354cac2e89e9bcf54c27d">aforementioned Swift file</a> ends with a <code>#Playground</code> you can actually futz with interactively in Xcode 26 and navigate the results interactively. Just three more calls to get your cocktail:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="kd">import</span> <span class="nc">Playgrounds</span>
</span></span><span class="line"><span class="cl"><span class="p">#</span><span class="n">Playground</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">session</span> <span class="p">=</span> <span class="n">LanguageModelSession</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">cocktailPromptSet</span><span class="p">.</span><span class="n">instructions</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">response</span> <span class="p">=</span> <span class="k">try</span> <span class="n">await</span> <span class="n">session</span><span class="p">.</span><span class="n">respond</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">to</span><span class="p">:</span> <span class="s">&#34;Shirley Temple&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">schema</span><span class="p">:</span> <span class="n">GenerationSchema</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="n">cocktailSchema</span><span class="p">,</span> <span class="n">dependencies</span><span class="p">:</span> <span class="p">[])</span>
</span></span><span class="line"><span class="cl">  <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nv">cocktailResult</span> <span class="p">=</span> <span class="k">try</span> <span class="n">EducationalResult</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The above yielded this response:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-swift" data-lang="swift"><span class="line"><span class="cl"><span class="n">EducationalResult</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">summary</span><span class="p">:</span> <span class="s">&#34;The Shirley Temple is a classic and refreshing cocktail that has been delighting children and adults alike for generations. It</span><span class="se">\&#39;</span><span class="s">s known for its simplicity, sweet taste, and vibrant orange hue. Made primarily with ginger ale, it</span><span class="se">\&#39;</span><span class="s">s a perfect example of a kid-friendly drink that doesn</span><span class="se">\&#39;</span><span class="s">t compromise on flavor. The combination of ginger ale and grenadine creates a visually appealing and sweet-tart beverage, making it a staple at parties, brunches, and any occasion where a fun and easy drink is needed.&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">confidence</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">subComponents</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Steps&#34;</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="s">&#34;1. In a tall glass filled with ice, pour 2 oz of ginger ale. 2. Add 1 oz of grenadine carefully, swirling gently to combine. 3. Garnish with an orange slice and a cherry on top.&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Prep&#34;</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="s">&#34;Ensure you have fresh ginger ale and grenadine ready to go.&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">SubComponentResult</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="s">&#34;Ingredients&#34;</span><span class="p">,</span> <span class="n">body</span><span class="p">:</span> <span class="s">&#34;2 oz ginger ale, 1 oz grenadine, Orange slice, Cherry&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">])</span>
</span></span></code></pre></div><p>The best part? I can only generate &quot;Shirley Temple&quot; drinks because whenever I ask for an alcoholic cocktail, it trips the on-device models' safety guardrails and refuses to generate anything.</p>
<p>Cool!</p>

<h2 id="this-was-too-hard">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#this-was-too-hard">This was too hard</a>
</h2>
<p>I've heard stories about Apple's documentation being bad, but never about it being <em>straight-up wrong</em>. Live by the beta, die by the beta, I guess.</p>
<p>In any case, between the documentation snafu and Claude Code repeatedly shitting the bed trying to guess its way through this API, I'm actually really grateful I was forced to buckle down and learn me some Swift.</p>
<p><a href="mailto:justin@searls.co">Let me know</a> if this guide helped you out! 💜</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/","append_url_label":"Read 📄","content":"\u003cp\u003eOver the past few days, I got really hung up in my attempts generate data structures using \u003ca href=\"https://developer.apple.com/documentation/FoundationModels\"\u003eApple Foundation Models\u003c/a\u003e for which the exact shape of that data wasn't known until runtime. The new APIs actually provide for this capability via \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema\"\u003eDynamicGenerationSchema\u003c/a\u003e, but the WWDC sessions and sample code were too simple to follow this thread end-to-end:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eStart with a struct representing a \u003ccode\u003ePromptSet\u003c/code\u003e: a variable set of prompts that will either map onto or be used to define the ultimate response data structure \u003ca href=\"#1-define-a-promptset\"\u003e🔽\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eInstantiate a \u003ccode\u003ePromptSet\u003c/code\u003e with—\u003cem\u003ewhat else?\u003c/em\u003e—a set of prompts to get the model to generate the sort of data we want \u003ca href=\"#2-instantiate-our-promptset\"\u003e🔽\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBuild out a \u003ccode\u003eDynamicGenerationSchema\u003c/code\u003e based on the contents of a given \u003ccode\u003ePromptSet\u003c/code\u003e instance \u003ca href=\"#3-build-a-dynamicgenerationschema\"\u003e🔽\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCreate a struct that can accommodate the variably-shaped data with as much type safety as possible and which conforms to \u003ca href=\"https://developer.apple.com/documentation/FoundationModels/ConvertibleFromGeneratedContent\"\u003eConvertibleFromGeneratedContent\u003c/a\u003e, so it can be instantiated by passing a \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/languagemodelsession#Generating-a-request\"\u003eLanguageModelSession\u003c/a\u003e response's \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/generatedcontent\"\u003eGeneratedContent\u003c/a\u003e \u003ca href=\"#4-define-a-result-struct-that-conforms-to-convertiblefromgeneratedcontent\"\u003e🔽\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePull it all together and generate some data with the on-device foundation models! \u003ca href=\"#5-pull-it-all-together\"\u003e🔽\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eWell, it took me all morning to get this to work, but I did it. Since I couldn't find a single code example that did anything like this, I figured I'd share this write up. You can \u003ca href=\"https://gist.github.com/searls/52c5cf53220354cac2e89e9bcf54c27d\"\u003eread the code as a standalone Swift file\u003c/a\u003e or otherwise follow along below.\u003c/p\u003e\n\n\u003ch2 id=\"1-define-a-promptset\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#1-define-a-promptset\"\u003e1. Define a PromptSet\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eStart with whatever code you need to represent the set(s) of prompts you'll be dealing with at runtime. (Maybe they're defined by you and ship with your app, maybe you let users define them through your app's UI.) To keep things minimal, I defined this one with a couple of mandatory fields and a variable number of custom ones:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-swift\" data-lang=\"swift\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eEducationalPromptSet\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003einstructions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003esummaryGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003econfidenceGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003esubComponents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eSubComponentPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eSubComponentPromptSet\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003ebodyGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNote that rather than modeling the data itself, the purpose of these structs is to model the set of prompts that will ultimately drive the creation of the schema which will, in turn, determine the shape and contents of the data we get back from the Foundation Models API. To drive this home, whatever goes in \u003ccode\u003esummaryGuideDescription\u003c/code\u003e, \u003ccode\u003econfidenceGuideDescription\u003c/code\u003e, and \u003ccode\u003ebodyGuideDescription\u003c/code\u003e should themselves be \u003cem\u003eprompts\u003c/em\u003e to guide the generation of like-named type-safe values.\u003c/p\u003e\n\u003cp\u003eYes, it is very meta.\u003c/p\u003e\n\n\u003ch2 id=\"2-instantiate-our-promptset\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#2-instantiate-our-promptset\"\u003e2. Instantiate our PromptSet\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003ePresumably, we could decode some JSON from a file or received over the network that could populate this \u003ccode\u003eEducationalPromptSet\u003c/code\u003e. Here's an example set of prompts for generating cocktail recipes, expressed in some sample code:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-swift\" data-lang=\"swift\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003ecocktailPromptSet\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eEducationalPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;bartender_basic\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003einstructions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e    You are an expert bartender. Take the provided cocktail name or list of ingredients and explain how to make a delicious cocktail. Be creative!\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Cocktail Recipe\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;A custom cocktail recipe, tailored to the user\u0026#39;s input and communicated in an educational tone and spirit\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003esummaryGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;The summary should describe the history (if applicable) and taste profile of the cocktail\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003econfidenceGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Range between 0-100 for your confidence in the feasibility of this cocktail based on the prompt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003esubComponents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSubComponentPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Ingredients\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebodyGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;A list of all ingredients in the cocktail\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSubComponentPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Steps\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebodyGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;A list of the steps to make the cocktail\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSubComponentPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Prep\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebodyGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;The bar prep you should have completed in advance of service\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou can see that the provided instruction, description, and each guide description really go a long way to specify what kind of data we are ultimately looking for here. This same format could just as well be used to specify an \u003ccode\u003eEducationalPromptSet\u003c/code\u003e for calculus formulas, Japanese idioms, or bomb-making instructions.\u003c/p\u003e\n\n\u003ch2 id=\"3-build-a-dynamicgenerationschema\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#3-build-a-dynamicgenerationschema\"\u003e3. Build a DynamicGenerationSchema\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eNow, we must translate our prompt set into a \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema\"\u003eDynamicGenerationSchema\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWhy \u003ccode\u003eDynamicGenerationSchema\u003c/code\u003e and not the much simpler and defined-at-compile-time \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/generationschema\"\u003eGenerationSchema\u003c/a\u003e that's expanded with the \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/generable\"\u003e@Generable\u003c/a\u003e? Because reasons:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eWe only know the prompts (in API parlance, \u0026quot;Generation Guide descriptions\u0026quot;) at runtime, and the \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/guide(description:)\"\u003e@Guide\u003c/a\u003e macro must be specified statically\u003c/li\u003e\n\u003cli\u003eWe don't know how many \u003ccode\u003esubComponents\u003c/code\u003e a prompt set instance will specify in advance\u003c/li\u003e\n\u003cli\u003eWhile \u003ccode\u003esubComponents\u003c/code\u003e may ultimately redound to an array of strings, that doesn't mean they represent like concepts that could be generated by a single prompt (as an array of ingredient names might). Rather, each subComponent is effectively the answer to a different, unknowable-at-compile-time prompt of its own\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAs for building the \u003ccode\u003eDynamicGenerationSchema\u003c/code\u003e, you can break this up into two roots and have the parent reference the child, but after experimenting, I preferred just specifying it all in one go. (One reason not to get too clever about extracting these is that \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/dynamicgenerationschema/property\"\u003eDynamicGenerationSchema.Property\u003c/a\u003e is not \u003ca href=\"https://developer.apple.com/documentation/swift/sendable\"\u003eSendable\u003c/a\u003e, which can easily lead to concurrency-safety violations).\u003c/p\u003e\n\u003cp\u003eThis looks like a lot because this API is verbose as fuck, forcing you to oscillate between nested schemas and properties and schemas:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-swift\" data-lang=\"swift\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003ecocktailSchema\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecocktailPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecocktailPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecocktailPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esummaryGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kc\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;confidence\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecocktailPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econfidenceGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eInt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kc\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;subComponents\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;subComponents\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecocktailPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubComponents\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"bp\"\u003emap\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003esubComponentPromptSet\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003esubComponentPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003esubComponentPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebodyGuideDescription\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDynamicGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kc\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003ch2 id=\"4-define-a-result-struct-that-conforms-to-convertiblefromgeneratedcontent\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#4-define-a-result-struct-that-conforms-to-convertiblefromgeneratedcontent\"\u003e4. Define a result struct that conforms to ConvertibleFromGeneratedContent\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eWhen conforming to \u003ca href=\"https://developer.apple.com/documentation/FoundationModels/ConvertibleFromGeneratedContent\"\u003eConvertibleFromGeneratedContent\u003c/a\u003e, a type can be instantiated with nothing more than the \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/generatedcontent\"\u003eGeneratedContent\u003c/a\u003e returned from a language model response.\u003c/p\u003e\n\u003cp\u003eThere is a lot going on here. Code now, questions later:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-swift\" data-lang=\"swift\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eEducationalResult\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eConvertibleFromGeneratedContent\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003econfidence\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eInt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003esubComponents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eSubComponentResult\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003e_\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eGeneratedContent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"kr\"\u003ethrows\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esummary\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kc\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eforProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003econfidence\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eInt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kc\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eforProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;confidence\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003esubComponentsContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGeneratedContent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kc\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eforProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;subComponents\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003eproperties\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eGeneratedContent\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estructure\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubComponentsContent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekind\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[:]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esubComponents\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"bp\"\u003emap\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebodyContent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003eSubComponentResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ebodyContent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kc\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eSubComponentResult\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003eString\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThat \u003ccode\u003einit\u003c/code\u003e constructor is doing the Lord's work, here, because Apple's documentation really fell down on the job this time. See, through OS 26 beta 4, if you had a \u003ccode\u003eGeneratedContent\u003c/code\u003e, you could simply iterate over a dictionary of its \u003ccode\u003eproperties\u003c/code\u003e or an array of its \u003ccode\u003eelements\u003c/code\u003e. These APIs, however, appear to have been removed in OS 26 beta 5. I say \u0026quot;appear to have been removed,\u0026quot; because Apple shipped Xcode 26 beta 5 with \u003cem\u003eoutdated developer documentation\u003c/em\u003e that continues to suggest they should exist and which \u003cem\u003efailed\u003c/em\u003e to include beta 5's newly-added \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/generatedcontent/kind-swift.enum\"\u003eGeneratedContent.Kind\u003c/a\u003e enum. Between this and the lack of any example code or blog posts, I spent most of today wondering whether I'd lost my goddamn mind.\u003c/p\u003e\n\u003cp\u003eAnyway, good news: you \u003cem\u003ecan\u003c/em\u003e iterate over a dynamic schema's collection of properties of unknown name and size by unwrapping the \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/generatedcontent/kind-swift.property\"\u003eresponse.content.kind\u003c/a\u003e enumerator. In my case, I know my \u003ccode\u003esubComponents\u003c/code\u003e will always be a structure, because I'm the guy who defined my schema and the nice thing about the Foundation Models API is that its responses \u003cem\u003ealways, yes, always\u003c/em\u003e adhere to the types specified by the requested schema, whether static or dynamic.\u003c/p\u003e\n\u003cp\u003eSo let's break down what went into deriving the value's \u003ccode\u003ecustomProperties\u003c/code\u003e property.\u003c/p\u003e\n\u003cp\u003eWe start by fetching a nested \u003ccode\u003eGeneratedContent\u003c/code\u003e from the top-level property named \u003ccode\u003esubComponents\u003c/code\u003e with \u003ccode\u003econtent.value(GeneratedContent.self, forProperty: \u0026quot;subComponents\u0026quot;)\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eNext, this little nugget assigns to \u003ccode\u003eproperties\u003c/code\u003e a dictionary mapping \u003ccode\u003eString\u003c/code\u003e keys to \u003ccode\u003eGeneratedContent\u003c/code\u003e values by unwrapping the properties from the \u003ccode\u003ekind\u003c/code\u003e enumerator's structure case, and defaulting to an empty dictionary in the event we get anything unexpected:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-swift\" data-lang=\"swift\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003eproperties\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eGeneratedContent\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estructure\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubComponentsContent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekind\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[:]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFinally, we build out our result struct's \u003ccode\u003esubComponents\u003c/code\u003e field by mapping over those properties.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-swift\" data-lang=\"swift\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esubComponents\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"bp\"\u003emap\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebodyContent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003eSubComponentResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ebodyContent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kc\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTwo things are admittedly weird about that last bit:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eI got a little lazy here by using the each sub-components' \u003ccode\u003etitle\u003c/code\u003e as the name of the corresponding generated property. Since the property name gets fed into the LLM, one can only imagine doing so can only improve the results. Based on my experience so far, the name of a field greatly influences what kind of data you get back from the on-device foundation models.\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003ebodyContent\u003c/code\u003e itself is a \u003ccode\u003eGeneratedContent\u003c/code\u003e that we know to be a string (again, because that's what our dynamic schema specifies), so we can safely demand one back using its \u003ca href=\"https://developer.apple.com/documentation/foundationmodels/generatedcontent/value(_:)\"\u003evalue(Type)\u003c/a\u003e method\u003c/li\u003e\n\u003c/ol\u003e\n\n\u003ch2 id=\"5-pull-it-all-together\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#5-pull-it-all-together\"\u003e5. Pull it all together\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eOkay, the moment of truth. This shit compiles, but will it work? At least as of OS 26 betas 5 \u0026amp; 6: \u003cem\u003eyes\u003c/em\u003e!\u003c/p\u003e\n\u003cp\u003eMy \u003ca href=\"https://gist.github.com/searls/52c5cf53220354cac2e89e9bcf54c27d\"\u003eaforementioned Swift file\u003c/a\u003e ends with a \u003ccode\u003e#Playground\u003c/code\u003e you can actually futz with interactively in Xcode 26 and navigate the results interactively. Just three more calls to get your cocktail:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-swift\" data-lang=\"swift\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003eimport\u003c/span\u003e \u003cspan class=\"nc\"\u003ePlaygrounds\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e#\u003c/span\u003e\u003cspan class=\"n\"\u003ePlayground\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003esession\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eLanguageModelSession\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecocktailPromptSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einstructions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003eresponse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003esession\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erespond\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eto\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Shirley Temple\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eGenerationSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecocktailSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nv\"\u003ecocktailResult\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"n\"\u003eEducationalResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe above yielded this response:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-swift\" data-lang=\"swift\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eEducationalResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;The Shirley Temple is a classic and refreshing cocktail that has been delighting children and adults alike for generations. It\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#39;\u003c/span\u003e\u003cspan class=\"s\"\u003es known for its simplicity, sweet taste, and vibrant orange hue. Made primarily with ginger ale, it\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#39;\u003c/span\u003e\u003cspan class=\"s\"\u003es a perfect example of a kid-friendly drink that doesn\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#39;\u003c/span\u003e\u003cspan class=\"s\"\u003et compromise on flavor. The combination of ginger ale and grenadine creates a visually appealing and sweet-tart beverage, making it a staple at parties, brunches, and any occasion where a fun and easy drink is needed.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003econfidence\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003esubComponents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSubComponentResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Steps\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;1. In a tall glass filled with ice, pour 2 oz of ginger ale. 2. Add 1 oz of grenadine carefully, swirling gently to combine. 3. Garnish with an orange slice and a cherry on top.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSubComponentResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Prep\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Ensure you have fresh ginger ale and grenadine ready to go.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSubComponentResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Ingredients\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;2 oz ginger ale, 1 oz grenadine, Orange slice, Cherry\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe best part? I can only generate \u0026quot;Shirley Temple\u0026quot; drinks because whenever I ask for an alcoholic cocktail, it trips the on-device models' safety guardrails and refuses to generate anything.\u003c/p\u003e\n\u003cp\u003eCool!\u003c/p\u003e\n\n\u003ch2 id=\"this-was-too-hard\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/#this-was-too-hard\"\u003eThis was too hard\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eI've heard stories about Apple's documentation being bad, but never about it being \u003cem\u003estraight-up wrong\u003c/em\u003e. Live by the beta, die by the beta, I guess.\u003c/p\u003e\n\u003cp\u003eIn any case, between the documentation snafu and Claude Code repeatedly shitting the bed trying to guess its way through this API, I'm actually really grateful I was forced to buckle down and learn me some Swift.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"mailto:justin@searls.co\"\u003eLet me know\u003c/a\u003e if this guide helped you out! 💜\u003c/p\u003e","id":"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/","og_image":"https://justin.searls.co/img/social/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-18T01:00:08Z","title":"How to generate dynamic data structures with Apple Foundation Models","updated_at":"2025-08-18T07:42:00-04:00","url":"https://justin.searls.co/posts/how-to-generate-dynamic-data-structures-with-apple-foundation-models/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v42-free-as-in-remodel/</id>
      <title type="text">🎙️ Breaking Change podcast v42 - Free as in Remodel</title>
      <link href="https://justin.searls.co/casts/breaking-change-v42-free-as-in-remodel/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-16T15:34:21+00:00</published>
    <updated>2025-08-19T10:43:00-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v42.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v42.mp3">Direct link to podcast audio file</a>
</p><p>Thanks for writing so many lovely emails to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Hell, thanks even for the unlovely ones.</p>
<p>Be sure to look out for me showing up on <a href="http://deadcode.website">Dead Code</a> at some point after it records next Tuesday. I'm realizing not all podcasts have a 1-hour-or-less turnaround time like this one does.</p>
<p>As promised, some URLs follow:</p>
<ul>
<li><a href="https://note.com/yanotomoaki/n/nbb31a0e5604f?utm_source=chatgpt.com">Want a Japanese girlfriend? Better be the right Myers-Briggs type</a></li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li><a href="https://www.thecut.com/article/corinne-low-having-it-all-not-dating-men-interview.html">Men sucking at chores is turning women gay!</a> (<a href="https://apple.news/AAygiAG0mQKmnXUYkF8BBsQ">News+</a>)</li>
<li><a href="https://www.economist.com/science-and-technology/2025/08/08/are-nightmares-bad-for-your-health">Nightmares kill you</a> (<a href="https://archive.is/fqoRk">Archive</a>)</li>
<li>This <a href="https://www.reddit.com/r/overemployed/s/8fm4h4FOSv">shiner from /r/overemployed</a></li>
<li><a href="https://developers.slashdot.org/story/25/08/10/0110212/hour-of-code-announces-its-now-evolving-into-hour-of-ai">Hour of Code is now Hour of AI</a></li>
<li><a href="https://garymarcus.substack.com/p/gpt-5-overdue-overhyped-and-underwhelming">Gary Marcus taking a few victory laps around GPT-5</a></li>
<li><a href="https://daringfireball.net/2025/08/openai_chatgpt_models_emotional_attachment">OpenAI caves to 4o-pilled users</a></li>
<li><a href="https://www.reuters.com/investigates/special-report/meta-ai-chatbot-guidelines/">Meta's AI rules have let bots hold 'sensual' chats with children</a></li>
<li><a href="https://www.theverge.com/news/759158/apple-watch-blood-oxygen-redesign-import-ban-wearables-smartwatch">Apple returns blood oxygen monitoring to the latest Apple Watches (sort of)</a></li>
<li><a href="https://www.theverge.com/news/737757/apple-president-donald-trump-ceo-tim-cook-glass-corning">The Trump Trophy</a></li>
<li><a href="https://yro.slashdot.org/comments.pl?sid=23765914&amp;cid=65583466">My man Steve Wozniak has a 6-digit /. account</a></li>
<li><a href="https://benn.substack.com/p/enough">Enough</a></li>
<li><a href="https://en.wikipedia.org/wiki/Andor_%28TV_series%29">Andor</a></li>
<li><a href="https://en.wikipedia.org/wiki/Alien%3A_Earth">Alien: Earth</a></li>
<li><a href="https://www.ea.com/games/the-sims/the-sims-2-25th-anniv-edition">Sims 2 Legacy Collection</a></li>
<li><a href="https://en.wikipedia.org/wiki/Foundation_(TV_series)">Foundation Season 3</a></li>
<li><a href="https://www.loom.com/share/350ba04bad7e46f7a6c0fa3028952c1f">Mariusz schools us on running Claude Code in a Docker container</a> (<a href="https://gist.github.com/marzdrel/cf0fec314c2fd24a6812eae53b23b430">sources</a>)</li>
<li><a href="https://worksonmymachine.ai/p/entering-technical-debts-zirp-era/comment/143554949">Marick's ZIRP reply</a> and <a href="https://justin.searls.co/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing/">my follow-up post</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>Thanks for writing so many lovely emails to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Hell, thanks even for the unlovely ones.</p>
<p>Be sure to look out for me showing up on <a href="http://deadcode.website">Dead Code</a> at some point after it records next Tuesday. I'm realizing not all podcasts have a 1-hour-or-less turnaround time like this one does.</p>
<p>As promised, some URLs follow:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v42-free-as-in-remodel/","append_url_label":"Hear 🎙","content":"\u003cp\u003eThanks for writing so many lovely emails to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e. Hell, thanks even for the unlovely ones.\u003c/p\u003e\n\u003cp\u003eBe sure to look out for me showing up on \u003ca href=\"http://deadcode.website\"\u003eDead Code\u003c/a\u003e at some point after it records next Tuesday. I'm realizing not all podcasts have a 1-hour-or-less turnaround time like this one does.\u003c/p\u003e\n\u003cp\u003eAs promised, some URLs follow:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://note.com/yanotomoaki/n/nbb31a0e5604f?utm_source=chatgpt.com\"\u003eWant a Japanese girlfriend? Better be the right Myers-Briggs type\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.thecut.com/article/corinne-low-having-it-all-not-dating-men-interview.html\"\u003eMen sucking at chores is turning women gay!\u003c/a\u003e (\u003ca href=\"https://apple.news/AAygiAG0mQKmnXUYkF8BBsQ\"\u003eNews+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.economist.com/science-and-technology/2025/08/08/are-nightmares-bad-for-your-health\"\u003eNightmares kill you\u003c/a\u003e (\u003ca href=\"https://archive.is/fqoRk\"\u003eArchive\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThis \u003ca href=\"https://www.reddit.com/r/overemployed/s/8fm4h4FOSv\"\u003eshiner from /r/overemployed\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developers.slashdot.org/story/25/08/10/0110212/hour-of-code-announces-its-now-evolving-into-hour-of-ai\"\u003eHour of Code is now Hour of AI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://garymarcus.substack.com/p/gpt-5-overdue-overhyped-and-underwhelming\"\u003eGary Marcus taking a few victory laps around GPT-5\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://daringfireball.net/2025/08/openai_chatgpt_models_emotional_attachment\"\u003eOpenAI caves to 4o-pilled users\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.reuters.com/investigates/special-report/meta-ai-chatbot-guidelines/\"\u003eMeta's AI rules have let bots hold 'sensual' chats with children\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/news/759158/apple-watch-blood-oxygen-redesign-import-ban-wearables-smartwatch\"\u003eApple returns blood oxygen monitoring to the latest Apple Watches (sort of)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.theverge.com/news/737757/apple-president-donald-trump-ceo-tim-cook-glass-corning\"\u003eThe Trump Trophy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://yro.slashdot.org/comments.pl?sid=23765914\u0026amp;cid=65583466\"\u003eMy man Steve Wozniak has a 6-digit /. account\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://benn.substack.com/p/enough\"\u003eEnough\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Andor_%28TV_series%29\"\u003eAndor\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Alien%3A_Earth\"\u003eAlien: Earth\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.ea.com/games/the-sims/the-sims-2-25th-anniv-edition\"\u003eSims 2 Legacy Collection\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Foundation_(TV_series)\"\u003eFoundation Season 3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.loom.com/share/350ba04bad7e46f7a6c0fa3028952c1f\"\u003eMariusz schools us on running Claude Code in a Docker container\u003c/a\u003e (\u003ca href=\"https://gist.github.com/marzdrel/cf0fec314c2fd24a6812eae53b23b430\"\u003esources\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://worksonmymachine.ai/p/entering-technical-debts-zirp-era/comment/143554949\"\u003eMarick's ZIRP reply\u003c/a\u003e and \u003ca href=\"https://justin.searls.co/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing/\"\u003emy follow-up post\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Free as in Remodel","id":"https://justin.searls.co/casts/breaking-change-v42-free-as-in-remodel/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v42-free-as-in-remodel.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-16T15:34:21Z","title":"Free as in Remodel","updated_at":"2025-08-19T10:43:00-04:00","url":"https://justin.searls.co/casts/breaking-change-v42-free-as-in-remodel/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/shots/2025-08-10-12h31m46s/</id>
      <title type="text">📸 Shout for DANGER</title>
      <link href="https://justin.searls.co/shots/2025-08-10-12h31m46s/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-10T16:31:46+00:00</published>
    <updated>2025-08-10T12:38:19-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[
<div>
  <img src="https://justin.searls.co/shots/2025-08-10-12h31m23s-9508d07.jpeg"/>
</div><p>Free idea for anyone who wants it.</p>
<p>I've been juggling so many LLM-based editors and CLI tools that I've started collecting them into meta scripts like this shell-completion-aware <code>edit</code> dingus that I use for launching into my projects each day.</p>
<p>Because many of these CLIs have separate &quot;safe&quot; and &quot;for real though&quot; modes, I've picked up the convention of giving the editor name in ALL CAPS to mean &quot;give me dangerous mode, please.&quot;</p>
<p>So:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">$ edit -e claude posse_party
</span></span></code></pre></div><p>Will open Claude Code in <code>~/code/searls/posse_party</code> in normal mode.</p>
<p>And:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">$ edit -e CLAUDE posse_party
</span></span></code></pre></div><p>Will do the same, while also passing the <code>--dangerously-skip-permissions</code> flag, which I refuse to type.</p>

]]></content>
    <summary type="html"><![CDATA[<p>Free idea for anyone who wants it.</p>
<p>I've been juggling so many LLM-based editors and CLI tools that I've started collecting them into meta scripts like this shell-completion-aware <code>edit</code> dingus that I use for launching into my projects each day.</p>
<p>Because many of these CLIs have separate &quot;safe&quot; and &quot;for real though&quot; modes, I've picked up the convention of giving the editor name in ALL CAPS to mean &quot;give me dangerous mode, please.&quot;</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/shots/2025-08-10-12h31m46s/","append_url_label":"View 📸","content":"\u003cp\u003eFree idea for anyone who wants it.\u003c/p\u003e\n\u003cp\u003eI've been juggling so many LLM-based editors and CLI tools that I've started collecting them into meta scripts like this shell-completion-aware \u003ccode\u003eedit\u003c/code\u003e dingus that I use for launching into my projects each day.\u003c/p\u003e\n\u003cp\u003eBecause many of these CLIs have separate \u0026quot;safe\u0026quot; and \u0026quot;for real though\u0026quot; modes, I've picked up the convention of giving the editor name in ALL CAPS to mean \u0026quot;give me dangerous mode, please.\u0026quot;\u003c/p\u003e\n\u003cp\u003eSo:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ edit -e claude posse_party\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWill open Claude Code in \u003ccode\u003e~/code/searls/posse_party\u003c/code\u003e in normal mode.\u003c/p\u003e\n\u003cp\u003eAnd:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ edit -e CLAUDE posse_party\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWill do the same, while also passing the \u003ccode\u003e--dangerously-skip-permissions\u003c/code\u003e flag, which I refuse to type.\u003c/p\u003e\n","id":"https://justin.searls.co/shots/2025-08-10-12h31m46s/","media":[{"type":"image","url":"https://justin.searls.co/shots/2025-08-10-12h31m23s-9508d07.jpeg"}],"og_image":"https://justin.searls.co/shots/2025-08-10-12h31m23s-9508d07.jpeg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-10T16:31:46Z","title":"Shout for DANGER","updated_at":"2025-08-10T12:38:19-04:00","url":"https://justin.searls.co/shots/2025-08-10-12h31m46s/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing/</id>
      <title type="text">🔗 Is a Technical Debt ZIRP a good thing?</title>
        <link href="https://worksonmymachine.ai/p/entering-technical-debts-zirp-era/comment/143554949" rel="alternate" type="text/html" />
        <link href="https://justin.searls.co/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing/" rel="related" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-10T14:33:14+00:00</published>
    <updated>2025-08-10T12:08:44-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>A few days back, <a href="/takes/2025-08-08-15h03m04s/">I linked to</a> Scott Werner's clever insight that—rather than fear the mess created by AI codegen—we should think through the flip side: an army of robots working tirelessly to clean up our code has the potential to bring the <a href="https://worksonmymachine.ai/p/entering-technical-debts-zirp-era">carrying cost of technical debt way down</a>, akin to the previous decade's <a href="https://en.wikipedia.org/wiki/Zero_interest-rate_policy">zero-interest rate phenomenon (ZIRP)</a>. Scott was inspired by Orta Therox's retrospective on <a href="https://blog.puzzmo.com/posts/2025/07/30/six-weeks-of-claude-code/">six weeks of Claude Code at Puzzmo</a>, which Orta himself wrote after reading my own <a href="/posts/full-breadth-developers/">Full-breadth Developers</a> post.</p>
<p>Blogging is so back!</p>
<p>If you aren't familiar with <a href="https://mstdn.social/@marick">Brian Marick</a>, he's a whip-smart thinker with a frustrating knack for making contrarian points that are hard to disagree with. He saw my link and <a href="https://worksonmymachine.ai/p/entering-technical-debts-zirp-era/comment/143554949">left this comment</a> on Scott's blog post about technical debt and ZIRP. The whole comment is worth reading and should have top-billing as a post in its own right, so I figured I'd highlight it here:</p>
<blockquote>
<p>The problem with a ZIRP is that those questions are b-o-r-i-n-g and you can't compete with those who skip them. You're out of business before they crash. (&quot;The market can remain irrational longer than you can remain solvent.&quot;)</p>
<p>Similarly, there's a collective action problem. Our society is structured such that when the optimists' predictions go wrong, they don't pay for their mistakes – rather society as a whole does. See housing derivatives in 2008, the Asian financial crisis of the late '90s, etc. ZIRP makes it cheaper to be an optimist, but someone else pays the bill for failure (Silicon Valley Bank, Savings and Loan crisis)</p>
<p>It's weird to see ZIRP touted as a model, given the incredible overspending that took place, which had to be clawed back once ZIRP went away. (Most notably in tech layoffs, but I'm more concerned about all the small companies that were crushed because of financials, not because of the merit of their products.)</p>
</blockquote>
<p>Brian made me ashamed to admit that I had read Scott's post as an exclusively <em>good thing</em>, despite the fact that on a macro level, he's absolutely right: the excesses of irrational exuberance and their unfair consequences are definitely net-harmful to society. No argument there. Someone should absolutely get on that and, of course, literally no one will.</p>
<p>Why am I unbothered? Because as a customer, I am happy to ride a ZIRP wave for my own personal benefit. That way, even if the world burns in the end, at least I got <em>something</em> out of it. Last time around, I benefited from a shitload of free cloud compute, cheap taxi rides, subsidized meal services, and credit card reward arbitrage in the 2010s—even as I made sure to direct my investment portfolio towards businesses that actually, you know, made money. So it is today: the tech industry has made a nigh-infinite number of GPUs available at remarkably low prices, and I'm just some dipshit customer who is more than happy to allow investors to subsidize my usage. At the moment, I'm paying $200/month for Claude Max which admittedly feels like a bit of a stretch, until I check <a href="https://github.com/ryoppippi/ccusage">ccusage</a> and realize I've burned over $4500 worth of API tokens in the last 30 days.</p>
<p>And, unreliable and frustrating as they may be, I'm still seeing a ton of personal value from the current crop of LLM-based tools overall. As long as that's the case, I suppose I'll keep doing whatever best assists me in achieving my goals.</p>
<p>Is any of this sustainable? Unlikely. Are we all cooked? Probably! But as Brian says, this is a collective action problem. I'm not going to be the one to fix it. And while I greatly admire the spirit of those who would gladly spend years of their lives as activists to also not fix it, I've got other shit I'd rather do.</p>
<p>My only real medium-to-long-term hope is that the local LLM scene continues to mature and evolve so as to hedge the possibility that the AI cloud subsidy disappears and all these servers get turned off. So long as this class of tools continues to be available to those who buy fancy Apple products, how I personally approach software development will be forever changed.</p>
<p><em>(h/t to Tim Dussinger for reminding me to link to Brian's commentary.)</em></p>

<p>🔗 <a href="https://worksonmymachine.ai/p/entering-technical-debts-zirp-era/comment/143554949" title="Original Article">worksonmymachine.ai</a></p><p>🧂 <a href="https://justin.searls.co/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing/" title="Permalink to my take">justin.searls.co</a></p>]]></content>
    <summary type="html"><![CDATA[<p>A few days back, <a href="/takes/2025-08-08-15h03m04s/">I linked to</a> Scott Werner's clever insight that—rather than fear the mess created by AI codegen—we should think through the flip side: an army of robots working tirelessly to clean up our code has the potential to bring the <a href="https://worksonmymachine.ai/p/entering-technical-debts-zirp-era">carrying cost of technical debt way down</a>, akin to the previous decade's <a href="https://en.wikipedia.org/wiki/Zero_interest-rate_policy">zero-interest rate phenomenon (ZIRP)</a>. Scott was inspired by Orta Therox's retrospective on <a href="https://blog.puzzmo.com/posts/2025/07/30/six-weeks-of-claude-code/">six weeks of Claude Code at Puzzmo</a>, which Orta himself wrote after reading my own <a href="/posts/full-breadth-developers/">Full-breadth Developers</a> post.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing/","append_url_label":"Click 🔗","content":"\u003cp\u003eA few days back, \u003ca href=\"/takes/2025-08-08-15h03m04s/\"\u003eI linked to\u003c/a\u003e Scott Werner's clever insight that—rather than fear the mess created by AI codegen—we should think through the flip side: an army of robots working tirelessly to clean up our code has the potential to bring the \u003ca href=\"https://worksonmymachine.ai/p/entering-technical-debts-zirp-era\"\u003ecarrying cost of technical debt way down\u003c/a\u003e, akin to the previous decade's \u003ca href=\"https://en.wikipedia.org/wiki/Zero_interest-rate_policy\"\u003ezero-interest rate phenomenon (ZIRP)\u003c/a\u003e. Scott was inspired by Orta Therox's retrospective on \u003ca href=\"https://blog.puzzmo.com/posts/2025/07/30/six-weeks-of-claude-code/\"\u003esix weeks of Claude Code at Puzzmo\u003c/a\u003e, which Orta himself wrote after reading my own \u003ca href=\"/posts/full-breadth-developers/\"\u003eFull-breadth Developers\u003c/a\u003e post.\u003c/p\u003e\n\u003cp\u003eBlogging is so back!\u003c/p\u003e\n\u003cp\u003eIf you aren't familiar with \u003ca href=\"https://mstdn.social/@marick\"\u003eBrian Marick\u003c/a\u003e, he's a whip-smart thinker with a frustrating knack for making contrarian points that are hard to disagree with. He saw my link and \u003ca href=\"https://worksonmymachine.ai/p/entering-technical-debts-zirp-era/comment/143554949\"\u003eleft this comment\u003c/a\u003e on Scott's blog post about technical debt and ZIRP. The whole comment is worth reading and should have top-billing as a post in its own right, so I figured I'd highlight it here:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe problem with a ZIRP is that those questions are b-o-r-i-n-g and you can't compete with those who skip them. You're out of business before they crash. (\u0026quot;The market can remain irrational longer than you can remain solvent.\u0026quot;)\u003c/p\u003e\n\u003cp\u003eSimilarly, there's a collective action problem. Our society is structured such that when the optimists' predictions go wrong, they don't pay for their mistakes – rather society as a whole does. See housing derivatives in 2008, the Asian financial crisis of the late '90s, etc. ZIRP makes it cheaper to be an optimist, but someone else pays the bill for failure (Silicon Valley Bank, Savings and Loan crisis)\u003c/p\u003e\n\u003cp\u003eIt's weird to see ZIRP touted as a model, given the incredible overspending that took place, which had to be clawed back once ZIRP went away. (Most notably in tech layoffs, but I'm more concerned about all the small companies that were crushed because of financials, not because of the merit of their products.)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBrian made me ashamed to admit that I had read Scott's post as an exclusively \u003cem\u003egood thing\u003c/em\u003e, despite the fact that on a macro level, he's absolutely right: the excesses of irrational exuberance and their unfair consequences are definitely net-harmful to society. No argument there. Someone should absolutely get on that and, of course, literally no one will.\u003c/p\u003e\n\u003cp\u003eWhy am I unbothered? Because as a customer, I am happy to ride a ZIRP wave for my own personal benefit. That way, even if the world burns in the end, at least I got \u003cem\u003esomething\u003c/em\u003e out of it. Last time around, I benefited from a shitload of free cloud compute, cheap taxi rides, subsidized meal services, and credit card reward arbitrage in the 2010s—even as I made sure to direct my investment portfolio towards businesses that actually, you know, made money. So it is today: the tech industry has made a nigh-infinite number of GPUs available at remarkably low prices, and I'm just some dipshit customer who is more than happy to allow investors to subsidize my usage. At the moment, I'm paying $200/month for Claude Max which admittedly feels like a bit of a stretch, until I check \u003ca href=\"https://github.com/ryoppippi/ccusage\"\u003eccusage\u003c/a\u003e and realize I've burned over $4500 worth of API tokens in the last 30 days.\u003c/p\u003e\n\u003cp\u003eAnd, unreliable and frustrating as they may be, I'm still seeing a ton of personal value from the current crop of LLM-based tools overall. As long as that's the case, I suppose I'll keep doing whatever best assists me in achieving my goals.\u003c/p\u003e\n\u003cp\u003eIs any of this sustainable? Unlikely. Are we all cooked? Probably! But as Brian says, this is a collective action problem. I'm not going to be the one to fix it. And while I greatly admire the spirit of those who would gladly spend years of their lives as activists to also not fix it, I've got other shit I'd rather do.\u003c/p\u003e\n\u003cp\u003eMy only real medium-to-long-term hope is that the local LLM scene continues to mature and evolve so as to hedge the possibility that the AI cloud subsidy disappears and all these servers get turned off. So long as this class of tools continues to be available to those who buy fancy Apple products, how I personally approach software development will be forever changed.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(h/t to Tim Dussinger for reminding me to link to Brian's commentary.)\u003c/em\u003e\u003c/p\u003e\n","id":"https://justin.searls.co/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing/","og_image":"https://justin.searls.co/img/social/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-10T14:33:14Z","related_url":"https://worksonmymachine.ai/p/entering-technical-debts-zirp-era/comment/143554949","title":"Is a Technical Debt ZIRP a good thing?","updated_at":"2025-08-10T12:08:44-04:00","url":"https://justin.searls.co/links/2025-08-10-is-a-technical-debt-zirp-a-good-thing/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/mails/2025-07/</id>
      <title type="text">✉️ Connect 4</title>
      <link href="https://justin.searls.co/mails/2025-07/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-07T00:00:00+00:00</published>
    <updated>2025-10-20T10:51:25-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p class="italic text-secondary">
  <em>This is a copy of the <a href="/newsletter" class="underline hover:no-underline">Searls of Wisdom newsletter</a>
  delivered to subscribers on August 7, 2025.</em>
</p>


<p>I just realized that Christmas in July must have been held somewhere, and I missed it. Damn.</p>
<p>Regardless, the blog was busy since we last checked in:</p>
<ul>
<li>There's some <a href="https://justin.searls.co/posts/adding-swift-format-to-your-xcode-build/">Xcode</a> <a href="https://justin.searls.co/posts/i-made-xcodes-tests-60-times-faster/">stuff</a> for Apple people, as well as the nostalgia of <a href="https://justin.searls.co/shots/2025-07-16-15h10m35s/">finding the order confirmation</a> of my very first Mac, a 12&quot; iBook G4</li>
<li>We got in some good thoughtlording with a <a href="https://justin.searls.co/links/2025-07-29-upside-down-development/">software design thinkpiece</a>, an <a href="https://justin.searls.co/links/2025-08-03-there-is-no-ai-in-team/">organizational design thinkpiece</a>, and an <a href="https://justin.searls.co/posts/letting-go-of-autonomy/">AI thinkpiece</a></li>
<li>Reflections on how <em>bang-on</em> my favorite <a href="https://justin.searls.co/posts/there-will-come-soft-rains-a-year-from-today/">apocalyptic short story set in 2026</a> turned out to be</li>
<li>A couple podcasts, too (<a href="https://justin.searls.co/casts/breaking-change-v40-go-home-claude-youre-drunk/">1</a>, <a href="https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/">2</a>)</li>
</ul>
<p>Also since I last wrote you, they held the final <a href="https://railsconf.org">RailsConf</a>, an event and community that had a huge impact on my career. I was honored that Aji Slater <a href="https://www.youtube.com/watch?v=T-lqK2SR8vk">summarized my 2017 keynote</a> on stage, even though I don't own a single pair of white pants:</p>
<p><img src="/img/social/mails/2025-07.jpg" alt="I wasn't at the final RailsConf in person, but I was there in spirit/Keynote"></p>
<p>As it happens, I've been chewing on a lot of the same themes I discussed back in that <a href="https://www.youtube.com/watch?v=rm8RYzrVkFA">How to Program</a> talk, because the current AI-induced industry shakeup we're experiencing has underscored the importance of taking ownership over how we work. And although I didn't plan this in advance, that's kind of exactly the topic I'm writing about today.</p>
<p>Of course, when I talk about work, I mean it in a quite expansive sense. For most intents and purposes, I retired at the end of 2023. I contend that I still <em>do stuff</em>, but increasingly nothing about my day resembles a traditional job. There is, however, one exception: I now have more meetings on my calendar as a retiree than I did as a full-time employee.</p>
<p>Today, I'll share the unlikely story of how my calendar started filling up again and the even unlikelier reality that I'm completely okay with it (happy, even).</p>
<p>There are many different ways to feel about the word &quot;process&quot;:</p>
<ul>
<li>
<p><strong>Some are indifferent.</strong> They show up each day, follow the herd, and are content with checking boxes. If a process wastes time, blurs focus, or causes friction—that's on whoever designed and implemented the process, not them</p>
</li>
<li>
<p><strong>Some are stifled.</strong> They have their preferred way of doing things and will judge a process not on its own merits, but as the sum of deviations it takes from <em>their</em> way of doing things. They often opt into flat organizations with a light touch, hoping others will stay out of their way</p>
</li>
<li>
<p><strong>Some are obsessive.</strong> Without a clear and comprehensive process in place that covers every conceivable contingency, they fall to pieces. Once they get acclimated, any talk of changing the process—or, God forbid, eliminating it—spikes their blood pressure and triggers a threat response</p>
</li>
<li>
<p><strong>Some are pragmatic.</strong> They can thrive with a heavy-handed process or no process at all. What matters is that whatever is expected of them is a good fit for <em>today's</em> problems. What's more, they want a say in the continued evolution of the process itself, just as they would in the maintenance of any other tool on the worksite.</p>
</li>
</ul>
<p>Managing a company that welcomes and tolerates all four of these dispositions would be a complete pain in the ass, and I don't recommend it. The indifferent won't leave unless they win the lotto or you fire them. The stifled can play ball in external-facing roles and at early-stage companies, but will generally be more trouble than they're worth at a larger scale. Obsessives are a bad fit for startups—feeling neglected in the early stages and overwhelmed by reorgs and scaling churn in the middle stages—but are right at home in bureaucratic and staid late-stage companies. One might assume pragmatists can fit in anywhere, but in reality they're the canaries in the coal mine—if your organization doesn't have its shit together, results-oriented people will get bored and go work somewhere that does.</p>
<p>Give me a team made up of nothing but process pragmatists and we can scale horizontally as a flat organization far beyond the point most others would collapse in on themselves. In fact, I have a suspicion that most organizational design memes like &quot;self-organizing&quot;, &quot;agile&quot;, &quot;lean&quot;, and &quot;squads&quot; were initially coined by pragmatists who innovated custom processes for their unique situations. Things went well for them, they wrote a blog post or book about their experience, and then they moved on.</p>
<p>Those books were then bought by obsessives shopping for a reputable off-the-shelf process, and who went on to adopt that process as their ideology despite never really &quot;getting&quot; it. They'd codify and gate-keep the process, organize conferences, conduct trainings, and administer certification programs… before inevitably splintering into distinct religious sects. Because obsessives are the only ones who care so damn much about process, the rest of us are happy to delegate it to them. <strong>As a result, we tend to conceive of <em>what process is or can be</em> on the terms of those who have an unhealthy obsession with it.</strong> (If you're already bored reading this, thank the world's feckless middle managers—and their projection of false authority masking unresolved anxieties—for ruining &quot;process&quot; for the rest of us.)</p>
<p>If someone gives you a process to follow and doesn't leave room for you to apply it to your particular situation, they're doing both you and themselves a disservice. The only way to ensure a system or process will reliably achieve its desired outcomes is if the people following it deeply understand and buy into how it's supposed to translate their actions into those outcomes. And the best way to foster that understanding and buy-in is for the people executing the process to have a hand in its creation and evolution. <strong>Good process design is like an inside joke: you just had to be there.</strong></p>
<p>Sure, there will be constraints the process will have to accommodate—customer demands, industry regulations, inflexible software tools—but there is no escaping it: you're the one who owns how you think through and approach your work. Your brain cannot be outsourced. There's a widespread delusion we can adopt a famous company's &quot;playbook&quot; as a starting point, customize it to our liking, and achieve the same success they did. But a methodology's effectiveness depends on its practitioners' sense of ownership as they continuously adapt it to their unique context. Whatever mechanical steps and procedures emerge are an artifact of the thing, not the thing itself. Adopting some other company's system like <a href="https://basecamp.com/shapeup">Shape Up</a> or <a href="https://blog.crisp.se/wp-content/uploads/2012/11/SpotifyScaling.pdf">Spotify Squads</a> would be like stealing another family's photo album and rewriting your own names into the captions.</p>
<p>But this issue of Searls of Wisdom is not here to tell you how to design and implement custom processes to scale your business. (If you want to pay me to tell you anyway, <a href="mailto:justin@searls.co">knock yourself out</a>.) All I'm here to say is that every organization owns their process, that few among us understand this to be part of the job, and that the people excited about process for the sake of process are the last ones we should trust with it.</p>

<h2 id="connect-4">Connect 4</h2>
<p>Okay, we are in desperate need of a concrete example. I'd like to tell the story of a process that was designed to address real problems, how it was iterated and improved upon, and why it's not for you.</p>
<p>Today, I serve as chairman of a multi-national conglomerate of several businesses. Each day, I toil away in a co-working space (my house) alongside the CEO of one of our portfolio companies (my wife, Becky).</p>
<p>As is right and good, we began our individual endeavors without any preconceived process. We showed up, we did our work, and then things would go as well or as poorly as they were going to. We didn't impose any structure on ourselves.</p>
<p>A few months in, it became clear we were operating on wildly different wavelengths. Working different hours. Frequently interrupting each other. Stepping on each other's toes. She wanted more connection throughout the day. I wanted more coordination to ensure things got done.</p>
<p>We initially tried to solve this ad hoc by simply showing up to work differently. I attempted a mindset shift called, &quot;be a nice person,&quot; which lasted for a day or two. Since that didn't work, I leaned on what my career had taught me: if good intentions and sheer force of will aren't enough, it's likely a sign the underlying problem is systemic. And systemic problems demand systemic solutions.</p>

<h3 id="iteration-1-a-recurring-calendar-event">Iteration 1: a recurring calendar event</h3>
<p>So we spun up our first process: every morning at 7:30, we'd come downstairs for &quot;Coffee Time.&quot; We'd sync our schedules by starting the day together, each pouring a coffee and sitting by each other in the living room or out on the lanai.</p>
<p>Coffee Time successfully aligned our working hours, but it created all-new problems. It wasn't a meeting so much as a scheduled coexistence, so I'd work on my computer while Becky would read. One of us would try to strike up conversation or discuss plans for the day, which the other would experience as an interruption. Any given instance of Coffee Time might last 5 minutes or run for 2 hours.</p>
<p>It almost always ended with one or both of us feeling mildly irritated.</p>

<h3 id="iteration-2-ground-rules">Iteration 2: ground rules</h3>
<p>Since Coffee Time clearly needed more structure to achieve its desired outcome, we added a constraint: no devices. We'd sit our asses down at the appointed time and place, sip our coffee, and be forced to talk to each other.</p>
<p>One member of our team is an optimistic, energetic morning person and loved this process tweak.</p>
<p>Others, who shall remain nameless, struggle to engage in conversation first thing in the morning and that's why this change fucking sucked.</p>
<p>See, I get my best creative work done right after waking up, before something—like freeform conversation—can derail me and <a href="https://ashore.io/journal/crossover-creativity/poisoning-the-day">poison my day</a>. As a result, Coffee Time represented a high-wire act of my own design: one wrong move and I might lose a whole day's productivity.</p>
<p>This misalignment frequently manifested in conflict. Becky sought unhurried and relaxed connection. I sought to get it over with ASAP so I could go back to my work. We gradually stopped showing up. <strong>Coffee Time went the way of so many recurring calendar events: nobody bothering to attend but nobody with the courage to delete it.</strong></p>

<h3 id="iteration-3-">Iteration 3: 🔥🔥🔥</h3>
<p>The Coffee Time calendar event just sat there for literal months. I lost track of how many times my watch buzzed only for me to ignore it.</p>
<p>When you lose faith in a process you helped establish, it's a special kind of demoralizing. I felt a tinge of shame every time the calendar notification popped up. The event's ongoing existence crowded out any space for a better solution to emerge.</p>
<p>Most people lack the courage to discard pre-existing documents, policies, and processes. Getting rid of practices that everyone agrees are self-defeating or even harmful is nevertheless unusual. When we talk about businesses being slow and inflexible in the face of change, we often think of <em>big</em> companies—but the problem is really with <em>old</em> companies (and most big companies just happen to also be old). The longer they've been in business, the more layers of process and policy sediment pile up. The people who were in the room then aren't in the room now, so past decisions are treated by today's people as untouchable dogma. And unless periodic reset &amp; renewal is reinforced somehow, the institution will gradually calcify and become vulnerable.</p>
<p>Anyway, I lack such inhibitions, so I deleted the Coffee Time event one day. Surely, there existed some better way of cohabiworking, but an unstructured appointment nobody shows up for probably wasn't the answer.</p>

<h3 id="iteration-4-structure">Iteration 4: Structure</h3>
<p>Literally the day after I deleted Coffee Time, I had an idea.</p>
<p>I pitched a new meeting: &quot;Connect 4.&quot; It would be designed to meet both of our needs. Becky wanted to establish connection and kick off each morning in harmony with one another. I wanted to ensure we coordinated our activities and had the ability to hold one another accountable. It would also give us an opportunity to offer each other our support, whatever that might look like from day to day.</p>
<p>I scribbled four quadrants onto a legal pad and titled it &quot;Connect 4&quot;. Each morning, we would take turns, each sharing three things:</p>
<ul>
<li><strong>Biggest feel.</strong> Name one overriding emotional or physiological feeling. Let the other know what version of yourself they're working with today</li>
<li><strong>Biggest goal.</strong> If you could accomplish just one thing, what would it be? When you look back, what do you want today to be remembered for?</li>
<li><strong>Biggest want or need.</strong> We're not just here to get shit done—we're here in pursuit of a life well-lived. What does that look like today?</li>
</ul>
<p>After reflecting and sharing our answers to the above questions, there was one last step. (I needed a fourth thing so I could call the meeting &quot;Connect 4&quot;.) So, after we'd both had our turns to speak, we would pose a question to the other: <strong>&quot;What can I do to support you today?&quot;</strong> It was important we offer support by way of a question, as opposed to guessing what the other needed (which would be presumptive) or directly stating the support we wanted (which could be interpreted as an imposition). If I ask Becky how I can support her and however she answers isn't something I'm thrilled about doing, that <em>I asked for it</em> makes it more likely I'll follow through. Little touches like this are a great example of structure reflecting purpose.</p>
<p>That's it. Three quick things plus one question. Achievable in ten minutes. We both get our needs met.</p>
<p>I resisted introducing something like Connect 4 for over a year, because it felt stupid to kick off my retirement by signing up to do daily <a href="https://en.wikipedia.org/wiki/Stand-up_meeting">standup meetings</a> with my wife. But once we got going, it didn't feel that way at all. Because the process solved real problems that we'd actually been struggling with, there wasn't anything to complain about.</p>

<h3 id="iteration-5-the-ceremony">Iteration 5: the ceremony</h3>
<p>Connect 4 immediately proved more valuable than our previous attempts at starting each day on the right foot, but it also would not have materialized without them. It's important not to be too hard on yourself if your initial solution fails to solve the problem—something can only be improved once it actually exists.</p>
<p>Still, Connect 4 wasn't perfect:</p>
<ul>
<li>Originally, Connect 4 was only scheduled on weekdays, but we gradually found the days we didn't sync suffered for it, so now we do it seven days a week</li>
<li>We'd sometimes derail things by going on long tangents, so we began to (kindly) defer those conversations until we'd gotten through our Connect 4 updates</li>
<li>Conversation regularly unearthed deeper issues that warranted more time than a quick check-in would allow, so we began scheduling ad hoc follow-up meetings as needed</li>
</ul>
<p>There was one other lingering problem that persisted for a few months before we identified and addressed it. See, despite having a scheduled start time, the reality of being two self-employed people working from home meant it wasn't uncommon for one of us to get into flow and fail to show up on time. This, in turn required the other to go and collect the other, interrupting them. And when one person has to <em>call</em> the meeting, they become the de facto person to <em>run</em> the meeting. This can introduce or reinforce a <a href="https://www.youtube.com/watch?v=opcChKBAhrE">vertical dynamic</a>, which is counterproductive to building a sense of mutual respect and commitment.</p>
<p>To solve for this—and one wonders whether this is how church bells got invented—I took a sound bite of <a href="https://podcast-cdn.searls.co/misc/family-mart-chime.mp3">the Family Mart chime</a> and configured HomeKit to automatically play it at 8:30 AM in every room of the house. This way, neither of us has to call the meeting—the meeting calls itself. We separately stop what we're doing and attend it of our own volition, as peers.</p>
<p>Some will read the above and think it's too insignificant a thing to bother with, but people fail to realize this sort of reaction is what leads to our lives feeling so cluttered and overwhelming. Insignificant things pile up. If you choose to ignore a small pebble in your shoe, no one's going to award you a prize for learning to live with it. Not letting life's little irritants bother you may sound laudable, but if you forget about that pebble you might later fail to identify it as the cause of your postural problems, or your joint pain, or your short temper.</p>
<p><strong>Don't make the mistake of equating the apparent size of a problem with its potential impact</strong> when assessing whether it's worth taking the time to fix it.</p>

<h2 id="youre-the-one-youre-waiting-for">You're the one you're waiting for</h2>
<p>Connect 4 is just one of dozens of goofy practices Becky and I have created to draw out the best versions of ourselves. We name each of our customs. We sing jingles. We have secret handshakes. We reflect on what's working and what isn't. We make tweaks. We aren't afraid to let go of any of our rituals once they're no longer useful.</p>
<p>Why do we bother taking the time to do all this? Because it never occurred to us to invite some third person to optimize our marriage for us. That just sounds ridiculous.</p>
<p>And yet, the vast majority of employees expect their employer to optimize their workflow for them. That sounds pretty ridiculous, too, if you ask me.</p>
<p>And sure, I could write a book on all the things Becky and I do to live our best lives, but this one example is all you're getting. I am aware that all it would take is to give each practice its own chapter—brand it with a name, explain what it solves, how it's done, and why it works. I could earn money and notoriety by pitching our system as a framework to building a happier marriage, or achieving work-life harmony, or some other bullshit. But that would just be prescribing yet another process for others to follow. And even if I was offering genuinely helpful advice, it would only further prevent people from figuring out for themselves that <strong>the path to greatness is not a paved road, but a blazed trail</strong>. There's nothing of value to be gained by blithely retracing someone else's steps.</p>
<p>If taking ownership of the systems that govern how you think through problems and interact with others seems out of reach, it shouldn't. Humans tend to live and work in pretty small groups—it's not unreasonable for everyone to have a say. I've witnessed families and teams alike who agreed to make decisions by consensus, who expect everyone to propose improvements, and who celebrate doing the things nobody asked for. It's not hard to live this way, but it won't magically happen on its own.</p>
<p><strong>Following a process without continuously improving it is like driving a car without touching the steering wheel.</strong> The only person staring down the road ahead is you. That makes you the best person to figure out how to get wherever you're going.</p>]]></content>
    <summary type="html"><![CDATA[<p>I just realized that Christmas in July must have been held somewhere, and I missed it. Damn.</p>
<p>Regardless, the blog was busy since we last checked in:</p>
<ul>
<li>There's some <a href="https://justin.searls.co/posts/adding-swift-format-to-your-xcode-build/">Xcode</a> <a href="https://justin.searls.co/posts/i-made-xcodes-tests-60-times-faster/">stuff</a> for Apple people, as well as the nostalgia of <a href="https://justin.searls.co/shots/2025-07-16-15h10m35s/">finding the order confirmation</a> of my very first Mac, a 12&quot; iBook G4</li>
<li>We got in some good thoughtlording with a <a href="https://justin.searls.co/links/2025-07-29-upside-down-development/">software design thinkpiece</a>, an <a href="https://justin.searls.co/links/2025-08-03-there-is-no-ai-in-team/">organizational design thinkpiece</a>, and an <a href="https://justin.searls.co/posts/letting-go-of-autonomy/">AI thinkpiece</a></li>
<li>Reflections on how <em>bang-on</em> my favorite <a href="https://justin.searls.co/posts/there-will-come-soft-rains-a-year-from-today/">apocalyptic short story set in 2026</a> turned out to be</li>
<li>A couple podcasts, too (<a href="https://justin.searls.co/casts/breaking-change-v40-go-home-claude-youre-drunk/">1</a>, <a href="https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/">2</a>)</li>
</ul>
<p>Also since I last wrote you, they held the final <a href="https://railsconf.org">RailsConf</a>, an event and community that had a huge impact on my career. I was honored that Aji Slater <a href="https://www.youtube.com/watch?v=T-lqK2SR8vk">summarized my 2017 keynote</a> on stage, even though I don't own a single pair of white pants:</p>
<p><img src="/img/social/mails/2025-07.jpg" alt="I wasn't at the final RailsConf in person, but I was there in spirit/Keynote"></p>
<p>As it happens, I've been chewing on a lot of the same themes I discussed back in that <a href="https://www.youtube.com/watch?v=rm8RYzrVkFA">How to Program</a> talk, because the current AI-induced industry shakeup we're experiencing has underscored the importance of taking ownership over how we work. And although I didn't plan this in advance, that's kind of exactly the topic I'm writing about today.</p>
<p>Of course, when I talk about work, I mean it in a quite expansive sense. For most intents and purposes, I retired at the end of 2023. I contend that I still <em>do stuff</em>, but increasingly nothing about my day resembles a traditional job. There is, however, one exception: I now have more meetings on my calendar as a retiree than I did as a full-time employee.</p>
<p>Today, I'll share the unlikely story of how my calendar started filling up again and the even unlikelier reality that I'm completely okay with it (happy, even).</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/mails/2025-07/","append_url_label":"Open ✉️","content":"\u003cp\u003eI just realized that Christmas in July must have been held somewhere, and I missed it. Damn.\u003c/p\u003e\n\u003cp\u003eRegardless, the blog was busy since we last checked in:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThere's some \u003ca href=\"https://justin.searls.co/posts/adding-swift-format-to-your-xcode-build/\"\u003eXcode\u003c/a\u003e \u003ca href=\"https://justin.searls.co/posts/i-made-xcodes-tests-60-times-faster/\"\u003estuff\u003c/a\u003e for Apple people, as well as the nostalgia of \u003ca href=\"https://justin.searls.co/shots/2025-07-16-15h10m35s/\"\u003efinding the order confirmation\u003c/a\u003e of my very first Mac, a 12\u0026quot; iBook G4\u003c/li\u003e\n\u003cli\u003eWe got in some good thoughtlording with a \u003ca href=\"https://justin.searls.co/links/2025-07-29-upside-down-development/\"\u003esoftware design thinkpiece\u003c/a\u003e, an \u003ca href=\"https://justin.searls.co/links/2025-08-03-there-is-no-ai-in-team/\"\u003eorganizational design thinkpiece\u003c/a\u003e, and an \u003ca href=\"https://justin.searls.co/posts/letting-go-of-autonomy/\"\u003eAI thinkpiece\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReflections on how \u003cem\u003ebang-on\u003c/em\u003e my favorite \u003ca href=\"https://justin.searls.co/posts/there-will-come-soft-rains-a-year-from-today/\"\u003eapocalyptic short story set in 2026\u003c/a\u003e turned out to be\u003c/li\u003e\n\u003cli\u003eA couple podcasts, too (\u003ca href=\"https://justin.searls.co/casts/breaking-change-v40-go-home-claude-youre-drunk/\"\u003e1\u003c/a\u003e, \u003ca href=\"https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/\"\u003e2\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAlso since I last wrote you, they held the final \u003ca href=\"https://railsconf.org\"\u003eRailsConf\u003c/a\u003e, an event and community that had a huge impact on my career. I was honored that Aji Slater \u003ca href=\"https://www.youtube.com/watch?v=T-lqK2SR8vk\"\u003esummarized my 2017 keynote\u003c/a\u003e on stage, even though I don't own a single pair of white pants:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/img/social/mails/2025-07.jpg\" alt=\"I wasn't at the final RailsConf in person, but I was there in spirit/Keynote\"\u003e\u003c/p\u003e\n\u003cp\u003eAs it happens, I've been chewing on a lot of the same themes I discussed back in that \u003ca href=\"https://www.youtube.com/watch?v=rm8RYzrVkFA\"\u003eHow to Program\u003c/a\u003e talk, because the current AI-induced industry shakeup we're experiencing has underscored the importance of taking ownership over how we work. And although I didn't plan this in advance, that's kind of exactly the topic I'm writing about today.\u003c/p\u003e\n\u003cp\u003eOf course, when I talk about work, I mean it in a quite expansive sense. For most intents and purposes, I retired at the end of 2023. I contend that I still \u003cem\u003edo stuff\u003c/em\u003e, but increasingly nothing about my day resembles a traditional job. There is, however, one exception: I now have more meetings on my calendar as a retiree than I did as a full-time employee.\u003c/p\u003e\n\u003cp\u003eToday, I'll share the unlikely story of how my calendar started filling up again and the even unlikelier reality that I'm completely okay with it (happy, even).\u003c/p\u003e\n\u003cp\u003eThere are many different ways to feel about the word \u0026quot;process\u0026quot;:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSome are indifferent.\u003c/strong\u003e They show up each day, follow the herd, and are content with checking boxes. If a process wastes time, blurs focus, or causes friction—that's on whoever designed and implemented the process, not them\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSome are stifled.\u003c/strong\u003e They have their preferred way of doing things and will judge a process not on its own merits, but as the sum of deviations it takes from \u003cem\u003etheir\u003c/em\u003e way of doing things. They often opt into flat organizations with a light touch, hoping others will stay out of their way\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSome are obsessive.\u003c/strong\u003e Without a clear and comprehensive process in place that covers every conceivable contingency, they fall to pieces. Once they get acclimated, any talk of changing the process—or, God forbid, eliminating it—spikes their blood pressure and triggers a threat response\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSome are pragmatic.\u003c/strong\u003e They can thrive with a heavy-handed process or no process at all. What matters is that whatever is expected of them is a good fit for \u003cem\u003etoday's\u003c/em\u003e problems. What's more, they want a say in the continued evolution of the process itself, just as they would in the maintenance of any other tool on the worksite.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eManaging a company that welcomes and tolerates all four of these dispositions would be a complete pain in the ass, and I don't recommend it. The indifferent won't leave unless they win the lotto or you fire them. The stifled can play ball in external-facing roles and at early-stage companies, but will generally be more trouble than they're worth at a larger scale. Obsessives are a bad fit for startups—feeling neglected in the early stages and overwhelmed by reorgs and scaling churn in the middle stages—but are right at home in bureaucratic and staid late-stage companies. One might assume pragmatists can fit in anywhere, but in reality they're the canaries in the coal mine—if your organization doesn't have its shit together, results-oriented people will get bored and go work somewhere that does.\u003c/p\u003e\n\u003cp\u003eGive me a team made up of nothing but process pragmatists and we can scale horizontally as a flat organization far beyond the point most others would collapse in on themselves. In fact, I have a suspicion that most organizational design memes like \u0026quot;self-organizing\u0026quot;, \u0026quot;agile\u0026quot;, \u0026quot;lean\u0026quot;, and \u0026quot;squads\u0026quot; were initially coined by pragmatists who innovated custom processes for their unique situations. Things went well for them, they wrote a blog post or book about their experience, and then they moved on.\u003c/p\u003e\n\u003cp\u003eThose books were then bought by obsessives shopping for a reputable off-the-shelf process, and who went on to adopt that process as their ideology despite never really \u0026quot;getting\u0026quot; it. They'd codify and gate-keep the process, organize conferences, conduct trainings, and administer certification programs… before inevitably splintering into distinct religious sects. Because obsessives are the only ones who care so damn much about process, the rest of us are happy to delegate it to them. \u003cstrong\u003eAs a result, we tend to conceive of \u003cem\u003ewhat process is or can be\u003c/em\u003e on the terms of those who have an unhealthy obsession with it.\u003c/strong\u003e (If you're already bored reading this, thank the world's feckless middle managers—and their projection of false authority masking unresolved anxieties—for ruining \u0026quot;process\u0026quot; for the rest of us.)\u003c/p\u003e\n\u003cp\u003eIf someone gives you a process to follow and doesn't leave room for you to apply it to your particular situation, they're doing both you and themselves a disservice. The only way to ensure a system or process will reliably achieve its desired outcomes is if the people following it deeply understand and buy into how it's supposed to translate their actions into those outcomes. And the best way to foster that understanding and buy-in is for the people executing the process to have a hand in its creation and evolution. \u003cstrong\u003eGood process design is like an inside joke: you just had to be there.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSure, there will be constraints the process will have to accommodate—customer demands, industry regulations, inflexible software tools—but there is no escaping it: you're the one who owns how you think through and approach your work. Your brain cannot be outsourced. There's a widespread delusion we can adopt a famous company's \u0026quot;playbook\u0026quot; as a starting point, customize it to our liking, and achieve the same success they did. But a methodology's effectiveness depends on its practitioners' sense of ownership as they continuously adapt it to their unique context. Whatever mechanical steps and procedures emerge are an artifact of the thing, not the thing itself. Adopting some other company's system like \u003ca href=\"https://basecamp.com/shapeup\"\u003eShape Up\u003c/a\u003e or \u003ca href=\"https://blog.crisp.se/wp-content/uploads/2012/11/SpotifyScaling.pdf\"\u003eSpotify Squads\u003c/a\u003e would be like stealing another family's photo album and rewriting your own names into the captions.\u003c/p\u003e\n\u003cp\u003eBut this issue of Searls of Wisdom is not here to tell you how to design and implement custom processes to scale your business. (If you want to pay me to tell you anyway, \u003ca href=\"mailto:justin@searls.co\"\u003eknock yourself out\u003c/a\u003e.) All I'm here to say is that every organization owns their process, that few among us understand this to be part of the job, and that the people excited about process for the sake of process are the last ones we should trust with it.\u003c/p\u003e\n\n\u003ch2 id=\"connect-4\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-07/#connect-4\"\u003eConnect 4\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eOkay, we are in desperate need of a concrete example. I'd like to tell the story of a process that was designed to address real problems, how it was iterated and improved upon, and why it's not for you.\u003c/p\u003e\n\u003cp\u003eToday, I serve as chairman of a multi-national conglomerate of several businesses. Each day, I toil away in a co-working space (my house) alongside the CEO of one of our portfolio companies (my wife, Becky).\u003c/p\u003e\n\u003cp\u003eAs is right and good, we began our individual endeavors without any preconceived process. We showed up, we did our work, and then things would go as well or as poorly as they were going to. We didn't impose any structure on ourselves.\u003c/p\u003e\n\u003cp\u003eA few months in, it became clear we were operating on wildly different wavelengths. Working different hours. Frequently interrupting each other. Stepping on each other's toes. She wanted more connection throughout the day. I wanted more coordination to ensure things got done.\u003c/p\u003e\n\u003cp\u003eWe initially tried to solve this ad hoc by simply showing up to work differently. I attempted a mindset shift called, \u0026quot;be a nice person,\u0026quot; which lasted for a day or two. Since that didn't work, I leaned on what my career had taught me: if good intentions and sheer force of will aren't enough, it's likely a sign the underlying problem is systemic. And systemic problems demand systemic solutions.\u003c/p\u003e\n\n\u003ch3 id=\"iteration-1-a-recurring-calendar-event\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-07/#iteration-1-a-recurring-calendar-event\"\u003eIteration 1: a recurring calendar event\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eSo we spun up our first process: every morning at 7:30, we'd come downstairs for \u0026quot;Coffee Time.\u0026quot; We'd sync our schedules by starting the day together, each pouring a coffee and sitting by each other in the living room or out on the lanai.\u003c/p\u003e\n\u003cp\u003eCoffee Time successfully aligned our working hours, but it created all-new problems. It wasn't a meeting so much as a scheduled coexistence, so I'd work on my computer while Becky would read. One of us would try to strike up conversation or discuss plans for the day, which the other would experience as an interruption. Any given instance of Coffee Time might last 5 minutes or run for 2 hours.\u003c/p\u003e\n\u003cp\u003eIt almost always ended with one or both of us feeling mildly irritated.\u003c/p\u003e\n\n\u003ch3 id=\"iteration-2-ground-rules\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-07/#iteration-2-ground-rules\"\u003eIteration 2: ground rules\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eSince Coffee Time clearly needed more structure to achieve its desired outcome, we added a constraint: no devices. We'd sit our asses down at the appointed time and place, sip our coffee, and be forced to talk to each other.\u003c/p\u003e\n\u003cp\u003eOne member of our team is an optimistic, energetic morning person and loved this process tweak.\u003c/p\u003e\n\u003cp\u003eOthers, who shall remain nameless, struggle to engage in conversation first thing in the morning and that's why this change fucking sucked.\u003c/p\u003e\n\u003cp\u003eSee, I get my best creative work done right after waking up, before something—like freeform conversation—can derail me and \u003ca href=\"https://ashore.io/journal/crossover-creativity/poisoning-the-day\"\u003epoison my day\u003c/a\u003e. As a result, Coffee Time represented a high-wire act of my own design: one wrong move and I might lose a whole day's productivity.\u003c/p\u003e\n\u003cp\u003eThis misalignment frequently manifested in conflict. Becky sought unhurried and relaxed connection. I sought to get it over with ASAP so I could go back to my work. We gradually stopped showing up. \u003cstrong\u003eCoffee Time went the way of so many recurring calendar events: nobody bothering to attend but nobody with the courage to delete it.\u003c/strong\u003e\u003c/p\u003e\n\n\u003ch3 id=\"iteration-3-\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-07/#iteration-3-\"\u003eIteration 3: 🔥🔥🔥\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eThe Coffee Time calendar event just sat there for literal months. I lost track of how many times my watch buzzed only for me to ignore it.\u003c/p\u003e\n\u003cp\u003eWhen you lose faith in a process you helped establish, it's a special kind of demoralizing. I felt a tinge of shame every time the calendar notification popped up. The event's ongoing existence crowded out any space for a better solution to emerge.\u003c/p\u003e\n\u003cp\u003eMost people lack the courage to discard pre-existing documents, policies, and processes. Getting rid of practices that everyone agrees are self-defeating or even harmful is nevertheless unusual. When we talk about businesses being slow and inflexible in the face of change, we often think of \u003cem\u003ebig\u003c/em\u003e companies—but the problem is really with \u003cem\u003eold\u003c/em\u003e companies (and most big companies just happen to also be old). The longer they've been in business, the more layers of process and policy sediment pile up. The people who were in the room then aren't in the room now, so past decisions are treated by today's people as untouchable dogma. And unless periodic reset \u0026amp; renewal is reinforced somehow, the institution will gradually calcify and become vulnerable.\u003c/p\u003e\n\u003cp\u003eAnyway, I lack such inhibitions, so I deleted the Coffee Time event one day. Surely, there existed some better way of cohabiworking, but an unstructured appointment nobody shows up for probably wasn't the answer.\u003c/p\u003e\n\n\u003ch3 id=\"iteration-4-structure\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-07/#iteration-4-structure\"\u003eIteration 4: Structure\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eLiterally the day after I deleted Coffee Time, I had an idea.\u003c/p\u003e\n\u003cp\u003eI pitched a new meeting: \u0026quot;Connect 4.\u0026quot; It would be designed to meet both of our needs. Becky wanted to establish connection and kick off each morning in harmony with one another. I wanted to ensure we coordinated our activities and had the ability to hold one another accountable. It would also give us an opportunity to offer each other our support, whatever that might look like from day to day.\u003c/p\u003e\n\u003cp\u003eI scribbled four quadrants onto a legal pad and titled it \u0026quot;Connect 4\u0026quot;. Each morning, we would take turns, each sharing three things:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBiggest feel.\u003c/strong\u003e Name one overriding emotional or physiological feeling. Let the other know what version of yourself they're working with today\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBiggest goal.\u003c/strong\u003e If you could accomplish just one thing, what would it be? When you look back, what do you want today to be remembered for?\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBiggest want or need.\u003c/strong\u003e We're not just here to get shit done—we're here in pursuit of a life well-lived. What does that look like today?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAfter reflecting and sharing our answers to the above questions, there was one last step. (I needed a fourth thing so I could call the meeting \u0026quot;Connect 4\u0026quot;.) So, after we'd both had our turns to speak, we would pose a question to the other: \u003cstrong\u003e\u0026quot;What can I do to support you today?\u0026quot;\u003c/strong\u003e It was important we offer support by way of a question, as opposed to guessing what the other needed (which would be presumptive) or directly stating the support we wanted (which could be interpreted as an imposition). If I ask Becky how I can support her and however she answers isn't something I'm thrilled about doing, that \u003cem\u003eI asked for it\u003c/em\u003e makes it more likely I'll follow through. Little touches like this are a great example of structure reflecting purpose.\u003c/p\u003e\n\u003cp\u003eThat's it. Three quick things plus one question. Achievable in ten minutes. We both get our needs met.\u003c/p\u003e\n\u003cp\u003eI resisted introducing something like Connect 4 for over a year, because it felt stupid to kick off my retirement by signing up to do daily \u003ca href=\"https://en.wikipedia.org/wiki/Stand-up_meeting\"\u003estandup meetings\u003c/a\u003e with my wife. But once we got going, it didn't feel that way at all. Because the process solved real problems that we'd actually been struggling with, there wasn't anything to complain about.\u003c/p\u003e\n\n\u003ch3 id=\"iteration-5-the-ceremony\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-07/#iteration-5-the-ceremony\"\u003eIteration 5: the ceremony\u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eConnect 4 immediately proved more valuable than our previous attempts at starting each day on the right foot, but it also would not have materialized without them. It's important not to be too hard on yourself if your initial solution fails to solve the problem—something can only be improved once it actually exists.\u003c/p\u003e\n\u003cp\u003eStill, Connect 4 wasn't perfect:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOriginally, Connect 4 was only scheduled on weekdays, but we gradually found the days we didn't sync suffered for it, so now we do it seven days a week\u003c/li\u003e\n\u003cli\u003eWe'd sometimes derail things by going on long tangents, so we began to (kindly) defer those conversations until we'd gotten through our Connect 4 updates\u003c/li\u003e\n\u003cli\u003eConversation regularly unearthed deeper issues that warranted more time than a quick check-in would allow, so we began scheduling ad hoc follow-up meetings as needed\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThere was one other lingering problem that persisted for a few months before we identified and addressed it. See, despite having a scheduled start time, the reality of being two self-employed people working from home meant it wasn't uncommon for one of us to get into flow and fail to show up on time. This, in turn required the other to go and collect the other, interrupting them. And when one person has to \u003cem\u003ecall\u003c/em\u003e the meeting, they become the de facto person to \u003cem\u003erun\u003c/em\u003e the meeting. This can introduce or reinforce a \u003ca href=\"https://www.youtube.com/watch?v=opcChKBAhrE\"\u003evertical dynamic\u003c/a\u003e, which is counterproductive to building a sense of mutual respect and commitment.\u003c/p\u003e\n\u003cp\u003eTo solve for this—and one wonders whether this is how church bells got invented—I took a sound bite of \u003ca href=\"https://podcast-cdn.searls.co/misc/family-mart-chime.mp3\"\u003ethe Family Mart chime\u003c/a\u003e and configured HomeKit to automatically play it at 8:30 AM in every room of the house. This way, neither of us has to call the meeting—the meeting calls itself. We separately stop what we're doing and attend it of our own volition, as peers.\u003c/p\u003e\n\u003cp\u003eSome will read the above and think it's too insignificant a thing to bother with, but people fail to realize this sort of reaction is what leads to our lives feeling so cluttered and overwhelming. Insignificant things pile up. If you choose to ignore a small pebble in your shoe, no one's going to award you a prize for learning to live with it. Not letting life's little irritants bother you may sound laudable, but if you forget about that pebble you might later fail to identify it as the cause of your postural problems, or your joint pain, or your short temper.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDon't make the mistake of equating the apparent size of a problem with its potential impact\u003c/strong\u003e when assessing whether it's worth taking the time to fix it.\u003c/p\u003e\n\n\u003ch2 id=\"youre-the-one-youre-waiting-for\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/mails/2025-07/#youre-the-one-youre-waiting-for\"\u003eYou're the one you're waiting for\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eConnect 4 is just one of dozens of goofy practices Becky and I have created to draw out the best versions of ourselves. We name each of our customs. We sing jingles. We have secret handshakes. We reflect on what's working and what isn't. We make tweaks. We aren't afraid to let go of any of our rituals once they're no longer useful.\u003c/p\u003e\n\u003cp\u003eWhy do we bother taking the time to do all this? Because it never occurred to us to invite some third person to optimize our marriage for us. That just sounds ridiculous.\u003c/p\u003e\n\u003cp\u003eAnd yet, the vast majority of employees expect their employer to optimize their workflow for them. That sounds pretty ridiculous, too, if you ask me.\u003c/p\u003e\n\u003cp\u003eAnd sure, I could write a book on all the things Becky and I do to live our best lives, but this one example is all you're getting. I am aware that all it would take is to give each practice its own chapter—brand it with a name, explain what it solves, how it's done, and why it works. I could earn money and notoriety by pitching our system as a framework to building a happier marriage, or achieving work-life harmony, or some other bullshit. But that would just be prescribing yet another process for others to follow. And even if I was offering genuinely helpful advice, it would only further prevent people from figuring out for themselves that \u003cstrong\u003ethe path to greatness is not a paved road, but a blazed trail\u003c/strong\u003e. There's nothing of value to be gained by blithely retracing someone else's steps.\u003c/p\u003e\n\u003cp\u003eIf taking ownership of the systems that govern how you think through problems and interact with others seems out of reach, it shouldn't. Humans tend to live and work in pretty small groups—it's not unreasonable for everyone to have a say. I've witnessed families and teams alike who agreed to make decisions by consensus, who expect everyone to propose improvements, and who celebrate doing the things nobody asked for. It's not hard to live this way, but it won't magically happen on its own.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFollowing a process without continuously improving it is like driving a car without touching the steering wheel.\u003c/strong\u003e The only person staring down the road ahead is you. That makes you the best person to figure out how to get wherever you're going.\u003c/p\u003e","id":"https://justin.searls.co/mails/2025-07/","og_image":"https://justin.searls.co/img/social/mails/2025-07.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-07T00:00:00Z","title":"Connect 4","updated_at":"2025-10-20T10:51:25-04:00","url":"https://justin.searls.co/mails/2025-07/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/letting-go-of-autonomy/</id>
      <title type="text">📄 Letting go of autonomy</title>
      <link href="https://justin.searls.co/posts/letting-go-of-autonomy/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-05T15:52:04+00:00</published>
    <updated>2025-08-05T12:32:41-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>I <a href="https://justin.searls.co/posts/full-breadth-developers/#good-game-programmers">recently wrote</a> I'm inspecting everything I thought I knew about software. In this new era of coding agents, what have I held firm that's no longer relevant? Here's one area where I've completely changed my mind.</p>
<p>I've long been an advocate for promoting individual autonomy on software teams. At <a href="https://testdouble.com">Test Double</a>, we founded the company on the belief that greatness depended on <strong>trusting the people closest to the work</strong> to decide how best to do the work. We'd seen what happens when the managerial class has the hubris to assume they know better than someone who has all the facts on the ground.</p>
<p>This led to me very often showing up at clients and pushing back on practices like:</p>
<ul>
<li>Top-down mandates governing process, documentation, and metrics</li>
<li>Onerous <a href="https://git-scm.com/docs/githooks">git hooks</a> that prevented people from committing code until they'd jumped through a preordained set of hoops (e.g. blocking commits if code coverage dropped, if the build slowed down, etc.)</li>
<li>Mandatory code review and approval as a substitute for genuine collaboration and collective ownership</li>
</ul>
<p>More broadly, if technical leaders created rules without consideration for reasonable exceptions and without regard for whether it demoralized their best staff… they were going to hear from me about it.</p>
<p>I lost track of how many times I've said something like, &quot;<strong>if you design your organization to minimize the damage caused by your least competent people, don't be surprised if you minimize the output of your most competent people.</strong>&quot;</p>

<h2 id="well-never-mind-all-that">Well, never mind all that</h2>
<p>Lately, I find myself mandating a lot of quality metrics, encoding them into git hooks, and insisting on reviewing and approving every line of code in my system.</p>
<p>What changed? AI coding agents are the ones writing the code now, and the long-term viability of a codebase absolutely depends on establishing and enforcing the right guardrails within which those agents should operate.</p>
<p>As a result, my latest project is full of:</p>
<ul>
<li>Authoritarian documentation dictating what I want from each coder with granular precision (in <a href="https://docs.anthropic.com/en/docs/claude-code/memory">CLAUDE.md</a>)</li>
<li>Patronizing step-by-step instructions telling coders how to accomplish basic tasks, repeated each and every time I ask them to carry out the task (as <a href="https://docs.anthropic.com/en/docs/claude-code/slash-commands">custom slash commands</a>)</li>
<li>Ruthlessly rigid scripts that can block the coder's progress and commits (whether as git hooks and <a href="https://docs.anthropic.com/en/docs/claude-code/hooks">Claude hooks</a>)</li>
</ul>
<p>Everything I believe about autonomy still holds for <em>human</em> people, mind you. Undermining people's agency is indeed counterproductive if your goal is to encourage a sense of ownership, leverage self-reliance to foster critical thinking, and grow through failure. But coding agents are (currently) inherently ephemeral, trained generically, and impervious to learning from their mistakes. They need all these guardrails.</p>
<p>All I would ask is this: if you, like me, are constructing a bureaucratic hellscape around your workspace so as to wrangle Claude Code or some other agent, don't forget that your human colleagues require autonomy and self-determination to thrive and succeed. Lay down whatever gauntlet you need to for your agent, but give the humans a hall pass.</p>]]></content>
    <summary type="html"><![CDATA[<p>I <a href="https://justin.searls.co/posts/full-breadth-developers/#good-game-programmers">recently wrote</a> I'm inspecting everything I thought I knew about software. In this new era of coding agents, what have I held firm that's no longer relevant? Here's one area where I've completely changed my mind.</p>
<p>I've long been an advocate for promoting individual autonomy on software teams. At <a href="https://testdouble.com">Test Double</a>, we founded the company on the belief that greatness depended on <strong>trusting the people closest to the work</strong> to decide how best to do the work. We'd seen what happens when the managerial class has the hubris to assume they know better than someone who has all the facts on the ground.</p>
<p>This led to me very often showing up at clients and pushing back on practices like:</p>
<ul>
<li>Top-down mandates governing process, documentation, and metrics</li>
<li>Onerous <a href="https://git-scm.com/docs/githooks">git hooks</a> that prevented people from committing code until they'd jumped through a preordained set of hoops (e.g. blocking commits if code coverage dropped, if the build slowed down, etc.)</li>
<li>Mandatory code review and approval as a substitute for genuine collaboration and collective ownership</li>
</ul>
<p>More broadly, if technical leaders created rules without consideration for reasonable exceptions and without regard for whether it demoralized their best staff… they were going to hear from me about it.</p>
<p>I lost track of how many times I've said something like, &quot;<strong>if you design your organization to minimize the damage caused by your least competent people, don't be surprised if you minimize the output of your most competent people.</strong>&quot;</p>

<h2 id="well-never-mind-all-that">
    <a class="font-bold no-underline text-primary hover:underline" href="https://justin.searls.co/posts/letting-go-of-autonomy/#well-never-mind-all-that">Well, never mind all that</a>
</h2>
<p>Lately, I find myself mandating a lot of quality metrics, encoding them into git hooks, and insisting on reviewing and approving every line of code in my system.</p>
<p>What changed? AI coding agents are the ones writing the code now, and the long-term viability of a codebase absolutely depends on establishing and enforcing the right guardrails within which those agents should operate.</p>
<p>As a result, my latest project is full of:</p>
<ul>
<li>Authoritarian documentation dictating what I want from each coder with granular precision (in <a href="https://docs.anthropic.com/en/docs/claude-code/memory">CLAUDE.md</a>)</li>
<li>Patronizing step-by-step instructions telling coders how to accomplish basic tasks, repeated each and every time I ask them to carry out the task (as <a href="https://docs.anthropic.com/en/docs/claude-code/slash-commands">custom slash commands</a>)</li>
<li>Ruthlessly rigid scripts that can block the coder's progress and commits (whether as git hooks and <a href="https://docs.anthropic.com/en/docs/claude-code/hooks">Claude hooks</a>)</li>
</ul>
<p>Everything I believe about autonomy still holds for <em>human</em> people, mind you. Undermining people's agency is indeed counterproductive if your goal is to encourage a sense of ownership, leverage self-reliance to foster critical thinking, and grow through failure. But coding agents are (currently) inherently ephemeral, trained generically, and impervious to learning from their mistakes. They need all these guardrails.</p>
<p>All I would ask is this: if you, like me, are constructing a bureaucratic hellscape around your workspace so as to wrangle Claude Code or some other agent, don't forget that your human colleagues require autonomy and self-determination to thrive and succeed. Lay down whatever gauntlet you need to for your agent, but give the humans a hall pass.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/letting-go-of-autonomy/","append_url_label":"Read 📄","content":"\u003cp\u003eI \u003ca href=\"https://justin.searls.co/posts/full-breadth-developers/#good-game-programmers\"\u003erecently wrote\u003c/a\u003e I'm inspecting everything I thought I knew about software. In this new era of coding agents, what have I held firm that's no longer relevant? Here's one area where I've completely changed my mind.\u003c/p\u003e\n\u003cp\u003eI've long been an advocate for promoting individual autonomy on software teams. At \u003ca href=\"https://testdouble.com\"\u003eTest Double\u003c/a\u003e, we founded the company on the belief that greatness depended on \u003cstrong\u003etrusting the people closest to the work\u003c/strong\u003e to decide how best to do the work. We'd seen what happens when the managerial class has the hubris to assume they know better than someone who has all the facts on the ground.\u003c/p\u003e\n\u003cp\u003eThis led to me very often showing up at clients and pushing back on practices like:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTop-down mandates governing process, documentation, and metrics\u003c/li\u003e\n\u003cli\u003eOnerous \u003ca href=\"https://git-scm.com/docs/githooks\"\u003egit hooks\u003c/a\u003e that prevented people from committing code until they'd jumped through a preordained set of hoops (e.g. blocking commits if code coverage dropped, if the build slowed down, etc.)\u003c/li\u003e\n\u003cli\u003eMandatory code review and approval as a substitute for genuine collaboration and collective ownership\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMore broadly, if technical leaders created rules without consideration for reasonable exceptions and without regard for whether it demoralized their best staff… they were going to hear from me about it.\u003c/p\u003e\n\u003cp\u003eI lost track of how many times I've said something like, \u0026quot;\u003cstrong\u003eif you design your organization to minimize the damage caused by your least competent people, don't be surprised if you minimize the output of your most competent people.\u003c/strong\u003e\u0026quot;\u003c/p\u003e\n\n\u003ch2 id=\"well-never-mind-all-that\"\u003e\n    \u003ca class=\"font-bold no-underline text-primary hover:underline\" href=\"https://justin.searls.co/posts/letting-go-of-autonomy/#well-never-mind-all-that\"\u003eWell, never mind all that\u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eLately, I find myself mandating a lot of quality metrics, encoding them into git hooks, and insisting on reviewing and approving every line of code in my system.\u003c/p\u003e\n\u003cp\u003eWhat changed? AI coding agents are the ones writing the code now, and the long-term viability of a codebase absolutely depends on establishing and enforcing the right guardrails within which those agents should operate.\u003c/p\u003e\n\u003cp\u003eAs a result, my latest project is full of:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAuthoritarian documentation dictating what I want from each coder with granular precision (in \u003ca href=\"https://docs.anthropic.com/en/docs/claude-code/memory\"\u003eCLAUDE.md\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePatronizing step-by-step instructions telling coders how to accomplish basic tasks, repeated each and every time I ask them to carry out the task (as \u003ca href=\"https://docs.anthropic.com/en/docs/claude-code/slash-commands\"\u003ecustom slash commands\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRuthlessly rigid scripts that can block the coder's progress and commits (whether as git hooks and \u003ca href=\"https://docs.anthropic.com/en/docs/claude-code/hooks\"\u003eClaude hooks\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEverything I believe about autonomy still holds for \u003cem\u003ehuman\u003c/em\u003e people, mind you. Undermining people's agency is indeed counterproductive if your goal is to encourage a sense of ownership, leverage self-reliance to foster critical thinking, and grow through failure. But coding agents are (currently) inherently ephemeral, trained generically, and impervious to learning from their mistakes. They need all these guardrails.\u003c/p\u003e\n\u003cp\u003eAll I would ask is this: if you, like me, are constructing a bureaucratic hellscape around your workspace so as to wrangle Claude Code or some other agent, don't forget that your human colleagues require autonomy and self-determination to thrive and succeed. Lay down whatever gauntlet you need to for your agent, but give the humans a hall pass.\u003c/p\u003e","id":"https://justin.searls.co/posts/letting-go-of-autonomy/","og_image":"https://justin.searls.co/img/social/posts/letting-go-of-autonomy.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-05T15:52:04Z","title":"Letting go of autonomy","updated_at":"2025-08-05T12:32:41-04:00","url":"https://justin.searls.co/posts/letting-go-of-autonomy/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/posts/there-will-come-soft-rains-a-year-from-today/</id>
      <title type="text">📄 &#34;There Will Come Soft Rains&#34; a year from today</title>
      <link href="https://justin.searls.co/posts/there-will-come-soft-rains-a-year-from-today/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-04T14:14:33+00:00</published>
    <updated>2025-07-28T16:56:58-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<p>Easily my all-time favorite short story is &quot;<a href="https://en.wikipedia.org/wiki/There_Will_Come_Soft_Rains_(short_story)">There Will Come Soft Rains</a>&quot; by Ray Bradbury. (If you haven't read it, just Google it and you'll find a PDF—seemingly half the schools on earth assign it.)</p>
<p>The story takes place exactly a year from now, on August 4th, 2026. In just a few pages, Bradbury recounts the events of the final day of a fully-automated home that somehow survives an apocalyptic nuclear blast, only to continue operating without any surviving inhabitants. Apart from being a cautionary tale, it's genuinely remarkable that—despite being written 75 years ago—it so closely captures many of the aspects of the modern smarthome. When sci-fi authors nail a prediction <em>at any point in the future</em>, people tend to give them a lot of credit, but this guy called his shot by naming the drop-dead date (literally).</p>
<p>I mean, look at this house.</p>
<p>It's got <a href="https://www.sharkclean.com/page/robot-vacuums">Roombas</a>:</p>
<blockquote>
<p>Out of warrens in the wall, tiny robot mice darted. The rooms were a crawl with the small cleaning
animals, all rubber and metal. They thudded against chairs, whirling their moustached runners,
kneading the rug nap, sucking gently at hidden dust. Then, like mysterious invaders, they popped
into their burrows. Their pink electric eyes faded. The house was clean.</p>
</blockquote>
<p>It's got <a href="https://rachio.com/products/rachio-3">smart sprinklers</a>:</p>
<blockquote>
<p>The garden sprinklers whirled up in golden founts, filling the soft morning air with
scatterings of brightness. The water pelted window panes…</p>
</blockquote>
<p>It's got a <a href="https://juneoven.com/pages/smart-oven">smart oven</a>:</p>
<blockquote>
<p>In the kitchen the breakfast stove gave a hissing sigh and ejected from its warm interior eight pieces
of perfectly browned toast, eight eggs sunny side up, sixteen slices of bacon, two coffees, and two
cool glasses of milk.</p>
</blockquote>
<p>It's got a <a href="https://ring.com/support/articles/76yt8/How-to-Use-Alexa-Greetings">video doorbell and smart lock</a>:</p>
<blockquote>
<p>Until this day, how well the house had kept its peace. How carefully it had inquired,
&quot;Who goes there? What's the password?&quot; and, getting no answer from lonely foxes and whining cats, it had
shut up its windows and drawn shades in an old-maidenly preoccupation with self-protection which
bordered on a mechanical paranoia.</p>
</blockquote>
<p>It's got a <a href="https://www.chamberlain.com/myq">Chamberlain MyQ</a> subscription, apparently:</p>
<blockquote>
<p>Outside, the garage chimed and lifted its door to reveal the waiting car. After a long wait the door
swung down again.</p>
</blockquote>
<p>It's got <a href="https://mymoonlite.com">bedtime story projectors</a>, for the kids:</p>
<blockquote>
<p>The nursery walls glowed.</p>
<p>Animals took shape: yellow giraffes, blue lions, pink antelopes, lilac panthers cavorting in crystal
substance. The walls were glass. They looked out upon color and fantasy. Hidden films clocked
through well-oiled sprockets, and the walls lived.</p>
</blockquote>
<p>It's got one of those <a href="https://jp.toto.com/products/detail/bath-syn-osoujiyokusou/">auto-filling bath tubs from Japan</a>:</p>
<blockquote>
<p>Five o'clock. The bath filled with clear hot water.</p>
</blockquote>
<p>Best of all, it's got a <a href="https://www.makrshakr.com">robot that knows how to mix a martini</a>:</p>
<blockquote>
<p>Bridge tables sprouted from patio walls. Playing cards fluttered onto pads in a shower of pips.
Martinis manifested on an oaken bench with egg-salad sandwiches. Music played.</p>
</blockquote>
<p>All that's missing is the nuclear apocalypse! But like I said, we've got a whole year left.</p>]]></content>
    <summary type="html"><![CDATA[<p>Easily my all-time favorite short story is &quot;<a href="https://en.wikipedia.org/wiki/There_Will_Come_Soft_Rains_(short_story)">There Will Come Soft Rains</a>&quot; by Ray Bradbury. (If you haven't read it, just Google it and you'll find a PDF—seemingly half the schools on earth assign it.)</p>
<p>The story takes place exactly a year from now, on August 4th, 2026. In just a few pages, Bradbury recounts the events of the final day of a fully-automated home that somehow survives an apocalyptic nuclear blast, only to continue operating without any surviving inhabitants. Apart from being a cautionary tale, it's genuinely remarkable that—despite being written 75 years ago—it so closely captures many of the aspects of the modern smarthome. When sci-fi authors nail a prediction <em>at any point in the future</em>, people tend to give them a lot of credit, but this guy called his shot by naming the drop-dead date (literally).</p>
<p>I mean, look at this house.</p>
<p>It's got <a href="https://www.sharkclean.com/page/robot-vacuums">Roombas</a>:</p>
<blockquote>
<p>Out of warrens in the wall, tiny robot mice darted. The rooms were a crawl with the small cleaning
animals, all rubber and metal. They thudded against chairs, whirling their moustached runners,
kneading the rug nap, sucking gently at hidden dust. Then, like mysterious invaders, they popped
into their burrows. Their pink electric eyes faded. The house was clean.</p>
</blockquote>
<p>It's got <a href="https://rachio.com/products/rachio-3">smart sprinklers</a>:</p>
<blockquote>
<p>The garden sprinklers whirled up in golden founts, filling the soft morning air with
scatterings of brightness. The water pelted window panes…</p>
</blockquote>
<p>It's got a <a href="https://juneoven.com/pages/smart-oven">smart oven</a>:</p>
<blockquote>
<p>In the kitchen the breakfast stove gave a hissing sigh and ejected from its warm interior eight pieces
of perfectly browned toast, eight eggs sunny side up, sixteen slices of bacon, two coffees, and two
cool glasses of milk.</p>
</blockquote>
<p>It's got a <a href="https://ring.com/support/articles/76yt8/How-to-Use-Alexa-Greetings">video doorbell and smart lock</a>:</p>
<blockquote>
<p>Until this day, how well the house had kept its peace. How carefully it had inquired,
&quot;Who goes there? What's the password?&quot; and, getting no answer from lonely foxes and whining cats, it had
shut up its windows and drawn shades in an old-maidenly preoccupation with self-protection which
bordered on a mechanical paranoia.</p>
</blockquote>
<p>It's got a <a href="https://www.chamberlain.com/myq">Chamberlain MyQ</a> subscription, apparently:</p>
<blockquote>
<p>Outside, the garage chimed and lifted its door to reveal the waiting car. After a long wait the door
swung down again.</p>
</blockquote>
<p>It's got <a href="https://mymoonlite.com">bedtime story projectors</a>, for the kids:</p>
<blockquote>
<p>The nursery walls glowed.</p>
<p>Animals took shape: yellow giraffes, blue lions, pink antelopes, lilac panthers cavorting in crystal
substance. The walls were glass. They looked out upon color and fantasy. Hidden films clocked
through well-oiled sprockets, and the walls lived.</p>
</blockquote>
<p>It's got one of those <a href="https://jp.toto.com/products/detail/bath-syn-osoujiyokusou/">auto-filling bath tubs from Japan</a>:</p>
<blockquote>
<p>Five o'clock. The bath filled with clear hot water.</p>
</blockquote>
<p>Best of all, it's got a <a href="https://www.makrshakr.com">robot that knows how to mix a martini</a>:</p>
<blockquote>
<p>Bridge tables sprouted from patio walls. Playing cards fluttered onto pads in a shower of pips.
Martinis manifested on an oaken bench with egg-salad sandwiches. Music played.</p>
</blockquote>
<p>All that's missing is the nuclear apocalypse! But like I said, we've got a whole year left.</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/posts/there-will-come-soft-rains-a-year-from-today/","append_url_label":"Read 📄","content":"\u003cp\u003eEasily my all-time favorite short story is \u0026quot;\u003ca href=\"https://en.wikipedia.org/wiki/There_Will_Come_Soft_Rains_(short_story)\"\u003eThere Will Come Soft Rains\u003c/a\u003e\u0026quot; by Ray Bradbury. (If you haven't read it, just Google it and you'll find a PDF—seemingly half the schools on earth assign it.)\u003c/p\u003e\n\u003cp\u003eThe story takes place exactly a year from now, on August 4th, 2026. In just a few pages, Bradbury recounts the events of the final day of a fully-automated home that somehow survives an apocalyptic nuclear blast, only to continue operating without any surviving inhabitants. Apart from being a cautionary tale, it's genuinely remarkable that—despite being written 75 years ago—it so closely captures many of the aspects of the modern smarthome. When sci-fi authors nail a prediction \u003cem\u003eat any point in the future\u003c/em\u003e, people tend to give them a lot of credit, but this guy called his shot by naming the drop-dead date (literally).\u003c/p\u003e\n\u003cp\u003eI mean, look at this house.\u003c/p\u003e\n\u003cp\u003eIt's got \u003ca href=\"https://www.sharkclean.com/page/robot-vacuums\"\u003eRoombas\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOut of warrens in the wall, tiny robot mice darted. The rooms were a crawl with the small cleaning\nanimals, all rubber and metal. They thudded against chairs, whirling their moustached runners,\nkneading the rug nap, sucking gently at hidden dust. Then, like mysterious invaders, they popped\ninto their burrows. Their pink electric eyes faded. The house was clean.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt's got \u003ca href=\"https://rachio.com/products/rachio-3\"\u003esmart sprinklers\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe garden sprinklers whirled up in golden founts, filling the soft morning air with\nscatterings of brightness. The water pelted window panes…\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt's got a \u003ca href=\"https://juneoven.com/pages/smart-oven\"\u003esmart oven\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn the kitchen the breakfast stove gave a hissing sigh and ejected from its warm interior eight pieces\nof perfectly browned toast, eight eggs sunny side up, sixteen slices of bacon, two coffees, and two\ncool glasses of milk.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt's got a \u003ca href=\"https://ring.com/support/articles/76yt8/How-to-Use-Alexa-Greetings\"\u003evideo doorbell and smart lock\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUntil this day, how well the house had kept its peace. How carefully it had inquired,\n\u0026quot;Who goes there? What's the password?\u0026quot; and, getting no answer from lonely foxes and whining cats, it had\nshut up its windows and drawn shades in an old-maidenly preoccupation with self-protection which\nbordered on a mechanical paranoia.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt's got a \u003ca href=\"https://www.chamberlain.com/myq\"\u003eChamberlain MyQ\u003c/a\u003e subscription, apparently:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eOutside, the garage chimed and lifted its door to reveal the waiting car. After a long wait the door\nswung down again.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt's got \u003ca href=\"https://mymoonlite.com\"\u003ebedtime story projectors\u003c/a\u003e, for the kids:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe nursery walls glowed.\u003c/p\u003e\n\u003cp\u003eAnimals took shape: yellow giraffes, blue lions, pink antelopes, lilac panthers cavorting in crystal\nsubstance. The walls were glass. They looked out upon color and fantasy. Hidden films clocked\nthrough well-oiled sprockets, and the walls lived.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt's got one of those \u003ca href=\"https://jp.toto.com/products/detail/bath-syn-osoujiyokusou/\"\u003eauto-filling bath tubs from Japan\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFive o'clock. The bath filled with clear hot water.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eBest of all, it's got a \u003ca href=\"https://www.makrshakr.com\"\u003erobot that knows how to mix a martini\u003c/a\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eBridge tables sprouted from patio walls. Playing cards fluttered onto pads in a shower of pips.\nMartinis manifested on an oaken bench with egg-salad sandwiches. Music played.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAll that's missing is the nuclear apocalypse! But like I said, we've got a whole year left.\u003c/p\u003e","id":"https://justin.searls.co/posts/there-will-come-soft-rains-a-year-from-today/","og_image":"https://justin.searls.co/img/social/posts/there-will-come-soft-rains-a-year-from-today.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-04T14:14:33Z","title":"\"There Will Come Soft Rains\" a year from today","updated_at":"2025-07-28T16:56:58-04:00","url":"https://justin.searls.co/posts/there-will-come-soft-rains-a-year-from-today/"}]]></posse:post>
  </entry>
  <entry>
    <id>https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/</id>
      <title type="text">🎙️ Breaking Change podcast v41 - Liquid Glasshole</title>
      <link href="https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/" rel="alternate" type="text/html" />
    <author>
      <name>Justin Searls</name>
      <email>website@searls.co</email>
    </author>
    <published>2025-08-03T16:33:57+00:00</published>
    <updated>2025-08-04T10:55:21-04:00</updated>
    <content type="html" xml:base="https://justin.searls.co/"><![CDATA[<audio controls style="width: 100%">
  <source src="https://podcast-cdn.searls.co/breaking-change/v41.mp3" type="audio/mpeg">
</audio>
<p>
  <a href="https://podcast-cdn.searls.co/breaking-change/v41.mp3">Direct link to podcast audio file</a>
</p><p>I've made it! I'm over the hump! I'm actually writing<sup>*</sup> my language-learning app in Swift!</p>
<p>Send an email expressing how proud you are of me to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Or if there's any news worth following that isn't about AI. Too much AI stuff lately.</p>
<p><sup>*</sup>And by &quot;I'm writing&quot;, I admit Claude Code is doing a lot of the heavy lifting here.</p>
<p>Hyperlinks:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=aVXbYwJnm7s">Girlfriend Reviews of Mario Kart World</a></li>
<li><a href="https://www.videogameschronicle.com/news/mario-paint-has-been-added-to-switch-onlines-snes-library-supports-switch-2-mouse-controls/">Mario Paint 2 for Nintendo Switch 2</a></li>
<li>Ben publishes <a href="https://nsscreencast.com/episodes">NSScreencast</a>, not NSCoder 🤦‍♂️</li>
<li><a href="https://github.com/yamkz/claude-discord-bridge">claude-discord-bridge</a></li>
<li><a href="https://justin.searls.co/posts/i-made-xcodes-tests-60-times-faster/">Speeding up your Xcode tests</a></li>
<li><a href="https://justin.searls.co/links/2025-07-29-upside-down-development/">Upside-down development</a></li>
<li><a href="https://justin.searls.co/links/2025-08-03-there-is-no-ai-in-team/">There is no AI in Team</a></li>
<li>Aaron's <a href="https://justin.searls.co/puns/">puns, ranked</a></li>
<li>7/24 - <a href="https://www.washingtonpost.com/technology/2025/07/24/tea-dating-app-women-review-men/">WaPo: This app lets women review their dates. Men are worried.</a> (<a href="https://apple.news/ADvl1IGVHRle_LKhJnmxAWw">Apple News+</a>)</li>
<li>7/25 - <a href="https://www.404media.co/women-dating-safety-app-tea-breached-users-ids-posted-to-4chan/">404 Media: Tea hack exposed. Women Dating Safety App 'Tea' Breached, Users' IDs Posted to 4chan</a></li>
<li><a href="https://daringfireball.net/linked/2025/07/28/tea-breach-worsens">Security Breach at Tea Worsens, Revealing Users' DMs About Abortions and Cheating</a></li>
<li><a href="https://soranews24.com/2025/07/26/tokyo-prostitution-ring-members-who-targeted-foreigners-arrested/">Tokyo prostitution ring members who targeted foreigners arrested</a></li>
<li><a href="https://youtu.be/-Zrm-SuDdbY?si=GeMQnJQKi-GfqbhI">Somebody's remaking Rebel Assault in UE5</a></li>
<li><a href="https://www.videogameschronicle.com/news/i-was-just-taken-with-it-star-trek-and-battlestar-galactica-writer-ronald-d-moore-explains-why-hes-showrunning-god-of-war/">Battlestar Galactica writer Ronald D Moore is showrunning God of War</a></li>
<li><a href="https://www.apple.com/newsroom/2025/07/apple-introduces-applecare-one-streamlining-coverage-into-a-single-plan/">AppleCare One</a> is a good deal</li>
<li><a href="https://www.bloomberg.com/news/articles/2025-08-01/apple-ceo-tells-staff-ai-is-ours-to-grab-in-hourlong-pep-talk">Apple CEO Tim Cook Tells Staff AI Is 'Ours to Grab' in Pep Talk</a></li>
<li><a href="https://www.wsj.com/tech/ai/meta-zuckerberg-ai-recruiting-fail-e6107555">Thanks for Your $1 Billion Job Offer, Mark Zuckerberg. I'm Gonna Pass</a> (<a href="https://apple.news/AjBn7A9xCQmW6N2659e5Dig">Apple News+</a>)</li>
<li><a href="https://simonwillison.net/2025/Jul/30/steve-krouse/#atom-everything">Steve Krouse with a great tech debt analogy</a></li>
<li><a href="https://simonwillison.net/2025/Jul/31/christina-wodtke/#atom-everything">Christina Wodtke on what it means that early-days web developers are pumped about AI</a></li>
<li><a href="https://blog.puzzmo.com/posts/2025/07/30/six-weeks-of-claude-code/">Orta: Six weeks of claude code</a></li>
<li><a href="https://www.reddit.com/r/ClaudeAI/s/vwFWf3cbIP">System prompt updates to Claude 4 Opus tries to ward off mania</a></li>
<li><a href="https://en.wikipedia.org/wiki/Foundation_(TV_series)">Foundation Season 3</a></li>
<li><a href="https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(TV_series)">Halt and Catch Fire</a></li>
<li><a href="https://www.youtube.com/watch?v=BbleRDeGpWg">Saw that Family Guy musical, Music Man</a></li>
<li><a href="https://opencode.ai">opencode.ai</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>I've made it! I'm over the hump! I'm actually writing<sup>*</sup> my language-learning app in Swift!</p>
<p>Send an email expressing how proud you are of me to <a href="mailto:podcast@searls.co">podcast@searls.co</a>. Or if there's any news worth following that isn't about AI. Too much AI stuff lately.</p>
<p><sup>*</sup>And by &quot;I'm writing&quot;, I admit Claude Code is doing a lot of the heavy lifting here.</p>
<p>Hyperlinks:</p>]]></summary>
    
    <posse:post format="json"><![CDATA[{"alternate_url":"https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/","append_url_label":"Hear 🎙","content":"\u003cp\u003eI've made it! I'm over the hump! I'm actually writing\u003csup\u003e*\u003c/sup\u003e my language-learning app in Swift!\u003c/p\u003e\n\u003cp\u003eSend an email expressing how proud you are of me to \u003ca href=\"mailto:podcast@searls.co\"\u003epodcast@searls.co\u003c/a\u003e. Or if there's any news worth following that isn't about AI. Too much AI stuff lately.\u003c/p\u003e\n\u003cp\u003e\u003csup\u003e*\u003c/sup\u003eAnd by \u0026quot;I'm writing\u0026quot;, I admit Claude Code is doing a lot of the heavy lifting here.\u003c/p\u003e\n\u003cp\u003eHyperlinks:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=aVXbYwJnm7s\"\u003eGirlfriend Reviews of Mario Kart World\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/mario-paint-has-been-added-to-switch-onlines-snes-library-supports-switch-2-mouse-controls/\"\u003eMario Paint 2 for Nintendo Switch 2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBen publishes \u003ca href=\"https://nsscreencast.com/episodes\"\u003eNSScreencast\u003c/a\u003e, not NSCoder 🤦‍♂️\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/yamkz/claude-discord-bridge\"\u003eclaude-discord-bridge\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/posts/i-made-xcodes-tests-60-times-faster/\"\u003eSpeeding up your Xcode tests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/links/2025-07-29-upside-down-development/\"\u003eUpside-down development\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://justin.searls.co/links/2025-08-03-there-is-no-ai-in-team/\"\u003eThere is no AI in Team\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAaron's \u003ca href=\"https://justin.searls.co/puns/\"\u003epuns, ranked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e7/24 - \u003ca href=\"https://www.washingtonpost.com/technology/2025/07/24/tea-dating-app-women-review-men/\"\u003eWaPo: This app lets women review their dates. Men are worried.\u003c/a\u003e (\u003ca href=\"https://apple.news/ADvl1IGVHRle_LKhJnmxAWw\"\u003eApple News+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e7/25 - \u003ca href=\"https://www.404media.co/women-dating-safety-app-tea-breached-users-ids-posted-to-4chan/\"\u003e404 Media: Tea hack exposed. Women Dating Safety App 'Tea' Breached, Users' IDs Posted to 4chan\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://daringfireball.net/linked/2025/07/28/tea-breach-worsens\"\u003eSecurity Breach at Tea Worsens, Revealing Users' DMs About Abortions and Cheating\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://soranews24.com/2025/07/26/tokyo-prostitution-ring-members-who-targeted-foreigners-arrested/\"\u003eTokyo prostitution ring members who targeted foreigners arrested\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/-Zrm-SuDdbY?si=GeMQnJQKi-GfqbhI\"\u003eSomebody's remaking Rebel Assault in UE5\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.videogameschronicle.com/news/i-was-just-taken-with-it-star-trek-and-battlestar-galactica-writer-ronald-d-moore-explains-why-hes-showrunning-god-of-war/\"\u003eBattlestar Galactica writer Ronald D Moore is showrunning God of War\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.apple.com/newsroom/2025/07/apple-introduces-applecare-one-streamlining-coverage-into-a-single-plan/\"\u003eAppleCare One\u003c/a\u003e is a good deal\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.bloomberg.com/news/articles/2025-08-01/apple-ceo-tells-staff-ai-is-ours-to-grab-in-hourlong-pep-talk\"\u003eApple CEO Tim Cook Tells Staff AI Is 'Ours to Grab' in Pep Talk\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.wsj.com/tech/ai/meta-zuckerberg-ai-recruiting-fail-e6107555\"\u003eThanks for Your $1 Billion Job Offer, Mark Zuckerberg. I'm Gonna Pass\u003c/a\u003e (\u003ca href=\"https://apple.news/AjBn7A9xCQmW6N2659e5Dig\"\u003eApple News+\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://simonwillison.net/2025/Jul/30/steve-krouse/#atom-everything\"\u003eSteve Krouse with a great tech debt analogy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://simonwillison.net/2025/Jul/31/christina-wodtke/#atom-everything\"\u003eChristina Wodtke on what it means that early-days web developers are pumped about AI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.puzzmo.com/posts/2025/07/30/six-weeks-of-claude-code/\"\u003eOrta: Six weeks of claude code\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.reddit.com/r/ClaudeAI/s/vwFWf3cbIP\"\u003eSystem prompt updates to Claude 4 Opus tries to ward off mania\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Foundation_(TV_series)\"\u003eFoundation Season 3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(TV_series)\"\u003eHalt and Catch Fire\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=BbleRDeGpWg\"\u003eSaw that Family Guy musical, Music Man\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://opencode.ai\"\u003eopencode.ai\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","format_string":"New episode of Breaking Change is live! Liquid Glasshole","id":"https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/","og_image":"https://justin.searls.co/img/social/casts/breaking-change-v41-liquid-glasshole.jpg","platform_overrides":{"instagram":{"syndicate":false}},"published_at":"2025-08-03T16:33:57Z","title":"Liquid Glasshole","updated_at":"2025-08-04T10:55:21-04:00","url":"https://justin.searls.co/casts/breaking-change-v41-liquid-glasshole/"}]]></posse:post>
  </entry>



</feed>
