Inspiration
Most fitness plans are written for a kitchen you don't have. Grilled chicken, quinoa, 150 g of this. If you live in India, your day is dal, chapati and a katori of raita, and no calorie counter knows what a katori is. Every app we tried made us translate our food into its units, and that translation is where people quit.
We wanted one plan that speaks in household portions, treats diet and training as the same week, and has a coach who has read the plan before you ask.
What it does
Steado is an AI diet and training coach built for how people in India actually eat.
- Onboarding asks one question per screen: goal, body, health conditions, diet type and cuisines, the foods you name, your kitchen, where and on which days you train, injuries. The API generates a seven-day plan from that.
- Meals are dishes in household portions, not ingredients in grams:
Jeera pulao · 1.5 × plate,Kulthi dal · 1 × bowl,Chapati · 4 × chapati. Each meal is badged PRE- or POST-WORKOUT when it sits around a session. - Log by photo or catalog. Photograph the plate and a vision scan returns per-dish review. Or search the catalog, pick the food's own portion (
katori,bowl, or by weight), and optionally log it instead of what was planned. Home then shows what it replaced. - The coach knows the plan. Ask "what's left today?" and it reads your day back: calories, macros, the next meals, the session. It can act through 23 tools: swap a meal, add an exercise, log a workout, log weight, update preferences. It declines off-topic questions in your own language.
- The plan learns from you. Adherence feedback names the dishes you refuse most, the newest chat memories reach next week's generation, and weigh-ins move your targets.
- Workout logging carries the last set forward, shows rest as a countdown strip, and lets you log a session after the fact.
- Offline-first. A persistent outbox queues every write; a sync banner shows what is waiting. Light, dark and system themes.
- Premium through RevenueCat meters the coach, the scans and the plans.
How we built it
- App: Flutter, feature-first clean architecture.
flutter_blocfor state (Cubits for flat load/mutate, Blocs for event-sourced flows like coach streaming and photo scan stages),get_itfor DI,diofor transport,go_routerwith a single auth redirect guard. - Offline: Hive caches under per-resource cache policies, a
RequestQueueoutbox drained by aSyncManager, client-minted UUIDv7 ids so writes can be applied optimistically and reconciled later. - API: a Node/TypeScript backend that runs plan generation, weekly replan, the food catalog, the vision scan, and the coach with SSE streaming and tool calls.
- Billing: RevenueCat SDK on the client, webhook on the API, one
steado_premiumsubscription with two base plans. - Auth: Firebase phone sign-in exchanged for a Steado session.
- Release: Android on Play internal testing, an iOS runner, and a web build at steado.web.app. 59 of 60 API operations are wired to screens; a script audits that instead of a hand-kept checklist.
- Video: the launch film is a Remotion composition, timed from a single script table so no scene knows a frame number.
Challenges we ran into
- Portions are hard. A "bowl" of dal and a "bowl" of pulao are different weights, and users don't want to see grams first. We built the portion sheet from each food's own catalog portions, with weight as the fallback rather than the default.
- Making the AI plan accountable to real behaviour. Adherence originally reached the generator as counts that named no dish, and chat memories never reached generation at all. Wiring those through, and making weigh-ins move targets, took more backend work than any screen.
- Never-fail generation. A near-miss on the last attempt used to abandon the whole week. Now the closest passing week is committed and named on the run row.
- Offline writes that reconcile. Optimistic apply-then-reconcile across meals, workouts and the coach, with a sync banner the user can trust.
- We renamed twice in one week. Pulse collided with other apps, so it became Acheave; two days later it became Steado, with a new three-blade mark drawn from one master SVG that drives the icon, the splashes and every loader. The video shows all three cold starts.
- Billing can't be tested against a local backend, because RevenueCat's webhook delivers to the deployed API. Learned that the quiet way.
Accomplishments we're proud of
- No placeholder screens. Every feature talks to the real backend.
- A coach that reads and writes the same plan the screens show, so a swap in chat shows up on Home.
- The plan gets better the longer you use it, and we can point at the code that makes it so.
- Shipping Android, iOS and web from one codebase in the same week as a full rebrand.
What we learned
- The units are the product. The moment we showed "4 × chapati" instead of "144 g", the plan stopped feeling like homework.
- A coach with a scope boundary is more trusted than one that answers everything. Ours used to write bubble sort on request.
- Build-time config fails quietly. Forget one
--dart-defineflag and the app launches fine and every request times out on a real phone.
What's next
- Store release on Play and the App Store.
- Barcode lookup, the one API operation not yet wired.
- Yoga: 90 asanas are in the catalog and waiting to deploy.
- Wearable signals (Health Connect) feeding the daily plan.
Built With
- agents
- ai
- bullmq
- flutter
- minio
- node.js
- openrouter
- postgresql
- react
- redis
- typescript
- vps
Log in or sign up for Devpost to join the conversation.