<?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" xmlns:byline="https://bylinespec.org/1.0"><channel><title>Stuart Breckenridge</title><description>Personal blog by Stuart Breckenridge. App development, Apple ecosystem, cycling, and more.</description><link>https://stuartbreckenridge.net/</link><language>en-us</language><atom:link href="https://stuartbreckenridge.net/rss.xml" rel="self" type="application/rss+xml"/><byline:contributors><byline:person id="stuart"><byline:name>Stuart Breckenridge</byline:name><byline:context>iOS developer, program manager, cyclist, and writer about apps, Apple, RSS, and technology.</byline:context><byline:url>https://stuartbreckenridge.net/about</byline:url><byline:profile href="https://indieweb.social/@stuarticus" rel="mastodon"/><byline:profile href="https://bsky.app/profile/stuartbreckenridge.net" rel="bluesky"/><byline:profile href="https://github.com/stuartbreckenridge" rel="github"/><byline:profile href="https://threads.net/@stuarticus" rel="threads"/></byline:person></byline:contributors><image><url>https://stuartbreckenridge.net/favicon-v20260420.png</url><title>Stuart Breckenridge</title><link>https://stuartbreckenridge.net/</link></image><item><title>Moving Feed Discovery to /.well-known</title><link>https://stuartbreckenridge.net/2026-05-04-moving-feed-discovery-to-well-known/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KQSM4R2Q1FT0X2TGN0B167VM</guid><description>Remove the guesswork from feed discovery.</description><pubDate>Mon, 04 May 2026 13:51:46 GMT</pubDate><content:encoded>

&lt;p&gt;A few weeks ago I wrote about how RSS discovery is &lt;a href=&quot;https://stuartbreckenridge.net/2026-03-13-making-rss-discoverable/&quot;&gt;hard&lt;/a&gt;. In that particular example I used the BBC, who make things notoriously difficult because they don&apos;t even surface their feeds in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; element of their site. However, since writing that piece, I&apos;ve been thinking about better ways for RSS readers to discover feeds, and it turns out I&apos;m not the only one.&lt;/p&gt;
&lt;p&gt;There&apos;s an &lt;a href=&quot;https://datatracker.ietf.org/doc/html/draft-nottingham-feed-menu-00#name-feed-menu-documents&quot;&gt;Internet-Draft&lt;/a&gt; that proposes moving feed discovery to &lt;code&gt;/.well-known/feed-menu.json&lt;/code&gt;, which I think, in principle, is a great idea. Take the following &lt;em&gt;very common&lt;/em&gt; use case:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the user provides a website &lt;code&gt;https://example.com&lt;/code&gt; to a feed reader&lt;/li&gt;
&lt;li&gt;the feed reader scans &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and can&apos;t find any feeds&lt;/li&gt;
&lt;li&gt;the feed reader then makes &lt;em&gt;educated&lt;/em&gt; guesses to find feeds, e.g.,&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/feed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/rss&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rss.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/atom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;and so on&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contrast that with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the user provides a website &lt;code&gt;https://example.com&lt;/code&gt; to a feed reader&lt;/li&gt;
&lt;li&gt;the feed reader reads &lt;code&gt;https://example.com/.well-known/feed-menu.json&lt;/code&gt; and immediately has a full rundown of the feeds the site offers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The benefits are clear.&lt;/p&gt;
&lt;h2&gt;What I Would Change About Feed Menu&lt;/h2&gt;
&lt;p&gt;The name. I think &lt;em&gt;Feed Menu&lt;/em&gt; is not serious enough for a standard. I&apos;d prefer something along the lines of &lt;code&gt;/.well-known/syndication.json&lt;/code&gt; or, even simpler, just &lt;code&gt;/.well-known/feeds.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I&apos;d also expand each object in &lt;code&gt;feeds&lt;/code&gt; so that it is explicit about title, URL, format, version, and media type.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;publisher&quot;: {
    &quot;name&quot;: &quot;Stuart Breckenridge&quot;,
    &quot;url&quot;: &quot;https://stuartbreckenridge.net/&quot;,
    &quot;contact_url&quot;: &quot;https://stuartbreckenridge.net/about&quot;
  },
  &quot;feeds&quot;: [
    {
      &quot;title&quot;: &quot;Stuart Breckenridge&quot;,
      &quot;url&quot;: &quot;https://stuartbreckenridge.net/feed.json&quot;,
      &quot;format&quot;: &quot;jsonfeed&quot;,
      &quot;version&quot;: &quot;1.1&quot;,
      &quot;rel&quot;: &quot;self&quot;,
      &quot;media_type&quot;: &quot;application/feed+json&quot;,
      &quot;preferred&quot;: true
    },
    {
      &quot;title&quot;: &quot;Stuart Breckenridge&quot;,
      &quot;url&quot;: &quot;https://stuartbreckenridge.net/atom.xml&quot;,
      &quot;format&quot;: &quot;atom&quot;,
      &quot;rel&quot;: &quot;alternate&quot;,
      &quot;media_type&quot;: &quot;application/atom+xml&quot;
    },
    {
      &quot;title&quot;: &quot;Stuart Breckenridge&quot;,
      &quot;url&quot;: &quot;https://stuartbreckenridge.net/rss.xml&quot;,
      &quot;format&quot;: &quot;rss&quot;,
      &quot;version&quot;: &quot;2.0&quot;,
      &quot;rel&quot;: &quot;alternate&quot;,
      &quot;media_type&quot;: &quot;application/rss+xml&quot;
    },
    {
      &quot;title&quot;: &quot;Stuart Breckenridge: Links&quot;,
      &quot;url&quot;: &quot;https://stuartbreckenridge.net/links/feed.json&quot;,
      &quot;format&quot;: &quot;jsonfeed&quot;,
      &quot;version&quot;: &quot;1.1&quot;,
      &quot;rel&quot;: &quot;alternate&quot;,
      &quot;media_type&quot;: &quot;application/feed+json&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A single GET to &lt;code&gt;/.well-known/feeds.json&lt;/code&gt; would give a feed reader everything it needs.&lt;/p&gt;
</content:encoded><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>personal</byline:perspective></item><item><title>Enhanced Feeds with Byline Data</title><link>https://stuartbreckenridge.net/2026-05-03-enhanced-feeds-with-byline-data/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KQPWXDVZSHD2X2ZVASCT3NEG</guid><description>One must keep the feeds in order.</description><pubDate>Sun, 03 May 2026 12:27:20 GMT</pubDate><content:encoded>

&lt;p&gt;The feeds on this site now support the nascent &lt;a href=&quot;https://www.bylinespec.org/&quot;&gt;Byline&lt;/a&gt; specification. While this is a single-person blog, the change gives supporting feed readers the data they need to differentiate between linked items (&lt;code&gt;curation&lt;/code&gt;), reviews (&lt;code&gt;review&lt;/code&gt;), and announcements (&lt;code&gt;announcement&lt;/code&gt;).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;channel&amp;gt;
  &amp;lt;title&amp;gt;Stuart Breckenridge&amp;lt;/title&amp;gt;
  &amp;lt;description&amp;gt;Personal blog by Stuart Breckenridge. App development, Apple ecosystem, cycling, and more.&amp;lt;/description&amp;gt;
  &amp;lt;link&amp;gt;https://stuartbreckenridge.net/&amp;lt;/link&amp;gt;
  &amp;lt;language&amp;gt;en-us&amp;lt;/language&amp;gt;
  &amp;lt;atom:link href=&quot;https://stuartbreckenridge.net/rss.xml&quot; rel=&quot;self&quot; type=&quot;application/rss+xml&quot;/&amp;gt;
  &amp;lt;byline:contributors&amp;gt;
    &amp;lt;byline:person id=&quot;stuart&quot;&amp;gt;
      &amp;lt;byline:name&amp;gt;Stuart Breckenridge&amp;lt;/byline:name&amp;gt;
      &amp;lt;byline:context&amp;gt;iOS developer, program manager, cyclist, and writer about apps, Apple, RSS, and technology.&amp;lt;/byline:context&amp;gt;
      &amp;lt;byline:url&amp;gt;https://stuartbreckenridge.net/about&amp;lt;/byline:url&amp;gt;
      &amp;lt;byline:profile href=&quot;https://indieweb.social/@stuarticus&quot; rel=&quot;mastodon&quot;/&amp;gt;
      &amp;lt;byline:profile href=&quot;https://github.com/stuartbreckenridge&quot; rel=&quot;github&quot;/&amp;gt;
      &amp;lt;byline:profile href=&quot;https://bsky.app/profile/stuartbreckenridge.net&quot; rel=&quot;bluesky&quot;/&amp;gt;
      &amp;lt;byline:profile href=&quot;https://threads.net/@stuarticus&quot; rel=&quot;threads&quot;/&amp;gt;
    &amp;lt;/byline:person&amp;gt;
  &amp;lt;/byline:contributors&amp;gt;
  &amp;lt;image&amp;gt;
    &amp;lt;url&amp;gt;https://stuartbreckenridge.net/favicon-v20260420.png&amp;lt;/url&amp;gt;
    &amp;lt;title&amp;gt;Stuart Breckenridge&amp;lt;/title&amp;gt;
    &amp;lt;link&amp;gt;https://stuartbreckenridge.net/&amp;lt;/link&amp;gt;
  &amp;lt;/image&amp;gt;
  &amp;lt;item&amp;gt;
    &amp;lt;title&amp;gt;Enhanced Feeds with Byline Data&amp;lt;/title&amp;gt;
    &amp;lt;link&amp;gt;https://stuartbreckenridge.net/2026-05-03-enhanced-feeds-with-byline-data/?utm_source=rss&amp;amp;utm_medium=feed&amp;lt;/link&amp;gt;
    &amp;lt;guid isPermaLink=&quot;false&quot;&amp;gt;01KQPWXDVZSHD2X2ZVASCT3NEG&amp;lt;/guid&amp;gt;
    &amp;lt;pubDate&amp;gt;Sun, 03 May 2026 12:27:20 GMT&amp;lt;/pubDate&amp;gt;
    &amp;lt;content:encoded&amp;gt; &amp;lt;p&amp;gt;The feeds on this site now support the nascent &amp;lt;a href=&quot;https://www.bylinespec.org/&quot;&amp;gt;Byline&amp;lt;/a&amp;gt; specification. While this is a single-person blog, the change gives supporting feed readers the data they need to differentiate between linked items (&amp;lt;code&amp;gt;curation&amp;lt;/code&amp;gt;), reviews (&amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt;), and announcements (&amp;lt;code&amp;gt;announcement&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt; &amp;lt;pre&amp;gt;&amp;lt;code class=&quot;language-xml&quot;&amp;gt; &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;/content:encoded&amp;gt;
    &amp;lt;byline:author ref=&quot;stuart&quot;/&amp;gt;
    &amp;lt;byline:role&amp;gt;creator&amp;lt;/byline:role&amp;gt;
    &amp;lt;byline:perspective&amp;gt;personal&amp;lt;/byline:perspective&amp;gt;
    &amp;lt;/item&amp;gt;
&amp;lt;/channel&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>personal</byline:perspective></item><item><title>&apos;One Month In&apos;</title><link>https://stuartbreckenridge.net/2026-05-01-one-month-in/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KQJY91TN2XPS00QDVV99P51K</guid><description>How things are going.</description><pubDate>Fri, 01 May 2026 23:34:12 GMT</pubDate><content:encoded>&lt;p&gt;Gobbler&apos;s &lt;a href=&quot;https://gobbler.press/blog/one-month-in/&quot;&gt;Month One Update&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gobbler is one month old. Overall, it’s been a stable first month, with user numbers growing and a few interesting events along the way.&lt;/p&gt;
&lt;h2&gt;Stability&lt;/h2&gt;
&lt;p&gt;According to DigitalOcean, Gobbler had over 99% uptime. There was the odd latency spike from distant regions (think us_east to se_asia), but nothing worrying. The database is also performing well as the number of entries grows (at time of writing, ~150,000).&lt;/p&gt;
&lt;h2&gt;Success, 403s, and 404s When You Least Expect Them&lt;/h2&gt;
&lt;p&gt;Despite initially working fine, &lt;code&gt;*.substack.com&lt;/code&gt; and &lt;code&gt;medium.com&lt;/code&gt; feeds stopped working in their entirety in weeks three and four, respectively. This has largely been resolved by routing fetches to these domains via Cloudflare egress. Gobbler has also been submitted to Cloudflare’s Bot Verification Program, which should make the egress workaround a thing of the past.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;youtube.com&lt;/code&gt; feeds are special. For most of the day they’ll work fine, then they’ll 404 for a few hours, then they’ll work fine again. It’s a &lt;a href=&quot;https://www.reddit.com/r/youtube/comments/1r61jpo/all_youtube_channel_rss_feeds_are_down_return_404/&quot;&gt;known issue&lt;/a&gt; and there doesn’t appear to be a solution.&lt;/p&gt;
&lt;p&gt;The only other problematic sites belong to, or are partnered with, IGN Entertainment. We have reached out to IGN to see if this can be resolved. However, as these sites are protected by Cloudflare, Bot Verification is hopefully the long-term solution.&lt;/p&gt;
&lt;p&gt;Outside of the above, 5% of feeds are not reachable due to network errors, and Gobbler’s article fetch success rate sits at 84%.&lt;/p&gt;
&lt;h2&gt;Improvements in Month 1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;New accounts: switched from email/password to social sign-in (Apple, Microsoft, Google) and app passwords&lt;/li&gt;
&lt;li&gt;Implemented WebSub support&lt;/li&gt;
&lt;li&gt;Improved newsletter rendering&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</content:encoded><atom:updated>2026-05-03T11:13:00.000Z</atom:updated><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>curation</byline:perspective></item><item><title>Astro 6.1</title><link>https://stuartbreckenridge.net/2026-04-28-astro-6/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KQA26J1RK66P6CRTCNMB7JAA</guid><description>Astro 5 to 6.1</description><pubDate>Tue, 28 Apr 2026 12:49:35 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve upgraded the site from Astro 5 all the way to Astro 6.1. Everything should be as it was, but what&apos;s gone on behind the scenes is extensive. A short summary of what&apos;s changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Posts have been reorganised — each post is now its own folder with its images sitting alongside the markdown.&lt;/li&gt;
&lt;li&gt;All post images have been converted from PNG/JPG to WebP &lt;sup&gt;&lt;a id=&quot;fn-ref-1&quot; href=&quot;https://stuartbreckenridge.net/2026-04-28-astro-6/#fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. The legacy versions are still around so existing feed entries don&apos;t break.&lt;/li&gt;
&lt;li&gt;Search results have been visually fixed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unrelated to Astro 6.1, the &lt;code&gt;/atom.xml&lt;/code&gt; feed is now using &lt;a href=&quot;https://websubhub.com&quot;&gt;WebSubHub&lt;/a&gt;, so if your reader supports it, you&apos;ll now see posts close to when they are published.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1-2026-04-28&quot;&gt;
&lt;p&gt;Addresses &lt;a href=&quot;https://news.ycombinator.com/item?id=47482462&quot;&gt;this comment&lt;/a&gt;, which was harsh but fair. &lt;a href=&quot;https://stuartbreckenridge.net/2026-04-28-astro-6/#fn-ref-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content:encoded><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>announcement</byline:perspective></item><item><title>&apos;Someone Bought 30 WordPress Plugins and Planted a Backdoor in All of Them&apos;</title><link>https://stuartbreckenridge.net/2026-04-27-someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KQ7AKKRWPG96MAEAAQVP5NWS</guid><description>This keeps happening.</description><pubDate>Mon, 27 Apr 2026 11:18:48 GMT</pubDate><content:encoded>&lt;p&gt;Austin Ginder, &lt;a href=&quot;https://anchor.host/someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/&quot;&gt;Anchor Hosting&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Last week, I wrote about catching a supply chain attack on a WordPress plugin called Widget Logic. A trusted name, acquired by a new owner, turned into something malicious. It happened again. This time at a much larger scale.&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;The injected code was sophisticated. It fetched spam links, redirects, and fake pages from a command-and-control server. It only showed the spam to Googlebot, making it invisible to site owners. And here is the wildest part. It resolved its C2 domain through an Ethereum smart contract, querying public blockchain RPC endpoints. Traditional domain takedowns would not work because the attacker could update the smart contract to point to a new domain at any time.&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;Two supply chain attacks in two weeks. Both followed the same pattern. Buy a trusted plugin with an established install base, inherit the WordPress.org commit access, and inject malicious code. The Flippa listing for Essential Plugin was public. The buyer’s background in SEO and gambling marketing was public. And yet the acquisition sailed through without any review from WordPress.org.&lt;/p&gt;
&lt;p&gt;WordPress.org has no mechanism to flag or review plugin ownership transfers. There is no “change of control” notification to users. No additional code review triggered by a new committer. The Plugins Team responded quickly once the attack was discovered. But 8 months passed between the backdoor being planted and being caught.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&apos;s truly astonishing that WordPress, despite its scale, has such exploitable supply-chain security. I&apos;m aware of a similar npm supply-chain risk with &lt;a href=&quot;https://gobbler.press&quot;&gt;Gobbler&lt;/a&gt;, though I am using both Dependabot and Socket.dev to mitigate it.&lt;sup&gt;&lt;a id=&quot;fn-ref-1&quot; href=&quot;https://stuartbreckenridge.net/2026-04-27-someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/#fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1-2026-04-27&quot;&gt;
&lt;p&gt;I am also reminded of my own &lt;a href=&quot;https://stuartbreckenridge.net/2025-07-12-wpfail2ban&quot;&gt;brief stint&lt;/a&gt; with WordPress in mid-2025 — I was quite excited. However, after four days I was already concerned about its security and installed wpfail2ban. &lt;a href=&quot;https://stuartbreckenridge.net/2026-04-27-someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/#fn-ref-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content:encoded><atom:updated>2026-04-27T14:08:00.348Z</atom:updated><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>curation</byline:perspective></item><item><title>Filtered Feeds</title><link>https://stuartbreckenridge.net/2026-04-20-filtered-feeds/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KPN9B4AP3QN3NF7XAMXAJSBG</guid><description>Feeds are now separated in All, Featured, and Linked.</description><pubDate>Mon, 20 Apr 2026 11:10:22 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve separated the content available across the RSS, Atom, and JSON feeds on the site. You can find them all on the &lt;a href=&quot;https://stuartbreckenridge.net/about&quot;&gt;About&lt;/a&gt; page, and I&apos;ve listed them below:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feed&lt;/th&gt;
&lt;th&gt;RSS&lt;/th&gt;
&lt;th&gt;Atom&lt;/th&gt;
&lt;th&gt;JSON&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;All Posts&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/rss.xml&quot;&gt;/rss.xml&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/atom.xml&quot;&gt;/atom.xml&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/feed.json&quot;&gt;/feed.json&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Featured Articles&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/featured/rss.xml&quot;&gt;/featured/rss.xml&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/featured/atom.xml&quot;&gt;/featured/atom.xml&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/featured/feed.json&quot;&gt;/featured/feed.json&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linked List&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/links/rss.xml&quot;&gt;/links/rss.xml&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/links/atom.xml&quot;&gt;/links/atom.xml&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stuartbreckenridge.net/links/feed.json&quot;&gt;/links/feed.json&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The new feeds are a bit bare right now as I&apos;ve moved this blog from platform to platform so many times, and lost content along the way. I must stop doing that.&lt;/p&gt;
</content:encoded><atom:updated>2026-04-27T11:00:00.000Z</atom:updated><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>announcement</byline:perspective></item><item><title>Implementing Webmention</title><link>https://stuartbreckenridge.net/2026-04-19-implementing-webmentions/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KPJ4DRMYTNMG40FCJJT3KJ0D</guid><description>My latest dabble into Indieweb plumbing.</description><pubDate>Sun, 19 Apr 2026 05:46:42 GMT</pubDate><content:encoded>&lt;p&gt;A few weeks ago I moved this site back to &lt;a href=&quot;https://stuartbreckenridge.net/2026-03-10-hello-astro/&quot;&gt;Astro&lt;/a&gt; and ever since I&apos;ve been curious about the &lt;a href=&quot;https://indieweb.social/@stuarticus/116424975618945377&quot;&gt;state of Webmention&lt;/a&gt; and whether I should implement it. For the &lt;a href=&quot;https://www.w3.org/TR/webmention/#abstract-p-1&quot;&gt;curious&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Webmention is a simple way to notify any URL when you mention it on your site. From the receiver&apos;s perspective, it&apos;s a way to request notifications when other sites mention it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To get this up and running quickly, I&apos;m using &lt;a href=&quot;https://webmention.io&quot;&gt;Webmention.io&lt;/a&gt; for receiving website mentions and &lt;a href=&quot;https://brid.gy&quot;&gt;brid.gy&lt;/a&gt; for monitoring social media interactions and sending them to Webmention.io. In &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, I&apos;ve added:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;link rel=&quot;webmention&quot; href=&quot;https://webmention.io/stuartbreckenridge.net/webmention&quot;&amp;gt;
&amp;lt;link rel=&quot;pingback&quot; href=&quot;https://webmention.io/stuartbreckenridge.net/xmlrpc&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At the bottom of each post, there&apos;s an Astro component that fetches and renders Webmentions from Webmention.io on each page load.&lt;/p&gt;
&lt;p&gt;In terms of posting Webmentions, I&apos;ve updated the small server app, Broadcaster, that monitors the Atom feed for the site and posts to Mastodon and Bluesky. Now, Broadcaster scans post content, identifies links, checks if the linked site publishes a Webmention &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;, and sends a Webmention if it does.  &lt;/p&gt;
&lt;p&gt;This all seems to work but I don&apos;t like relying on Webmention.io. Similar to the approach taken by &lt;a href=&quot;https://behindtheviewfinder.com/posse-1-1-3-full-w3c-webmention-support/&quot;&gt;Wojtek Powiertowski&lt;/a&gt;, I will look to incorporate Webmention &lt;em&gt;listening&lt;/em&gt; into Broadcaster (and, at the same time, I&apos;ll probably have to change its name).&lt;/p&gt;
</content:encoded><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>analysis</byline:perspective></item><item><title>&apos;App Store Reviews Are Busted&apos;</title><link>https://stuartbreckenridge.net/2026-04-17-app-store-reviews-are-busted/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KPDTJV22GFRQFYEWS0DR7N3B</guid><description>Steam has the right idea.</description><pubDate>Fri, 17 Apr 2026 13:37:45 GMT</pubDate><content:encoded>&lt;p&gt;Let&apos;s start with the &lt;a href=&quot;https://blog.terrygodier.com/2026/04/13/app-store-reviews-are-busted.html&quot;&gt;original article&lt;/a&gt; by Terry Godier:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For example, if you have a 4.1 star rating in the App Store, any 4 star review is going to decrease that average. In other words, leaving a 4 star review is essentially leaving a negative review.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://daringfireball.net/linked/2026/04/16/app-store-reviews-are-busted&quot;&gt;John Gruber&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Problem #1 [...] If you’re going to collect and average ratings from users, the system that works best is binary: thumbs-up or thumbs-down. Netflix switched from stars to thumbs in 2017, and YouTube switched all the way back in 2009.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;d add one more to this list, and certainly one that&apos;s more analogous to the App Store: &lt;em&gt;Steam&lt;/em&gt;. Steam&apos;s &lt;a href=&quot;https://store.steampowered.com/reviews/&quot;&gt;thumbs-based model&lt;/a&gt; is far superior. Not only can you rate and review the game (or app), but other users can also rate your review. Potential buyers can then find and filter by the most helpful reviews. It&apos;s a better model for all involved. &lt;strong&gt;See UPDATE #1 below.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Next:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Problem #2 is that even if the App Store switched from stars to thumbs, the system would still be gamified by developers, rewarding, as Godier aptly puts it, not the best apps but instead the apps that are best at “review prompt execution”. Apple should remove the APIs that allow apps to prompt for reviews, and forbid the practice of prompting for them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apple should remove those APIs, but they won&apos;t, and until they do, we&apos;re playing within that ruleset. Full disclosure, I&apos;ve built what Terry and John are describing, &lt;a href=&quot;https://singaporebuses.app.link/download&quot;&gt;Singapore Buses&lt;/a&gt; does include a review prompt. It&apos;s &lt;em&gt;insidiously&lt;/em&gt; well designed. On the third launch, the app asks for a rating.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE #1&lt;/strong&gt;: I just discovered that the App Store also has a thumbs-up/thumbs-down rating system for &lt;em&gt;reviews of an app&lt;/em&gt;. Long-press a review and a context menu appears with Helpful vs. Not Helpful responses. Its outrageous that this system is hidden behind a long-press.&lt;/p&gt;
</content:encoded><atom:updated>2026-04-18T06:00:00.000Z</atom:updated><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>curation</byline:perspective></item><item><title>&apos;Apple&apos;s MacBook Neo Sold Out Through April Amid Surging Demand&apos;</title><link>https://stuartbreckenridge.net/2026-04-16-apples-macbook-neo-sold-out-through-april-amid-surging-demand/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KPC75R25RHWQRNF3Z9NHSG7P</guid><description>Cheaper and much more capable than my iPad Pro.</description><pubDate>Thu, 16 Apr 2026 22:39:18 GMT</pubDate><content:encoded>&lt;p&gt;Juli Clover, &lt;a href=&quot;https://www.macrumors.com/2026/04/16/macbook-neo-demand-surging/&quot;&gt;Macrumors&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Apple&apos;s MacBook Neo has been a huge hit, and it&apos;s still in high demand over a month after it launched. The ‌MacBook Neo‌ is just $599, and with PC makers raising prices because of global RAM shortages, the Neo&apos;s low price tag and Apple allure are even more appealing.&lt;/p&gt;
&lt;p&gt;MacBook Neo‌ orders placed today on the online Apple Store won&apos;t reach customers until May, which means that it&apos;s sold out for the month of April, as &lt;a href=&quot;https://9to5mac.com/2026/04/16/macbook-neo-sells-out-for-april-as-demand-for-apples-affordable-laptop-outpaces-supply/&quot;&gt;9to5Mac&lt;/a&gt; points out. All colors and both the 256GB and 512GB SSD configurations will be delivered between May 1 and May 8 at the earliest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That the MacBook Neo is a success doesn&apos;t surprise me. I used one briefly in the nearby Apple Store and it&apos;s a really nice laptop. For $599 you&apos;re getting something cheaper and more capable than my iPad Pro paired with a Magic Keyboard. In fact, if the iPad Pro doesn&apos;t start running macOS in the future, I&apos;m not sure I&apos;d buy another one: iPadOS hobbles the iPad Pro to the point where it can&apos;t justify its price tag.&lt;/p&gt;
</content:encoded><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>curation</byline:perspective></item><item><title>M5 Networking Issues</title><link>https://stuartbreckenridge.net/2026-04-15-m5-networking-issues/?utm_source=rss&amp;utm_medium=feed</link><guid isPermaLink="false">01KP8M3QA9G6DXSS35H18JJTSX</guid><description>Changing from Cloudflare to Quad9 fixed my problem and I don&apos;t know why.</description><pubDate>Wed, 15 Apr 2026 13:08:26 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve been having a strange issue with my new M5 MacBook Pro and GitHub: at random intervals, my MacBook cannot connect to GitHub. Well, that&apos;s not strictly true: Safari can&apos;t connect to GitHub, Git Tower can&apos;t push or pull, but Chrome has no issues. &lt;/p&gt;
&lt;p&gt;Using &lt;code&gt;dns-sd -G v4 github.com&lt;/code&gt; to see what&apos;s happening over time:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Timestamp&lt;/th&gt;
&lt;th&gt;A/R&lt;/th&gt;
&lt;th&gt;Flags&lt;/th&gt;
&lt;th&gt;IF&lt;/th&gt;
&lt;th&gt;Hostname&lt;/th&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;19:46:30.769&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19:55:16.874&lt;/td&gt;
&lt;td&gt;Rmv&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19:55:16.885&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:01:42.237&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;0.0.0.0&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;No Such Record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:01:48.800&lt;/td&gt;
&lt;td&gt;Rmv&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:10:18.607&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:21:43.313&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;0.0.0.0&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;No Such Record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:21:49.456&lt;/td&gt;
&lt;td&gt;Rmv&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:21:49.508&lt;/td&gt;
&lt;td&gt;Rmv&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:22:57.954&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:23:50.255&lt;/td&gt;
&lt;td&gt;Rmv&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:23:50.267&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:29:05.686&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;0.0.0.0&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;No Such Record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:29:13.694&lt;/td&gt;
&lt;td&gt;Rmv&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:29:13.705&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:37:31.780&lt;/td&gt;
&lt;td&gt;Rmv&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:37:31.780&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;0.0.0.0&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;No Such Record&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;During those &lt;em&gt;No Such Record&lt;/em&gt; periods, GitHub just refused to work in Safari or Git Tower. &lt;/p&gt;
&lt;p&gt;I switched from Cloudflare&apos;s &lt;code&gt;1.1.1.1&lt;/code&gt; service to Quad9, and ever since I&apos;ve had no issues.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Timestamp&lt;/th&gt;
&lt;th&gt;A/R&lt;/th&gt;
&lt;th&gt;Flags&lt;/th&gt;
&lt;th&gt;IF&lt;/th&gt;
&lt;th&gt;Hostname&lt;/th&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;20:37:45.321&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21:13:26.595&lt;/td&gt;
&lt;td&gt;Rmv&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21:13:26.603&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;github.com.&lt;/td&gt;
&lt;td&gt;20.205.243.166&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This wasn&apos;t a problem on my M3-series MacBook. I can only assume it&apos;s a problem with the M5 and its new networking stack.&lt;/p&gt;
</content:encoded><byline:author ref="stuart"/><byline:role>creator</byline:role><byline:perspective>analysis</byline:perspective></item></channel></rss>