Against Yesterday app icon GPS running & cycling · On-device

Against Yesterday

Every route is a race with your own best. Across Yesterday you run a live “ghost” of your personal best — and the gap, AHEAD or BEHIND, is the metric that carries every mile.

“BEHIND by 5 seconds” · “AHEAD of yesterday” · “NEW PERSONAL BEST”

No cloud · No account · No telemetry · No internet permission

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

1

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.

2

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.

3

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).