Never miss your train or bus. FGC and TMB commute assistant for iPhone and Mac
Local-first commute planning powered by FGC and TMB schedule and realtime data
Ping helps you choose a route fast and know exactly when to leave.
- Track upcoming departures and delay-aware leave times
- Save favorite stations for quick route switching
- Get calendar-aware commute suggestions and iPhone leave reminders
- Browse TMB bus stops on the map and tap a stop to see upcoming arrivals
- See FGC service alerts in iOS and macOS
Ping is open source and built to run from Xcode. There is no App Store or TestFlight build. That would require a paid Apple Developer Program license and I'm not paying for it. Until then:
- iOS: clone the repo, open in Xcode, and run on your own device or Simulator.
- macOS: either run from Xcode, or grab the unsigned
Ping.dmgbuilt locally viascripts/release-macos.sh(seeRELEASE.md).
Requirements:
- Xcode with iOS 26+ and macOS 26+ SDKs
xcodegenprotoc(only needed when regenerating GTFS Realtime generated code)
git clone https://github.com/felitrejos/ping.git
cd ping
xcodegen generate
open Ping.xcodeprojThen select Ping iOS or Ping macOS and run. The iOS target needs a free
personal Apple ID signed into Xcode to run on a physical device.
TMB map stops and iBus arrivals need API keys. Without them the FGC side of the app works fine, but the TMB map layer stays empty.
- Copy
iOS/Config/TMBKeys.example.xcconfigtoiOS/Config/TMBKeys.xcconfig. - Fill in:
TMB_APP_ID_PRIMARYTMB_APP_KEY_PRIMARYTMB_APP_ID_BACKUPTMB_APP_KEY_BACKUP
TMBKeys.xcconfig is gitignored and picked up by the iOS target config.
- Launch iOS or macOS target from Xcode.
- Pick origin and destination stations.
- Tap
Search routes. - Optionally add favorite stations in Settings.
- Enable location/calendar access for walking ETA and commute suggestions.
- Swift + SwiftUI multi-target app (
iOS/,macOS/) - Shared domain and services in
Shared/ - FGC GTFS static + GTFS-Realtime ingestion
- TMB GTFS static + iBus arrivals ingestion (iOS map)
- Dependencies:
SwiftProtobufZIPFoundation
If you need to regenerate protobuf models:
protoc --swift_out=Shared/Generated Proto/gtfs-realtime.protoping/
├── Shared/ # shared models, services, engine, settings views
├── iOS/ # iPhone app
├── macOS/ # menu bar app
├── Tests/PingSharedTests/
├── Resources/
└── Proto/
Run shared tests:
swift testproject.yml is the source of truth for the Xcode project.
Regenerate the project after target/dependency changes:
xcodegen generateUnsigned macOS DMG build: see RELEASE.md.
MIT
