A race, not a logbook
Race your personal best
A recording state machine drives every run — GPS acquiring → ready → running ↔ paused → finishing → completed — with live distance, pace, elapsed time and the PB gap.
Ghost racing
Every route carries a PB. Run against its ghost live on the map, then finish to see exactly where you were faster or slower — and bank a new time to beat.
Self-contained route map
A custom painter with no map SDK: the route, the travelled portion, the YOU and ghost markers, and a follow camera you can recentre at any time.
Route library & results
Course cards with PB / average / last stats, a performance chart of every attempt, NEW PERSONAL BEST detection, a splits breakdown, and a full history.
Rust GPS engine
gps-engine, called over FFI, turns raw fixes into track, route and ghost — filtering jitter, dropouts and jumps before any geometry is drawn.
Developer diagnostics
A gateable readout of the live engine, GPS fix, track, route, ghost and persistence state — plus one-tap export of the current run as raw GPS for regression replay.
How it works on your phone
Raw GPS in
Fixes are taken straight from the receiver before any processing and persisted with the activity, so a completed run always keeps its ground truth.
The Rust engine
gps-engine filters noise, dropouts and jumps, then builds the track, the route and the PB ghost — referenced by wall-clock time and recovered across process death, so an interrupted run resumes where it left off.
The race
You against the ghost: AHEAD or BEHIND on every repaint, splits at the finish, and the time banked as the next PB to beat.
Nothing leaves the device. The app declares no internet permission — there is no cloud, no account, no telemetry, and no path for your routes to travel on.
Build from source
Free and open source (AGPL-3.0-or-later). Flutter client, Rust engine — fully reproducible from the repository.
cd app
flutter pub get # Flutter client (deterministic fake engine by default)
flutter run
cargo test # Rust engine: tests + raw-GPS fixture replays
To run against the real Rust engine over FFI:
cargo build --release
cd app && flutter run --dart-define=USE_RUST_ENGINE=true
Requires the Flutter SDK (Dart ≥ 3.11), Rust 1.85+, and the Android NDK for the native build of the engine (API 24).