$ cd ../projects

FitMind AI

My own AI fitness coach: it builds your training and nutrition plan, then adapts it every month. Live on Google Play.

Get it on Google PlayWebsite

Role
Solo: product, Flutter app, backend, website
Year
2025–2026
Type
Mobile
Status
Shipped

$ cat brief.md# In short

The problem
A training plan is written once and then ignores what actually happened: the sessions you skipped, the weights that went up, the weeks you lost.
What I did
All of it, alone: the product, the Flutter app, the Firebase backend and Cloud Functions, the website, the payment flow and the Play Store release.
Result
Published on Google Play. Subscriptions run through Lemon Squeezy as merchant of record, because Google Play's merchant payments are not available to developers in Bosnia and Herzegovina.
Android app
Live on Google Play
Website
Live at fitmind-ai-web.vercel.app
iOS
Not released

$ stats --summary# In numbers

Google Play
live, built and released by me alone
35
screens across onboarding, plans, training, coach and progress
24
Cloud Functions holding every AI call and API key
4 weeks
per plan block, then the AI proposes the next one

$ ls screens/# Screens (tap one to enlarge)

Onboarding (6)

A short questionnaire that gives the AI everything it needs to build your plan.

Home & plan (4)

Today's workout on the home screen, and the AI-generated plan week by week.

Training (5)

Guided sessions with an AI weight suggestion for every exercise.

Coach & nutrition (2)

An AI coach that knows your data, and a weekly meal plan with macros.

Progress (5)

Charts and history so you and the AI can see what's working.

$ ls desktop/# On desktop

FitMind AI: Website: hero
Website: hero
FitMind AI: Website: features
Website: features
FitMind AI: Website: how it works
Website: how it works
FitMind AI: Website: pricing
Website: pricing

$ cat README.md# Overview

FitMind AI is a fitness app I designed, built and published on my own. A short onboarding turns your goal, experience, equipment and limits into a personalised training plan. During each workout it tells you exactly what weight to lift, and every month it recalibrates the whole plan from your real progress.

The app is Flutter with BLoC on Firebase. 24 Cloud Functions do the heavy lifting: OpenAI-powered plan generation and adaptation, workout and exercise-form analysis, exercise swaps, the AI coach chat, nutrition plans, scheduled reminders and Lemon Squeezy payments. I also built the marketing website that sells it. FitMind AI went live on Google Play in July 2026.

$ tree architecture/# How it fits together

Clients

  • Flutter app

    Built solo

    Android, on Google Play. BLoC, go_router, get_it, fl_chart.

  • Marketing website

    Built solo

    React + TypeScript: features, pricing, legal pages.

Firebase

  • Auth

    Email and Google sign-in.

  • Firestore

    Plans, sessions, nutrition, chats, weights, measurements.

  • Storage

    Progress photos.

  • Messaging + App Check

    Push notifications and protected APIs.

Cloud Functions (24)

  • HTTP

    Built solo

    generatePlan, adaptPlan, generateNutritionPlan, substituteExercise, analyzeWorkoutSession, analyzeExerciseForm…

  • Triggers

    Built solo

    onChatMessageCreated (AI coach), onWorkoutSessionCreated, onWeightEntryCreated.

  • Scheduled

    Built solo

    Meal reminders, weigh-ins, rest days, cooldowns.

External

  • OpenAI

    Plans, coaching, analysis and nutrition.

  • Lemon Squeezy

    Merchant of record: checkout, cards, VAT and payouts, with a webhook back into Firestore.

$ cat flow.log# How it flows

  1. 1.

    Onboard · App

    Goal, environment, equipment, experience, limits, measurements and strength PRs feed the AI.

  2. 2.

    AI builds the plan · Cloud Functions

    generatePlan creates a 4-week block and a matching nutrition plan, saved to Firestore.

  3. 3.

    Train with guidance · App · AI

    Each exercise shows sets, reps, rest and an AI-suggested weight based on your last session. Swap exercises when needed.

  4. 4.

    Coach, eat, track · Triggers

    Chat with the AI coach, follow meals and log weight, while triggers and schedules keep the data and reminders flowing.

  5. 5.

    Monthly check-in · adaptPlan

    After the last workout of the month a check-in screen asks how the block went: can you keep this pace, should the week drop from five sessions to fewer. The AI reads those answers with your real progress and proposes the next block, which you confirm or decline.

$ git log --author=amar# What I built

  • Onboarding that captures goal, training environment and equipment, experience, injuries, food restrictions, measurements, strength PRs, a starting photo and a free-text note for the AI, then generates the plan.
  • AI-generated 4-week plan blocks (weeks → days → exercises) stored in Firestore, with monthly recalibration the user can confirm or decline.
  • Guided training sessions: sets, reps, rest timers and an AI weight suggestion for every exercise based on your last session, plus one-tap swaps when equipment isn't available.
  • Post-workout AI analysis and exercise-form feedback through Cloud Functions, with progress tracked day by day.
  • AI Coach chat powered by a Firestore trigger: every reply has the context of your plan, history and check-ins, with a free message limit and upgrade path.
  • AI weekly nutrition plans matched to calorie targets and diet type (including halal, vegetarian and vegan), with daily adjustments and supplement validation.
  • Progress analytics built with fl_chart: weight trends, weekly volume per muscle, exercise history and PRs, body measurements and private progress photos in Firebase Storage.
  • Scheduled push and local notifications: meal reminders, weigh-ins, rest days and cooldowns after training.
  • Payments through Lemon Squeezy instead of Google Play billing: Google Play's merchant payments aren't available to developers in Bosnia and Herzegovina, so I took the subscription off-platform.
  • Lemon Squeezy acts as merchant of record: it runs the checkout, takes the card payment, handles VAT and tax across countries and pays out to me, so a solo developer doesn't have to register as a merchant in each market.
  • A webhook from Lemon Squeezy updates the subscription in Firestore, so the paywall reads one source of truth wherever the payment happened. I integrated Paddle first and moved to Lemon Squeezy.
  • Security: Firebase App Check, Firestore and Storage rules, and token-verified HTTP functions.
  • Marketing website in React and TypeScript with product videos, pricing, privacy policy, terms and an account-deletion page.
  • Took the app through Google Play's release process alone: internal testing, then closed testing, then open testing, then production, including the store listing, the data-safety form and the policy requirements each track adds.

$ cat fixed-bugs.md# Challenges I solved

  1. Getting an app onto Google Play as a solo developer is its own project, not a button at the end.

    I took it through every track myself (internal, then closed, then open testing, then production), fixing what each stage asked for: the store listing, the data-safety declarations and the policy requirements that come with testers.

  2. An AI-written plan is only useful if weeks, days, exercises and progress always line up.

    Plans are generated as structured four-week blocks saved in Firestore. Progress only moves forward on clear events: finishing a workout, confirming recovery on a rest day, or skipping a session.

  3. Monthly recalibration can't simply overwrite the plan someone is following, and the app can't tell from data alone whether a hard month was a good one.

    After the last workout of the month the app asks the user directly (is this pace sustainable, should the number of weekly sessions drop) and adaptPlan proposes the next block from those answers plus real progress. Nothing changes until the user confirms or declines it.

  4. AI calls cost money, and API keys can't live inside a mobile app.

    Every OpenAI call runs in Cloud Functions, which verify the user's token and are protected by Firebase App Check.

  5. Google Play billing, the obvious way to charge for an Android app, wasn't open to me: Google Play's merchant payments aren't supported for developers in Bosnia and Herzegovina.

    I took the subscription off-platform and used Lemon Squeezy as merchant of record. It runs the checkout and handles cards, VAT and payouts across countries, so I never touch card data. Being shut out of the default route meant designing the payment flow myself.

  6. With the payment happening outside the app, the app still has to know who is subscribed.

    A checkout function and a Lemon Squeezy webhook update the subscription on the user in Firestore, so the paywall reads one source of truth wherever the payment came from. I integrated Paddle first and moved to Lemon Squeezy.

  7. Reminders only help if they arrive at the right moment.

    Scheduled functions send meal, weigh-in and rest-day notifications, and cooldown reminders fire after training.

$ cat learned.txt# What I learned

  • Shipping a product alone: design, app, backend, payments, website, legal pages and a Google Play release.
  • Getting reliable, structured output from an AI model and checking it before it touches user data.
  • Serverless backends: HTTP functions, database triggers and scheduled jobs.
  • Everything around the code that makes it a real product: privacy policy, account deletion and pricing.
  • That where you live can shape your architecture: with Google Play billing closed to developers in Bosnia, the whole payment flow had to be built around a merchant of record instead.

$ cat package.json# Stack

Flutter · Dart · BLoC · Firebase · Cloud Functions · Firestore · OpenAI · Lemon Squeezy · fl_chart · React · TypeScript

# Next project in the logCreditGenius