Stride: an offline-first running app with a mascot that runs with you
Our own running and walking tracker for Android, with iOS next: live GPS that keeps going with the screen locked, no account needed, and Moop cheering every finished run.
- android now · ios next
- flutter + firebase
- built in indore
- open source
why we built it
a running app that just lets you run.
Many running apps want your email before your first step, then fill the screen with feeds, challenges and upgrade prompts. We wanted the opposite: open it, press one big button, go.
It's also our showroom. Stride is a real app, coming to Google Play now and iOS next, built exactly the way we build apps for clients, with the code open for anyone to read.
- design system first
- offline from day one
- tested on 360 px phones
- open source
the app, screen by screen.
Five screens, in the order you meet them.
screens 01–02 · welcome & home
start running, no account.
The welcome screen has one job: get you moving. "Start tracking now" works with no sign-up and no network; Google or email sign-in sits below, only for backups. Home is a map, one big start button, your streak and this week's distance.
- live distance, time, pace and steps
- while running, only a pause button
- to finish: pause, then hold for a second
screens 03–04 · onboarding
five questions, then go.
Goal, experience, units, height and weight, and how active you are, one question per screen with a progress bar on top. Height and weight drive the calorie estimate, and the body mass index updates as you type, in kilograms and pounds.
- one question per screen
- kilometres or miles, kilograms or pounds
- Moop keeps you company on every step
screen 05 · splash, and Moop
Moop runs with you.
Our mascot isn't a picture: in the app, Moop is drawn in code from the same shapes as the moops.in logo, the very one bouncing next to the screenshot. It breathes, blinks, has five moods, runs on the splash screen and cheers each of 14 badges, from "First stride" to a 30-day streak.
- five moods, from sleepy to shocked
- 14 badges and levels to unlock
- sharp on every screen: no image files
one brand, site and app.
Stride uses the same colours and fonts as this website, in a style we call cute neo-brutalism: flat pastel blocks, 2.5 px ink outlines, hard 4 px shadows, 20 px corners, one colour per card, everything on one spacing grid. A matching dark theme ships with it.
- cream#F8F8F3background
- ink#211F1Btext, outlines, shadows
- olive#3F6B35brand, main buttons
- butter#FFE58Ahighlights, streaks
- blush#FFDCE5badges, stop
- sky#C8E4FFweekly stats
- sage#E5F0CEcalm cards
- coral#D96979your dot on the map
good morningFraunces · headings
Start tracking nowGeist · interface
0.0 KM THIS WEEKGeist Mono · numbers
Fonts are bundled in the app, so it never waits for the network to draw text.
built like it'll be used.
The parts you don't see are where most apps fail: bad networks, locked screens, budget phones. This is how Stride handles them.
- 8,400lines of Dart
- 113automated tests
- 14badges to unlock
- 2themes, light and dark
-
offline first, sync second
Every change goes into SQLite on the phone first. Signed in, changes upload in chunks under Firestore's batch limit, and a rejected record is retried on its own, so one bad run never blocks the rest. Changes waiting to upload win, deleted runs travel as markers, the newest profile edit wins.
-
GPS that survives a locked screen
Location runs in a small native service of our own, Kotlin on Android and Swift on iOS, bridged to Flutter. It keeps measuring with the screen off and shows a notification for as long as a run is live.
-
private by default
No account needed, no ads, no analytics SDK. Firestore rules let each person touch only their own data, in the exact shape the app writes. App Check (Play Integrity) keeps fake clients out; crash reports run in store builds only.
-
tested at 360 px
113 automated tests: the sync engine against a fake Firestore, plus splits, pace, streaks and badges. Every screen is rendered in light and dark at a 360 px budget-phone width with real fonts, and fails on any overflow.
what this means for your app
- designed as a system first, so new screens stay consistent
- offline from day one, for patchy mobile networks
- tested on the 360 px phones your customers actually use
- privacy policy and account deletion ready for the Play Store
- your code and your store accounts, in your name
stride, in facts
- 113 automated tests, including every screen in light and dark at a 360 px phone width
- works fully offline; signing in is only for backing up runs
- each person can read and write only their own runs, checked by Firestore rules
built with
- Flutter
- Riverpod 3
- SQLite (sqflite)
- Firebase Auth
- Cloud Firestore
- Kotlin & Swift location services
- flutter_map + MapTiler
- Firebase Crashlytics
- App Check (Play Integrity)
source on GitHub ↗ Stride privacy policy delete your Stride account