← All work

In production Android 2026

TransitOS

An open-source Android transit app for Metrovalencia: live arrivals, trip planning and an interactive network map. No ads, no tracking, and a provider architecture so any operator can be added without touching the app.

Role
Solo developer · design to Play Store
Stack
  • Android
  • Kotlin
  • Jetpack Compose
  • Material 3
  • Ktor
  • Koin
  • osmdroid
  • Clean Architecture
Home with live arrivals at Benimaclet
Network map with live arrivals for a station
Trip planner with departure and arrival modes
v1.0.3
in production on Google Play
3
languages: English, Spanish and Valencian
AGPL-3.0
open source, no ads, no tracking

TransitOS is an open-source Android app for public transport in Valencia. It covers Metrovalencia (FGV) end to end: live arrivals, trip planning and an interactive network map. No ads, no tracking, no analytics.

What it covers

  • Live arrivals per station and line, through a typed AppResult so the UI tells loading, data and error apart.
  • Trip planner with departure or arrival modes and a configurable transfer buffer.
  • Network map on OpenStreetMap tiles: every station, the official line colours, tap a station for its lines and next arrivals.
  • Saved routes with custom labels (“Home”, “Work”), stored locally with DataStore.
  • Themes and i18n: system / light / dark / AMOLED pure black, plus English, Spanish and Valencian.

The provider model

Every operator exposes data differently: different endpoints, schemas and quirks. The trap is letting one operator leak into the rest of the app, so the domain layer defines a single TransitRepository contract and each operator lives in its own module.

Presentation (app, feature-*, core-ui, core-design)
        |  depends on
        v
Domain (core)  -> models, repository contracts, AppResult
        |  implemented by
        v
Data (provider-*, core-network, core-data)  -> repository impls, Ktor, DataStore

:provider-metrovalencia implements the contract against FGV’s data. Adding a new operator means adding one module: create :provider-emt, implement TransitRepository, register its Koin module in :app. The UI, the planner and the map do not change. That is what makes the multi-city plan realistic instead of a rewrite each time.

Stack

  • Kotlin with Coroutines and Flow, Clean Architecture
  • Jetpack Compose (BOM-managed), Material 3, dynamic colour
  • Ktor for networking, Koin for dependency injection, DataStore for preferences
  • osmdroid for the network map, Gradle Version Catalog for versions

Status

In production. On Google Play, with signed APKs on the releases page (latest v1.0.3). Metrovalencia is fully covered. Open source under AGPL-3.0; not affiliated with or endorsed by Metrovalencia or FGV.

Source: github.com/IgnacioLD/TransitOS.

Drafted with AI, edited by hand. I publish it when it sounds like me.

Tell me what you're building.

I read every email myself and reply within a few days. Products, collaborations, Android or on-device AI work, or just a coffee in Valencia.