About this project
Sprawl//Run is a Flutter-based Android app that frames running as a cyberpunk courier story. It is built for people who want narrative motivation rather than a spreadsheet of splits, and it is designed to work entirely offline.
Story and structure
Two campaigns contain twenty GPS-tracked missions. Sprawl Prime is the starting campaign; finishing it opens Null Tide. Before each mission you choose a target — a time or a distance — and the story paces itself to whatever you pick. Hitting the target clears the operation; stopping short fails it, leaves it open, and you can retry whenever you like. Running past the target still counts and triggers extra handler dialogue.
Pursuits are the central mechanic: during certain missions something chases you, and you have a limited window to escape. The required effort is scaled to your own pace over the previous three minutes rather than a fixed designer-chosen number, so it is a real effort at any running speed and is never impossible. Pursuits can be switched off entirely while keeping the story.
Nine characters are voiced by on-device speech synthesis, and the README states the campaigns contain 492 lines of dialogue. A codex of forty entries unlocks only after a character has actually mentioned an entry, so it records what you have been told rather than acting as a read-ahead wiki. Optional handler reminders and optional between-run "signal noise" messages can be enabled, with the latter never firing overnight.
Tracking and metrics
GPS tracking continues with the screen off and includes auto-pause. The live HUD shows distance, pace, elapsed time, a goal ring and the pursuit bar. Calories are computed from the ACSM metabolic equations and your body mass. Routes are drawn as a neon trace from the stored GPS data and can be replayed at the pace you actually ran. The app deliberately omits maps because map tiles require a network.
Progress
Weekly and monthly summaries can be stepped back to your first run. A long-term history shows distance per month plus a dot calendar where each month is lit by how far you ran. Sixty achievements span six categories and four tiers, and progress is recomputed from the run log rather than stored as counters. Streaks use a weekly commitment you define yourself (minutes, kilometres or missions), and a week still in progress never breaks a streak.
Data ownership
Settings → Data exports profile, campaign progress, achievements, codex and every run with its GPS trace as a single plain JSON file handed to the system share sheet. Import either replaces the device (a clean restore) or merges, adding only what is missing so an old backup cannot relock a mission. No storage permission is used in either direction. Individual runs can be exported as GPX 1.1 tracks for apps such as OsmAnd, Strava or Komoot.
Audio
Music from another player ducks for a transmission and is resumed if the player misbehaves. An optional ambient synth bed is available when you bring no music. Speech rate and effects volume are adjustable, and story voice can be silenced.
Privacy and permissions
The README is unusually explicit here. There is no INTERNET permission, no accounts, no ads, no analytics and no Google Play Services; the app module excludes the com.google.android.gms group and forces the AOSP LocationManager. Tracking with the screen off uses a foreground service rather than ACCESS_BACKGROUND_LOCATION, and the ongoing notification is the only notification the app shows. The README also notes that android:allowBackup is left at Android's default of true, so the OS backup agent may copy the run log to a user's Google account if device backup is enabled — the app itself never does this. Two permissions arrive indirectly: ACCESS_NETWORK_STATE via ExoPlayer/just_audio, and a self-defined dynamic-receiver permission from share_plus.
Technical notes
Built with Flutter 3.44.8 / Dart 3.12, Android first with iOS scaffolding present. Building requires JDK 17. The NDK is needed because path_provider_android pulls in package:jni. The run engine takes its location source, narrator and clock by injection, which allows whole missions to be tested against synthetic GPS in milliseconds; the README reports 228 tests and a clean flutter analyze. Sound effects, launcher icons and README screenshots are all generated by scripts in tool/, and the screenshot tool drives the real widgets with seeded data.
Mission packs are single JSON files dropped into the app's documents directory under sprawlrun/mission_packs/ and reloaded from Settings, with no rebuild required. App code is MIT; bundled fonts (Orbitron, Rajdhani, Share Tech Mono) are SIL OFL 1.1.
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.