A native iOS app to explore, track, and complete every transit station in the Paris region (Île-de-France), with gamification, iCloud sync, and zero dependencies.
- Browse all transit lines in the Paris region: Metro, RER, Train, Tram, Bus, Cable Car, Funicular, and more
- Track visited stations and log your travels across the network
- Search stations and lines across the entire network
- Find nearby stations based on your location
- Gamification system with XP, levels, badges, achievements, streaks, and secret discoveries
- View per-line and per-mode completion progress
- View line routes on an interactive map with heatmap overlay
- Browse your travel history on a timeline with animated route replay
- Monthly and yearly recaps with story cards
- Earn and share line completion certificates
- Detailed statistics: travel patterns, personal records, department and fare zone coverage
- Sync your progress across devices with iCloud
- Export and import your travel data as JSON
- Home screen widgets and quick actions
- Offline-first: all transit data is bundled with the app, no network required
- Fully native with zero third-party dependencies
- Metro
- RER
- Train
- Tram
- Bus
- Cable Car
- Funicular
- Regional Rail
- Rail Shuttle
- iOS 17.0+
- Xcode 16+ with iOS 17 SDK
- Bun (for the data pipeline)
The app bundles a pre-built SwiftData store with transit data. Since this file is not checked into the repository, you must download the source datasets and generate it before building.
A fetch script downloads all required datasets (3 JSON files + GTFS archive) from the IDFM and data.gouv.fr APIs, backing up any existing data first:
make fetchThis populates data-builder/data/ with the following structure:
data-builder/data/
arrets.json # from Arrêts
arrets-lignes.json # from Arrêts et lignes
referentiel-des-lignes.json # from Référentiel des lignes
IDFM-gtfs/ # extracted GTFS archive
agency.txt
calendar.txt
calendar_dates.txt
routes.txt
stops.txt
stop_times.txt
transfers.txt
trips.txt
...
The datasets are published under the following licenses:
| Dataset | Source | License |
|---|---|---|
| Arrêts et lignes | IDFM | ODbL |
| Arrêts | IDFM | Etalab Open License 2.0 |
| Référentiel des lignes | IDFM | ODbL |
| GTFS Horaires | data.gouv.fr | Licence Mobilités |
# 1. Process IDFM/GTFS data into JSON
make data
# 2. Build SwiftData store from JSON
make store
# 3. Copy store into app bundle resources
make importThen open metropolist/metropolist.xcodeproj in Xcode and build.
metropolist/ Xcode project (SwiftUI iOS app, tests, widgets)
data-builder/ TypeScript/Bun pipeline: IDFM GTFS data → JSON
store-builder/ Swift CLI: JSON → SwiftData .store file
Métropolist is localized in 2 languages:
English, French
Transit data is sourced from Île-de-France Mobilités (IDFM) and data.gouv.fr, published under the Etalab Open License 2.0, ODbL, and Licence Mobilités licenses. See Required Datasets for details.
Métropolist is licensed under the MIT License.




