<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
  <id>https://stuartbreckenridge.net/featured/atom.xml</id>
  <title>Stuart Breckenridge — Featured</title>
  <subtitle>Featured posts by Stuart Breckenridge.</subtitle>
  <link href="https://stuartbreckenridge.net/" />
  <link rel="self" type="application/atom+xml" href="https://stuartbreckenridge.net/featured/atom.xml" />
  <icon>https://stuartbreckenridge.net/favicon-v20260420.png</icon>
  <updated>2026-04-03T08:51:45.421Z</updated>
  <author>
    <name>Stuart Breckenridge</name>
    <uri>https://stuartbreckenridge.net/</uri>
  </author>
  <entry>
    <id>tag:stuartbreckenridge.net,2026:01KN98N3MCBM813SX2ZWPC3MPD</id>
    <title>The BBC's RSS Feed</title>
    <link rel="alternate" type="text/html" href="https://stuartbreckenridge.net/2026-04-03-the-bbcs-rss-feed/?utm_source=atom_featured&amp;utm_medium=feed" />
    <link rel="enclosure" type="image/jpeg" href="https://images.unsplash.com/photo-1640258234621-dba9be507958?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzNTA1ODV8MHwxfHNlYXJjaHwxM3x8dGV4dHVyZSUyMHBhdHRlcm5zfGVufDF8MHx8fDE3NzY2OTA4NTh8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" title="a close up of a wall with lines on it" />
    <link rel="via" type="text/html" href="https://unsplash.com/photos/a-close-up-of-a-wall-with-lines-on-it-LOWp0J9Qvh8?utm_source=stuart-on-astro&amp;utm_medium=referral" title="Photo by Martin Woortman on Unsplash" />
    <published>2026-04-03T08:51:45.421Z</published>
    <updated>2026-04-03T08:51:45.421Z</updated>
    <summary>The infuriating case of an incrementing GUID.</summary>
    <content type="html">&lt;p&gt;Due to the &lt;em&gt;incorrect&lt;/em&gt; way the BBC's &lt;a href=&quot;http://feeds.bbci.co.uk/news/uk/rss.xml&quot;&gt;RSS 2.0 feed&lt;/a&gt; handles &lt;code&gt;guid&lt;/code&gt;s, RSS readers are repeatedly left displaying &lt;a href=&quot;https://discourse.netnewswire.com/t/duplicates-of-the-articles/202&quot;&gt;duplicate articles&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Let's have a look at why this happens with a sample article from their feed:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;item&amp;gt;
    &amp;lt;title&amp;gt;
        &amp;lt;![CDATA[
            'We fell off the face of the earth': Dad-daughter duo who took on 7,500 miles for TV
        ]]&amp;gt;
    &amp;lt;/title&amp;gt;
    &amp;lt;description&amp;gt;
        &amp;lt;![CDATA[
            Molly Clifford and her father are part of this year's line up for the BBC's Race Across the World.
        ]]&amp;gt;
    &amp;lt;/description&amp;gt;
    &amp;lt;link&amp;gt;
        https://www.bbc.com/news/articles/c9951jrr18no?at_medium=RSS&amp;amp;at_campaign=rss
    &amp;lt;/link&amp;gt;
    &amp;lt;guid isPermaLink=&quot;false&quot;&amp;gt;https://www.bbc.com/news/articles/c9951jrr18no#3&amp;lt;/guid&amp;gt;
    &amp;lt;pubDate&amp;gt;Fri, 03 Apr 2026 05:19:07 GMT&amp;lt;/pubDate&amp;gt;
    &amp;lt;media:thumbnail width=&quot;240&quot; height=&quot;135&quot; url=&quot;https://ichef.bbci.co.uk/ace/standard/240/cpsprodpb/bb22/live/0bdf4fa0-2db9-11f1-934f-036468834728.jpg&quot;/&amp;gt;
&amp;lt;/item&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Specifically, let's focus on the &lt;code&gt;guid&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;guid isPermaLink=&quot;false&quot;&amp;gt;https://www.bbc.com/news/articles/c9951jrr18no#3&amp;lt;/guid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What I've seen the BBC doing is incrementing the suffix after the &lt;code&gt;#&lt;/code&gt; and, as per the &lt;a href=&quot;https://cyber.harvard.edu/rss/rss.html&quot;&gt;RSS 2.0 specification&lt;/a&gt; below, RSS readers tend to treat each incremented &lt;code&gt;guid&lt;/code&gt; as a new entry:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;guid&lt;/code&gt; stands for globally unique identifier. It's a string that uniquely identifies the item. When present, an aggregator may choose to use this string to determine if an item is new.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The above article has been fetched by Gobbler twice and the title had changed between fetches:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;guid&lt;/th&gt;
&lt;th&gt;title&lt;/th&gt;
&lt;th&gt;content hash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.bbc.com/news/articles/c9951jrr18no#2&quot;&gt;https://www.bbc.com/news/articles/c9951jrr18no#2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;'We fell off the face of the earth': Dad and daughter raced across world but had to keep it secret&lt;/td&gt;
&lt;td&gt;a8159e96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.bbc.com/news/articles/c9951jrr18no#3&quot;&gt;https://www.bbc.com/news/articles/c9951jrr18no#3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;'We fell off the face of the earth': Dad-daughter duo who took on 7,500 miles for TV&lt;/td&gt;
&lt;td&gt;17cbc6b7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Strictly speaking, the RSS 2.0 specification doesn't prohibit a &lt;code&gt;guid&lt;/code&gt; from changing. Additionally, there are no update semantics available (e.g., an &lt;code&gt;updatedDate&lt;/code&gt; element) in the 2.0 specification. So, in this scenario with a change of title, an incremented &lt;code&gt;guid&lt;/code&gt; is almost justifiable.&lt;/p&gt;
&lt;p&gt;However, this isn't always the case. Let's look at a different example in the Gobbler database:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;guid&lt;/th&gt;
&lt;th&gt;title&lt;/th&gt;
&lt;th&gt;content hash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.bbc.com/news/articles/cyv1q9gz39do#0&quot;&gt;https://www.bbc.com/news/articles/cyv1q9gz39do#0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;How English-only condolences undid one of Canada's top CEOs&lt;/td&gt;
&lt;td&gt;8845f9d6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.bbc.com/news/articles/cyv1q9gz39do#1&quot;&gt;https://www.bbc.com/news/articles/cyv1q9gz39do#1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;How English-only condolences undid one of Canada's top CEOs&lt;/td&gt;
&lt;td&gt;8845f9d6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.bbc.com/news/articles/cyv1q9gz39do#3&quot;&gt;https://www.bbc.com/news/articles/cyv1q9gz39do#3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;How English-only condolences undid one of Canada's top CEOs&lt;/td&gt;
&lt;td&gt;8845f9d6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Gobbler has fetched this article three times. The &lt;strong&gt;article hasn't changed&lt;/strong&gt; at all: same title, same content, and same published date &lt;sup&gt;&lt;a id=&quot;fn-ref-1&quot; href=&quot;https://stuartbreckenridge.net/2026-04-03-the-bbcs-rss-feed/#fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, all validated by the &lt;code&gt;content_hash&lt;/code&gt;. This is simply not justifiable. There is no reason to change the &lt;code&gt;guid&lt;/code&gt; if the article hasn't changed.&lt;/p&gt;
&lt;p&gt;What could the BBC do differently? &lt;/p&gt;
&lt;p&gt;First, don't change the &lt;code&gt;guid&lt;/code&gt; when the article content hasn't changed. Just &lt;em&gt;don't&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Second, if the article has been updated, use &lt;code&gt;&amp;lt;atom:updated&amp;gt;&lt;/code&gt; in the &lt;code&gt;&amp;lt;item&amp;gt;&lt;/code&gt;. The feed declares the Atom namespace and already uses it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;atom:link href=&quot;https://feeds.bbci.co.uk/news/uk/rss.xml&quot; rel=&quot;self&quot; type=&quot;application/rss+xml&quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lastly, and this is a bit of a stretch goal, put the full content of each article in the feed instead of a summary.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1-2026-04-03&quot;&gt;
&lt;p&gt;I couldn't fit everything in the table. &lt;a href=&quot;https://stuartbreckenridge.net/2026-04-03-the-bbcs-rss-feed/#fn-ref-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Tags: &lt;a href=&quot;https://stuartbreckenridge.net/tags/bbc/&quot;&gt;bbc&lt;/a&gt;, &lt;a href=&quot;https://stuartbreckenridge.net/tags/rss/&quot;&gt;rss&lt;/a&gt;, &lt;a href=&quot;https://stuartbreckenridge.net/tags/guid/&quot;&gt;guid&lt;/a&gt;&lt;/p&gt;</content>
    <category term="bbc" /><category term="rss" /><category term="guid" />
    <media:content url="https://images.unsplash.com/photo-1640258234621-dba9be507958?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wzNTA1ODV8MHwxfHNlYXJjaHwxM3x8dGV4dHVyZSUyMHBhdHRlcm5zfGVufDF8MHx8fDE3NzY2OTA4NTh8MA&ixlib=rb-4.1.0&q=80&w=1080" medium="image" width="5377" height="3585"><media:description>a close up of a wall with lines on it</media:description><media:credit role="photographer" scheme="urn:ebu">Martin Woortman</media:credit><media:copyright url="https://unsplash.com/@martfoto1?utm_source=stuart-on-astro&amp;utm_medium=referral">Martin Woortman / Unsplash</media:copyright></media:content>
  </entry>
  <entry>
    <id>tag:stuartbreckenridge.net,2014:69abcf76fa88fe00012617c8</id>
    <title>Rolling.bike</title>
    <link rel="alternate" type="text/html" href="https://stuartbreckenridge.net/2026-03-07-rolling-bike-out-now-ride-briefs/?utm_source=atom_featured&amp;utm_medium=feed" />
    <link rel="enclosure" type="image/jpeg" href="https://images.unsplash.com/photo-1612646561843-f7641ae5a4ef?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzNTA1ODV8MHwxfHNlYXJjaHwyM3x8dGV4dHVyZSUyMHBhdHRlcm5zfGVufDF8MHx8fDE3NzY2OTA4NTh8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" title="black and white checkered textile" />
    <link rel="via" type="text/html" href="https://unsplash.com/photos/black-and-white-checkered-textile-R6pSdFliZy4?utm_source=stuart-on-astro&amp;utm_medium=referral" title="Photo by Clark Van Der Beken on Unsplash" />
    <published>2026-03-07T07:58:47.000Z</published>
    <updated>2026-03-07T07:58:47.000Z</updated>
    
    <content type="html">&lt;p&gt;A useful new web app for generating ride briefs is now available at the brilliantly named &lt;a href=&quot;https://rolling.bike?ref=stuartbreckenridge.net&quot;&gt;rolling.bike&lt;/a&gt;. Upload your &lt;code&gt;GPX&lt;/code&gt; file, or sync your routes via Strava or Ride with GPS, provide some context and &lt;em&gt;Rolling&lt;/em&gt; will generate a well structured ride brief.&lt;/p&gt;
&lt;p&gt;Here's a walked through example:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://stuartbreckenridge.net/content/images/2026/03/Screenshot-2026-03-07-at-15.39.19.png&quot; alt=&quot;The GPX file&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A quick summary of this route:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start at Botanics&lt;/li&gt;
&lt;li&gt;The hilly &lt;em&gt;comb&lt;/em&gt; of First-to-Fifth Avenue&lt;/li&gt;
&lt;li&gt;Hillview&lt;/li&gt;
&lt;li&gt;Lorong Sesuai&lt;/li&gt;
&lt;li&gt;Rifle Range Road&lt;/li&gt;
&lt;li&gt;Finish at Dempsey at the bottom of the map&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Information I provided to &lt;em&gt;Rolling:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route Name: &lt;em&gt;Hills and Thrills&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Category: &lt;em&gt;Steady (2.0 - 2.8 W/kg)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Named Start and End points&lt;/li&gt;
&lt;li&gt;Rider Notes:&lt;/li&gt;
&lt;li&gt;New Rider Instructions: &lt;em&gt;Lots of short and snappy hills.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Self sufficiency note: &lt;em&gt;Two bottles. One gel.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With that information, Rolling can output various lengths of brief: Regular, Event, or WhatsApp, depending on your selection. In addition, you can pick your brief's &lt;em&gt;tone&lt;/em&gt; (I use &lt;em&gt;cheeky&lt;/em&gt;). With the above information, the Regular output for this ride:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hills and Thrills is exactly what it says on the tin, a fun steady-paced loop round some of the nicer parts of the island. It's 35.2 kilometres with 635 metres of climbing spread across six proper little kicks, so you'll get a proper workout but nothing that'll have you gasping for air round every corner.
This ride is for anyone who fancies a morning out with decent scenery and a few punchy climbs to keep things interesting. We've got regroup points dotted through the route, so you can catch your breath and stay together as a group. No heroics required.
The climbs are all short and snappy. Haunted Hill at 14.7 kilometres in is probably the meanest of the lot at 8.7 per cent, but it's still only 300 metres of pain. Lorong Sesuai later on is similarly spicy at 11 per cent but equally brief. First Avenue and Bukit Timah Road will warm you up early doors, nothing outrageous but enough to let you know your legs are switched on.
You'll be self-sufficient out there, so bring two bottles and a gel to keep the tank topped up. A spare tube and pump are non-negotiable, as is the usual common sense.
We're starting at Singapore Botanic Gardens Tanglin Gate on Saturday 7 March at 6am. It's an early one but worth it for the cooler morning air and quiet roads. We finish at Burnt Ends Bar on Dempsey Road, where we'll sort out proper breakfast and a coffee that's actually worth drinking.
Should be a cracking morning.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Event brief:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a steady ride built around short, punchy climbs that'll keep things interesting without requiring you to sell a kidney. We're looking at 35 kilometres with 635 metres of elevation crammed in, which is basically Singapore's way of testing whether you can handle variety on a bike.
We'll start at Tanglin Gate in the Botanic Gardens and head into familiar territory. The climbs here are properly bite-sized. You've got Jalan Dermawan, which is steep enough to remind you that you have legs, and Lorong Sesuai sits in there with a bit of attitude at 11 per cent average. Holland Road rounds out the main event near the end. Nothing's long enough to really damage you, but they're all short enough that you have to actually pedal properly.
This isn't a race, so we'll regroup sensibly at the bottom of anything notable. Keep things social on the flats, push on the climbs, and try not to look too smug when you get to the top. We're aiming for around two hours ten minutes of riding, which gives us time to chat, recover between efforts, and generally not take ourselves too seriously.
The route loops us back through some nice sections, so there's rhythm to it. Early on you'll pass through Avenues One to Five before heading out toward the real climbing. Bukit Timah Road gets involved early, then we settle into the longer middle section where Jalan Dermawan and Lorong Sesuai are waiting to have their say.
Bring two bottles and a gel minimum. There aren't convenient shops along the way, so come prepared to look after yourself. Water stops are on you.
We're finishing at Burnt Ends Bar on Dempsey Road, which is a proper reward for a solid morning's work. Coffee, food, legs that feel like they've done something worth doing. That's the deal.
See you Sunday morning. And no, you don't need to be elite to ride this. Just show up with a bike that works and legs that are willing to go up hills a few times.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And finally, the WhatsApp brief:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Saturday 7 March, 6am sharp from Tanglin Gate. We're doing Hills and Thrills, 35 km of the sort of climbing that keeps you honest. Plenty of short punchy hills that'll test your legs but won't bore you. Regroup spots at First through Fifth Avenue at the bottom, then Former Hillview and Lorong Sesuai at the top, plus Rifle Range Road at the end. Bring two bottles and a gel because we're not messing about. Finish at Burnt Ends Bar, Dempsey Road.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The more you use Rolling the better it gets as it actually learns your tone!&lt;/p&gt;
&lt;p&gt;It's an extremely useful utility, and a bargain at $15 AUD a year.&lt;/p&gt;

&lt;p&gt;Tags: &lt;a href=&quot;https://stuartbreckenridge.net/tags/apps/&quot;&gt;apps&lt;/a&gt;, &lt;a href=&quot;https://stuartbreckenridge.net/tags/cycling/&quot;&gt;cycling&lt;/a&gt;&lt;/p&gt;</content>
    <category term="apps" /><category term="cycling" />
    <media:content url="https://images.unsplash.com/photo-1612646561843-f7641ae5a4ef?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wzNTA1ODV8MHwxfHNlYXJjaHwyM3x8dGV4dHVyZSUyMHBhdHRlcm5zfGVufDF8MHx8fDE3NzY2OTA4NTh8MA&ixlib=rb-4.1.0&q=80&w=1080" medium="image" width="5980" height="3987"><media:description>black and white checkered textile</media:description><media:credit role="photographer" scheme="urn:ebu">Clark Van Der Beken</media:credit><media:copyright url="https://unsplash.com/@snapsbyclark?utm_source=stuart-on-astro&amp;utm_medium=referral">Clark Van Der Beken / Unsplash</media:copyright></media:content>
  </entry>
  <entry>
    <id>tag:stuartbreckenridge.net,2014:6990f9ddb014f90001cde7b6</id>
    <title>Experiments with the Codex and Claude Agents</title>
    <link rel="alternate" type="text/html" href="https://stuartbreckenridge.net/2026-02-15-experiments-with-the-codex-and-claude-agents/?utm_source=atom_featured&amp;utm_medium=feed" />
    <link rel="enclosure" type="image/jpeg" href="https://images.unsplash.com/photo-1710326062841-fbf052a96263?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzNTA1ODV8MHwxfHNlYXJjaHwyN3x8dGV4dHVyZSUyMHBhdHRlcm5zfGVufDF8MHx8fDE3NzY2OTA4NTh8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" title="a black background with multicolored lines on it" />
    <link rel="via" type="text/html" href="https://unsplash.com/photos/a-black-background-with-multicolored-lines-on-it-D9ATzAYDYiM?utm_source=stuart-on-astro&amp;utm_medium=referral" title="Photo by Martin Woortman on Unsplash" />
    <published>2026-02-15T00:00:43.000Z</published>
    <updated>2026-02-15T00:00:43.000Z</updated>
    
    <content type="html">&lt;p&gt;I've been experimenting with agents: Codex on a Python-to-ExpressJS conversion, and Claude in a Swift Package. The results have been impressive.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The remainder of this post was originally for members only.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Codex&lt;/h2&gt;
&lt;p&gt;Singapore Buses has a back-end server, written in Python with FastAPI, that is used to manage storage of APNS tokens, retrieve bus arrival estimates and push that data out as Live Activity notifications, and storage of aggregated session events for users. I wrote the server application in Python simply to get some experience with the language. I have, however, been wanting to re-write it as an ExpressJS app for quite some time.&lt;/p&gt;
&lt;p&gt;Enter Codex.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://stuartbreckenridge.net/content/images/2026/02/Screenshot-2026-02-14-at-21.59.50.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I downloaded Codex and gave it permission to the project's directory. I gave it one prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can you convert this project to ExpressJS?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Codex took less than two minutes to convert public routes, middleware, database, and schedulers, while selecting and replacing third-party Python packages with similar &lt;a href=&quot;https://www.npmjs.com/&quot;&gt;npm&lt;/a&gt; packages (e.g., &lt;code&gt;apns2&lt;/code&gt; was replaced with &lt;code&gt;@parse/node-apn&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The results was a working application with one defect—the payload for Live Activities was empty 🫣. Once that was fixed and the rest of the code tested, it was more-or-less a drop in replacement on the server (after changing PM2's configuration file).&lt;/p&gt;
&lt;h2&gt;Claude&lt;/h2&gt;
&lt;p&gt;In Xcode, I enabled Claude's agent and gave it dominion over my Swift Package &lt;a href=&quot;https://github.com/stuartbreckenridge/LandTransportKit&quot;&gt;LandTransportKit&lt;/a&gt; which is what I use in &lt;a href=&quot;https://singaporebuses.app.link/download&quot;&gt;Singapore Buses&lt;/a&gt;. The goal of this experiment was to have it write documentation for the package as a Documentation Archive (DocC). This is something I've been meaning to do for quite &lt;a href=&quot;https://stuartbreckenridge.net/introducing-landtransportkit/&quot;&gt;some time&lt;/a&gt;, as I wrote when I published the package in July 2025:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I used the ChatGPT integration to write the documentation for most of &lt;code&gt;struct&lt;/code&gt; , &lt;code&gt;class&lt;/code&gt;, and &lt;code&gt;func&lt;/code&gt; definitions. It hasn’t been used for the code itself, the test cases, or DocC.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Write documentation for this package in the documentation archive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://stuartbreckenridge.net/content/images/2026/02/Screenshot-2026-02-15-at-07.05.30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://stuartbreckenridge.github.io/LandTransportKit/documentation/landtransportkit/&quot;&gt;results&lt;/a&gt; speak for themselves. Not only is the package extensively documented, there's also example usage in UIKit and SwiftUI, along with prebuilt SwiftUI &lt;code&gt;View&lt;/code&gt;s.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;These experiments have left me impressed with what the Codex and Claude agents are capable of. Both were fast, understood the prompts, and, ultimately, I got the results I wanted.&lt;/p&gt;

&lt;p&gt;Tags: &lt;a href=&quot;https://stuartbreckenridge.net/tags/code/&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;https://stuartbreckenridge.net/tags/ai/&quot;&gt;ai&lt;/a&gt;&lt;/p&gt;</content>
    <category term="code" /><category term="ai" />
    <media:content url="https://images.unsplash.com/photo-1710326062841-fbf052a96263?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wzNTA1ODV8MHwxfHNlYXJjaHwyN3x8dGV4dHVyZSUyMHBhdHRlcm5zfGVufDF8MHx8fDE3NzY2OTA4NTh8MA&ixlib=rb-4.1.0&q=80&w=1080" medium="image" width="5490" height="3660"><media:description>a black background with multicolored lines on it</media:description><media:credit role="photographer" scheme="urn:ebu">Martin Woortman</media:credit><media:copyright url="https://unsplash.com/@martfoto1?utm_source=stuart-on-astro&amp;utm_medium=referral">Martin Woortman / Unsplash</media:copyright></media:content>
  </entry>
</feed>