What does “Updated Database” actually mean?

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)

CodeDescriptionRoad
74951Blk 962ATampines St 96

Location Changes (7)

CodeDescriptionDistance
14521Village Hotel320m
28221Opp Intl Business Pk53m
28239Jurong Town Hall Int48m
28301Blk 13121m
43081Opp St. Joseph’s Ch (Bt Timah)112m
59069Opp Blk 75774m
67759Compassvale Int13m

Name Changes (4)

CodeOld NameNew Name
47749W’lands Health CampusW’lands Hosp
52241Blk 105Bef Caldecott Stn/SAVH
65091BLK 301ABlk 301A
67759COMPASSVALE INTCompassvale Int

Service Changes (20)

CodeDescriptionAddedRemoved
74949Blk 961A18M
74959Blk 969C18M
74961Blk 96618M
74969Opp Blk 96618M
75341Opp The Clearwater Condo18M
75349The Clearwater Condo18M
84201Bedok Resvr Stn Exit A18M
84209Bedok Resvr Stn Exit B18M
84221Blk 10918M
84229Blk 11118M
84251Blk 9918M
84259Blk 8818M
84261St. Anthony’s Cano Sch18M
84269Blk 9518M
84271Aft Bedok Ind Pk E18M
84279Aft Bedok Nth St 518M
84521Blk 50618M
84529Blk 10918M
84591SBST Bedok Nth Depot18M
84599Opp SBST Bedok Nth Depot18M

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.

NetNewsWire 7 for iOS Out Now

NetNewsWire 7 for iOS Out Now

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.

The new About view.

Singapore Buses v2026

Singapore Buses v2026

Singapore Buses v2026 is out now. It’s been a challenging development cycle, to say the least, and I’m glad it’s over. The Design Diaries series covers the major Liquid Glass updates. This post looks at some of the other technical changes that have been made in the v2026 update.

GRDB

Singapore Buses, has always, always, always—way back to 2018 when it was SG Transit—used Core Data. Even when SwiftUI came along, followed by SwiftData, it stuck with Core Data. Not any more. It’s now using GRDB.

Each app version is seeded with an updated SQLite database containing the latest bus stops, routes, and services. This database is created using a separate app on the Mac. Long-term, the aim is to move away from having to release new app versions with an up-to-date database and instead move to an over-the-air model that refreshes the database in the background. The move to GRDB should smooth the path.

Map Performance

The database is now loaded into memory instead of being read from disk. As a result, panning the map and determining what bus stops to show (or hide) is now instantaneous instead of requiring a small pause and the end of the pan gesture. It’s a simple call site:

.onMapCameraChange(frequency: .continuous) { context in
    model.showStops = context.camera.distance < 9500 // hide stops when above 9,500m
    Task {
        await model.updateVisibleBusStops(context.rect)
    }
}

App Clip

Singapore Buses now contains an App Clip with arrival estimate UI.

When users share estimated arrival times from the main app, text is generated with the current arrival times along with a URL: https://clips.singaporebuses.app?... That URL has the following query parameters:

Parameter Usage Example
c Bus Stop Code 08138
n Bus Stop Name Concorde Hotel S'pore
r Road Name Orchard Rd
s Service No 174
lat Latitude 1.3004785730821
lon Longitude 103.841847006076
e Expiry 1757767987
v HMAC Validation signature

The parameters c, n, and r are used to populate the UI in the App Clip, while lat and lon are used to determine if a Look Around view can be displayed. s in conjunction with c are used to query the LTA API for the latest estimates. e is the time the App Clip expires, and v is a signature that is validated to make sure the URL is genuine.

If the recipient has Singapore Buses installed, tapping the link opens the app and presents arrivals for that bus stop. Otherwise, an App Clip launches with the same bus arrival UI as the main app and updates arrival estimates every 15 seconds for 10 minutes…then invites the user to download the app from the App Store.

The **clips**.singaporebuses.app subdomain is powered by Cloudflare Workers. It serves an AASA, some basic content, and a favicon, but is otherwise is there to enable redirects to the app or the App Clip.

This is the first time I’ve implemented an App Clip. I’m interested to see how (or if) it affects download statistics.

iPad Support

Given that iPadOS is, in my opinion, the star of the *26 *series of OS updates, it only made sense to extend Singapore Buses to the iPad. It now has a native layout with some iPad specific niceties, like keyboard shortcuts and a full-screen route views.

(I’ve never seen anyone actually use an iPad at a bus stop in Singapore. With that in mind, Singapore Buses will be on Apple Watch in the future.)

LandTransportKit

Lastly, all interaction with the Land Transport API is now handled with LandTransportKit.

I’ve open sourced this package—it’s free for anyone to use!

Singapore Buses v2026 Beta

0:00
/0:06

Singapore Buses v2026 beta is available now to website members. v2026 is a complete re-write and updates the app with Liquid Glass design niceties.

If you wish join the TestFlight, sign up and you’ll be able to access to the TestFlight link at the bottom of the article.

The remainder of this post was originally for members only.

What’s New in Singapore Buses v2026

OS Requirements

  • [New] The minimum supported iOS version is iOS 26
  • [New] Singapore Buses is now a native iPadOS app and works on Apple Vision Pro in iPad display mode

Underlying Technologies

  • [New] Database interaction is now managed by GRDB instead of Core Data
  • [New] Interaction with the Land Transport Authority API is now handled via LandTransportKit and it’s a little bit quicker
  • [Updated] Location tracking is now more accurate and updates more frequently

User Interface

  • [New] The app now uses the updated Liquid Glass tab bar navigation structure
  • [New] The nearest bus stop is presented above the tab bar on the map view
  • [New] The map view will display bus stops as you scroll instead of at the end of the scroll gesture
  • [New] All map views—bus stop and bus route—can be viewed in 3D
  • [New] Search has been updated with the search bar now positioned at the bottom of the screen
  • [New] App Icon based on 1990’s Singapore bus stop design
  • [New] TipKit used for initial onboarding
  • [Updated] There have been small changes to the bus stop layout rows
  • [Updated] There are additional theme options for Singapore Buses+ subscribers
  • [Updated] There are new support options in Settings
  • [Updated] Acknowledgements view

Join TestFlight

Apple Maps ‘Detailed City Experience’ Expands to Singapore

Apple Maps ‘Detailed City Experience’ Expands to Singapore

Over the last week or so, the ‘Detailed City Experience’ in Apple Maps has expanded to Singapore. The result is a more detailed map with improved road markings and highly detailed landmarks.

Marina Bay Sands (left), National Stadium (centre), Lau Pa Sat + Road markings (right)

Singapore Buses’ routes should benefit from a more detailed map!

Singapore Buses 2025.6.1

Singapore Buses 2025.6.1

Singapore Buses 2025.6.1 is now available in the App Store. There are no user facing changes in this release, but here’s a rundown of what has changed:

  • Uses a new version of the Singapore Buses API (which paves the way for a much larger update later in the year)1
  • Removes Google Firebase
  • Reduced the download size by approximately 3MB

If you enjoy using Singapore Buses, try the premium features available with Singapore Buses+2.


  1. The server-side app is now written in Python and uses the FastAPI framework.

  2. Live Activities, app themes, and advert removal.

Summer Plans

Summer Plans

Like other developers, I’ve spent a few weeks with Apple’s new Liquid Glass design language. In some areas, I think it’s tremendous: the macOS dock, iOS folders, text selection hover effects on iOS, and the new sidebars are standout elements. In other areas, it’s middling: toolbars and tab bars that don’t update quite in *real-time *as advertised leave the UI looking out-of-sync with the underlying content. And, the final bucket, where it’s rubbish: clear glass icons.

My working assumption is that the rough areas will be smoothed out over the next few months.

So, on to the plans:

Singapore Buses

  • Singapore Buses is currently on v2025.5. There may be a few summer updates to keep the bus stops and routes current.

  • Singapore Buses v2026:

  • Will target iOS 26

  • Will have Liquid Glass UI (I am experimenting with toolbars, tab bars, and more…)

  • Will have new server-side code (written in Python)

  • Will, tentatively, drop Core Data (which has been the biggest source of crashes)

NetNewsWire

  • Refresh the macOS and iOS UI.

  • No new features (except the NetNewsWire About panel on macOS)

Untitled Flag Quiz

  • A long time ago, in a coding language far far away (Objective-C), I wrote an app to teach my nephews about world flags
  • Said nephews are now adults, but I’ve been asked to bring back the app
  • Thing is, I don’t have the source code from that original app
  • Thus, build from scratch or build from prompts? Let’s see

Singapore Buses Year-in-Review 2024

Singapore Buses Year-in-Review 2024

It’s the last day of 2024! I launched this version of Singapore Buses in September 2023, so 2024 is the first full year of statistics I have available. The data below is captured through Firebase and App Store Connect.

  • Number of sessions: 133,000

  • Geolocation Alerts (to tell a user when they’ve arrived): 1,600

  • Live Activities: 627

  • Crashes: 48 (though 0 since October)

  • End of Year Ratings:

  • 4.6 ★★★★★ | 266 ratings (Singapore App Store)

  • 4.9 ★★★★★ | 34 ratings (Malaysia App Store)

  • 4.8 ★★★★★ | 11 ratings (US App Store)

  • 4.7 ★★★★★ | 10 ratings (UK App Store)

  • 4.9 ★★★★★ | 7 ratings (India App Store)

  • 4.3 ★★★★☆ | 6 ratings (Thai App Store)

  • 4.0 ★★★★☆ | 4 ratings (Australia App Store)

  • 4.8 ★★★★★ | 4 ratings (Japan App Store)

The Live Activity count is not as high as I would have hoped, but it is gated behind a (very small) in-app subscription so it is perhaps not surprising. The majority of the 48 crashes were caused by a daft programming error (i.e., my error) where I was trying to update the UI from a background thread. I haven’t seen a crash report since I fixed it in October.

Ratings-wise, I’m happy. (The overall 4★ rating from Australia is broken down to three 5★ ratings plus one 1★ rating, with no written review. I’m ignoring it.)

I’m happiest with the number of sessions. At 133,000 for the year, it averages at over 2,500 sessions-per-week.


On to the money:

  • Ad Revenue: S$167
  • App Store Revenue: S$77.00 (after Apple’s cut)
  • Server: (S$27.16)
  • Apple Developer: (S$134)
  • **SWEET PROFIT: **S$82.84

App development truly is a high-margin, high-profit, gold-rush business.

Here’s to 2025 ⌚️!

Singapore Buses v2023

Singapore Buses v2023

What’s New?

  • Singapore Buses now supports Look Around (where available) so you can see the surrounding area of a bus stop.
  • Singapore Buses+, a new subscription offering, allows you to remove ads and enables support for Live Activities.
  • Live Activities—next-generation arrival tracking—allows you to track up to five upcoming arrivals from your Lock Screen and, where available, from the Dynamic Island. This removes the need to open the app to get refreshed timings. Each arrival is tracked for 15 minutes.

Live Activities

What’s Changed?

  • The Arrivals view has been redesigned to show all upcoming arrivals on a single screen without selecting a bus service on a carousel.
  • The Arrivals view now supports Look Around (where available), so you can see the surrounding area of a bus stop.
  • The Search view no longer takes up a minimum of half the screen 😃!
  • Bus Route Search has been redesigned and shows Inbound, Outbound, and Loops.
  • The Bus Routes view has been redesigned and shows more data, e.g., route distance and stop count.
  • Bus routes accurately follow roads.
  • Improved support for dynamic text sizes throughout.
  • Siri integration has been removed in this release.

NetNewsWire 6.1 Released

NetNewsWire 6.1 is out now on macOS, and custom themes are the tentpole feature. Yes, custom themes, for your RSS reader. It’s not just changing the tint colour or the font, custom themes change the entire reading experience. It sounds nuts. It is nuts. It is also great fun.

From version 6.1, NetNewsWire will recognise .nnwtheme theme packages and install them automatically.

Two of my themes—Promenade and NewsFax—are included in the 6.1 release.

I also have a few others available for download for members:

  • Broadsheet — NetNewsWire as a quality newspaper
  • Illinois — NetNewsWire plus a little bit of classic macOS

NetNewsWire 6 Out Now on iPhone and iPad

‌The World’s Favourite Open Source RSS ReaderTM has been updated to version 6.0 on iPhone and iPad. I don’t often write about releases, but this one is significant and it’s been almost a year in the making.‌

The headline features of this release are iCloud syncing, Twitter and Reddit integrations, home screen widgets, and support for a host of new syncing services.

iCloud Syncing

iCloud syncing is a game-changing feature if you want to sync your feeds across your Apple devices and don’t want to use a third-party syncing service to do so.

You can enable iCloud syncing in the app by going to Settings > Add Account > iCloud. Once enabled, you can either drag feeds from your existing local account or third-party service to iCloud or add feeds directly using Add Feed and selecting the iCloud account.

From there, it behaves like a local account with one small difference: it will sync your feed subscriptions, read and starred statuses across your Apple devices. It’s a really cool feature.

A few words to the wise, though. First, if you’re going to do a large migration of feeds into iCloud, it does take time. Apple has strict requirements on the amount of data that can be synced and will, on occasion, apply some throttling. (Be patient!) Second, like local accounts, you may miss some articles if they come and go before the app has completed a refresh.

Additional Third-Party Sync Services

In addition to local syncing, iCloud, Feedbin, and Feedly, 6.0 expands the available syncing services with five new providers: BazQux, Inoreader, NewsBlur, The Old Reader, and FreshRSS. If you use any of these services, now is a great time to jump on board.

Twitter and Reddit Integrations

Tweets and Reddit posts in an RSS reader? If you’re using a local or iCloud account, this is now possible. You can enable Twitter or Reddit via the app’s Settings menu under Add Extension.

Once you’ve signed in, you get additional options in the “+” menu to add Twitter or Reddit feeds:

Reddit Twitter
Home Home
Popular Mentions
All Screen Name
Subreddit Search

I use the Twitter Search option the most. For example, to follow the #NetNewsWire hashtag.

Home Screen Widgets

There are three variations of home screen widgets that follow your Smart Feeds: a Today widget, an Unread widget, and a Starred widget. They come in medium and large sizes. Tapping on articles will take you straight to the article while tapping anywhere else will open the app.

We’ve not included the widgets on macOS. If you’d like them there, please raise an issue on GitHub.

If You Want to Help Out

NetNewsWire is free, open-source, and built by volunteers around the world. If you want to get involved—and very likely learn a thing or two—head over to Slack. Brent has built a fantastic community, you’ll be made to feel welcome!