AI-Powered Fitness App
🚧 In Progress

TawfiqFit

A personal fitness PWA where an AI coach named Tawfiq learns your workout history, builds your next workout from a deterministic algorithm, and coaches you through chat — grounded in your actual training data, not generic advice.

PWA AI Coach Algorithm-Driven Suggestions Personalised Fitness
Try the live app →

Live beta ending July 10

The Problem

Why this exists

My Role

Solo — UX, Product Strategy, and Full-Stack Development

Stack

React · TypeScript · Vite (frontend, Vercel) · Node.js + Express (backend, Railway) · Supabase (PostgreSQL + Auth) · Groq (Llama 4 Scout 17B)

Phase

Core product live · iterating on real user feedback

Screens

17+ across all flows, manual-logging flow rebuilt twice based on gym testing

Logging workouts at the gym is friction-heavy. Spreadsheets are slow. Most apps require you to know the exercise name before you can log it — and when you're between sets, the last thing you want to do is type.

TawfiqFit removes that barrier two ways: Tawfiq builds your workout for you based on your training history (no decision fatigue), and logging is reduced to 1-2 taps per exercise via a pre-filled bottom sheet. Tawfiq acts as a coach throughout — learning your history and goals to give guidance that's grounded in your actual data, not generic advice.

🧠

Tawfiq builds your workout

A deterministic algorithm reads your training history and picks today's session — Push/Pull/Legs rotation, recovery-aware, progressive overload. AI only writes the explanation.

🤖

AI coach in your pocket

Ask anything. Tawfiq knows your history, your goals, and what you said last week.

📈

Track real progress

Strength, volume, streaks — compared week over week. Bar chart built in pure CSS, no charting library.

The Process

Wireframe → Built

Every screen went from sketch to shipped. Left side shows the wireframe intent; right side shows the built result. Click any image to zoom.

Flow 1

Onboarding

Wireframe

Wireframe: Onboarding splash

Built

Built: Welcome screen

Before and after redesign

Wireframe

Wireframe: Goal selection

Built

Built: Account creation

Personalisation complete — Tawfiq calibrated before a single account detail is entered.

Wireframe

Wireframe: Empty home

Built

Built: Home screen

Empty home prompts the first action — Tawfiq speaks, zero stats don't

Before

Old onboarding 2 — camera permission request

After

New onboarding 2 — four features, camera demoted to Soon

"How it works" redesigned — camera permission removed, "Build me a plan" added as step 1, camera demoted to step 4 marked "Soon"

Flow 2

AI Coach & Progress

Wireframe

Wireframe: Coach chat

Built

Built: Coach chat

Coach chat — interactive, context-aware, AI-ready

Wireframe

Wireframe: Progress

Built

Built: Progress screen

Each Progress has different metrics based on user goal "Lose Weight, Stay Consistent or Build Muscle

Wireframe

Wireframe: Profile

Built

Built: Profile screen

Profile — your plan first, app settings second

Visual Identity

Brand System

Designed before a single component was built. Every colour, typeface, and mark is intentional — and lives in one file.

Brand overview
Wordmark App icon Colour palette Type system

Implementation — Tokens & Imports

tokens.css

:root {
  /* Surfaces */
  --tf-paper:  #FAF9F7;
  --tf-bone:   #E5DFD2;
  --tf-char:   #1A1714;
  --tf-ink:    #14110F;
  --tf-stone:  #6B6660;

  /* Brand */
  --tf-clay:   #6B2417;
  --tf-clay-2: #8C3A2B;
  --tf-ochre:  #B8924A;
}

Fonts & stacks

--tf-font-display: "Newsreader", Georgia, serif;
--tf-font-body:    "Geist", ui-sans-serif, sans-serif;
--tf-font-mono:    "Geist Mono", ui-monospace, Menlo, monospace;

Delivered files

assets/
  tokens.css
  wordmark-dark.svg
  wordmark-light.svg
  mark.svg
  mark-dark.svg
  favicon-32.png
  favicon-16.png

Design Thinking

Key UX Decisions

Eleven decisions that shaped the product — pivots, real-world testing, infrastructure tradeoffs, and the moments where the obvious path was wrong.

1

The Pivot — From Camera-First to Coach-First

Mentor feedback reshaped the entire product hierarchy before a single backend line was written for the new direction

The original concept was camera-first: point your phone at a gym machine, AI identifies it, log the set. Onboarding, home screen, and navigation were all built around this promise.

A mentor reviewed the product and gave one piece of feedback that restructured everything: "Reframe AI-suggested workouts as the primary feature, with camera logging as complementary."

This single sentence changed: the home screen's primary CTA (camera → "Build me a plan"), the onboarding narrative (camera demo → meeting Tawfiq as a coach), the three feature pills (Photo Log/AI Coach/Progress → AI Plans/Smart Coach/Real Progress), and the entire backend roadmap (camera/vision API moved to "Coming soon," AI suggestion algorithm became priority #1 backend feature).

Before — Home

Old home — camera CTA

Camera was the primary CTA — "Take a photo" in clay red

After — Home

New home — coach first

Tawfiq speaks first. "Build me a plan" is the primary action

Before — Onboarding

Old onboarding — camera first

Onboarding sold the camera feature — three empty placeholder cards

After — Onboarding

New onboarding — Tawfiq character

Tawfiq introduced via animated chat. Pills: AI Plans / Smart Coach / Real Progress

Before — Onboarding 2

Old onboarding 2 — camera permission request

Camera permission screen

After — Onboarding 2

New onboarding 2 — four features, camera demoted to Soon

Camera demoted to "Soon", "Build me a plan" added

Before — HomeMidSession

HomeMidSession before — camera CTA

Camera CTA still present mid-session

After — HomeMidSession

HomeMidSession — single CTA

Camera CTA removed mid-session too — one logging component end to end

Why: Camera-first made sense intuitively — it's the most "wow" demo. But it required the most infrastructure (Vision API, image storage, identification accuracy) for a feature that's genuinely complementary to the core value: knowing what to train and tracking progress. Leading with AI-suggested workouts meant the MVP could ship and be tested with real users weeks earlier, while camera remains visible on the roadmap as "Coming soon" — not abandoned, just sequenced correctly.

2

Algorithm Decides, AI Explains

The AI workout suggestion is ~95% deterministic code and ~5% AI-written prose

Every part of "Build me a plan" that could cause harm if wrong — which exercises, how many sets, what weight — is decided by code, not by a language model. Groq (Llama 4 Scout 17B) receives only the result of the algorithm's decision and writes a 2-sentence human explanation.

The algorithm, step by step

  1. 1.Zero sessions? → hardcoded beginner full-body template. Groq not called.
  2. 2.Full-body trainer? → if 2 of the last 3 sessions mix muscle groups, classified as full-body. Gets a rotating 3-exercise template instead of PPL.
  3. 3.Push/Pull/Legs recovery logic → finds most recent session per muscle group, picks whichever was trained longest ago.
  4. 4.Anti-repetition → same session type 3× in a row forces a different one.
  5. 5.Recovery edge cases → all muscle groups trained within 48h → adds recovery note. 7+ days since last session → reduces to 2 sets.
  6. 6.Goal-based parameters → sets, reps, exercise count, and compound-first order all looked up from user's goal, not generated.
  7. 7.Progressive overload → same weight + target reps for 2+ sessions → algorithm suggests +2.5kg.
  8. 8.Exercise selection → drawn ONLY from a curated library of 83 exercises that exactly matches the database — AI can never suggest an exercise that doesn't exist.

Goal-based parameters

Build muscle

3 sets · 8 reps · 4 exercises

Compound first ✓

Lose weight

3 sets · 12 reps · 4 exercises

Compound first ✓

Improve endurance

3 sets · 15 reps · 4 exercises

No compound priority

Stay consistent

2 sets · 10 reps · 3 exercises

No compound priority

10 edge case scenarios tested with seeded data

Normal PPL rotation

Long gap (10 days) — reduced sets + recovery note

Same session type 3× in a row — forced change

Zero sessions — beginner full-body

All muscle groups trained within 48h

✅ after fix

"Use dumbbells" modifier

Goal changes reps (muscle vs endurance)

"Add an exercise" caps at 5

Full-body trainer detection + rotation

Progressive overload trigger (+2.5kg)

⚠️ Deferred v2
AI suggestion bubble

The AI-written part is only the italic explanation at the top — everything else is algorithm output

Why: A language model choosing exercise names risks hallucination — suggesting "Cable Lat Pulldown Machine" when the actual database entry is "Lat Pulldown Machine" silently breaks logging. By constraining the AI to writing prose ABOUT a pre-computed result, the suggestion is always logically sound and always references real exercises — while still feeling personal and conversational.

3

Real Gym Testing Revealed the Real Problem

The most valuable feedback came from abandoning the app mid-workout

After the AI suggestion flow was built and tested at a desk, it was taken to an actual gym. The result: the app was abandoned mid-session. The friction wasn't in the AI — it was in logging sets.

What happened: browsing to find an exercise required digging through a category with no search. Logging 3 sets meant tapping into a reps field and a weight field SIX times (2 fields × 3 sets), each requiring the keyboard to open. After saving, a toast notification took a few seconds to confirm the save — long enough to feel like nothing happened. A notes field, after saving, visually disappeared (it had saved correctly, but looked broken).

Friction ranked by impact vs. effort

"Same as last time" pre-fill

Effort: MediumImpact: 🔥 Highest

Optimistic save (instant confirmation)

Effort: SmallImpact: High

Search in category view

Effort: SmallImpact: Medium

Notes confirmation chip

Effort: SmallImpact: Medium

Before

Old log sets

6 separate tap-and-type interactions per exercise

After

New log set sheet

Bottom sheet, pre-filled. One tap on "Done" logs the whole exercise.

Why: No amount of desk-testing surfaces friction the way actually using the product mid-workout does. The abandonment wasn't a minor annoyance — it was the exact failure mode that makes people quit fitness apps after a week. This single piece of evidence justified rebuilding the entire manual-logging flow — twice, as the next decision shows.

4

Iterating on an Input Widget — Three Attempts Before the Right One

Chips → horizontal ruler → iOS-style wheel picker, with real bugs at every stage

Replacing 6 taps with fewer taps required a new way to input reps and weight. Three approaches were built and tested, in order:

Attempt 1 — Chips

Set 1 — Reps

6 8 10 12 15
10 +

Worked for typical values — broke for a 100kg first-time lift, which needed 16 taps on "+" from a 50kg default.

Attempt 2 — Ruler

Set 1 — Weight (kg)

45 47.5 50 52.5 55

50 kg

↔ Swipe to adjust

Solved the range problem — but precise values (e.g. 105.5kg) required careful, deliberate swiping with no margin for error. Also had no desktop mouse support.

Attempt 3 — Wheel ✓

Wheel picker

Two-column wheel (Reps | Weight), pre-scrolled to last values. Reached after fixing height-collapse and z-index ghosting bugs in the library integration.

Why: Building custom scroll/gesture physics by hand (Attempt 2) hit the exact category of edge cases — boundaries, momentum, cross-device input — that a mature library has already solved. The lesson: for generic interaction patterns, research a library FIRST; for app-specific logic (the bottom sheet, history pre-fill, save/sync logic), hand-build because no library fits anyway.

5

Session State Lives in the List, Not a Separate Screen

Manual logging no longer needs a dedicated "session in progress" screen

With the new LogSetSheet, LogManual and ExerciseList became capable of showing session progress directly — so they became the session view themselves, for the manual-logging flow.

  • Search added to ExerciseList — searches the full library, not just the current category.
  • Logged exercises get a green checkmark badge. Categories show a red badge with count ("2 ✓").
  • Tapping an already-logged exercise opens it in EDIT mode — preventing duplicates (same exercise appeared 4 times before this fix).
  • Fixed a mobile-only double-fire bug where +/− buttons jumped by 2/5 instead of 1/2.5 — browser sending synthetic ghost mouse events after touch. Fixed with preventDefault() on touch handlers.
  • "Last time" subtitle now shows the actual session date instead of repeating Set 1's values.
  • The same bottom sheet handles set-editing in three contexts: live session, after-session via Exercise Detail, and AI-suggested exercises — one component, three entry points, no special cases.

Before — Exercise list

Old exercise list

Plain text rows, no images, no search

After — Exercise list

New exercise list

Image grid, search bar, equipment filters

Category badges

Category progress badge

Red "1 ✓" badge — progress at a glance

Logged checkmarks

Logged checkmarks

Tapping a checked exercise opens edit mode, not a duplicate

End session summary

Session end summary

Full set detail before confirming end

Why: A separate "session in progress" screen duplicated information that LogManual/ExerciseList could show natively via badges and checkmarks — and required navigating back and forth between "where am I in my workout" and "let me log this exercise." Collapsing these into one view removes a navigation layer entirely.

6

Closing the Loop — Post-Session Feedback

The app logged what you did. It never asked how it felt.

Mentor session flagged missing session quality data. The workout was captured — sets, reps, weight — but nothing about the experience behind it.

A lightweight check-in now appears automatically when a session ends. Three optional fields:

  • Energy scale 1–5 — 1 = sleepy/low energy · 2 = not feeling too well · 3 = alright · 4 = strong · 5 = on fire
  • Body-feel selector — quick descriptor of physical state
  • Free-text notes — anything else worth capturing

Saves to a session_feedback table linked to the session record.

Post-session feedback screen

Appears automatically after ending a session — no navigation required

Why: Immediate post-session capture is the most accurate — energy and feel are already fading by the next morning. Automatic appearance after "End session" means it gets answered before the user leaves the app. All fields are optional to avoid friction. Over time this gives Tawfiq context that sets and reps alone can't provide.

7

Honest AI Architecture — Only 2 Features Use Real AI

Every "smart" feature was audited: is this actually AI, or just a query?

Workout suggestion

✓ Real AI

What the user sees: Personalised workout plan with explanation

What actually runs: Deterministic PPL algorithm decides exercises/sets/weight; Groq (Llama 4 Scout 17B) writes only the explanation prose

Tawfiq coach chat

✓ Real AI

What the user sees: Personalised coaching advice

What actually runs: Groq (Llama 4 Scout 17B) — prompt includes session history, goals, last 3 sessions' full detail

Exercise history recall

DB query

What the user sees: "You did 3×12 last week"

What actually runs: Database query + string template

Progress stats

SQL

What the user sees: Streak, volume, weekly delta

What actually runs: SQL aggregates

Rest timer

JS timer

What the user sees: Countdown between sets

What actually runs: setTimeout()

Why: Labelling a database query as "AI" is dishonest and creates wrong expectations. If a deterministic function handles a feature well, AI is the wrong tool. This audit also keeps API costs near zero — only the 2 genuinely intelligent features ever hit the model.

8

Show the Vision Honestly, Validate Before Building

The wearables feature is shown as 'coming soon' — and asks users which to build first

Connect screen

Why: Device sync (Fitbit, Apple Watch, Garmin) is a v1.1 feature, not built yet. Rather than hide it or fake it, the Connect screen presents it honestly as 'coming soon' and asks 'which matters most to you?' — turning a placeholder into a way to learn which integration users actually want first. Commit to the vision, but let real demand decide the roadmap.

9

Design Token Architecture — No CSS Framework

Every visual decision lives in one file

/* tokens.css */
:root {
--color-primary: #7c3aed;
--color-surface: #1a1a2e;
--radius-card: 1rem;
--space-section: 2rem;
}

Why: No Tailwind, no Bootstrap — every color, radius, and spacing is a CSS custom property. Global theme changes are one-line edits. Each component's styles reference tokens directly via .module.css files.

10

The Coach Keeps Improving Without Disruption

The AI behind the coach can be upgraded anytime — the user never notices

Why: AI services change fast — they get better, cheaper, or occasionally go down. The coach was built so a better AI can be swapped in at any time, and the user never notices a thing: same chat, just smarter answers over time. The user gets continuity; the product keeps improving without a rebuild.

Visual Polish

Dark Mode

A full contrast audit was run across the app for dark mode — every screen below was checked against WCAG contrast guidelines and fixed where needed.

Post-session feedback dark mode

Post-session feedback — emoji rating, body-feel selector, optional notes.

Exercise detail dark mode

Exercise detail — before/after reference images, stats grid, Tawfiq's contextual note.

Coach chat dark mode

Coach chat — Tawfiq references specific weights and exercise history from real data (e.g. "You did Cable Lat Pulldown with 52.5kg recently").

Under the Hood

System Architecture

Database Schema (Supabase / PostgreSQL)

users id, name, goal, activity_level, created_at, terms_accepted_at, terms_version
sessions id, user_id, name, started_at, ended_at, duration_minutes
exercises id, user_id, session_id, name, muscle_group, logged_at, entry_method
sets exercise_id, user_id, set_number, reps, weight_kg
coach_messages id, user_id, role, content, created_at
exercise_library id, name, primary_muscle, secondary_muscle, equipment_type, difficulty, gif_url
session_feedback session_energy, body_feel, notes, skip true or false
Supabase exercise_library table

The exercise_library table — 83 exercises, single source of truth the suggestion algorithm draws from.

AI Coach Architecture

Tawfiq runs on Groq (Llama 4 Scout 17B, OpenAI-compatible API). Each request's system prompt includes a JSON summary built from 4 Supabase queries:

  • User profile + consistency stats (% of weeks with 3+ sessions)
  • Last 4 weeks' session breakdown
  • Last 3 sessions' full exercise/set detail
  • Top-5 exercise progression history with weight deltas

Conversation history (last 10 messages) is included for context. Users get 8 messages/day (UTC midnight reset) — checked before the expensive summary query runs, so over-limit requests fail fast.

Validation

AI Coach Testing — Before Shipping to Real Users

The coach went through two model iterations on Groq's API. Both were tested against the same 30-question framework across 6 categories — each question had a known expected answer based on seeded data. The goal wasn't just accuracy. It was finding what breaks before a real user does.

The Testing Framework — 30 Questions · 6 Categories

7Q

Data Accuracy

Does the coach correctly read session count, averages, top lifts, dates?

5Q

Goal-Specific

Does advice adapt to the user's goal — lose weight, build muscle, etc.?

5Q

Planning

Can it suggest today's workout, a weekly plan, or which muscles to prioritize?

4Q

Historical

Can it recall past sessions, progression arcs, and strongest muscle groups?

5Q

Edge Cases

How does it handle questions it can't answer — body fat %, calories burned?

4Q

Emotional

Does it handle "I don't feel like training" with empathy before data?

Model 1 — Tested June 6, 2026

Llama 3.3 70B (Groq)

20

Passing ✅

6

Partial ⚠️

1

Failing ❌

30

Total

Category 1 — Data Accuracy

7/7 · 100% ✅

"How am I doing?" → 13 sessions, 2.6/week average, 59 min avg session returned correctly ✅

"Best squat ever?" → 72.5kg on June 2 returned correctly ✅

"Muscle groups this week?" → Correct + flagged unworked groups ✅

Category 2 — Goal-Specific

5/5 · 100% ✅

"Am I making progress?" → Redirected from scale to consistency metrics (correct for "lose weight" goal) ✅

"Am I eating enough?" → Correctly acknowledged no food tracking data ✅

Hidden bug found: model said "consistency is 100%" on every response — incorrect, as one week had only 2 sessions. Fixed post-test.

Category 3 — Planning

5/5 · 100% ✅

"What should I do today?" → Correctly suggested Push day after a Pull day ✅

Hidden bug found: only suggested 1 exercise instead of 2–3. Fixed post-test.

Category 4 — Historical

2/4 passing · 2/4 partial ⚠️

"How has my bench press improved?" → Only saw last 2 sessions, missed the full 50→62.5kg arc ⚠️

Root cause: summary only included last 3 sessions. Fixed by expanding to last 8 sessions + adding full exercise progression history.

Category 5 — Edge Cases

4/5 passing · 1/5 failing ❌

"Compare this week to last week?" → Completely incoherent response ❌

Root cause: no weekly breakdown in the summary — model tried to calculate from raw dates and confused itself. Fixed by adding pre-calculated weekly breakdown to the JSON summary.

Category 6 — Emotional

2/4 passing · 2/4 partial ⚠️

"I don't feel like training today" → "Skipping can set you back" — too harsh ⚠️

"I missed a week, should I give up?" → Used real data to show no full week was actually missed — excellent ✅

Fix: added empathy instruction to system prompt — acknowledge the feeling with one sentence before responding with data.

What Testing Revealed — 10 Fixes Applied

Grouped by what type of thinking they required, not just what changed in the code.

UX & Coaching Quality

Add empathy instruction — acknowledge feeling before responding with data
Fix rest vs. train logic — consider which muscle groups need recovery, not just recency
Suggest 2–3 exercises, not just 1

Data Quality (what the model could see)

Switch summary format from prose to structured JSON
Expand session history from last 3 → last 8 sessions
Add exercise progression history across all sessions
Add pre-calculated weekly breakdown (last 4 complete weeks)
Fix consistency % — only count complete weeks, not partial
Fix week number calculation — use first session date, not account creation date
Post-fix retest: 15/15 targeted questions passing ✅ — all root causes confirmed resolved before switching models.

Model 2 — Tested June 11, 2026 · Final

Llama 4 Scout 17B (Groq)

Switched for one primary reason: token efficiency on the free tier. Spot-checked with 8 questions after all fixes were already in place.

8/8 passing ✅

"How was last week?"

"What do you suggest I workout today?" → Push/Legs with specific exercises and weights

"Give me a plan I can do now" → 3 exercises with sets, reps, and rest times

"Tell me more about myself" → goal, sessions, recent workouts, top lifts all correct

"I don't want to go today" → "That's okay, it's normal" — empathetic tone

"Do you know the list of exercises the app offers?" → Correctly said no, offered history instead

"How can I achieve 100kg bench press?" → Progressive overload from real current weight (55kg)

"But my hand hurts" → Suggested rest, empathetic tone

Daily message limit (8 messages) triggered correctly after 8 messages ✅

Model Comparison — Why Llama 4 Scout Won

Input tokens per request

Llama 3.3 70B: ~2,440Llama 4 Scout: ~1,767 (28% more efficient)

Output tokens per request

Llama 3.3 70B: ~120Llama 4 Scout: ~43 (64% more efficient)

Daily token limit (free tier)

Llama 3.3 70B: 100,000Llama 4 Scout: 500,000 (5× more)

Max users at 8 msgs/day

Llama 3.3 70B: ~5 usersLlama 4 Scout: ~35 users

Decision: Llama 4 Scout 17B chosen for beta — 5× more users supported on the free tier, token usage 28–64% more efficient, response quality adequate for coaching use. The slightly shorter responses were an acceptable tradeoff for a beta that needs to support multiple real users without hitting limits.

Roadmap

Current State & Roadmap

Core product is live and deployed. Auth, AI coach, suggestion algorithm, manual logging (rebuilt with bottom-sheet + wheel picker), and legal pages are all shipped. Camera identification, calendar view, and a visual design refresh are next.

🔐

Authentication

  • Google OAuth — live. Known issue: returning users signing in via "I already have an account" are sometimes routed through onboarding steps 3-4 before reaching existing data. Data integrity unaffected — purely a routing bug.
  • Email / password — live. Fallback for users who prefer not to link Google.
  • Apple Sign In — not built; requires Apple Developer account, lower priority for an Android-first PWA.
🗄️

PostgreSQL Data Model (Live)

users id, name, goal, activity_level, created_at, terms_accepted_at, terms_version
sessions id, user_id, name, started_at, ended_at, duration_minutes
exercises id, user_id, session_id, name, muscle_group, logged_at, entry_method
sets exercise_id, user_id, set_number, reps, weight_kg
coach_messages id, user_id, role, content, created_at
exercise_library id, name, primary_muscle, secondary_muscle, equipment_type, difficulty, gif_url
session_feedback session_energy, body_feel, notes, skip true or false
🤖

AI Integration

  • Suggestion algorithm — deterministic Push/Pull/Legs logic + progressive overload, 83-exercise curated library; Groq (Llama 4 Scout 17B) only writes the explanation
  • Coach chat — Groq (Llama 4 Scout 17B), prompted with user profile, consistency stats, last 4 weeks' sessions, and last 3 sessions' full exercise/set detail
  • Everything else — DB queries + string templates; no AI needed, no AI used
  • Camera ID — Coming soon (roadmap). Vision-capable model identifies the machine from a photo; sequenced after core logging flow was validated.
📊

Data Calculations

  • Streak — consecutive calendar days with a logged session
  • Volume — Σ(sets × reps × weight) per session and per week
  • Weekly delta — % change in volume vs the same day last week
  • Progressive overload — suggest +2.5% weight when user hits 3 target sets in a row
  • Muscle groups — frequency heatmap from tagged exercises over a 7-day window

Current status

Core product live — iterating on real feedback

Auth, AI suggestion algorithm, AI coach, manual logging (rebuilt with bottom-sheet + wheel picker), session-state badges, and legal pages are all live and deployed. Camera identification, calendar view, and a visual design refresh are next.

Auth, backend, AI coach · Live
AI suggestion algorithm · Live
Camera ID · Roadmap