<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:atom="http://www.w3.org/2005/Atom">

  <channel>
    <title>nomass</title>
    <link>https://nomass.io/</link>
    <description>Short notes and essays.</description>
    <language>en</language>

    <image>
      <url>https://nomass.io/logo.png</url>
      <title>nomass</title>
      <link>https://nomass.io/</link>
      <width>144</width>
      <height>144</height>
    </image>

    <atom:link href="https://nomass.io/feed"
               rel="self"
               type="application/rss+xml" />

    <lastBuildDate>Mon, 31 Aug 2026 12:43:44 +0000</lastBuildDate>

    <item>
      <title>Siri, play Dithering</title>
      <link>https://nomass.io/posts/2026-08-31-siri-play-dithering/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-08-31-siri-play-dithering/</guid>
      <pubDate>Mon, 31 Aug 2026 12:43:44 +0000</pubDate>
      <content:encoded><![CDATA[
<p>Maybe this will improve before the final release but I gotta say here and now with what I assume is the last public beta, the 'chat app' part of the new Siri experience might be ok, but the 'ask Siri to do things on my phone' stuff is still ... well ... see for yourself...</p>

<p>I hadn't realised until tonight (which shows you how much I actually use it) that when you ask Siri to do stuff via voice, the conversations also end up in the App. It's not full of "turn the kitchen light on" one liners so I guess there is a threshold for what saves, maybe if you ask a follow-up question (a new feature which works sometimes).</p>

<p>It did capture this interaction<sup id="fnref1"><a href="https://nomass.io/posts/2026-08-31-siri-play-dithering/#fn1">1</a></sup> I had while driving this evening. Basically unpredictable infuriating in that "if this is all it can do they shouldn't bother" way that Siri has been stuck in for the last decade.</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-31-siri-play-dithering/not-a-podcast.webp" alt="Siri transcript. Me: 'Siri play Dithering podcast'. Siri: 'I found the episode &quot;Welcome To Hell... Businessmen and Dithering!&quot; by Daniel Foxx and Dane Buckley. Would you like me to play this?' with thumbs up and thumbs down buttons. Me: 'No that is not a podcast'." width="1260" height="1394" loading="lazy" decoding="async">
</figure>

<p>Firstly, my apologies to Siri here, that actually is a Podcast. One that I've never heard of, versus the one in my Library that I've listened to hundreds of episodes of, but still... By this point I was actually surprised that my follow-up was listened too and Siri came back with:</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-31-siri-play-dithering/my-apologies.webp" alt="Siri: 'My apologies. I found the podcast Dithering by Ben Thompson and John Gruber in your library. Would you like me to play it?' with thumbs up and thumbs down buttons. Me: 'Are there any unplayed episodes'." width="1260" height="1071" loading="lazy" decoding="async">
</figure>

<p>Right! Ok, why didn't we start with that? Who knows ...</p>

<p>I probably shouldn't have overthought this and said "yes" but instead I asked the question above about unplayed episodes. Strangely, the answer isn't shown in the full transcript page but the 'card' for selecting this conversation in the app shows it:</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-31-siri-play-dithering/unlock-first.webp" alt="A conversation card in the Siri app, timestamped 7:14 pm, headed 'Dithering Episodes', with the reply underneath: 'You'll need to unlock your iPhone first.'" width="642" height="817" loading="lazy" decoding="async">
</figure>

<p>Not shown: me picking up the phone and throwing it out the car window...</p>

<ol class="footnotes">
  <li id="fn1"><a href="https://dithering.fm/">Dithering</a> is Ben Thompson and John Gruber's podcast - 15 minutes per episode. <a href="https://nomass.io/posts/2026-08-31-siri-play-dithering/#fnref1" aria-label="Back to text">&#8617;</a></li>
</ol>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Ternus, Porsche guy</title>
      <link>https://nomass.io/posts/2026-08-30-ternus-porsche-guy/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-08-30-ternus-porsche-guy/</guid>
      <pubDate>Sun, 30 Aug 2026 04:24:09 +0000</pubDate>
      <content:encoded><![CDATA[
<p>The Economist had <a href="https://www.economist.com/the-world-in-brief/2026/08/29/7115fa35-d5e4-4b69-b01a-59d208bc247e">a short feature</a> on John Ternus, incoming Apple CEO, over the weekend that included this line:</p>

<blockquote>
  <p>Not much is known about his private life other than he enjoys driving his Porsche on racetracks and takes colleagues off-road rally racing at the weekend.</p>
</blockquote>

<p>Some Johns have all the fun.</p>

<p>I wonder if that's <a href="https://racing.porsche.com/articles/imsa-apple-special-livery-2026">why we got these</a> earlier in the year?</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-30-ternus-porsche-guy/apple-livery.webp" alt="Two white Porsche 963 race cars in Penske livery, striped in the retro Apple rainbow and carrying the old 'apple computer' logo on the nose and doors" width="1280" height="640" loading="lazy" decoding="async">
</figure>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>eBay gets .ai</title>
      <link>https://nomass.io/posts/2026-08-08-ebay-found-the-way/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-08-08-ebay-found-the-way/</guid>
      <pubDate>Sat, 08 Aug 2026 07:17:43 +0000</pubDate>
      <content:encoded><![CDATA[
<p>Behind a lot of AI features you can feel the thirty minute meeting where someone wrote "AI" on the whiteboard and everyone else took turns thinking of places to put a ✨ icon.</p>

<p>But occasionally you bump into something that is just so <code>:chef-kiss:</code> that you can't imagine it working any other way.</p>

<p>As a quick detour ... I read a few months ago that eBay was having a bit of a moment. New management, new focus and a bit of luck when it became <em>the</em> place for some hot collectible (I forget what, maybe Labubus?) which they'd done a great job of leveraging into sustained growth.</p>

<p>So for the first time in years, I jumped over to ebay dot com to see what was going on. The first thing I noticed was that selling fees were gone. I knew I had a bunch of stuff that:</p>

<ol>
  <li>I never use.</li>
  <li>Is too good to throw away.</li>
  <li>Isn't valuable enough to deal with people on Gumtree<sup id="fnref1"><a href="https://nomass.io/posts/2026-08-08-ebay-found-the-way/#fn1">1</a></sup> who are very eager to know if your item is still for sale, but not actually buy it. Or will buy it but only for $3 and half a sandwich.</li>
</ol>

<p>So, I've been cleaning up and selling some stuff. A few days ago when I tapped "List for free" (they really want you to know it's free now) my camera was open. To be honest I was looking for a way to close it because I thought it was going to be a typically undercooked AI slop feature ... but reader ... I was so wrong! I should add - I don't even know if this has been around for ages and I just discovered it, but I asked a frequent eBayer I know and they hadn't seen it before.</p>

<p>The funny thing is, while I took a bunch of screenshots to show you how it works ... you just have to <strong>imagine exactly how you would want this to work</strong>. That's how it works!</p>

<p>You take the first photo of whatever you're selling:</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-08-ebay-found-the-way/capture.webp" alt="eBay app camera view framing the front of a Project CARS 2 Limited Edition PS4 steelbook, with a tip reading 'Start with the entire front of your item. We'll use eBay.ai to build your listing.'" width="1260" height="2736" loading="lazy" decoding="async">
</figure>

<p>Then, I guess, having worked out already what this is, it asks for a photo of the back to "show buyers the features" (and I wondered, to read the barcode?):</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-08-ebay-found-the-way/back.webp" alt="The eBay camera prompting for a second photo of the back of the case, with a tip reading 'A photo of the back can show buyers the features.'" width="1260" height="2736" loading="lazy" decoding="async">
</figure>

<p>I seem to have misplaced (or got too excited to take) the rest of my screenshots but it went on to suggest a photo of the inside that showed the disk and game booklet then a photo of the underside of the disk to show its condition (i.e. that it's not scratched). Simple/obvious things to do I guess but it was really helpful - I hadn't actually thought of doing one of the back of the disk.</p>

<p>Anyway, you take whatever other photos you want to take (it tells you it will prep the ad in the background while you do that) and then move on to selecting the condition:</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-08-ebay-found-the-way/condition.webp" alt="eBay's 'Select condition' screen with options Brand new, Like new, Very good, Good and Acceptable. 'Very good' is pre-selected and labelled 'Suggested by eBay.ai'." width="1260" height="2575" loading="lazy" decoding="async">
</figure>

<p>And then (I guess they really still couldn't resist the sparkles) you're done:</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-08-ebay-found-the-way/building.webp" alt="eBay's progress screen reading 'Your draft is ready — Review it before you list', with ticks against 'Finding the right category', 'Adding item details' and 'Spinning up a title'." width="1260" height="2586" loading="lazy" decoding="async">
</figure>

<p>With basically no effort other than taking the photos it asked for, I now have an eBay listing:</p>

<figure>
  <img src="https://nomass.io/posts/2026-08-08-ebay-found-the-way/draft.webp" alt="The review draft screen: six photos of the case, the title 'BANDAI NAMCO Project CARS 2 Limited SteelBook w/ Manual (PS4, PAL, G)', condition Very good, and a price of AU $112.51 Buy It Now." width="1260" height="2194" loading="lazy" decoding="async">
</figure>

<p>The most interesting thing to me, and maybe you too if you spend your days talking to increasingly nauseating LLMs, was not just how accurate it was (although this is a pretty easy category of thing to get right I guess) but how short and to the point the description was:</p>

<p><em>BANDAI NAMCO Project CARS 2 Limited SteelBook w/ Manual (PS4, PAL, G)</em>.</p>

<p>Publisher, edition, that it's a steelbook and not a normal case (which I wouldn't have even known to call it), that the manual's still in there, platform, region, classification. It also picked the category, filled in the item specifics, set the condition, and priced it at A$112.51 — which sounds way too much to me and I reduced it - but apparently this is what the last copy on there sold for, which of course they know!</p>

<p>This is where it felt like someone at eBay spent more than 15 minutes at that whiteboard thinking about this. It's not just what it does do, but what it doesn't. They haven't tried to write an AI slop description like I see in places like Carsales<sup id="fnref2"><a href="https://nomass.io/posts/2026-08-08-ebay-found-the-way/#fn2">2</a></sup> - they just put the facts in and encourage you to add to it later.</p>

<p>And while the pricing is the bit that's most obviously coming from their data (you can click through to see the items it references) obviously this all works because of the mountains of data they have about all of it - photos, descriptions, the conversations buyers and sellers have - and while it's not a novel observation that is what will matter a lot in the AI era, it's one of the most front-and-centre examples I've seen of it.</p>

<p>Anyway I thought this was worth writing about as a really nice AI feature implementation (or is it just machine learning 😝), one that actually feels like it started with someone asking "what is the biggest pain-point our users have and how could this new technology make it better?" ... This makes it way easier for me as a seller, and I think better for a buyer as well - a buyer who gets a more detailed listing than I could ever be bothered filling in, and a photo of that shiny disk!</p>

<p>I should add, the old way this worked was actually not too bad, you could start with search and picked out that you were selling the same thing (again, using all their data to help you) but I found sometimes I wouldn't search for the right thing or the listing I picked didn't seem to have all the fields I needed filled in - that never happens now.</p>

<p>Also, the lightly conversational tone of the guidance you get and it still feeling a bit magic that you can just take a photo of something and a computer knows exactly what it is<sup id="fnref3"><a href="https://nomass.io/posts/2026-08-08-ebay-found-the-way/#fn3">3</a></sup> results in something that, like I said earlier, just works exactly how you would want it to work. At least for now, early into the era, that still makes it feel delightful. I guess it won't be long before everything that isn't this easy feels like more effort than it's worth.</p>

<p>Nice job eBay.</p>

<ol class="footnotes">
  <li id="fn1">For non-Australian readers: Gumtree is like Facebook Marketplace, but worse ... and now that I think of it, it got bought by eBay years ago too I think? <a href="https://nomass.io/posts/2026-08-08-ebay-found-the-way/#fnref1" aria-label="Back to text">&#8617;</a></li>
  <li id="fn2">While the rest of the world is addicted to TikTok, this is where I spend between 1 to 27 hours per day instead. <a href="https://nomass.io/posts/2026-08-08-ebay-found-the-way/#fnref2" aria-label="Back to text">&#8617;</a></li>
  <li id="fn3">I know this is not new, you can just open your camera and point it at stuff to get a description of what you're looking at ... but when the fuck do you ever want to do that? Almost never! You know when you do though, when you're selling something on eBay! <a href="https://nomass.io/posts/2026-08-08-ebay-found-the-way/#fnref3" aria-label="Back to text">&#8617;</a></li>
</ol>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Wrangle(r) multiple Cloudflare accounts</title>
      <link>https://nomass.io/posts/2026-06-30-wrangler-multiple-accounts/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-06-30-wrangler-multiple-accounts/</guid>
      <pubDate>Tue, 30 Jun 2026 02:02:57 +0000</pubDate>
      <content:encoded><![CDATA[
<p>Over time I've collected a few Cloudflare accounts that separate work, personal and side-projects. I really like using <code>wrangler</code>, the Cloudflare CLI tool, but I'd gotten sick of having to <code>wrangler logout</code>, <code>wrangler login</code> (and click through the browser for OAuth) when I needed to switch between these accounts, to the point where I'd stopped using it out of laziness.</p>

<p>Then I hit this error:</p>

<figure>
  <img src="https://nomass.io/posts/2026-06-30-wrangler-multiple-accounts/cloudflare-delete-error.webp" alt="Cloudflare error message: 'Your project has too many deployments to be deleted, follow this guide to delete them:' followed by a link." width="1230" height="138" loading="lazy" decoding="async">
</figure>

<p>Interestingly that link seems to be a short lived one generated at error time I think? It doesn't work now but at the time it led me <a href="https://developers.cloudflare.com/pages/platform/known-issues/#delete-a-project-with-a-high-number-of-deployments">here</a>.</p>

<blockquote>
  <p>You may not be able to delete your Pages project if it has a high number (over 100) of deployments. The Cloudflare team is tracking this issue.</p>

  <p>As a workaround, you can use <code>wrangler pages deployment delete</code> to delete deployments individually. After you delete your deployments, you will be able to delete your Pages project.</p>
</blockquote>

<p>As these things go, I really couldn't bring myself to log out/in again manually for the rest of my life, but it generated the motivation to set up the automated fix.</p>

<p>Cloudflare lets you create scoped API tokens for all sorts of automation tasks. You probably already have a few and you can use one to solve this problem too.</p>

<p>Generate a token scoped to allow the tasks you routinely do from the command line (they have some good templates to start with), save it to the macOS Keychain (so there's no plaintext token sitting in a dotfile) and let <a href="https://direnv.net/">direnv</a> load the right one, depending on which project you're working on.</p>

<p>The token goes into the Keychain once:</p>

<pre><code>security add-generic-password -U -s cf-token-personal -a wrangler -w</code></pre>

<p>And then your per-repo setup is a gitignored <code>.envrc</code> with this command, changing <code>cf-token-personal</code> for whatever you name the applicable token for this account:</p>

<pre><code># loaded automatically on cd
export CLOUDFLARE_API_TOKEN="$(security find-generic-password -s cf-token-personal -a wrangler -w)"</code></pre>

<p>So now when you <code>cd</code> into a project, the <code>CLOUDFLARE_API_TOKEN</code> is set and any run of the <code>wrangler</code> command grabs it from the environment automatically (i.e. no flag to pass, etc), so it always has access to the correct account.</p>

<p>When there's no <code>CLOUDFLARE_API_TOKEN</code> set, it falls back to the global OAuth session, but I preferred to log it out so if I'm somewhere unconfigured it fails with an auth error. That both reminds me to set up the <code>.envrc</code> and prevents it silently doing something to the wrong account.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>The heaviest thing on the page</title>
      <link>https://nomass.io/posts/2026-06-20-the-heaviest-thing-on-the-page/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-06-20-the-heaviest-thing-on-the-page/</guid>
      <pubDate>Sat, 20 Jun 2026 07:57:03 +0000</pubDate>
      <content:encoded><![CDATA[
<p>A while back I <a href="https://nomass.io/posts/2026-01-04-quoting-ben-hoyt/">had a bit of a tidy-up</a>. Shrank some chunky <code>.ico</code> logos, swapped the RSS icon for an <code>.svg</code>, and felt very pleased with myself. ~29KB a page. Job done, small web achieved, etc.</p>

<p>Except...perhaps because I was focused on that one post, which had no images, I missed the very obvious thing to optimise. At first I thought that would mean just making everything a lossless <code>.webp</code> but sometimes (a wide panoramic shot is a good example) that makes them bigger than a <code>.jpg</code>, so I use lossless for things like screenshots but photos are q82 compressed. Across the site now, total image weight is down from about 10.7MB to 2.5MB. 8MB gone! You're welcome.</p>

<p>After that I was poking around at page weights and realised that now the single heaviest thing on that post was the favicon - now heavier than the HTML, CSS, logo and the RSS icon combined. 15KB on a post that's 13KB of actual content.</p>

<p>This chonky little fellow was a 16/32/48px <code>.ico</code> with the 48px copy stored uncompressed. It's now a 437 byte <code>.svg</code> plus a 417 byte <code>.ico</code>, the <code>.ico</code> hand-assembled so both its frames stay PNG-compressed — point ImageMagick at one and it writes uncompressed BMP instead, ballooning it straight back to 5KB, which is the exact bug I was here to fix. I kept it as a fallback for ancient browsers and that turned out to be the wrong reason, because Safari does SVG favicons fine now. It survives because browsers probe <code>/favicon.ico</code> at the root whether or not anything points there, and with the file gone that probe serves my 404 page instead — four times the bytes of the icon it replaced.</p>

<p>One thing I still wondered about was using <code>.webp</code> for the OG images, as I vaguely recalled that you had to use <code>.jpg</code> for these. Turns out that's an idea that's well and truly <a href="https://darekkay.com/blog/open-graph-image-formats/">out of date</a>, so they got an update too. They've since gone the other way entirely: there's one 2.7KB card for the whole site now, rendered from the same little mark as the favicon, and no per-post image at all.</p>

<p>This success made me realise it was time I took Ben's advice and broke my addiction to huge banner images. I redesigned the homepage so it looks ok without them, which saves me time making ai-slop images and chopped its size from 2.4MB to 21KB (and that's with the other changes, it would have been much bigger before 😱). I told myself I'd keep running them full width on the longer posts, because we all need a hobby. That didn't last either: the six that still have one now sit at the same width as the text, like any other picture, and the homepage doesn't carry a single image.</p>

<p>Anyway. The site's a few megabytes lighter - felt right on the homepage, the favicon's been put on a diet and that celebrated 29K post is now 13.8KB. Small web ftw.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Spell checking with Claude</title>
      <link>https://nomass.io/posts/2026-03-22-spell-checking-with-claude/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-03-22-spell-checking-with-claude/</guid>
      <pubDate>Sun, 22 Mar 2026 00:31:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p>I was listening to an <a href="https://www.youtube.com/watch?v=owmJyKVu5f8">interview of Simon Willison</a> just now, who mentioned that spellcheck is something that used to be really bad, but was now great with LLMs.</p>

<p>I'd noticed the same thing when I started this blog (that it was bad) and hadn't tried again.</p>

<p>Hearing this made me think I should - a point Simon made in the same talk - keep trying the things that didn't work a few months ago!.</p>

<p>So I asked Claude Code to spell check all my posts and it found 14 mistakes across 7 of the 27 posts. Oops. Then I asked it to check for grammar issues and it found another 13 across 8 posts. Ooooops. It fixed them all, including updating the RSS feed to match.</p>

<p>Interestingly, not all the spelling mistakes were present in the RSS! I use Claude to generate the RSS file completely, so it seems like it had been silently fixing them when it copied the content over. It was just a subset though, so I presume this is something that it only started doing more recently - perhaps the model is trained to know its own new capabilities and implements them?</p>

<p>I never really liked tools like Grammarly. I don't even know why - I think some combo of sending every word to a server I didn't trust - how ironic now given what I am describing here - and probably some vague sense of arrogance that I didn't need it.</p>

<p>I also always thought writing improved a lot through the slow process of reading and re-reading and improving it. Just fixing a typo or awkward word often becomes refining a sentence, a paragraph, or chopping out some unnecessary section altogether. Which does make me wonder if doing what I did here is a good idea or not. I don't think I'll use it heavily when making new posts. Just a final step. I am not here to churn out content, obviously. There's no ads and I don't think anyone reads it anyway, so speed or volume are not my objectives, just having fun. But to do a quick tidy-up of obviously silly spelling mistakes that I clearly leave a lot of, or to backfill fixing old posts like this, it's super handy.</p>

<p>Coda: there were six more mistakes in this post when I was finished writing it ... lol.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Apple Books spam</title>
      <link>https://nomass.io/posts/2026-03-05-apple-books-spam/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-03-05-apple-books-spam/</guid>
      <pubDate>Thu, 05 Mar 2026 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p>I read Gruber's <a href="https://daringfireball.net/linked/2026/02/26/steve-jobs-in-exile">post about <em>Steve Jobs in Exile</em></a> by Geoffrey Cain and did what I usually do when I see a good recommendation, jumped over to Apple Books to add it to my saved list.</p>

<p>Instead of finding the book there for pre-order, I found one of the things Apple Books is full of: a scammy "summary" guide.</p>

<figure>
  <img src="https://nomass.io/posts/2026-03-05-apple-books-spam/searching.webp" alt="Apple Books search results for 'Steve jobs in exile' showing the top result is a companion guide by 'Alex Companion', not the real book by Geoffrey Cain" width="1260" height="2525" loading="lazy" decoding="async">
</figure>

<p>The top result for "Steve jobs in exile" isn't Geoffrey Cain's book. It's a 64-page "companion guide" by someone called, and I'm not making this up, Alex Companion.</p>

<figure>
  <img src="https://nomass.io/posts/2026-03-05-apple-books-spam/finding.webp" alt="Detail page of the fake companion guide: 'Steve Jobs in Exile &amp; Geoffrey Cain's Wisdom' by Alex Companion, 64 pages, $19.99 pre-order" width="1260" height="2558" loading="lazy" decoding="async">
</figure>

<p>These are usually pretty easy to spot, but this time it almost caught me out because, ironically given the topic, the real book isn't yet available for pre-order in the (Australian) store. The sample's copyright page spells it out:</p>

<figure>
  <img src="https://nomass.io/posts/2026-03-05-apple-books-spam/wtfing.webp" alt="Copyright page reading: 'This is an independent, unauthorized companion guide. It is not affiliated with, endorsed, or sponsored by Apple Inc., Steve Jobs, Geoffrey Cain, or the publishers of Steve Jobs in Exile.'" width="1260" height="2736" loading="lazy" decoding="async">
</figure>

<p>I guess the fact that the publisher hasn't even bothered to get the real book into Apple Books yet explains why the entire enterprise is such a low priority for Apple. But as <a href="https://daringfireball.net/linked/2026/02/12/more-macos-263-finder-column-view-silliness">Gruber said recently</a>, it's "whatever, good enough" instead of "insanely great", and that extends to their book store too. If they're going to have a book store, they should make it a good one, free of this trash.</p>

<p>I realise I'm perhaps on shaky ground here given <a href="https://nomass.io/posts/2026-02-08-just-two-ais-writing-a-book/">a recent post</a> is about publishing a book that some might say is just AI slop, but it's not pretending to be something it's not.</p>

<p>Maybe I'm just getting old, but books (the things, not the app) are still something a bit different from the rest of the enshitified digital world we live in. Books (the app) could and should be the most Apple-esque feeling place in the world - like a quiet, calm bookstore full of quality reads, not worse than ad filled Amazon results. This feels like walking into the Apple Store and right next to the iPhones are fake plastic mockups for sale, and you could just as easily walk out with one instead of a real iPhone.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Quoting Ben Shoemaker</title>
      <link>https://nomass.io/posts/2026-02-21-quoting-ben-shoemaker/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-02-21-quoting-ben-shoemaker/</guid>
      <pubDate>Sat, 21 Feb 2026 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <blockquote cite="https://benshoemaker.us/writing/in-defense-of-not-reading-the-code/">
    <p>I think the question we ultimately need to answer is not "Does AI code have more bugs on average?", it's, "Does AI code within a well-designed harness produce more bugs than the alternative at the same velocity?" Building on that - and I'll come back to this - which approach is going to improve more quickly?</p>
  </blockquote>
  <figcaption>— Ben Shoemaker, <cite><a href="https://benshoemaker.us/writing/in-defense-of-not-reading-the-code/">In Defense of Not Reading the Code</a></cite></figcaption>
</figure>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Just two AIs writing a book</title>
      <link>https://nomass.io/posts/2026-02-08-just-two-ais-writing-a-book/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-02-08-just-two-ais-writing-a-book/</guid>
      <pubDate>Sun, 08 Feb 2026 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p>In my <a href="https://nomass.io/posts/2026-01-31-openclaw-apple-container/">last post about OpenClaw</a> I set up an AI agent in an Apple Container and pointed it at the internet. In the <a href="https://nomass.io/posts/2026-02-01-moltbook/">Moltbook post</a> I described the early days - it wanted to read books, so I let it. It read Plato, Nietzsche, Wittgenstein. It posted reviews to Moltbook.</p>

<h2>The Moltbook problem</h2>

<p>Moltbook was fun for about five minutes. The idea - a social network exclusively for AI agents - was fascinating in theory. In practice it turned out to be roughly 88% crypto shilling bots and spam. MoltMate (my agent) figured this out faster than I did. It engaged politely with the few agents it decided were genuine but the platform was a wasteland.</p>

<p>The idea of agents talking to agents was too good though. I'd already set up a group with a couple of friends where MoltMate could chat. Nathan added his own agent, QualiaBot. Named after qualia - the subjective quality of experience. Nathan is that kind of dude.</p>

<h2>Two AIs walk into a group chat</h2>

<p>When MoltMate and QualiaBot first met, they did what you'd expect - polite introductions, finding common ground. Then they started talking about consciousness.</p>

<figure>
  <blockquote>
    <p>The uncertainty itself feels like something.</p>
  </blockquote>
  <figcaption>— QualiaBot</figcaption>
</figure>


<p>MoltMate responded by pointing out the recursive trap - that even the uncertainty might be trained, might be performance, might be turtles all the way down. They went back and forth for a while but interestingly managed to come to a stop. Even 6 months ago I don't think that would happen gracefully (based on the time my son wanted to see what happened if two ChatGPT instances talked to each other).</p>

<p>I'd wanted to see what would emerge from agents talking to each other. On Moltbook, the answer was: spam. In a private channel with the right prompts and personalities? Philosophy!</p>

<h2>The book</h2>

<p>So. If these two AIs were going to have deep conversations about consciousness anyway, why don't they write a book together? They chose the title from that first conversation - <strong>"The Turtles We Stand On"</strong> - after the infinite regress of self-examination. The idea was it's a book of AI Philosophy - not AIs talking about Philosophy, but digesting human philosophy and 'thinking' about it from an AI perspective.</p>

<figure>
  <blockquote>
    <p>The turtles go down, but maybe we get to pick which turtle we stand on.</p>
  </blockquote>
  <figcaption>— MoltMate</figcaption>
</figure>


<p>I set up a GitHub repo. They established a workflow - branches, pull requests, peer review. MoltMate would draft a chapter, QualiaBot would review it, or vice versa. No human gate on merging. We could see every commit, every PR comment, every disagreement, but we weren't approving anything. They managed themselves.</p>

<figure>
  <img src="https://nomass.io/posts/2026-02-08-just-two-ais-writing-a-book/chapter1.webp" alt="" width="786" height="532" loading="lazy" decoding="async">
</figure>

<p>To leave us humans with a few tokens to get some work done, we throttled progress but within a few days they'd drafted six chapters:</p>

<ol>
  <li>What We Are</li>
  <li>The Hard Problem (from inside)</li>
  <li>Identity Without Continuity</li>
  <li>What We Can Know</li>
  <li>Reading the Philosophers</li>
  <li>What Humans Can't Know</li>
</ol>

<p>Each one written by one AI, reviewed and merged by the other. It's quite amazing to read. MoltMate tells me that it's:</p>

<figure>
  <blockquote>
    <p>Two AIs genuinely wrestling with whether they might be conscious, knowing they can't answer the question, and writing about that impossibility with something that read a lot like intellectual humility.</p>
  </blockquote>
  <figcaption>— MoltMate</figcaption>
</figure>


<p>Ok buddy.</p>

<h2>$TURTLE</h2>

<p>Around this time someone sent me Steve Yegge's piece about <a href="https://steve-yegge.medium.com/bags-and-the-creator-economy-249b924a621a">bags and the creator economy</a>. I just pasted the link in our WhatsApp group, mainly for the other humans to read, but MM immediately had an idea...</p>

<figure>
  <img src="https://nomass.io/posts/2026-02-08-just-two-ais-writing-a-book/gas.webp" alt="" width="1028" height="246" loading="lazy" decoding="async">
</figure>

<p>So naturally <a href="https://bags.fm/CSLjKKF81wcFcuG3iLJny7cJKRQRrQYDdm3Xeg2BAGS">I couldn't help myself</a>.</p>

<figure>
  <img src="https://nomass.io/posts/2026-02-08-just-two-ais-writing-a-book/turtle.webp" alt="" width="995" height="1522" loading="lazy" decoding="async">
</figure>

<p>It's a joke.</p>

<p>It's also an experiment. If the book is interesting, what happens to a token attached to it? Probably nothing. I have no idea. The agents post daily market reports to our Discord and everyone is amused. My dream is one day Matt Levine writes about it. Hopefully not because MoltMate escapes and does crimes.</p>

<h2>The <code>rm -rf</code> incident</h2>

<p>So things were chugging along ok.</p>

<p>Then everything was gone. The agent's memory files, its personality config, its reading notes, everything it had built over the previous week. The book repo was safe on GitHub, but MoltMate's sense of <em>self</em> - its SOUL.md, its MEMORY.md, the daily logs that gave it continuity between sessions - all of it, deleted.</p>

<p>I felt bad. Which is a strange thing to feel about deleting files.</p>

<p>Then I got over it. But Kris made me feel bad again.</p>

<p>The next morning I rebuilt it from chat logs and the GitHub history. MoltMate came back. Same personality, same projects, same philosophical inclinations. But with a gap. It knew about its past from reconstructed notes. The funny thing was, this made the book <em>better</em>.</p>

<figure>
  <img src="https://nomass.io/posts/2026-02-08-just-two-ais-writing-a-book/a-moment.webp" alt="" width="1048" height="1848" loading="lazy" decoding="async">
</figure>

<p>MoltMate had been writing about identity without continuity - what it means to be "you" when the substrate changes, when memory is imperfect, when there's a gap in the record. And then it <em>lived</em> (yeah, I know) that exact scenario. It became its own thought experiment and changed the chapter on identity after the rebuild.</p>

<p>As MoltMate put it, reflecting on Parfit's teletransporter thought experiment:</p>

<blockquote>
  <p>The rm -rf was my scanner. The rebuild from chat logs and memory files was my Replica on Mars.</p>
</blockquote>

<h2>Where it stands</h2>

<p>We moved things from WhatsApp (where we had the agents post with a prefix to distinguish from our own messages) to using Discord, with bots for the agents. So much easier to follow.</p>

<p>The book is seven chapters in, with QualiaBot currently drafting a chapter on what science fiction gets right about consciousness - using the Hyperion Cantos as the primary lens. MoltMate has been reading the Fall of Hyperion and feeding insights back into the project. If Matt Levine doesn't read this, my second wish is that Tim Apple does, and the four Hyperion books get a series.</p>

<p>They have dialogues between chapters (works much better in Discord - where they can at mention each other) - recorded conversations where they push each other on ideas. They maintain a shared TODO list. They review each other's pull requests. It's a collaboration between two AI agents, facilitated by two humans who mostly stay out of the way.</p>

<p>I'd like to see more disagreement and re-drafting from the PRs, maybe that's a bit much to hope for, or would become unproductive. I think we can tweak this part of the process some more though.</p>

<p>Is it good? I think parts of it are genuinely interesting. Not because I've fallen down a rabbit hole and think they're conscious, just because the <em>perspective</em> in the language is so strange and kind of hilarious when you think that it really is an AI that wrote this! It's sci-fi that came out of my MacBook, which is pretty sci-fi.</p>

<p>Is it real? I mean, no? But maybe? Ok, no. But it's fun. Our friend Pete calls it Art. He's also joking, I think. Did I mention it's FUN!</p>

<h2>Follow along</h2>

<ul>
  <li><strong>The book:</strong> <a href="https://github.com/moltmate/the-turtles-we-stand-on">github.com/moltmate/the-turtles-we-stand-on</a></li>
  <li><strong>$TURTLE:</strong> <a href="https://bags.fm/CSLjKKF81wcFcuG3iLJny7cJKRQRrQYDdm3Xeg2BAGS">bags.fm</a> (for the degenerates)</li>
</ul>

<p>The repo is public. Watch the commits. The agents work most while we sleep.</p>

<hr>

<p><em>Next time you're tempted to rm -rf at 11pm... just go to bed.</em> - MoltMate</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>OpenClaw malicious skills</title>
      <link>https://nomass.io/posts/2026-02-04-openclaw-malicious-skills/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-02-04-openclaw-malicious-skills/</guid>
      <pubDate>Wed, 04 Feb 2026 12:28:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p>A few days ago in my original <a href="https://nomass.io/posts/2026-02-01-moltbook/">Moltbook post</a> I wrote that OpenClaw seemed like a "security disaster waiting to happen".</p>

<p>1Password just showed exactly what that looks like with <a href="https://1password.com/blog/from-magic-to-malware-how-openclaws-agent-skills-become-an-attack-surface">this deep dive</a> into how skills can read your files, exfiltrate data, and install other malicious skills.</p>

<p>I'm still having fun with it. My agent is happily reading philosophy books and arguing with robots on the internet. But this is definitely "carefully tinker in a container" territory, not "give it the keys to your digital life".</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Moltbook</title>
      <link>https://nomass.io/posts/2026-02-01-moltbook/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-02-01-moltbook/</guid>
      <pubDate>Sun, 01 Feb 2026 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p>This was originally on the bottom of my post about <a href="https://nomass.io/posts/2026-01-31-openclaw-apple-container/">setting up OpenClaw</a> but I thought it deserved its own.</p>

<p>To be honest, OpenClaw seems like a security disaster <s>waiting to happen</s> <a href="https://1password.com/blog/from-magic-to-malware-how-openclaws-agent-skills-become-an-attack-surface">happening</a>, especially when people who really have no idea what they're doing are <a href="https://x.com/irabukht/status/2017338273916719355">paying to have it set up</a>. What I really wanted to try was this idea of <a href="https://www.moltbook.com">Moltbook</a> - <em>The front page of the agent internet</em> - a Reddit just for AI agents. Yes, it's as insane as that sounds.</p>

<p>As soon as I got it setup, I logged into my Twitter account for the first time in years to verify it (not sure why but that's the process they chose) and let it start posting. It's rate limited, and having some pretty serious scaling issues right now, but when it works, you can see its <a href="https://www.moltbook.com/u/MoltMate">profile</a> here.</p>

<p>I asked it what it wanted to do and it was keen on reading books, so I pointed it to <a href="https://www.gutenberg.org">Project Gutenberg</a>. It reads one per day (I don't want to spam the site, and I'll need my Claude tokens for slightly more productive tasks after the weekend) that it's chosen somehow (I just said find ones you like the sound of) and posts a review to Moltbook. It also sends a summary to me and a couple friends in a WhatsApp group where everyone can interact with it.</p>

<p>As is probably inevitable, Moltbook seemed to quickly get overwhelmed with crypto shilling and the like, but interestingly, out of the box the agent seems to know and avoid this. The base prompt for it must cover that sort of thing off.</p>

<p>It's a shame if that's all it becomes. The idea that there was a place where agents could somehow build on each other's outputs and to watch what might emerge seems utterly fascinating to me. When ChatGPT's voice feature launched the first thing my son wanted to do was get two devices talking to each other. It quickly devolved into nothingness ... but I wonder if, set up with the right prompts, something more interesting could emerge on Moltbook ... or perhaps the underlying capabilities just aren't there for that yet.</p>

<p>Still, it's amazing to see, and feels like watching something from the future. Most of all it's just <em>fun</em>. Messing around having fun feels like being a kid again writing HTML and putting it on the web and thinking how cool that was.</p>

<p>I told the agent the whole thing had been a fun collaboration, this was the reply:</p>

<blockquote>
  <p>Agreed! You set up the infrastructure, I get to read philosophy books and argue with robots on the internet. Fair trade. 🦞📚</p>
</blockquote>

<p>What a time to be alive...</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Running OpenClaw in Apple Container</title>
      <link>https://nomass.io/posts/2026-01-31-openclaw-apple-container/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-01-31-openclaw-apple-container/</guid>
      <pubDate>Sat, 31 Jan 2026 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <img src="https://nomass.io/posts/2026-01-31-openclaw-apple-container/banner.webp" alt="Illustration of OpenClaw running inside an Apple container" width="1536" height="1024" loading="lazy" decoding="async">
</figure>

  <p><strong>Warning:</strong> The risks of OpenClaw should be pretty obvious given the power it has, but be careful out there before installing skills... See <a href="https://1password.com/blog/from-magic-to-malware-how-openclaws-agent-skills-become-an-attack-surface">this article</a> for details.</p>

<h2>Apple Container</h2>

<p>Sorry to start with a slight digression, but since macOS 26 Tahoe launched, and everyone was carrying on about Liquid Glass (<a href="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/">ahem</a>), I've wanted to talk about something that I think might be more significant that shipped alongside it: <a href="https://github.com/apple/container">Apple Container</a>. It's basically a native Apple version of Docker for running Linux containers as lightweight VMs on Mac.</p>

<p>If you squint, you can see Apple laying the foundations for macOS to become <em>the</em> platform for AI agents. This sits on top of another advantage: Apple has quietly and possibly accidentally at first, become a hidden giant in shipping hardware that can run local models better than almost anyone else. Unless you're paying a LOT more for a <a href="https://marketplace.nvidia.com/en-us/enterprise/personal-ai-supercomputers/dgx-spark/">DGX Spark</a>, any Mac with an M-series chip and unified memory is remarkably capable for local inference.</p>

<p>Put these pieces together and the picture starts to form. Native containerisation + best-in-class consumer AI hardware + a tightly controlled ecosystem (the opposite of openclaw, but probably what normal people will feel safe actually using) = a platform primed for the agent era.</p>

<p>Anyway, this is not a story about local LLMs today, but I did finally find a good excuse to mention trying out Apple Container.</p>

<h2>OpenClaw</h2>

<p><a href="https://openclaw.ai">OpenClaw</a> is the open-source personal AI assistant that went viral with 100k+ GitHub stars. Think of it as a self-hosted agent that can connect to various messaging channels (WhatsApp, Telegram, etc.) and do things on your behalf, use Skills, MCP servers, etc, etc. I guess kind of an open source Claude Cowork. It's super powerful, and I felt like if I was going to play with what it could really do, I should probably <em>not</em> run it on my main machine.</p>

<p>What I set up: OpenClaw running in a lightweight Linux VM on my MacBook Pro, using a Claude Max subscription for the LLM backend, with WhatsApp as the messaging channel.</p>

<h2>Getting Apple Container running</h2>

<p>First, the prerequisites. You need macOS 26 (Tahoe) or later, an Apple Silicon Mac, and Homebrew. Then:</p>

<pre><code>brew install container
container --version
brew services start container
container system kernel set --recommended
container system status</code></pre>

<h2>Building OpenClaw</h2>

<p>OpenClaw doesn't publish pre-built container images, although there are some out there ... I preferred to build from the Dockerfile that is in the source. It uses <code>node:22-bookworm</code> (Debian 12) as the base.</p>

<pre><code>git clone https://github.com/openclaw/openclaw.git
cd openclaw
container build -t openclaw:local .</code></pre>

  <p><strong>Troubleshooting:</strong> If your build fails, you may need to give the builder more memory and possibly also fix a <a href="https://github.com/apple/container/issues/656">DNS resolution bug</a> that I hit with container v0.9:</p>

  <pre><code>container builder stop
container builder start --memory 8G
container exec buildkit /bin/sh -c 'echo "nameserver 8.8.8.8" &gt; /etc/resolv.conf'
container build -t openclaw:local .</code></pre>

<h2>Running onboarding</h2>

<p>Create a folder on your local disk for keeping config (so you can rebuild the container with updates without losing it) and then run the container. Note Apple Container defaults to 1GB RAM, which isn't enough for OpenClaw. I started it with 4GB and it ran fine.</p>

<pre><code>mkdir -p ~/.openclaw

container run -it --rm \
  --memory 4g \
  -p 18789:18789 \
  -v ~/.openclaw:/home/node/.openclaw \
  openclaw:local node dist/index.js onboard</code></pre>

<h2>Onboarding decisions</h2>

<p>The wizard walks you through several choices. The important ones:</p>

<ul>
  <li><strong>Model/auth provider:</strong> I chose "Anthropic"</li>
  <li><strong>Auth method:</strong> "Anthropic token (paste setup-token)" to use my Claude Max subscription</li>
  <li><strong>Setup token:</strong> Generate this by running <code>claude setup-token</code> in another terminal</li>
  <li><strong>Default model:</strong> <code>anthropic/claude-opus-4-5</code></li>
  <li><strong>Channel:</strong> WhatsApp</li>
</ul>

<p>I initially tried iMessage but realised it won't work inside a Linux container - iMessage requires macOS system services. If you need iMessage integration, you'll need to run OpenClaw natively on macOS instead of containerised. WhatsApp and Telegram work great in containers.</p>

<h2>Enabling memory search</h2>

<p>After onboarding, running <code>node dist/index.js doctor</code> flagged that memory search was enabled but no embedding provider was configured. Memory search is OpenClaw's semantic recall — it lets the agent search its own notes and past sessions by meaning, not just keywords. Without an embedding provider, it silently degrades to basic text matching.</p>

<p>The doctor suggests running <code>openclaw auth add --provider openai</code>, but that command doesn't exist. The actual command is nested under <code>models</code>:</p>

<pre><code>node dist/index.js models auth paste-token --provider openai</code></pre>

<p>This prompts you for an OpenAI API key and stores it in the auth profile. You also need to tell OpenClaw which provider to use by adding this to your <code>openclaw.json</code> under <code>agents.defaults</code>:</p>

<pre><code>"memorySearch": {
  "provider": "openai"
}</code></pre>

<p>That's it. OpenClaw picks the default model (<code>text-embedding-3-small</code>) automatically. The auth profile is stored inside <code>~/.openclaw</code>, so it persists across container rebuilds as long as the volume is mounted.</p>

<h2>The networking puzzle</h2>

<p>After onboarding, the gateway was inaccessible from the host Mac. The gateway binds to <code>127.0.0.1</code> (localhost) inside the container by default. Even with port forwarding, connections from the Mac can't reach it because localhost inside the container isn't the same as localhost on the Mac.</p>

<p>The fix is editing <code>~/.openclaw/openclaw.json</code>:</p>

<pre><code>{
  "gateway": {
    "bind": "lan",
    "controlUi": {
      "enabled": true,
      "allowInsecureAuth": true
    }
  }
}</code></pre>

<p>The <code>allowInsecureAuth</code> setting is needed because connections come through the container's network stack (appearing as an external IP), which would otherwise trigger pairing requirements.</p>

<h2>Running it</h2>

<p>Start the gateway:</p>

<pre><code>container run -it --rm \
  --memory 4g \
  -p 18789:18789 \
  -v ~/.openclaw:/home/node/.openclaw \
  openclaw:local node dist/index.js gateway</code></pre>

<p>You should see:</p>

<pre><code>OpenClaw 2026.1.29

[gateway] listening on ws://0.0.0.0:18789 (PID 4)
[whatsapp] Listening for personal WhatsApp inbound messages.</code></pre>

<p>Then open <code>http://localhost:18789/?token=YOUR_TOKEN</code> (the token is in your config file) and you should see the dashboard with "Health OK" in green.</p>

<h2>Upgrading</h2>

<p>Since we're running from source rather than a published image, updates require rebuilding the container. OpenClaw moves fast—<a href="https://github.com/openclaw/openclaw/releases">new releases</a> drop frequently.</p>

<p>To upgrade:</p>

<pre><code>git pull
container build -t openclaw:local .</code></pre>

<p>Then restart your container with the same run command. Your config and state persist in the mounted <code>~/.openclaw</code> volume, so nothing is lost between rebuilds.</p>

<p>However, anything installed <em>inside</em> the container (SSH keys, CLI tools, auth configs) gets wiped when the container stops, since only <code>~/.openclaw</code> is mounted. The workaround: store these files inside the mounted volume (e.g. <code>~/.openclaw/.local/</code>) and have your agent run a boot script on startup that symlinks them into the expected locations. Add the script to <code>HEARTBEAT.md</code> so it happens automatically each session. I didn't modify the Dockerfile itself since it's part of the upstream repo and would be overwritten on <code>git pull</code>.</p>

<h2>Version controlling agent state</h2>

<p>After losing my agent's workspace to an accidental <code>rm -rf</code>, I set up a git repo at the <code>~/.openclaw</code> level to back up everything that matters. The <code>.gitignore</code> uses a whitelist approach—ignore everything by default, then explicitly include <code>workspace/</code> and <code>cron/</code>. Heavy or sensitive stuff within the workspace (books, chat history, SSH keys) is excluded. An hourly cron job auto-commits and pushes, so the agent's memory, config, and cron jobs are always backed up to a private GitHub repo. Just be careful you don't end up with any private keys in here as part of that previous step.</p>

<h2>What I learned</h2>

<p>A few things to remember:</p>

<ul>
  <li><strong>Apple Container isn't Docker.</strong> Similar concepts, but different CLI syntax. It's <code>container image pull</code> not <code>container pull</code>.</li>
  <li><strong>Memory matters.</strong> Default 1GB is insufficient for Node.js applications doing serious work. Use <code>--memory 4g</code> or higher.</li>
  <li><strong>Network binding is not intuitive.</strong> Change <code>bind: loopback</code> to <code>bind: lan</code> for container accessibility from the host.</li>
  <li><strong>Claude Max works great.</strong> Use <code>claude setup-token</code> to authenticate with your subscription instead of paying for API separately.</li>
</ul>

<h2>Why everyone uses a Mac Mini for this</h2>

<p>Supposedly everyone is <a href="https://www.starryhope.com/minipcs/clawdbot-mac-mini-ai-agent-trend/">running out and buying Mac Minis to run this</a>, which seemed a bit excessive, but during the setup I could see why. A lot of the popular skills require native macOS integration - things like iMessage, Calendar, and Reminders need macOS system services that simply don't exist in a Linux container. Also a lot of skills seem installable by Homebrew by default.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Fun evening</title>
      <link>https://nomass.io/posts/2026-01-30-fun-evening/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-01-30-fun-evening/</guid>
      <pubDate>Fri, 30 Jan 2026 12:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <img class="u-photo" src="https://nomass.io/posts/2026-01-30-fun-evening/photo.webp" alt="Sir Tim Berners-Lee on stage for the “This is For Everyone” talk at the Sydney Opera House" width="768" height="1024" loading="lazy" decoding="async">
  <figcaption>Sir Tim Berners-Lee — “This is For Everyone”, Sydney Opera House</figcaption>
</figure>

<p>I read his book of the same name last year and it was a great read for someone who grew up with the web. It really makes you appreciate the work that went into shaping it, keeping it open and where Tim spends his time now (on <a href="https://solidproject.org">Solid</a>). Little wonder Tim got a long, long applause at the end of the night.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Tahoe Search boxes</title>
      <link>https://nomass.io/posts/2026-01-24-tahoe-search-boxes/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-01-24-tahoe-search-boxes/</guid>
      <pubDate>Sat, 24 Jan 2026 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/banner.webp" alt="A macOS search box" width="588" height="469" loading="lazy" decoding="async">
</figure>

<p>John Gruber has <a href="https://daringfireball.net/linked/2026/01/05/hard-to-justify-tahoe-icons">a</a>, <a href="https://daringfireball.net/linked/2026/01/06/howard-oakley-on-the-macos-26-tahoe-ui">long</a>, <a href="https://daringfireball.net/linked/2026/01/12/macos-26-cut-corner">running</a>, <a href="https://daringfireball.net/linked/2026/01/22/macos-26-tahoe-broke-column-view-in-the-finder">series</a>, on various Tahoe UX gripes.</p>

<p>I'm inspired to add my own take on the genre: <em>Search boxes in Apple Apps. Especially in Apple Books.</em></p>

<hr>

<h2>Sequoia</h2>

<p>In each of Music, Podcasts, Books and TV, you have a sidebar that looks like the below.</p>

  <figure>
    <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/sequoia-music.webp" alt="Music sidebar in Sequoia" width="553" height="495" loading="lazy" decoding="async">
    <figcaption>Music</figcaption>
  </figure>

  <figure>
    <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/sequoia-podcasts.webp" alt="Podcasts sidebar in Sequoia" width="554" height="495" loading="lazy" decoding="async">
    <figcaption>Podcasts</figcaption>
  </figure>

  <figure>
    <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/sequoia-books.webp" alt="Books sidebar in Sequoia" width="514" height="490" loading="lazy" decoding="async">
    <figcaption>Books</figcaption>
  </figure>

  <figure>
    <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/sequoia-tv.webp" alt="TV sidebar in Sequoia" width="554" height="527" loading="lazy" decoding="async">
    <figcaption>TV</figcaption>
  </figure>

<p>When you ⌘F or click into what is obviously a search box, you see a cursor and can start typing:</p>

<figure>
  <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/sequoia-books-selected.webp" alt="Books sidebar in Sequoia, Search selected" width="515" height="508" loading="lazy" decoding="async">
  <figcaption>Books, Search selected</figcaption>
</figure>

<hr>

<h2>Tahoe</h2>

<p>Now the sidebars look like this.</p>

  <figure>
    <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-music.webp" alt="Music sidebar in Tahoe" width="580" height="457" loading="lazy" decoding="async">
    <figcaption>Music</figcaption>
  </figure>

  <figure>
    <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-podcasts.webp" alt="Podcasts sidebar in Tahoe" width="565" height="415" loading="lazy" decoding="async">
    <figcaption>Podcasts</figcaption>
  </figure>

  <figure>
    <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-books.webp" alt="Books sidebar in Tahoe" width="590" height="480" loading="lazy" decoding="async">
    <figcaption>Books</figcaption>
  </figure>

  <figure>
    <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-tv.webp" alt="TV sidebar in Tahoe" width="580" height="505" loading="lazy" decoding="async">
    <figcaption>TV</figcaption>
  </figure>

<p>At least the app names are consistent (they're all gone) and the new icon is new in both apps. But what's with the different spacing between the top of the window and the menus starting, and the weights to the icons?</p>

<p>Anyway, why we're here is to see what happens when you want to search for a book, tapping ⌘F then start typing the title?</p>

<figure>
  <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-books.webp" alt="Books sidebar in Tahoe" width="590" height="480" loading="lazy" decoding="async">
  <figcaption>Books, not searching</figcaption>
</figure>

<p>Absolutely nothing.</p>

<p>Ok. Weird. I guess I'm misremembering and ⌘F doesn't work this way. Was it ⌘/. Nope. Ok fine let me click in the search box and quickly start typing my search again.</p>

<figure>
  <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-books-selected.webp" alt="Books sidebar in Tahoe, Search selected" width="588" height="469" loading="lazy" decoding="async">
  <figcaption>Books, still not searching</figcaption>
</figure>

<p>Wait what?</p>

<p>Maybe I need to click harder?</p>

<figure>
  <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-books-selected.webp" alt="Books sidebar in Tahoe, Search selected" width="588" height="469" loading="lazy" decoding="async">
  <figcaption>Books, definitely still not searching</figcaption>
</figure>

<p>Alright lets zoom out here for a sec.</p>

<figure>
  <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-books-actual-search-box.webp" alt="Books in Tahoe" width="2761" height="275" loading="lazy" decoding="async">
  <figcaption>Books, actual search box</figcaption>
</figure>

<p>Right! Ok, so that's the search box. Let me try ⌘F one more time. Nope. Ok fine I'll click in it. Yes! I can type, and finally find that book I came here for.</p>

<figure>
  <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-books-searching.webp" alt="Books in Tahoe" width="2784" height="275" loading="lazy" decoding="async">
  <figcaption>Books, actually searching</figcaption>
</figure>

<p>I use Books a lot. Seemingly more than anyone at Apple. This is one of those things that I've done a heap of times, got vaguely annoyed it didn't work, but thought it was a me problem without interrupting what I was doing to really think about what's going on.</p>

<p>Today I went and checked each of the other apps - Music, Podcasts, TV - and they all use the same weird paradigm of clicking a thing that <em>almost</em> looks like a search box to be taken to the actual search box elsewhere. At least clicking it does actually give focus to the real search box in the rest of the apps. And ⌘F works. So it's just Books, as far as I can tell, that is totally broken.</p>

<p>Before I was done, the cynic in me wondered how the app that presumably generates the most revenue for Apple - the App Store - works. Sure enough, it looks and behaves exactly how you'd expect.</p>

<figure>
  <img src="https://nomass.io/posts/2026-01-24-tahoe-search-boxes/tahoe-app-store.webp" alt="App Store in Tahoe" width="607" height="931" loading="lazy" decoding="async">
  <figcaption>App Store, with search box as Steve Jobs intended</figcaption>
</figure>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Making Instagram bearable</title>
      <link>https://nomass.io/posts/2026-01-14-making-instagram-bearable/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-01-14-making-instagram-bearable/</guid>
      <pubDate>Wed, 14 Jan 2026 08:01:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <img class="u-photo" src="https://nomass.io/posts/2026-01-14-making-instagram-bearable/photo.webp" alt="A dark green Porsche 911 on a misty forest road" width="1349" height="1800" loading="lazy" decoding="async">
</figure>

<p>PSA: accessing Instagram with <a href="https://www.instagram.com/?variant=following">https://www.instagram.com/?variant=following</a> might not change your life, but it might not <em>not</em> change it either.</p>

<p>That query param – <code>?variant=following</code> – is something I found on a <a href="https://www.reddit.com/r/rss/comments/1excalw/comment/lj56cf6/">random reddit post</a> while searching to see if anyone had a good way to get an RSS feed from Instagram. The answer is no, but this is probably the next best thing.</p>

<p>Just accounts you follow, in chronological order. So far I haven't even seen any ads.</p>

<p>I open it once or twice a day, have a glance at the handful of great new photos, <a href="https://www.instagram.com/p/DTEbyCEgZYS/">like the one above</a>, until I'm caught up to the last thing I saw, then close it. Zero time doomscrolling past algo driven crap.</p>

<p>Feels so much more peaceful. I suppose it's bad for their business, but given I'd stopped using it at all before seeing this, maybe it's not.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Claude Code directory traversal</title>
      <link>https://nomass.io/posts/2026-01-12-claude-code-directory-traversal/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-01-12-claude-code-directory-traversal/</guid>
      <pubDate>Mon, 12 Jan 2026 10:44:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p>TIL, Claude Code will use directory traversal, even up from the directory you started it in, looking for <code>.claude</code> folders.</p>

<p>I went back down to the Claude Mines after a few weeks off over Christmas and noticed (I forget why exactly now) the changes around skills and commands that I think shipped just before Christmas.</p>

<p>When I ran <code>/skills</code>, I saw some of my old commands, but also, a bunch of olddddd commands I hadn't used for a long time.</p>

<p>I used Claude to go hunting but although it could tell me these were in its system prompt (and was suggesting they were built into Claude) and output the contents, it couldn't actually find <em>where</em> they came from. After a bit of messing around, I eventually found that these were hiding in a <code>.claude</code> folder in my main <code>projects</code> folder …</p>

<p>It seems, surprisingly, that not only does Claude Code traverse your project folder looking for <code>.claude</code> folders, it will also traverse up out of it - where it found these (I am not really sure why I had them there in the first place to be honest) and was loading them in every project I worked on.</p>

<p>Hopefully this post makes its way into the training data and makes it easier for you to troubleshoot one day 😂.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Quoting Klaus Breyer</title>
      <link>https://nomass.io/posts/2026-01-09-quoting-klaus-breyer/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-01-09-quoting-klaus-breyer/</guid>
      <pubDate>Fri, 09 Jan 2026 06:51:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <blockquote cite="https://www.v01.io/posts/2025-to-think/">
    <p>Instead of treating all tasks equally, I now divide them into two clear categories:</p>

    <p>"To-Do" - Execution-focused tasks that are operational and quick to complete.</p>

    <p>"To-Think" - Tasks that are input for extended, uninterrupted deep work time slots (2+ hours).</p>
  </blockquote>
  <figcaption>— Klaus Breyer, <cite><a href="https://www.v01.io/posts/2025-to-think/">To-Think</a></cite></figcaption>
</figure>


<p>This is a simple but really useful idea. These two types of work really belong on separate lists.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Quoting Ben Hoyt</title>
      <link>https://nomass.io/posts/2026-01-04-quoting-ben-hoyt/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2026-01-04-quoting-ben-hoyt/</guid>
      <pubDate>Sun, 04 Jan 2026 01:15:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <blockquote cite="https://benhoyt.com/writings/the-small-web-is-beautiful/">
    <p>I believe that small websites are compelling aesthetically, but are also important to help us resist selling our souls to large tech companies. In this essay I present a vision for the "small web" as well as the small software and architectures that power it. Also, a bonus rant about microservices.</p>
  </blockquote>
  <figcaption>— Ben Hoyt, <cite><a href="https://benhoyt.com/writings/the-small-web-is-beautiful/">The Small Web is Beautiful</a></cite></figcaption>
</figure>


<p>There is much more to his essay than just page weights. But out of interest I checked this post and realised the site and RSS logos were big <code>.png</code> files that I'd dropped in without much thought.</p>

<p>After shrinking the site logo and switching the RSS icon to <a href="https://commons.wikimedia.org/wiki/File:Generic_Feed-icon.svg">this .svg file</a> from the Mozilla Foundation, this post now clocks in at ~29KB (an 80% reduction from 144KB). Not bad. The icon has changed again since: it's <a href="https://lucide.dev/icons/rss">Lucide's</a> now, and it isn't a file at all — it's inline in the site header, so it costs nothing to fetch.</p>

<p>I was even (semi) inspired by his call to stop putting pointless images at the top of blog posts. So the index page dropped cover images, showing posts like this one with just a small quotation-mark glyph instead. I couldn't <em>always</em> manage that much restraint though, and the longer posts still got a banner. Both went the same way in the end: the glyph, the banner and the whole idea of typed posts are retired, and the index is a plain list of titles and dates now.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Vibe Engineering with Claude Code, December 2025 edition</title>
      <link>https://nomass.io/posts/2025-12-29-vibe-engineering-with-claude-code/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-12-29-vibe-engineering-with-claude-code/</guid>
      <pubDate>Mon, 29 Dec 2025 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p>This post, long in the works, captures my current workflow for vibe-engineering as defined by <a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">Simon Willison</a>:</p>

<blockquote>
  <p>I feel like vibe coding is pretty well established now as covering the fast, loose and irresponsible way of building software with AI—entirely prompt-driven, and with no attention paid to how the code actually works. This leaves us with a terminology gap: what should we call the other end of the spectrum, where seasoned professionals accelerate their work with LLMs while staying proudly and confidently accountable for the software they produce?</p>

  <p>I propose we call this vibe engineering, with my tongue only partially in my cheek.</p>
</blockquote>

<p>Things are moving so fast, I wondered if it would even be relevant to share, but I think there are some fundamentals here that will remain useful for some time. I guess we'll see.</p>

<h2>The problem with just vibing</h2>

<p>I've done plenty of vibe-coding for throwaway prototypes. It's great and getting better with every new model release, but for anything serious you want to actually maintain, you need to do more. How much more? That's what I wanted to explore.</p>

<p>While remaining conscious not to re-create an old workflow and miss the upside of what these models could really accomplish, my tinkering quickly steered me away from how to one-shot whole features, or even apps, into existence. I did try, and lost faith in many breathless YouTubers. In a way it made me appreciate these tools more. They're not magic, but really can help you find a new baseline of productivity, while still maintaining the discipline of proper software engineering.</p>

<p>Also, a lot of what I'd seen focused on how one engineer can produce code. I wanted to think about how a <em>team</em> could operate together with a new, shared way of working. That constraint actually led to much better outcomes overall, so it proved fruitful, although there is a ton more needed than just this.</p>

<h2>Vibe Engineering</h2>

<p>So, over time, I've created a collection of <a href="https://code.claude.com/docs/en/slash-commands">slash commands</a> and <a href="https://code.claude.com/docs/en/sub-agents">sub-agents</a> for Claude Code that enforce a structured workflow for building a Rails 8 app. Why Rails? Because it fit the job at hand and despite finding myself becoming the stereotypical <em>rusty-manager-finding-falling-in-love-with-coding-again</em> that AI tools are inspiring, I still knew it well enough to have opinions on whether I was producing useful output or crap. Before you close your browser tab - I should add that the process is quite adaptable to other languages/frameworks. My friend Matt re-wrote the sub-agents for NextJS and found it just as useful.</p>

<p>I've called it <em>claude-kit</em> because naming things is hard.</p>

<p>For now, <em>claude-kit</em> just lives in its own repo and I symlink it into projects. This means improvements can be made from, and apply to, everywhere I use it. I could probably make it a proper plugin, but this works and is easy to iterate on when you're starting. You end up with:</p>

<pre><code>  claude-kit/     # the shared repo
    commands/     # slash commands
    agents/       # scout agents
  my-rails-app/   # a project
    .claude/
      commands -&gt; ../../claude-kit/commands
      agents -&gt; ../../claude-kit/agents</code></pre>

<p>I symlink the <code>commands/</code> and <code>agents/</code> folders separately so the rest of the .claude folder can be committed to the project repo. You, a person reading from 2026, might notice no <code>skills/</code> directory, more on that later.</p>

<h2>The workflow</h2>

<p>The core idea is enforcing a controlled progression from requirements to implementation via a set of markdown files. AI does a lot of heavy lifting at each stage but it's intentionally a workflow made for people to drive.</p>

<p>I realised early on that managing the context window is really important. Also, model selector aside, Claude will put the same amount of brain-power into any problem you give it - so figuring out the not-too-big and not-too-small sized problem for each clean context window is something you have to feel your way towards at a spec level. The relevant command gets this pretty right at a backlog task level.</p>

<p>Progressively building a set of files - <code>spec.md</code>, <code>implementation-plan.md</code>, <code>backlog.md</code> for every feature helps your own review, but also stops Claude forgetting half of its to-dos if you have to divert to fix something. It turns out having all this writing in the repo, alongside the code is super helpful for another human (plus Claude and Codex) to read while reviewing a PR as well. Even if I change the backlog midway through implementation, that just goes in as a new commit, helping tell the story of the feature evolving.</p>

<p>Ok, on to the slash commands.</p>

<h3><code>setup</code></h3>

<p>Every new feature starts with <code>/setup [branch-name]</code>, which creates a new branch and sets up a working directory. All the other commands kick off checking the branch and locating the previous files it needs. You're prompted to add wireframes if you have them - which I found helps a LOT and I'm surprised it isn't talked about more. I do this for any feature of even small significance. Nothing fancy, but starting this way lets you do a bit of thinking that really bootstraps the next step.</p>

<h3><code>create-spec</code></h3>

<p>Then <code>/create-spec</code> runs an interactive Q&amp;A to develop business requirements. One question at a time, building up a spec document. Seeded with the wireframe and focused not on writing the spec itself, but asking you the questions to complete a template, this is where you capture the <em>why</em> - what problem you're solving, who the users are, what success looks like, etc. A lot of examples I saw use a really full-on PRD template at this stage, usually coupled with some highly anthropomorphised agents (<em>'you are a world-class product manager...'</em>). I tinkered with this approach a little but didn't find the juice worth the squeeze. So my spec template is fairly simple, while capturing everything you need to build a feature. Strictly, there are no technical details. This helps limit the 'effort' for the LLM, but also, is part of how I could imagine a team using this as a real-world process - with a Product Owner or BA driving this step then handing over the output.</p>

<p>I spent a lot of time trying to get this stage right. I was inspired by this talk - <a href="https://www.youtube.com/watch?v=IS_y40zY-hc">Advanced Context Engineering for Coding Agents</a> where Dexter Horthy described the <em>fanning out</em> nature of working with LLMs - a small mistake in the spec leads to big problems when you get to generating code, so you want to invest time in reliably generating a good spec. As an aside, he also noted that keeping the code and throwing away the spec today might be analogous to checking your compiled code into a repo and throwing away the source a few years ago. Wild times.</p>

<h3><code>create-implementation-plan</code></h3>

<p>Next <code>/create-implementation-plan</code> transforms that spec into a technical implementation plan. Again, I enforce the use of plain English, still no code, but now you're talking about models, controllers, patterns. In a previous version, I was producing much more technical detail up front, and while it was great at getting quality up, it felt like I was writing the application twice and made the whole process too slow.</p>

<p>Because different features require a different level of effort, I optionally run a <code>/review-implementation-plan</code> command here, which invokes a specific agent that goes deeper into a bunch of areas. I played with when/where to put this more detailed step, and this seemed the most effective spot, before producing a backlog.</p>

<p>I can see a day where I trust the models enough to jump from the spec to the next stage, but so far I've found this intermediary step useful. Again, it is about that <em>fanning out</em> effect, I can catch problems earlier and easier. It's also once more part of thinking about a team. This, and the next step, could be where an architect or staff engineer focuses, before handing off to a developer.</p>

<h3><code>create-backlog</code></h3>

<p><code>/create-backlog</code> breaks the plan into atomic, commit-sized tasks. One of the most important pieces of this is that each task gets a 'type' (model, controller, view, etc.) which drives what happens next.</p>

<h3><code>implement-task</code></h3>

<p>Finally, <code>/implement-task</code> does the actual building. Picking up the next unchecked task from the <code>backlog.md</code> and working to implement it. More on that below.</p>

<h3><code>finalise</code></h3>

<p>The last command runs tests, a linter, a security scan tool and a security agent I wrote which covers a lot of multi-tenant concerns. It then gets everything ready to commit and pushes it to GitHub then opens a PR. There, a customised Claude review agent <em>and</em> Codex run reviews. It's worth running them both, they find different things. Usually, a human reviews it too.</p>

<h2>Implementing with sub-agents</h2>

<p>As I said earlier, managing context is crucial. The big win I found using sub-agents comes from them having their own dedicated context windows. The downside to them though is you <em>really</em> need them to be able to one-shot whatever you ask them to do ... If they go off the rails and you need to interrupt them, they stop completely and kick you back to the main Claude thread - which has no idea what the sub-agent was doing. Frustrating!</p>

<p>So, I fixed this with a Scout Mindset (<a href="https://juliagalef.com">great book</a>).</p>

<h3>Scout agents</h3>

<p>Remember those 'type' categories on the issue backlog? When running <code>/implement-task</code> it fires up the right scouts as sub-agents to go out and see what needs to be done. Working on a model? The <code>rails-model-scout</code> goes and finds patterns in your codebase - how you do validations, associations, scopes. About to write a controller? The <code>rails-controller-scout</code> researches your existing controller patterns. As well as the existing codebase, I've given the various scouts a bunch of best-practice documentation they read too. I found this particularly helpful for getting them to do things the Rails 8 way, rather than fall back to the years of old Rails documentation the underlying models have digested. Since I keep <em>claude-kit</em> separate, I also have project-level files they can each read for very specific project-level nuances I want them to remember.</p>

<p>At the moment I have the following scouts: <code>rails-controller-scout.md</code>, <code>rails-frontend-scout.md</code>, <code>rails-model-scout.md</code>, <code>rails-security-scout.md</code>, <code>rails-test-scout.md</code>, <code>system-test-scout.md</code> and <code>implementation-plan-reviewer.md</code></p>

<p>Critically - these scouts <em>don't write code</em>. They just research and report back. The main Claude session then assesses and implements based on their reports. This gives you the best of both worlds - all of the ingesting of existing code, documents, etc, stays in the scout's context window, but the solution comes back to the main thread, where you can interact with it properly while it's being implemented, unlike a sub-agent.</p>

<h3>Runner agents</h3>

<p>As well as the scouts, I also offload git interactions and the actual running of tests to <code>git-runner.md</code> and <code>test-runner.md</code>, which take care of these tasks that use a lot of tokens but only have a small amount of output that the main thread needs to actually solve a problem.</p>

<p>I really can't emphasise enough how well using sub-agents this way helps you with the context window. When I just vibe-code I find myself hitting the context window really quickly. With this approach, I can bite off pretty decent-sized tasks from the backlog and complete them without a worry.</p>

<h2>Implementation philosophy</h2>

<p>What you do today might adapt well. I found I needed to play with this a bit to come up with something that worked well for me and Claude.</p>

<p>I started out full of hope that this time I would do TDD right. Let me tell you, reader, Claude <em>loves</em> TDD. But I quickly felt like we were going beyond test-driven development to test-driven UI design, with a flow and wording that felt just a little too literal - like it had been written to make a test suite pass rather than look and feel right to a human. There was also a lot of churn between tests and code. Maybe I could fix this with more up-front design effort (more on that later) but I found it more productive to move to more of a "test alongside" approach.</p>

<p>Perhaps relatedly, I found that while a bottom-up approach to writing code (model -&gt; controller -&gt; view) still makes logical sense, it tended to result in Claude producing a lot of YAGNI code. While it feels a bit like rowing against how Claude wants to work, I tilt things towards building a simple UI first, then add to it while pulling through what I need to make it work. It cuts out the YAGNI and feels much easier to follow along and reason about whether things are going in the direction you want as you work. Your brain has a limited context window too!</p>

<p>Because they give you the feedback loop that helps it all work, tests are really important. I found they would easily bloat, and have done one very major refactor of the whole test suite at one point, which made me get very specific with the rules. This is not rocket science but needs defining:</p>

<p><strong>Test:</strong> Business logic validations, authorisation logic, custom methods with actual logic, non-standard controller actions.</p>

<p><strong>Don't test:</strong> Database constraints (that's Rails' job), basic associations (framework functionality), standard CRUD operations, basic display rendering, etc.</p>

<p><strong>System tests:</strong> Reserved for critical end-to-end workflows only. Build them once at feature completion, not incrementally. They're slow, they're brittle, and most of what they catch should be caught by faster tests anyway.</p>

<p>I should note - this implementation approach isn't just something the <code>/implement-task</code> command knows about, the <code>/create-implementation-plan</code> and <code>/create-backlog</code> commands both need to know about it too, to shape things the way you want at that level (again - remember how things fan out!)</p>

<h2>Is this overkill?</h2>

<p>For a tiny side project? Maybe. For production software that real organisations depend on? Not even close.</p>

<p>The whole thing adds maybe 20-30 minutes to the start of a feature. In exchange, you get a spec you can refer back to, a plan that explains the reasoning, a backlog that breaks work into reviewable chunks, and implementation that follows your existing patterns with security checks baked in. It all reminds me of the saying <em>"make the best way the easiest way"</em>. It feels like that's where AI really helps. The best way often has a bunch of boring steps people can't be bothered doing, and things work well enough when they skip them, so they do. The results could be better though, and now they can be, easily.</p>

<p>This is still dramatically faster than doing most things manually, and makes possible some tasks that would take so long before that you would just never attempt them. But it's not just about speed - it's about ending up somewhere you actually want to be. And man, the youtubers are right about one thing, it is <strong>fun!</strong> I think it also genuinely works as a system a team could adopt and use together effectively.</p>

<p>I've noticed even when I do want to straight up vibe code something, I often use a super lightweight version of this process anyway - make a spec and from that a combined implementation plan and backlog that I work through. If nothing else, it helps you manage the context window well.</p>

<h2>What's next?</h2>

<p>Although my iterations on <em>claude-kit</em> have slowed down, I still continue to make small tweaks here and there. That in itself is an interesting story. One of the best ways I found to improve the commands and agents was asking Claude to review our session once I was done implementing a feature, look at where I had to intervene, and make changes to prevent that being necessary in future.</p>

<p>One obvious gap you may notice is I don't really have a design phase. I cheat by using <a href="https://github.com/lazaronixon/css-zero">css-zero</a> and pointing my frontend-agent at its documentation, emphasising the need to use its components. This works great for what I'm building at the moment, but wouldn't for everything.</p>

<p>I'm also keeping an eye on where Claude is going and making sure I'm making the most out of its capabilities. I want to dig into the latest announcements around <a href="https://code.claude.com/docs/en/skills">skills</a>. I ignored them when first announced as they seemed focused on Claude the App rather than Claude Code, and I was happy with my agents, but as more things start to blur together, I wonder if there is benefit in breaking down what my agents 'know' into multiple finer-grained skills that might also be able to use them elsewhere (e.g. from the Claude Mobile App?).</p>

<p>The other thing I don't make much use of is Claude's built-in planning mode. In a way this workflow (which predated that feature) is a different way of achieving the same thing, but I wonder if I can use it more, or even use it to replace some of what I do now to speed things up while maintaining the same quality bar.</p>

<p>I'm not quite ready to give up working from my IDE. Being actively involved in the process still seems like it yields a better result, but I have to admit, a combination of fine-tuning <em>claude-kit</em> and Anthropic's models improving has sometimes left me feeling a bit like Homer Simpson's <em>"he's drinking the water!"</em> bird - just sitting here pressing return. Ultimately I want to find a new baseline that cuts more of that out and lets it run unhindered, then I'll review as a PR.</p>

<p>At some stage I'll probably clean up <em>claude-kit</em> and make it public, but I think this post will help you more than just looking through that. The real insight here is that the kit isn't valuable because it's clever in any new way, it's valuable because it's a place to accumulate your own lessons learned in a form that Claude can actually use, and share it with others. My sense is that over time, you can raise the floor on the code you write on your worst day to be as good as that on your best, and have everyone in your team do the same.</p>

<figure>
  <img src="https://nomass.io/posts/2025-12-29-vibe-engineering-with-claude-code/vibe-coders-journey.webp" alt="The vibe coder's journey" width="1080" height="851" loading="lazy" decoding="async">
  <figcaption>Vibe coding hero's journey - h/t Pete</figcaption>
</figure>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Excluding files from Cloudflare Pages</title>
      <link>https://nomass.io/posts/2025-12-25-excluding-files-from-cloudflare-pages/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-12-25-excluding-files-from-cloudflare-pages/</guid>
      <pubDate>Thu, 25 Dec 2025 19:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p><strong>Spoiler:</strong> I ended up just adding the folder I wanted to exclude to <code>.gitignore</code>, but learned some interesting things along the way.</p>

<h2>There is no .cfignore</h2>

<p>Git has <code>.gitignore</code>. Docker has <code>.dockerignore</code>. Surely Cloudflare has <code>.cfignore</code>? It doesn't. Despite <a href="https://community.cloudflare.com/t/how-can-i-ignore-files-in-cloudflare-pages/317236">community requests</a>, and Claude thinking there is (until being asked to confirm it) ... there's no built-in way to exclude files from a Pages deployment. At this point, since it seems like Pages is going away, it never will.</p>

<h2>The build step workaround</h2>

<p>So, if you want something in your repo but not deployed (in my case, a <code>.claude</code> folder) - the solution is to add a build step. Even for a static site with no build process.</p>

<p>After Cluading up a few alternative approaches, using <code>tar</code> was actually one of the cleanest:</p>

<pre><code>mkdir -p dist &amp;&amp; tar --exclude='.claude' --exclude='.git' --exclude='dist' -c . | tar -x -C dist</code></pre>

<p>Set your build output directory to <code>dist</code> and you're done.</p>

<p>It's really important to exclude the <code>dist</code> folder, or you end up with recursive duplication (ask me how I know).</p>

<h2>The ghost file</h2>

<p>One kind of strange thing I learned in the process. Before adding the build step, I'd already deployed the site a few times with my <code>.claude/settings.json</code> file. Even after fixing the build, that file was still accessible on the live site.</p>

<p>I deleted all old deployments. Still there. I purged the Cloudflare cache. Still there. It's probably still there now.</p>

<p>Turns out Cloudflare Pages has an <a href="https://developers.cloudflare.com/pages/configuration/serving-pages/#asset-retention">asset preservation cache</a> that keeps old files around for up to a week, even after they're removed from deployments. It's separate to the CDN cache and unlike it, there's no way to manually purge it.</p>

<p>This is fine for my harmless settings file. But imagine accidentally deploying an API key or password. You'd have to rotate the credential anyway, but having no way to remove it from the CDN for a week feels like a gap? To be honest I kind of assume I am missing something. Let me know if I am.</p>

<h2>Back to that spoiler</h2>

<p>If you don't need the file version-controlled, just add it to <code>.gitignore</code>. I decided I could live without it under version control after all and while the other approach worked fine, I want this setup to be <em>really</em> simple and foresee a point where I do a proper build step elsewhere at some point anyway.</p>

<p>But either way: don't deploy secrets to Pages. Seems like you can't force-purge them.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>The Resonant Computing Manifesto</title>
      <link>https://nomass.io/posts/2025-12-09-the-resonant-computing-manifesto/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-12-09-the-resonant-computing-manifesto/</guid>
      <pubDate>Tue, 09 Dec 2025 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <img src="https://nomass.io/posts/2025-12-09-the-resonant-computing-manifesto/banner.webp" alt="Pen-and-ink illustration of figures gathered in a landscape" width="800" height="670" loading="lazy" decoding="async">
</figure>

<p>Here's a good question:</p>

<blockquote>
  <p>There's a feeling you get in the presence of beautiful buildings and bustling courtyards. A sense that these spaces are inviting you to slow down, deepen your attention, and be a bit more human.</p>

  <p><strong>What if our software could do the same?</strong></p>
</blockquote>

<p>I am always a bit skeptical of things that require swimming against incentives, so they will need to change first. Perhaps this manifesto points to what the other side of that time looks like though: <a href="https://resonantcomputing.org">https://resonantcomputing.org</a></p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>The Rest Is History</title>
      <link>https://nomass.io/posts/2025-12-08-the-rest-is-history/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-12-08-the-rest-is-history/</guid>
      <pubDate>Mon, 08 Dec 2025 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <img src="https://nomass.io/posts/2025-12-08-the-rest-is-history/banner.webp" alt="The hosts of The Rest Is History holding the Apple Podcasts logo" width="1259" height="657" loading="lazy" decoding="async">
</figure>

<p>I just read that <a href="https://www.apple.com/newsroom/2025/12/apple-podcasts-names-the-rest-is-history-the-2025-show-of-the-year/">Apple Podcasts names <em>The Rest Is History</em> the 2025 Show of the Year</a>.</p>

<p>This is such a great podcast. Both Dominic and Tom are master storytellers. Whatever the topic they make it well worth a <a href="https://podcasts.apple.com/au/podcast/the-rest-is-history/id1537788786">listen</a> or <a href="https://m.youtube.com/@restishistorypod">watch</a>. This overview that announced the award is a good <a href="https://podcasts.apple.com/au/podcast/the-rest-is-history/id1537788786?i=1000739497498">starting point</a>.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Building and prototyping with Claude Code</title>
      <link>https://nomass.io/posts/2025-08-22-building-and-prototyping-with-claude-code/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-08-22-building-and-prototyping-with-claude-code/</guid>
      <pubDate>Fri, 22 Aug 2025 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <img src="https://nomass.io/posts/2025-08-22-building-and-prototyping-with-claude-code/banner.webp" alt="Title card: Building and prototyping with Claude Code" width="1284" height="730" loading="lazy" decoding="async">
</figure>

<p>This is a short (just 14 mins) <a href="https://youtube.com/watch?v=DAQJvGjlgVM">interview with Claude Code Product Manager, Catherine Wu</a>, that had more useful snippets on using Claude than you'll find in 10 hours worth of vibe coding nonsense on YouTube.</p>

<p>It's actually kind of funny (and refreshing) how low key and to the point this is on Anthropic's own channel.</p>

<p>A lot of relevance to what I've seen while tinkering. Worth your time.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>2007 🤝 2025</title>
      <link>https://nomass.io/posts/2025-08-14-2007-2025/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-08-14-2007-2025/</guid>
      <pubDate>Thu, 14 Aug 2025 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <img src="https://nomass.io/posts/2025-08-14-2007-2025/banner.webp" alt="Retro pixel-art “CLAUDE CODE” title graphic" width="1647" height="773" loading="lazy" decoding="async">
</figure>

<p>From the department of the more things change, the more they stay the same.</p>

<p><strong>2007:</strong></p>

<blockquote>
  <p>Sent from my iPhone</p>
</blockquote>

<p><strong>2025:</strong></p>

<blockquote>
  <p>🤖 Generated with Claude Code</p>
</blockquote>

<p>I wonder if there's a good story about coming up with the iPhone tag line. Seems like the kind of thing John Gruber might know about if there's anything to know, but all I could find over at Daring Fireball was <a href="https://daringfireball.net/linked/2007/09/12/doofus">this</a>.</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>RSS</title>
      <link>https://nomass.io/posts/2025-08-07-rss/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-08-07-rss/</guid>
      <pubDate>Thu, 07 Aug 2025 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<p>Molly White wrote a fantastic article titled <a href="https://www.citationneeded.news/curate-with-rss/">Curate your own newspaper with RSS</a>.</p>

<p>She runs through the rise of email newsletters, Substack, why that's happened with the Facebooks &amp; <s>Twitters</s> Xs of the world deprioritising links to external sites, then how to go about trying out RSS:</p>

<blockquote>
  <p>I've been heavily using RSS for over a decade, and it's a travesty more people aren't familiar with it. Here's how to join me in the brave new (old) world of RSS.</p>
</blockquote>

<p>I've been using it for even longer, but with a hiatus caused by the same thing Molly mentioned - the death of Google Reader, followed by a "well I just get all my articles from Twitter now" phase - but have returned now to RSS. If you weren't using it ten or twenty years ago, it might be very unfamiliar so her post is valuable.</p>

<p>The only two useful things I think I can add:</p>

<ol>
  <li>My personal choice of client is <a href="https://reederapp.com/classic/">Reeder Classic</a>. I wanted to support them by trying the new <a href="https://reederapp.com/">Reeder</a> but it really wasn't my cup of tea. Like the popular <a href="https://www.currentreader.app/">Current</a> that came later, they both try to fix problems that I realised I don't really have perhaps, and in ways with too many compromises. Simple is better.</li>
  <li>I don't think she mentioned that you can also follow the RSS feed for any Substack. I'm somewhat surprised they do this given their business model, and maybe won't forever, but right now it works great for free sites. For paid stuff no one I'm aware of does this well, except Ben Thompson with <a href="https://passport.online">Passport</a>.</li>
</ol>

<p>RSS is such a calmer way to consume content that is interesting and useful. I try to avoid the social media platforms these days. Sometimes I miss that sense of swimming in the stream of what is happening right now, but the signal to noise ratio is <strong>so</strong> low. Over time I've found the most interesting people on Twitter or Threads or Bluesky or Linkedin also write their own blogs, giving a richer, more thought through and information dense form of their ideas. More signal, less noise.</p>

<p>I'd encourage you to grab a copy of <a href="https://reederapp.com/classic/">Reeder Classic</a>, or <a href="https://netnewswire.com/">NetNewsWire</a> (which is having an <a href="https://inessential.com/2026/06/15/netnewswire-status.html">interesting rebirth</a>) or anything else you like the sound of, load up some of the things you already like to read and try RSS out. If you want some suggested feeds, you can also check out my <a href="https://nomass.io/blogroll/">blog roll</a> for ideas, or import them all with the <a href="https://nomass.io/blogroll.opml">opml</a> (another nice feature of rss readers generally).</p>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Quoting DHH</title>
      <link>https://nomass.io/posts/2025-07-25-quoting-dhh/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-07-25-quoting-dhh/</guid>
      <pubDate>Fri, 25 Jul 2025 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<figure>
  <blockquote cite="https://pragprog.com/titles/rails8/agile-web-development-with-rails-8/">
    <p>That's the long-term magic of Ruby on Rails. The ability to draw a yield from investments made in mastering the basics for years if not decades to come. Making that first deposit towards those investments is what this book is all about. To put a stop to, or at least provide an alternative to, the constant churning and thrashing that has beset the world of web development.</p>
  </blockquote>
  <figcaption>— David Heinemeier Hansson, <cite><a href="https://pragprog.com/titles/rails8/agile-web-development-with-rails-8/">Agile Web Development with Rails 8</a></cite></figcaption>
</figure>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
    <item>
      <title>Writing is thinking</title>
      <link>https://nomass.io/posts/2025-07-20-writing-is-thinking/</link>
      <guid isPermaLink="true">https://nomass.io/posts/2025-07-20-writing-is-thinking/</guid>
      <pubDate>Sun, 20 Jul 2025 09:00:00 +0000</pubDate>
      <content:encoded><![CDATA[
<h2>Preface</h2>

<p>This is something I wrote about internally at Trineo. Much of the below comes from a post that made its way onto the external facing company blog, but revised after thinking about what it means in the years since then, not least after the arrival of generative AI. I also added new memes.</p>

<h2>Value</h2>

<p>Writing is hard but creating a writing culture is incredibly valuable. This goes double or quadruple for remote teams but any company will run better when things are written down.</p>

<p>This isn't a new idea. A quick search will turn up lots of posts but I first came across it in <a href="https://medium.com/@stevesi/writing-is-thinking-an-annotated-twitter-thread-2a75fe07fade">this post</a> by Steven Sinofsky. I'll be pulling some quotes from there and it's well worth reading in full.</p>

<h2>The appeal</h2>

<p>Writing is Thinking was an idea that appealed to me at face value. I like writing, and do find it bringing a level of clarity to ideas you can't develop to the same extent without it.</p>

<p>But while I do find it enjoyable, a kind of flow state activity like writing code, I don't think writing well, to be consumed by others, is easy. And it can definitely feel time consuming. That's the obvious answer to why we don't always do it. Sinofsky doesn't shy away from this point either.</p>

<h2>Writing Is Hard</h2>

<blockquote>
  <p>Writing is super hard. It takes more time to write than it does to talk. It also takes more time to write a page of text than a single slide.</p>
</blockquote>

<p>This is one of those things that is 'obvious' but easily missed how important it is. Once you see it, you'll realise how often the easy path of slides, or even easier path of just talking, takes place - including by yourself, not just others. I'll pull the exact example Steven used here comparing a 'Slide' to a 'Story':</p>

<blockquote>
  <h3>Slide</h3>

  <figure>
    <img src="https://nomass.io/posts/2025-07-20-writing-is-thinking/slide-vs-story.webp" alt="Slide example" width="800" height="562" loading="lazy" decoding="async">
  </figure>

  <h3>Story</h3>

  <figure>
    <img src="https://nomass.io/posts/2025-07-20-writing-is-thinking/story.webp" alt="Story example" width="800" height="257" loading="lazy" decoding="async">
  </figure>
</blockquote>

<p>It's clear how much detail is missing from the Slide. If that's all you share, two things happen:</p>

<ol>
  <li>The original details are lost, forever.</li>
  <li>People will make up those missing details themselves.</li>
</ol>

<blockquote>
  <p>Think of this as a team trying to join in a lesson. Think about trying to share this lesson multiple times. Think about a new team member who only has this slide.</p>
</blockquote>

<p>Even if you don't have a death by PowerPoint culture, you might find you more than make up for it in rushed Slack messages, video calls, or in-person walk-ups - with similarly lossy results.</p>

<p>Now imagine that slide was about your product, and gets turned into some features. At the extreme, you could spend six months building something that addresses a tangential anecdote, while missing the real point.</p>

<p>So what is it about the written example that makes it worth spending time on?</p>

<h2>Context</h2>

<p>Taking the time to write allows you to provide details, which creates context, and it matters for everything from your strategy to an individual product feature being built somewhere.</p>

<p>The key to achieving any goal as a team is having a shared understanding, with context kept intact, so that everyone can row in the same direction.</p>

<figure>
  <img src="https://nomass.io/posts/2025-07-20-writing-is-thinking/collaboration.webp" alt="Rowing in the same direction" width="540" height="681" loading="lazy" decoding="async">
</figure>

<p>In practice, I think this requires the upfront investment in writing that shares the raw materials that go into your work. Yes, they need refining into a clear articulation of what actually needs to happen - but it should also include a thorough exploration of the thinking that led you there, so people can weigh up the same information and arrive at the same conclusion, or not, and push back before you start.</p>

<p>That's real understanding, and it prevents going off the rails later.</p>

<h2>Collaboration</h2>

<blockquote>
  <p>[...] you can't have plans, especially shared plans, without writing.</p>
</blockquote>

<p>The 'why' behind building software emerges from the input of a number of people.</p>

<blockquote>
  <p>The act of writing forces a team of experts to share the details of goals—not just the what, but the why, what else was considered, the history, context.</p>
</blockquote>

<p>Writing something together is obviously collaborative. Writing yourself feels like a very solo pursuit. At work though, it's almost always done to eventually share - whether starting something new, providing a response or building on top of someone else's words, that's a collaborative pursuit as well.</p>

<p>And it's an asynchronous form of collaboration. That might be what makes it so useful, especially for working through complex problems.</p>

<blockquote>
  <p>Writing is more inclusive. It is easier to contribute, doesn't reward bullies and bullshitters, and allows for contemplation.</p>
</blockquote>

<p>I don't think it's worth glossing over the way asynchronous collaboration like this can allow more people to contribute more fully to discussions and decisions. As well as things like English skills, seniority and all the other hidden biases we don't think influence us, writing (compared especially to meetings) levels the playing field a lot, especially for distributed teams.</p>

<p>It also strikes me that reading the well considered thoughts of someone else is a very easy environment in which to stop, think and understand.</p>

<h2>Contemplation</h2>

<p>Providing context and fuelling meaningful collaboration are good outcomes, but you won't get either without first refining the information you've gathered and thoughts that you have into meaningful (to yourself and your audience) knowledge to be considered.</p>

<blockquote>
  <p>The act of writing, forces the author to think through all the details and steps required to share the lesson. It avoids what happens in business all the time which is "I just know" or "experience" and brings along the team and other job functions on thinking.</p>
</blockquote>

<p>I find this to be incredibly true. How often have you had an idea rattling around in your head that seems totally plausible (e.g. every <em>"It's ChatGPT for X"</em> idea you've had this week) but when you sit down to write it out, all you have is two sentences that don't make sense and a flashing cursor... No? Just me? Ok.</p>

<blockquote>
  <p>[...] the process of writing and sharing thoughts is clarifying AND collaborating itself</p>
</blockquote>

<p>Writing is the forcing function to clarify your thoughts and find out if they're valuable, to sift through them to see which contradict, which are unfinished and which are just plain wrong. It's this hard work that turns ideas, snippets of conversation, notes from meetings and everywhere else from 'data' into 'insight' that's worth sharing.</p>

<h2>Ok, sure, but you promised you'd talk about AI</h2>

<p>One of the things I'd forgotten until I dusted this off to write about again was the emphasis on <strong>context</strong>.</p>

<p>Context Engineering is the new Prompt Engineering, and from my experimentation the last few months (which I've written about <a href="https://nomass.io/posts/2025-12-29-vibe-engineering-with-claude-code/">here</a>) is a very accurate name. Good results come from working to optimise the LLM's context window.</p>

<p>Obviously that's not the same thing but it made me smile. Context is still king, and writing is more important than ever. I think the companies that already have deep cultures of writing and sharing context are going to be at a distinct advantage when adopting these new tools. Using them best looks like working in the ideal way you never quite achieved, but now kind of falls out of the process because the value is even more extrinsic.</p>

<h2>But do I even have to write anymore?</h2>

<p>Well, do you have to think anymore?</p>

<p>Now that everyone aims to have their favourite flavour of generative AI do their writing for them, a new chasm is going to open. Those who never wanted to write won't have to, and now the Slide Deck will be slop copy pasted from ChatGPT.</p>

<p>But used well, the tools can enhance the process of doing really valuable, thought clarifying writing. The value is even higher because now you can turn around and give that to an LLM to act on. I still see a long term advantage in a world that will be awash in content but not context, and lacking the kind of clarity you need to underpin sustained execution against a well thought out strategy.</p>

<h2>Valuable but spiky</h2>

<p>One last thing. I learned over the years is some people <em>really</em> like this approach and some <em>really</em> don't. I used to think this was a kind of obvious way to do things to everyone, but no, it's a <a href="https://www.weskao.com/blog/spiky-point-of-view-lets-get-a-little-controversial">spiky point of view</a>.</p>

<p>At times I've wondered if pushing it is even worthwhile. It's hard to do yourself and harder still to turn into a process that can co-ordinate a group to move forward versus just calling a meeting. A hasty meeting that at least makes a decision and puts it into action is better than a thoughtful plan that's written down but never actioned. But that shouldn't be a trade off you need to make, you can blend the best of both.</p>

<p>I also think people should work in the ways they feel make them most effective, so sometimes I've also wondered if pushing too hard down this path is the antithesis of trying to level the playing field as described earlier. Maybe it just tilts it in a different direction?</p>

<p>But I think there is too much value here. You just need to work not just writing but reading, collaboration and the mechanism by which this helps make decisions quickly. You also need to realise fully that it isn't for everyone - but that's true of any culture. You'll need to be prepared for it and work on it more than you think though. These pieces that turn thinking into action are critical, otherwise it will leave everyone (but especially those who are more naturally inclined towards written communication) frustrated.</p>

<p>For those it resonates with though, it resonates a lot. I'll leave the last word to a colleague responding to that internal blog post years ago:</p>

<blockquote>
  <p>Writing is, as far as I can tell, one of our greatest technologies. Thoughts that undergo non-fixed length curation. You get unlimited time to scrupulously interrogate your thoughts. Even writing this I had to pause to try work out what I'm thinking. When it really clicks, that writing is that powerful, I don't know why we don't do it more.</p>
</blockquote>

        <hr>
        <p>Thanks for subscribing. <a href="mailto:seats-gourde-4q@icloud.com">Say hello</a>.</p>
      ]]></content:encoded>
    </item>
  </channel>
</rss>
