Your next Athens train, instantly.
Metro • Tram • Suburban Railway
A transit companion for the Athens metro, tram, and suburban railway. Pick a station or let GPS find the nearest one and get a live countdown to your next departure. Works offline, underground, with no signal.
Syrmos (συρμός) is the Greek word for the carriages that form a metro train.
|
|
| Home | Live Map |
- Offline-first. Every release bundles a full snapshot of the API; the app launches with correct data on airplane mode and syncs silently when online.
- Live train map with simulated metro/tram positions and real-time suburban tracking from the Hellenic Train SSE feed.
- Frequency-band projector computes next departures from operator rules, so schedules stay correct without a client release.
- Real OSM track geometry for every line: T7 Piraeus loop, M3 airport branch, A4 Megara curve render along actual rail.
- GPS nearest station, bilingual EN/EL, light/dark theme, full timetables, station details, line browser.
- Hot-patchable schedules via
api-syrmos.peterdsp.dev: fix a band on the Pi, every installed app sees it on next cold start.
| Mode | Lines | Stations | Operator |
|---|---|---|---|
| Metro | Line 1, 2, 3 | 71 | STASY |
| Tram | T6, T7 | 62 | STASY |
| Suburban | A1, A2, A3, A4 | 68 | Hellenic Train |
One Kotlin Multiplatform codebase. iOS uses SwiftUI + MapKit, Android uses Compose + osmdroid, web uses Compose for Wasm + Leaflet. Shared train simulation, schedule logic, data layer, and icons.
iosApp/ SwiftUI shell (Apple Maps)
androidApp/ Compose Activity shell (osmdroid)
composeApp/ KMP composition root, navigator, Koin wiring
feature/ home, lines, stations, schedule, map, settings
core/
domain/ use cases, projector, LiveArrivalsProvider
data/ repositories, DataSeeder, ScheduleSync
database/ SQLDelight + platform drivers
network/ Ktor services
designsystem/ theme, shared components
navigation/ Voyager tabs and routes
model/ domain data classes
common/ Result, datetime, geo
build-logic/ convention plugins for the 15+ modules
ops/ Pi-hosted FastAPI service + importers (syrmos-api, syrmos-web)
docs/ contribution workflow, case study, privacy, badges, screenshots
scripts/ importers, deployers, seed snapshotters
assets/ icon packs, line geometry, timetable PDFs
Backend lives on a Raspberry Pi behind Cloudflare Tunnel at api-syrmos.peterdsp.dev. It serves /api/lines, /api/schedules, /api/holidays, /api/fares, /api/announcements, /api/trains (SSE relay), and /line-geometry/{id}.geojson, all ETag-driven. Source of truth is SQLite, edited through a gated /admin UI.
Stack: Kotlin 2.1, Compose Multiplatform 1.8, SwiftUI, SQLDelight 2.1, Koin 4.1, Ktor 3.1, Voyager 1.1, osmdroid, Leaflet, kotlinx-datetime.
Prereqs: JDK 17+, Android Studio Ladybug+, Xcode 16+ (iOS).
# Android
./gradlew :androidApp:installDebug
# iOS: auto-detects project, picks latest simulator, builds, installs, streams logs
./scripts/simulator.sh
./scripts/simulator.sh --device "iPhone 16 Pro" --clean
./scripts/simulator.sh --release
./scripts/simulator.sh --list
# Web dev
./gradlew :composeApp:wasmJsBrowserRun
# Web release
./gradlew :composeApp:stageWebRelease
./scripts/deploy-web-to-pi.sh
# Tests
./gradlew allTestsSchedule data is encoded as operator rules (operating hours + frequency bands by daypart), not as pre-computed departure lists, so it stays accurate when the user's clock disagrees with the build clock.
- STASY: Metro 1/2/3 and Tram T6/T7
- Hellenic Train: Suburban A1/A2/A3/A4 (PDFs archived in assets/hellenic-train-timetables/)
- OASA 24mmm: Saturday 24-hour grid, scraped daily
A daily Pi timer hashes upstream PDFs; when anything changes, the admin UI surfaces the diff before the next snapshot ships. Reference data (coords, icon rules, holidays, M3 split, T7 loop) lives in ops/syrmos-api/pkg/.
Syrmos is not affiliated with STASY, Hellenic Train, or OASA. Suburban ticket purchases open Hellenic Train's official site under their own terms.
Shipping: iOS 1.0.5, Android 1.0.4, Web (rolling). See CHANGELOG.md for what landed in each release and what is planned next. The changelog is the source of truth, kept in sync at every release.
- Contributing: PR-first workflow with a CI guard on
master. See contribution workflow and .github/CONTRIBUTING.md. - Privacy: no data collection, no analytics, no tracking; location stays on-device. Privacy Policy.
- License: code is BSD 3-Clause (LICENSE), docs and assets are CC BY-SA 4.0 (docs/LICENSE-docs.md) and may also be used under BSD 3-Clause. Security: .github/SECURITY.md. Conduct: .github/CODE_OF_CONDUCT.md.
Logo by Petros Dhespollari, inspired by designs of art conservator Amalia Boura. Map data © OpenStreetMap contributors (ODbL). Live positions via Hellenic Train at railway.gov.gr. Trademarks remain with their owners.


