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 (Dart)FastAPIPythonVue 3TypeScriptMapLibre GLSQLiteDocker

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

Storage

SQLite

Activities · events · media

GPS tracks, event logs, photos and audio from the ride. Collections and their shared permissions. Everything in one database file.

Backend

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.

Frontend

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.

Users

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:

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.

Back to Projects