Skip to content

peterdsp/Syrmos

image

Syrmos

Your next Athens train, instantly.
Metro • Tram • Suburban Railway

Kotlin Compose SwiftUI Platform License

Download on the App Store   Get it on Google Play   Open Web App


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.

image image
Home Live Map

Highlights

  • 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.

Coverage

Mode Lines Stations Operator
Metro Line 1, 2, 3 71 STASY
Tram T6, T7 62 STASY
Suburban A1, A2, A3, A4 68 Hellenic Train

Architecture

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.

Build and run

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 allTests

Data sources

Schedule 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.

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.

Releases and roadmap

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, privacy, license

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.