Routebase
A full-stack system for tracking multi-day bikepacking tours — on the bike, on the server, and for the people watching from home.
Tech Stack
Flutter for the on-bike cockpit because it runs Android with a single binary and no Play Store hassle. FastAPI + SQLite for the backend because it's fast to iterate and light enough for a small VPS. Vue 3 for the public viewer because I wanted reactive live updates without a heavy framework.
Garmin’s LiveTrack is fine for sharing a blinking dot — but it gives spectators nothing beyond “they’re still moving.” I wanted event logging from the bike, a proper dashboard for multi-day tours, and full control over my own data.
So I replaced the whole thing.
Architecture
SQLite
Activities · events · media
GPS tracks, event logs, photos and audio from the ride. Collections and their shared permissions. Everything in one database file.
FastAPI
Python · REST · SSE
Receives GPS batches and events, stores them, pushes live updates via Server-Sent Events. Manages auth, share tokens, and Collection permissions.
Flutter App
Android · on-bike cockpit
Live GPS posting, one-tap event logging (drink, snack, mechanical), media uploads. Designed for handlebar use with large touch targets.
Web App
Vue 3 · mobile-first
Live tracking view, past tour review, route and Collection management. Works for both riders managing their data and spectators following along.
Riders
Account · Flutter + Web
Track rides on the bike via the app, manage activities and Collections via the web. Can share Collections with other riders.
Collaborators
Account · Web
Other registered riders co-owning a Collection — plan multi-person tours together, each contributing routes and stages.
Friends & Family
No account · share token
No account needed. Follow a live ride or browse a shared Collection — full tour with all stages, tracks, and event logs — via a share link on any phone.
The cockpit app (Flutter/Android)
A custom GPS client that runs on my phone mounted to the handlebar. It posts live position batches to the backend directly — no Garmin in the loop anymore.
Also handles event logging: tap once to record a drink, snack, mechanical issue, or voice note, with GPS position captured automatically. Designed for one-handed use with large touch targets and a dark theme.
The backend (FastAPI + SQLite)
Receives GPS batches and events from the app, distributes live updates to connected viewers via SSE, and stores everything in a straightforward SQLite database. No ORM — just raw SQL and migrations.
Also handles media uploads (photos, audio), authentication, activity and collection management, and the public API for the viewer.
The public viewer (Vue 3)
What friends and family see during a tour:
- Live hero card with current position, speed, and last update time
- Interactive map with the full track and event pins
- Elevation profile with metrics overlay
- Chronological event timeline
- Multi-day stage switcher for longer tours
Built mobile-first — most people following a bikepacking tour are on their phones.
Current state
Deployed on a private URL, actively used. Next release after Dartobert.