The app I kept quitting

I have downloaded and abandoned more fitness apps than I can count. The apps were fine. I just stopped showing up. Meanwhile Duolingo had me doing a 200+ day streak for a language I barely use. That gap was the whole idea: steal the mechanics that make people show up daily, and point them at the body instead.

Wulver is a bodyweight fitness app for iPhone where a wolf coach demonstrates every rep, an AI builds your plan from three onboarding questions, and a streak, XP, and rank system (Pup to Alpha) makes tomorrow's workout the one you refuse to skip. No equipment, no gym, 20 to 30 minutes a day.

How I built it

Solo, end to end. The stack: Expo / React Native with TypeScript on the front, Supabase (Postgres, Auth, Edge Functions on Deno) on the back. Plan generation is a Supabase Edge Function that calls Claude with a forced tool schema, validates the output against a hard ruleset (exercise whitelist, volume ceilings, day-index integrity), and falls back to a deterministic template if the model misbehaves. The client never trusts the AI raw.

RevenueCat runs the entire money layer: one default entitlement, monthly and annual packages, a 7-day free trial on the yearly plan, and a webhook that syncs subscription state into Supabase so the backend always knows who is entitled without ever parsing an Apple receipt myself. Paywall to purchase to entitlement took a fraction of the time everything else did, which is exactly what you want from the payments layer.

The 72-hour rename

Days before my first submission, with the listing done and the domain live, I searched the App Store one more time and found another fitness app already using my original name. Same category. So I renamed everything in 72 hours: app, backend project, subscription products (Apple locks product IDs forever, a lesson tattooed on me now), domain, and website. Wulver survived. The wolf did too.

The day-28 problem

My biggest fear was the user who buys a year and hits the end of their 4-week plan with nothing next. So I built an adaptive plan engine: after each workout you tap one of three difficulty ratings, and when a block ends, the server computes a bounded progression directive (deload first if it felt tough, progress if it felt easy, volume clamped to a hard 0.90 to 1.15 range) and generates the next block. The AI fills exercises inside those limits; it never decides how hard to push a human. It ships in v1.1, already built and fully tested.

What I learned

Ship boring, proven mechanics with one sharp differentiator. Validate everything an LLM returns. Never fall in love with a name before searching the store. And charge from day one: the trial paywall plus RevenueCat took an afternoon, and it made every design decision after it more honest.

Built With

Share this project:

Updates

Submission history