Grinda is an iPhone app that turns a daily walking goal into a commitment backed by your own money. You pin a race bib, stake an amount, and walk. When you finish, every cent comes back. Short races are only a hold on your card, so nothing is ever charged if you finish. If you miss, the stake is kept.
It's built to help people lose weight by walking. The stake is the mechanism. Grin, the Grinda lion, keeps you company.

The signature interaction: hold to pin your bib.
These are real iOS Simulator captures (iPhone 6.9") taken by CI in demo mode on every push. The data is synthetic. Dark mode versions are in screenshots/dark.
Grin is a vector character built in code (brand/mascot/tools/grin.py). The same geometry renders the marketing art and animates natively in SwiftUI.
- Moods: happy, calm, cheer, roar, worried, sleep, wink, proud.
- Poses: idle, cheer, wave, hold, flex.
- The mane grows with you: Cub → Young lion → Lion → King of the track, based on your goal days in the last 14. It never resets overnight.
- Where he appears: Today (coach lines, tap him for a reaction), onboarding, the hold-to-pin flow, the finish, medals, empty states, the paywall, share cards, the widget, and notifications.
- Motion: idle motion is near-invisible because people see it many times a day. Celebrations get squash-and-stretch hops, confetti, and haptics. Reduce Motion is respected everywhere.
The engagement system (evolving mascot, medals, the Walktober campaign, Grin-voiced nudges) is documented with its research in brand/mascot/MASCOT.md.
| Today | Your steps as laps on a stadium track with a ghost pacer, plus Grin with a line about your actual day. |
| Races | 5-Day Sprint, 10K Week, Weekend Warrior, 30-Day Reset, and a free Practice Lap. Each race is a numbered bib. |
| Commit | The whole deal in plain words, then hold to pin your bib: four pins, four haptic taps, then Apple Pay via Stripe. |
| Progress | Grin's mane, distance as a journey, the trophy case (13 medals), the weight trend, and a punch card. |
| Wallet | A passbook of every hold, charge, release, and refund with its Stripe reference, plus Grinda's public books. |
| Finish | The tape breaks, Grin cheers, confetti, and your stake counts back up. Share card for X and Discord. |
| Also | Widgets with Grin, the evening pace nudge (max one), Grinda Pro (StoreKit 2, with a Grin app icon), account deletion, and an EN/DE listing. |
ios/: SwiftUI app (iOS 17+), widget, and fastlane. The project is generated by XcodeGen (cd ios && xcodegen generate).supabase/: Postgres schema with RLS, plus Edge Functions:create-stake,stripe-webhook,submit-steps,settle(cron),public-stats,delete-account.brand/: name, G-Track symbol, wordmark, icons, fonts, and the Grin mascot (brand/mascot/: source, renders, bible).marketing/: the weekly stats post for X and Discord (live numbers only) and the App Store frame generator.site/: landing page, privacy, support, and race rules, at https://cipherdriftx.github.io/grinda/docs/: research, strategy, the prompt audit, and the shipping guide.PRODUCT.mdandDESIGN.md: the product record and the design system.
- On a Mac:
brew install xcodegen && cd ios && xcodegen generate && open Grinda.xcodeproj. Add the launch arguments-demo YESto see it with sample data. - CI: every push to
ios/builds on a macOS runner and captures screenshots. - Ship: follow
docs/SHIPPING.md(Apple, Stripe, Supabase, and GitHub secrets), then run the Release workflow.
























