Skip to content

Repository files navigation

image

Syrmos

Your next Greek train, instantly.
Metro • Tram • Suburban • InterCity Railway

Kotlin Compose SwiftUI Platform License

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


A rail companion for Greece. Athens (metro, tram, suburban), Thessaloniki (metro + suburban), the InterCity corridor between them, and Patras suburban. 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, trilingual EN/EL/SQ (Albanian first-class), light/dark theme, full timetables, station details, line browser.
  • Ariadne, an offline transit assistant: ask in plain English, Greek or Albanian and she answers departures, last trains, routes and fares from the bundled data. A tool-only intent router with an optional on-device LLM — she never invents a fact.
  • Hot-patchable schedules via api-syrmos.peterdsp.dev: fix a band on the Pi, every installed app sees it on next cold start.

Coverage

Greek passenger rail, city by city. 32 lines, four regions.

Region Lines Operator
Athens Metro 1/2/3, Tram T6/T7, Suburban A1-A4 STASY, Hellenic Train
Thessaloniki Metro TM1 (live), TM2 (Kalamaria, opening) • Suburban Larisa, Florina, Sindos, Serres-Drama Thessaloniki Metro, Hellenic Train
National InterCity Athens–Thessaloniki, Athens–Leianokladi, Alexandroupoli–Orestiada–Ormenio (Evros) • Tourist rail: Katakolo–Pyrgos–Olympia, Pelion (Ano Lechonia–Milies), Diakopto–Kalavryta rack (suspended) • Rail-replacement buses: Paleofarsalos–Kalambaka, Volos–Larisa, Drama–Xanthi–Alexandroupoli, Kiato–Patra, Tithorea–Lamia–Stylida Hellenic Train
Patras Suburban Kaminia & Rio branches, Kato Achaia connecting bus, University campus shuttles Hellenic Train

Every timetable is transcribed from the official Hellenic Train / railway.gov.gr sources and stored as exact per-station times — never estimated. A line that is built but not yet open (Thessaloniki Line 2) renders greyed and carries no departures until it opens.

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 2.0.0 (build 138), Android 2.0.0 (versionCode 223), Web (rolling). See CHANGELOG.md for what landed in each release. The next major release direction, 3.0 "Journeys", is defined in docs/plans/3.0-JOURNEYS.md. 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.

Releases

Packages

Contributors

Languages