Arrivals is a Kotlin Multiplatform project for live public transit times. It supports 3 targets: a macOS toolbar app, a CLI, and a desktop app (for e.g. Raspberry Pi kiosk displays).
| Dot Matrix | LCD |
|---|---|
![]() |
![]() |
There's a separate Python renderer in the arrivals-led repo, which drives a physical 128x32 LED panel.
| System | Source | |
|---|---|---|
| London | Underground, Overground, DLR | TfL API |
| UK | National Rail | Darwin API |
| NYC | Subway | MTA GTFS |
| SF Bay Area | BART | 511.org GTFS |
| Berlin | U-Bahn, S-Bahn, Tram | transport.rest |
... or any custom GTFS-RT feed
The macOS toolbar app can be downloaded from releases and copied to your Applications folder. Other targets can to be built from source with the instructions below.
- Get API keys for any authenticated sources you plan to use:
- TfL: Transport for London API
- UK National Rail: OpenLDBWS
- BART: 511.org
- Create
shared/secret.propertiesand add your keys:tfl_key=YOURKEY darwin_key=YOURKEY org_511_key=YOURKEY - Make sure you have a JDK configured at
$JAVA_HOME
| Target | Platform | Description | Quick start |
|---|---|---|---|
| macOS | macOS | SwiftUI status bar app | Open macOS/Arrivals.xcodeproj in Xcode and click the Run button |
| Desktop | Linux (incl. Raspberry Pi), macOS, Windows | Compose Multiplatform window with fullscreen mode | ./gradlew :desktop:run |
| CLI | Linux, macOS, JVM | Command-line interface | ./cli/install |
Native status bar application for macOS, built with SwiftUI.
- Open
macOS/Arrivals.xcodeprojin Xcode - Press the Run button
- Configure via the settings UI
Cross-platform desktop UI, built with Compose Multiplatform. Includes a fullscreen mode for kiosk displays and configuration via a YAML file.
# Windowed mode
./gradlew :desktop:run
# Fullscreen with custom dimensions
./gradlew :desktop:run --args="-pi 1280 400"# Executable in desktop/build/compose/binaries/main/app/
./gradlew :desktop:createDistributableCreate a .arrivals.yml in the user home directory to configure:
# Mode: "tfl", "darwin", "bvg", or "gtfs"
mode: tfl
# Shared config fields
stop: 910GSHRDHST # Station/stop ID (all modes)
platform: 2 # Optional platform (all but GTFS)
line: # Optional line (BVG only: U8, M10, etc.)
direction: # Optional direction (TfL only: "inbound" or "outbound")
# GTFS-specific config
gtfs_realtime: https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-g
gtfs_schedule: http://web.mta.info/developers/data/nyct/subway/google_transit.zip
# Optional for authenticated feeds
gtfs_api_key_param: # Param or header (e.g. "app_id", "header:Authorization")
gtfs_api_key: # API keyCommand-line interface, compiled as a native binary. Run ./cli/install to build and install the arrivals command for your platform, or run it via Gradle with ./gradlew :cli:jvmRun.
arrivals tfl --station 910GSHRDHST --platform 2arrivals gtfs --station G28S \
--realtime https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-g \
--schedule http://web.mta.info/developers/data/nyct/subway/google_transit.ziparrivals search tfl "shoreditch high street" # or use list-stops for GTFS- Powered by:
- TfL Open Data
- OS data © Crown copyright and database rights 2016
- Geomni UK Map data © and database rights 2019
- Rail Data Marketplace via Huxley2
- 511 Open Data
- transport.rest
- TfL Open Data
- Uses this London Underground Dot Matrix Typeface


