I’m thinking about releasing a new web-based RSS reader and RSS aggregator called Gobbler. It’s available to test for the next month or so and you can sign up using this link. Everything is still in sandbox, so you won’t be charged for Stripe. All data will be removed at the end of March.
If you want to use Gobbler on mobile:
Reeder: Use Google Reader
NetNewsWire: Use FreshRSS
Current: Use FreshRSS
*or *just add it to your Home Screen from Safari
Gobbler on Desktop
Gobbler on iPhone
You can find out more about Gobbler at gobbler.press.
If you have feedback—I’d be delighted to hear it—please send to support@gobbler.press.
Every month or so I update Singapore Buses with the latest data from the Land Transport Authority. And every month the *What’s New *section on the App Store usually says something along the lines of:
Updated database and routes.
What does that actually mean? Well, starting with 2026.3, which is Waiting for Review, I’ve decided to include the month-to-month differences in the *What’s New *section. For this release, that means:
New Stops (1)
Code
Description
Road
74951
Blk 962A
Tampines St 96
Location Changes (7)
Code
Description
Distance
14521
Village Hotel
320m
28221
Opp Intl Business Pk
53m
28239
Jurong Town Hall Int
48m
28301
Blk 131
21m
43081
Opp St. Joseph’s Ch (Bt Timah)
112m
59069
Opp Blk 757
74m
67759
Compassvale Int
13m
Name Changes (4)
Code
Old Name
New Name
47749
W’lands Health Campus
W’lands Hosp
52241
Blk 105
Bef Caldecott Stn/SAVH
65091
BLK 301A
Blk 301A
67759
COMPASSVALE INT
Compassvale Int
Service Changes (20)
Code
Description
Added
Removed
74949
Blk 961A
18M
74959
Blk 969C
18M
74961
Blk 966
18M
74969
Opp Blk 966
18M
75341
Opp The Clearwater Condo
18M
75349
The Clearwater Condo
18M
84201
Bedok Resvr Stn Exit A
18M
84209
Bedok Resvr Stn Exit B
18M
84221
Blk 109
18M
84229
Blk 111
18M
84251
Blk 99
18M
84259
Blk 88
18M
84261
St. Anthony’s Cano Sch
18M
84269
Blk 95
18M
84271
Aft Bedok Ind Pk E
18M
84279
Aft Bedok Nth St 5
18M
84521
Blk 506
18M
84529
Blk 109
18M
84591
SBST Bedok Nth Depot
18M
84599
Opp SBST Bedok Nth Depot
18M
The biggest surprise to me was the number of bus stops moving around and how far they move. I mean *Village Hotel *is almost half a kilometre away from where it was before — that’d be a shock in the morning if it was where you started your commute.
This theme is *Matrix-*inspired and was built with the help of Claude (there’s simply no way my CSS is this clean and tidy). This theme shines when your device is in dark mode.
Features
Visual Style
Phosphor-green palette — deep near-black background with glowing green text
CRT vignette — a radial gradient overlay darkens the screen edges for a vintage monitor feel (macOS only)
Boot flicker — the page and article animate in with a CRT power-on flicker effect
Monospace throughout — SF Mono
Article Header
Feed name is prefixed with a shell prompt: user@nnw:~$ cat
Publish date is prefixed with # timestamp:
External link is prefixed with # source:
Feed icon is rendered in greyscale with a green tint and a pixel-art rendering mode
Article Title
Typewriter animation — the title types out character by character in reading order, correctly handling titles that span multiple lines
Blinking block cursor (█) appears after the last character lands and blinks indefinitely
Article Body
Separator line of ─ characters between the header and body
Headings prefixed with Markdown-style ##, ###, #### markers
Blockquotes styled with a left border and faint green background
Code blocks include a fake terminal title bar (● ● ● output) and horizontal scroll on overflow
Inline code highlighted in amber with a subtle glow
Tables use uppercase headers, row hover highlights, and a green glow on the border
Figcaptions prefixed with //
Images are desaturated and dimmed; hovering partially restores colour
Platform Behaviour
iOS — uses dynamic type sizing, system hyphenation, and respects safe area insets; html background is set so native navigation and tab bar blur effects sample the correct dark colour
macOS — includes the CRT vignette, wider padding, and fixed text-size classes (smallText → xxlargeText)
I’ve been experimenting with agents: Codex on a Python-to-ExpressJS conversion, and Claude in a Swift Package. The results have been impressive.
The remainder of this post was originally for members only.
Codex
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.
Enter Codex.
I downloaded Codex and gave it permission to the project’s directory. I gave it one prompt:
Can you convert this project to ExpressJS?
Codex took less than two minutes to convert public routes, middleware, database, and schedulers, while selecting and replacing third-party Python packages with similar npm packages (e.g., apns2 was replaced with @parse/node-apn).
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).
Claude
In Xcode, I enabled Claude’s agent and gave it dominion over my Swift Package LandTransportKit which is what I use in Singapore Buses. 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 some time, as I wrote when I published the package in July 2025:
I used the ChatGPT integration to write the documentation for most of struct , class, and func definitions. It hasn’t been used for the code itself, the test cases, or DocC.
The prompt:
Write documentation for this package in the documentation archive.
The results speak for themselves. Not only is the package extensively documented, there’s also example usage in UIKit and SwiftUI, along with prebuilt SwiftUI Views.
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.
After five-ish years of NetNewsWire 6—and many Summer, Autumn, and Winter nights of coding through 2025 and into 2026, and a sizeable TestFlight window—The World’s Favourite Open Source RSS ReaderTM has reached version 7. (Note: we discovered and fixed a lot of bugs during TestFlight, so thanks go to the testers!)
Similar to the Mac release, NetNewsWire 7 for iPhone and iPad:
requires the OSs 26
adopts Liquid Glass
is a significant under-the-hood overhaul that adopts Swift Concurrency
But, but, but…unlike the Mac release, which was quite easy, the iOS release has required a lot more work. On the latest episode of *The Talk Show, *Brent rightly pointed out that“iOS apps are just more complicated”.
To summarise my Design Diaries and some additional items, NetNewsWire 7 makes 30 major changes:
[Sidebar] Converted from UITableView to UICollectionView. This was needed in order to adopt modern styling across iPad and iPhone. iPad uses the .sidebar style, and iPhone uses .insetGrouped. This is similar to the behaviour you see in Mail.
[Sidebar] The current *Refresh *status is now located in the navigation bar as a subtitle, having previously been the footer.
[Sidebar (iPad)] Like the Mac refresh, the Feeds view floats and allows Timeline content to slide underneath.
[Sidebar] Smart Feeds and Account headers now adopt modern secondary styling.
[Sidebar (iPad)] Selected feeds have a modern capsule background and the text is bold.
[Sidebar] Folders have been redesigned to match modern standards—they now have the same indentation as any other feed, but the enclosed feeds are indented further.
[Sidebar] Folders will highlight when Feeds are being dragged and dropped into them.
[Sidebar] Separators have been realigned.
[Sidebar] Unread counts are larger and are no longer backed by a filled capsule.
[Sidebar] Unread counts for folders are only displayed when the folder is closed.
[Sidebar] Swipe actions reveal icons.
[Sidebar (iPad)] Users can resize the sidebar (within reason).
[Timeline] Converted from UITableView to UICollectionView (during TestFlight builds!) This was needed in order to adopt modern cell styling—e.g., selected and swipe status—across iPad and iPhone.
[Timeline] Now uses UICollectionViewDiffableDataSource.
[Timeline] Navigation bar images have been removed.
[Timeline] Unread counts are now located in the navigation bar subtitle.
[Timeline] Adopts hierarchical text colours for titles and summaries.
[Timeline (iPad)] The search bar has been moved to the app-wide toolbar and behaves similar to search on the Mac.
[Timeline (iPhone)] The search bar has been moved to the bottom toolbar.
[Timeline (iPad)] The Timeline width is user adjustable (again, within reason).
[Timeline] Timeline cells have been redesigned in Interface builder and now have the rounded corner selection style in addition to hierarchical text colours for title and summary.
[Timeline] The Mark All as Read image (on both iPad and iPhone) has had alignment changes to make sure it sits in the middle of an englassified button.
[Article (iPad)] Articles can be read in three-pane view without hiding the Sidebar.
[Article (iPad)] The top toolbar inherits search capabilities.
[Article] The bottom toolbar buttons have been grouped in a 2-1-2 formation with the *Next Unread *button sitting in the throne seat.
[Sidebar, Timeline, Article] Visual state is restored on relaunch.
[Widgets] Home Screen widgets have been redesigned to make better use of horizontal space.
[Widgets] Added a new Lock Screen widget with Today, Unread, Starred counts.
[Settings] Timeline Customiser has been redesigned and includes both icon and non-icon previews.
[About] Tending to the dark corner of the garden, the About view on iOS has been redesigned and inspired by the Credits from Vesper.
This release is significant: it adopts Swift Concurrency (which you shouldn’t see), Liquid Glass (which, despite the transparency, you should see), and supports macOS 26 (as a minimum). From a UI perspective:
The Sidebar adopts standard Liquid Glass behaviours which means it floats and allows timeline content to slide underneath
Unread indicators are no longer backed by a filled capsule. They are now just a simple unread count
The Toolbar has seen a minor reorganisation which moves the sidebar toggle from the timeline into the sidebar. In addition, toolbar buttons adopt the standard Liquid Glass button look-and-feel
Tending to the dark corner of the Lucida Grande garden, the About window has been redesigned
[Update 09 Nov 2025: there’s new API in iOS 26.2 that allows you to hide the tabViewBottomAccessory. See the bottom of this post for more.]
In Singapore Buses on iOS 26, I was able to hide the tabViewBottomAccessory based on various criteria—for example, if location tracking was enabled.
.tabViewBottomAccessory {
if locationTracker.isAuthorised {
HStack {
// Nearby bus stop
}
} else {
EmptyView()
}
}
Now, however, it displays the accessory with no content. I haven’t found a workaround yet, so for now I’m showing the tabViewBottomAccessory across all views. This isn’t ideal—the accessory isn’t relevant on the Settings view, for instance.
If this is Apple’s intended behaviour for the accessory, it’s far from ideal.
Update 09 Nov 2025:
There’s an update to the tabViewBottomAccessory modifier API in iOS 26.2 that lets you hide the tabViewBottomAccessory when it’s not needed:
Problematically, this only works with iOS 26.2. As I don’t intend to move away from iOS 26.0 as the minimum requirement for *Singapore Buses *for several months, I will apply this API using an if #unavailable(iOS 26.1) check. Users on iOS 26.0 - 26.1 will see the accessory on all views. 😞
I have mixed feelings about Halo: Campaign Evolved. The trailer looks and sounds excellent, the gameplay is both improved and familiar, and the nostalgia vibes are strong.
And that’s the problem: this is the third version of the Halo: Combat Evolved campaign (Halo: Combat Evolved (2000); *Halo: Combat Evolved Anniversary *(2011); and now Halo: Campaign Evolved (2026)).
I really hope *Halo: Campaign Evolved *is good. But it’s trading entirely on nostalgia.
That leaves me with some obvious questions:
How does Halo: Campaign Evolved move the franchise forward (excluding the fact that it’ll be on PlayStation)?
Can a 26-year-old game hold its own against modern FPS games or is this going to be like the Goldeneye64 remake?
Split-screen local co-op, online co-op, and no multiplayer…there’s more to announce, surely?
For years, both at home and at work, I’ve used headsets with built-in microphones that sit uncomfortably close to my mouth. They’ve always irritated me, especially when drinking coffee and the mug inevitably whacks the mic arm mid-sip.
To address this horrific shortcoming, I added a Shure MV6 microphone to my desk and now I have a new hobby — streaming games at @flywithstuart on YouTube (things are just getting started). Predominantly, the current focus is the recently released Battlefield 6, with some Microsoft Flight Simulator 2024 thrown in for good measure. I’m considering doing a NetNewsWire bug fix stream in the future (when I setup OBS on my Mac).