# 02 — Feature Deep Dive

A complete catalog of every SwoleX feature, organized by user surface. This is the source feedstock for landing-page bullets, ad copy, social posts, and demo scripts.

Every feature in this document is **shipped in production** as of app version **1.0.9** (May 2026) unless explicitly noted as "Roadmap." When in doubt, cross-reference the source files listed.

---

## Table of contents

1. [Onboarding & profile](#1-onboarding--profile)
2. [Workout logging (the core)](#2-workout-logging--the-core-loop)
3. [Programs](#3-programs)
4. [The Feed (social)](#4-the-feed--social)
5. [Kevin — AI Coach](#5-kevin--ai-coach) *(see `03_kevin_ai_coach.md` for the deep brief)*
6. [Progress & analytics](#6-progress--analytics)
7. [Nutrition & meal plans](#7-nutrition--meal-plans)
8. [Sharing & viral loop](#8-sharing--viral-loop)
9. [Trainer & client features](#9-trainer--client-features)
10. [Creator features](#10-creator-features)
11. [Conditioning circuits](#11-conditioning-circuits)
12. [Health, equipment & gym profiles](#12-health-equipment--gym-profiles)
13. [Imports & exports](#13-imports--exports)
14. [Settings, account, & subscriptions](#14-settings-account--subscriptions)
15. [Web app surfaces](#15-web-app-surfaces)
16. [Platform & infrastructure](#16-platform--infrastructure)
17. [Things only SwoleX has](#17-things-only-swolex-has)

---

## 1. Onboarding & profile

### Sign-up paths

- **Apple Sign In** (native, recommended on iOS)
- **Google Sign In** (OAuth)
- **Snapchat** (Snap Kit OAuth — also seeds friend discovery later)
- **Email magic link** (Supabase OTP — deep link via `swolex://auth/callback`)
- **Email + password** (fallback)
- **Reset / promo code** (REVIEWER_2026 etc.)

### Streamlined onboarding (1.0.9)

The full fitness profile used to be a 4-step required gauntlet. As of 1.0.9 it's **just three required answers** — handle, name, birthday. Everything else (training level, goal, strength baselines, capabilities, injuries, equipment) is editable later in the **Fitness Profile hub**, which lives in Profile and is broken into single-screen editors:

- Edit Training Goal (strength / hypertrophy / endurance / general wellness)
- Edit Training Level (beginner / intermediate / advanced / elite)
- Edit Strength Profile (max bench / squat / deadlift — optional, used as AI seed)
- Edit Capabilities (e.g. "can't do push-ups," "stairs make me winded")
- Edit Preferences (supersets / drop sets / straight sets — fed straight into Kevin's prompt)
- **Injuries** (structured intake, see §12)
- Gym equipment (multi-select equipment profile per gym, see §12)

**Why this matters for marketing:** the product respects the user's time. The first impression is *"Just train, fill in the rest later"* — not a 20-screen quiz.

### Avatar, handle, bio

- Avatar upload from camera or photo library (with auto-resize)
- @handle is unique; admin-mediated handle disputes
- Public bio (visible on profile)
- Trainer / Creator / PRO badges appear next to the handle when applicable

---

## 2. Workout logging — the core loop

This is the screen that needs to feel **faster than FitNotes, cleaner than Strong, smarter than Hevy**. UI rule: every tap < 300 ms, never block the weight input.

### Active Workout screen

- **Set rows** with weight, reps, RPE (optional), notes (optional)
- **Three set types**, first-class: **Normal**, **Drop Set**, **Superset**
- **Weight stepper** with 64×64 pt buttons (gym-hands proof), context-aware increments:
  - Barbell: ±5 lb / ±2.5 kg
  - Dumbbells: ±5 lb / ±2.5 kg (commercial), ±2.5 lb / ±1.25 kg (well-equipped)
  - Cable: ±5–10 lb per click
  - Machine: variable per equipment profile
- **Long-press accelerator** on stepper — ±10 after 500 ms, ±25 after 1.5 s
- **Inline autosave** (1.1.1) — weight/rep edits save the moment you move on. The old X / SAVE button pair is gone.
- **Swipe-to-delete** (1.1.1) — swipe left on any set row to delete it. Same gesture on the workout-plan rows in the planner.
- **Kevin's Tip inline** (1.1.1) — the per-exercise form cue sits right above the steppers on the active screen, not buried in a sheet.
- **Exercise tab strip** (1.1.1) — horizontal scroll of today's exercises at the bottom; tap to jump without losing your place. Drop-set indicator is inline on the row, not a modal.
- **Drag-to-reorder sets** (react-native-reorderable-list)
- **Drag-to-reorder exercises** while planning
- **Inline notes** per set ("felt weak today" / "elbow tweak")
- **PR badge** (gold trophy) appears on the row the moment a personal record lands; in 1.1.1 only one set per workout earns the badge for a given rep range (no double-counting two identical sets) and a heavy set isn't flagged as a PR if you've previously logged a higher-rep set at the same weight
- **"Last session ▾"** collapsible — shows the previous instance of this exercise inline; auto-expanded for AI-generated workouts so you see what Kevin proposed
- **Ghost values** — the previous best-by-rep-range pre-fills the weight stepper

### Rest timer

- **Default 2 minutes.** Configurable globally or per-workout.
- Slides down as a slim orange progress bar — **never modal**, never blocks input.
- Audio cues: tick at 3 / 2 / 1, chime on completion.
- Haptic on completion.
- Plays through silent switch on iOS (`playsInSilentModeIOS`).
- Mutable from settings; visible "mute" pill in the timer overlay.
- Tap **+30** to add 30 seconds; tap **SKIP** to dismiss.
- **Auto-resumes the workout when you tap the rest-timer notification** (1.0.7 fix — no more landing on a blank session).

### Voice and audio

- Audio cues for rest timer
- Lazy-loaded via `expo-audio` (graceful fallback if unavailable)
- Custom rest-timer sounds (Pro)

### Crash-proof session

- Active workout is persisted to AsyncStorage on every set
- Quit the app mid-set → reopen → **Resume Workout** is the primary action; **Start Fresh** is secondary (1.0.7 fix — no accidental duplicate sessions)

### Smart defaults

- **Best weight by rep range** auto-suggested on the next set
- **Plate calculator** — the stepper rounds to real, available weights (no 47.3 lb suggestions)
- **Warmup-aware** rep ranges for the first set
- **Weighted bodyweight** (chin-ups, dips) accepts an added-weight field (1.0.7)

### Quick start tiles (Log tab home)

The Log tab is a launchpad. Tap the orange **+** in the tab bar →

- **⚡ ASK KEVIN** — Kevin generates from scratch
- **NEW WORKOUT** — blank session
- **FROM HISTORY** — clone a previous session
- **MY WORKOUTS** — your saved templates
- **🕒 CONDITIONING CIRCUIT** — work/rest interval generator
- **RECENT** — last 3–5 sessions, one tap to clone
- **LOG PAST WORKOUT** (1.1.0+) — backfill a session you forgot to log. Pick the date, set the duration, then either pick exercises manually or describe the workout in plain text and let Kevin parse it into structured sets.

(See `marketing/screenshots/03_log_meet_kevin.png` for the live layout — same launchpad, with the first-run Kevin tour overlay.)

---

## 3. Programs

### Browse & enroll

- **Browse tab** — filter by difficulty (Beginner / Intermediate / Advanced), category, equipment, free vs paid
- **Enrolled tab** — your active programs, resume from current day
- **Created tab** — your published programs (Creator tier)
- **Trainer-assigned** badge if a program was given to you by your trainer

### Program structure

- Multi-week, multi-day-per-week
- Each day has a list of exercises with target sets / target reps ("3–5" / "8–10" / "AMRAP") and set type (normal / superset / drop)
- Supersets grouped with letter (A1/A2)
- Estimated session duration
- Per-day rationale (when AI-generated)

### Enrollment & checkout

- Free programs: one-tap enroll
- Premium programs: requires active Pro subscription
- Paid programs: Stripe checkout, one-time purchase

### Run a program day

- Tap the next day → workout loads pre-populated with target sets/reps/weights (Kevin scales weights if you don't have history yet)
- Completion is tied to the program enrollment — trainer sees it; analytics flow into adherence %

### Program Builder (Creator / Trainer)

- Manual editor: add days, add exercises, set rep schemes, mark supersets / drops, set rest seconds
- **AI generate-day** — Kevin proposes a single day's exercises with progressive overload aware of the program week
- **AI generate-full** — Kevin scaffolds an entire 4–12-week program from goal + difficulty + days/week + equipment
- **Templates** — save a day or whole program as a template, reload into a new program
- **Difficulty enforcement** — beginner programs cap at 4 exercises × 3 sets, advanced unlock 5–6 × 4–5 with supersets

---

## 4. The Feed — social

### Three feed tabs (top segmented control)

- **Following** — workouts from people you follow
- **At Your Gym** — local discovery (by gym profile)
- **New** — chronological newest first

### Workout card anatomy

Every feed card is a *runnable workout*. Live design (from `marketing/screenshots/01_feed_following.png`):

```
[Avatar] @bigchimp  May 22                  [Suggested]
BACK AND BICEPS HYPERTROPHY
7 exercises · 34.8k lbs · 1h 14m

[      CHALLENGE ACCEPTED 💪      ]    ← orange full-width CTA

[ 🔥 ] [ 🦍 ] [ 💬 ]                              ⌄ SETS
```

CTA copy varies per card / state: **CHALLENGE ACCEPTED 💪**, **LET'S GOOOOO 💪**, **I GOT THIS 💪**, and (on a creator's public profile) **TAP TO DO THIS WORKOUT ⚡**.

Key elements:

- **Avatar + @handle + date** (and "Suggested" badge when the discovery engine surfaces it)
- **Workout title** (bold, all caps)
- **Stats strip**: exercise count · total volume · duration
- **One-liner description** (creator's own words — "Ridiculous")
- **Primary CTA**:
  - **I GOT THIS** — on a workout that you haven't started yet
  - **CHALLENGE ACCEPTED** — on a workout from someone else
- **Three reactions:** 🔥 (fire), 💪 (brutal), 🦍 (gorilla)
- **Comments count** — opens a bottom sheet with nested replies
- **"13 people crushed this"** — completions chain, tap to see who
- **"⌄ SETS"** — expand the full exercise list with set/rep targets

### Interactions

- **Tap CTA** → workout loads with **Kevin-scaled weights** (Pro) or manual-adjust prompt (Free)
- **Tap @handle / avatar** → public profile
- **Tap comment** → bottom sheet
- **React** → instant haptic + count animation
- **Tap workout title on your own post** → inline rename (1.0.7 — no need to delete/repost)

### Public profile

- Avatar, display name, @handle, bio, badges
- Stats grid: workouts, followers, following, total volume, "Member since"
- Latest posts
- **Follow** / **Unfollow** button
- Trainer profiles show pricing + bio + sample programs

### Notifications

- Follows, reactions, comments, replies, completions on your workouts, trainer invites, program assignments
- Push via Expo v2 with deduplication + thread collapsing
- Deep-link routes back to the exact post / comment

### User search

- @handle search
- Snapchat contact discovery (Snap Kit OAuth → SHA-256 hashed external_id matching)
- Phone-number contact discovery (E.164 SHA-256 hashed)

### Blocks & moderation

- Block users (hides their posts, prevents follow / DM)
- AI content moderation on names, comments, and program descriptions
  - Stage 1: keyword blocklist
  - Stage 2: OpenAI `omni-moderation-latest` (free) or Claude Haiku fallback
  - Fail-open if the AI service is down — blocklist still enforced

---

## 5. Kevin — AI Coach

This section is a summary; the full brief is in [`03_kevin_ai_coach.md`](./03_kevin_ai_coach.md).

### Where Kevin shows up in the app

| Surface | What Kevin does |
|---|---|
| **ASK KEVIN** button (Workout tab) | Generates a full session from goal + duration + muscle focus + how you're feeling |
| **DO WORKOUT** / **I GOT THIS** | Scales every weight on a copied workout to your real strength |
| **SWAP EXERCISE** in active workout | Replaces an exercise (equipment missing, too hard, form concern, etc.) keeping the muscle / movement intent intact |
| **CONDITIONING CIRCUIT** | Generates work/rest interval circuits with coaching cues |
| **AI Coach** segment (Progress) | Generates a trainer-style report — letter grade, calibration verdict, muscle balance, top 3 recommendations |
| **Program Builder** | "✦ AI" button per day, or full-program scaffolder |
| **Trainer Console** | Per-client AI progress report |
| **Post-workout calibration** | "How was that?" rating ("just right" / "destroyed me" / "too easy") feeds back into Kevin's per-user adjustment factor |

### What Kevin knows about you

(see §03 for the full list — 30+ signals)

- Your training goal, level, age, sex, body metrics
- Your 5RM baselines (or self-reported maxes)
- Every set you've ever logged (volume trends, calibration)
- Your gym's available equipment
- Your training-style preferences (supersets / drops / straight)
- Your injuries — with structured directives, not free-text
- Your post-workout difficulty ratings (rolling calibration signal)
- Recent training load (don't hammer the same muscle two days in a row)

### Output discipline

Kevin returns **structured JSON** for workout generation (no markdown, no preamble). The UI parses it and renders the session deterministically. For the training-report long-form analysis, Kevin writes prose graded for a lifter, not a clinician.

---

## 6. Progress & analytics

The **Progress** tab is a 5-segment hub:

### Segment 1 — Sessions

Chronological list of every workout. Grouped by month. Each card shows: name, date, exercise count, duration, total volume, and any PR badges.

Tap → **Session Detail**:
- Every set, every weight, every rep, every RPE, every note
- Superset / drop indicators preserved
- Share button → opens Share Card flow
- Edit session (corrections)

### Segment 2 — AI Coach (Training Report)

(see §5 and `03_kevin_ai_coach.md` for the deep brief)

Free tier shows algorithmic metrics:
- Volume trend (increasing / decreasing / flat) with lbs/session slope
- Calibration % (actual weight vs. expected for goal)
- Scheme compliance (% of sessions meeting goal rep ranges)
- Muscle frequency distribution

Pro tier adds:
- Trainer-grade letter grade (A–F)
- Calibration verdict in plain English
- Muscle balance — over/under-emphasized groups
- Goal-alignment check
- NSCA-benchmarked comparison
- Top 3 actionable recommendations
- **PDF export** (iOS share sheet / Android SAF)

### Segment 3 — Stats

- Volume trend chart (period selectable)
- Tonnage over time
- Muscle frequency over time
- Strength curve per major lift (1RM estimate via Brzycki / O'Conner)

### Segment 4 — PRs

- Personal records across every exercise
- Sorted by recency or by weight
- Tap → exercise history view (every time you've performed it, every weight/rep)

### Segment 5 — Rankings (friends only)

- Per-exercise leaderboards against people you follow
- Avatar, handle, weight lifted
- Refresh to reload
- **Compare With User** view — head-to-head stats

### Streaks

- Longest streak (consecutive training days)
- Current streak shown on History header
- "This week" / "All time" counters

---

## 7. Nutrition & meal plans

Shipped in 1.4.0. Nutrition is a first-class tab, not a bolt-on — the food side of the same "train hard, prove it" loop.

### Daily log

- A calorie ring (consumed vs. target) plus **protein / carbs / fat** progress bars
- Food grouped by meal — **Breakfast / Lunch / Dinner / Snacks** — each with its own running kcal total
- Day-by-day navigation (‹ TODAY ›) and a rolling **7-day summary** strip
- Tap any entry to edit the serving; swipe to delete

### Add food (three ways)

- **Search** a food database (with recents surfaced first)
- **Scan a barcode** — resolved against Open Food Facts, cached locally so repeat scans are instant
- **Natural language** — type "2 eggs and toast" and Kevin parses it into structured macro entries

### Daily targets

- Pick a **diet style** — Balanced, High Protein, Ketogenic, Low Carb, Mediterranean, Endurance, or Zone (40/30/30)
- Pick a **goal** — lose fat / maintain / build muscle — and an activity level
- SwoleX computes calorie + macro targets from your body stats (each diet style has its own protein anchor and macro-split formula)
- Targets can be overridden manually and saved

### AI meal plans (Pro)

- Kevin builds a **multi-day meal plan** to your calorie + macro targets and diet style, with portions scaled to hit the numbers
- Each day breaks into meals with per-item macros; log a single food, a whole meal, or **the entire day** in one tap
- Generates an **aggregated grocery list** across the whole plan, in real shopping units
- **Branded PDF export** of the plan + grocery list to take to the store

### Health integration

- Writes food/nutrition (energy + macros) to **Apple Health** and **Health Connect** when the user enables Health sync

---

## 8. Sharing & viral loop

### Share Card (auto-generated on completion)

A portrait 9:16 card built for IG Story / TikTok / Snap. Style:

- Dark background with subtle diagonal speed lines + grain texture
- SWOLEX logo top-center
- **Workout name** in large bold white ("THE GAUNTLET")
- **Stats row in orange**: "12,450 lbs · 47 min · 21 sets"
- Optional attribution: "Completed Ryan & Alex's workout"
- Optional rating + comment (auto-censored on share, original kept in-app)
- Bottom CTA button: "Follow me on SwoleX @handle"
- Deep link / QR encoded back to the original template

### Variants

- **Completion card** — what you did, with credit to the original creator
- **Challenge card** — "I did the Gauntlet. Can you?" — for sharing the workout itself

### Share targets

- iOS / Android native share sheet
- **Snapchat Creative Kit** — one-tap to story (no OAuth required if logged in)
- IG Story (via native share)
- TikTok
- Facebook / X
- iMessage / copy link

### Deep-link behavior

- `swolex.com/s/{shortcode}` — universal short link with Open Graph metadata and Snap-friendly fallback
- Tap → if app installed, opens the workout in-app; if not, App Store / Play Store, then continues to the workout post-install
- Public sessions show in browser preview with workout details + creator handle
- Gated workouts show "follow to unlock"

### Branded edits

- The card always includes the SwoleX logo and the user's @handle
- Creator-tier users get **custom-handle styling** on the card

---

## 9. Trainer & client features

### Trainer side (in the web console + mobile)

- **Roster overview** — every client, status (pending / active / paused / terminated), last activity
- **Invite by email or @handle** with optional rate + billing cycle (monthly / one-time / free) + welcome message
- **Client detail** — profile, current program, adherence ring, PR timeline
- **Sessions tab** — read-only paginated workout log
- **Progress tab** — volume chart, PR timeline, **AI Report** button (Kevin analyzes the client)
- **Notes tab** — add/edit notes (general / goal / form / observation / progress); scoped to client, optionally to a specific program or session
- **Assign program** — picker → optional welcome note → push notification to client
- **Stripe Connect payouts** — view earnings, payout history

### Client side

- **Trainer Invites** screen — accept / decline incoming invites
- Trainer's assigned program shows a **Trainer-assigned** badge
- Trainer notes surface on the relevant session
- **Program-scoped Premium** — trainer-assigned work unlocks Pro features without a separate subscription

### Data scope

The trainer only sees data from sessions linked to **their assigned programs**. Ad-hoc "Run It Back" sessions stay private.

### Trainer directory

- `swolex.com/trainers` — public, browsable
- Trainer cards: avatar, name, specialty tags, price range, location (optional)
- Profile page: bio, credentials, sample programs, pricing, "Work with me" CTA
- Trainer invite link: `swolex.com/trainer-invite/{token}`

---

## 10. Creator features

### Publishing

- Create programs in `swolex.com/console/programs/new` (or the program builder in app)
- **AI generate-full** to scaffold a 4–12 week program in seconds
- Save as **draft** / **published**
- Set **price tier**: free, premium (Pro-only), or paid (Stripe one-time)
- Discount codes
- Cover image upload

### Discovery

- Listed in the public Programs catalog at `swolex.com/programs`
- Filter by creator → individual creator's catalog page
- "Suggested" badge in the feed when SwoleX surfaces your workouts to non-followers

### Custom exercises

- Create your own exercise variants
- Submit for inclusion in the global catalog (admin curation)
- "Created by you" badge in the picker

### Analytics

- Per-program: enrollments, completion rate, sessions logged, average rating
- "Who's doing your workouts" feed
- Revenue dashboard (Stripe Connect, weekly + monthly summaries)

### Payouts

- Stripe Connect (Express accounts)
- 15% platform take rate
- Weekly automatic payouts (configurable)

---

## 11. Conditioning circuits

A distinct mode for AMRAP / EMOM / interval training.

### CIRCUIT OVERVIEW screen

- AI-generated circuit pre-populated:
  - Exercise list (with form cues per exercise)
  - Work seconds / rest between exercises / rest between rounds
  - Round count
  - Estimated duration

### CIRCUIT PLAYER screen

- **Full-screen countdown** — GET READY → GO → REST → ROUND REST → DONE
- **Color-coded** phases: orange for GO, green for REST, blue-purple for ROUND REST
- **Auto-advance** — completely hands-free
- **Haptics** on every phase transition
- **Screen stays awake** (`expo-keep-awake`)
- Pause / resume / manual advance

### Manual setup

- Work seconds, rest between exercises, rest between rounds, rounds count
- Pick exercises from the same picker as strength workouts
- Save circuits as templates

---

## 12. Health, equipment & gym profiles

### Gym equipment profile

Per-gym multi-select of available equipment:

- Barbell, Dumbbell, Cable Stack, Selectorized Machine, Smith Machine
- Kettlebell, Bodyweight, Pull-up bar, EZ-Bar, Band
- Custom: dumbbell-pair max, plate-pair max, increment overrides

**Multiple gyms supported.** Mark one as default. The active gym profile is sent to Kevin so he never suggests an exercise you can't perform.

### Equipment-aware AI

Kevin's prompt includes the active gym's equipment list. If you're at the home gym with only dumbbells + pull-up bar, he'll generate accordingly. Switch to commercial-gym profile → full equipment unlocked.

### Injuries (structured)

Each injury captures:

- Body region (lower back, knee, shoulder, etc.)
- Type (strain, fracture, joint pain, etc.)
- Status (active / resolved — resolved injuries archive, don't delete)
- **Three qualifiers** that drive Kevin's directives:
  1. *Prevents training entirely?* (hard block)
  2. *Pain persists through warmup?* (avoid loading)
  3. *OK with light load?* (isolation over compound)
- A "What the AI will do" plain-language preview

Active injuries surface a count badge on the Fitness Profile.

### Body metrics

**Shipped in 1.1.1 — PROGRESS → BODY tab.** Open `Progress → Body` to log a weigh-in.
- **Weight** + **body-fat percentage** + **seven circumferences** — neck, chest, waist, hips, arms, thighs, calves
- **Trend chart** overlays bodyweight against any single measurement on one timeline, so cuts/bulks and recomp drift read at a glance
- Body data feeds Kevin's read of where you are — bodyweight is part of every AI build, so push-up/pull-up reps scale to what you're actually moving

**Roadmap (not yet shipped):**
- Photo timeline (private)
- Apple HealthKit sync

### Unit system

- Imperial (lbs) / Metric (kg) global setting
- AI rounds output to **real plate math** for the user's unit system (e.g. metric users get 77.5 kg, not 77.1 kg)

---

## 13. Imports & exports

### Imports

- **Fitbod** CSV — isWarmup + multiplier handling tightened in 0.434
- **Strong** export
- **Hevy** export
- **JEFIT** export
- **Generic CSV** — fall-through for any unrecognized exporter (per recent commit `434d146 feat(imports): generic CSV path for unrecognized exporters`)

Imports preserve set type (drop/superset), RPE if present, dates, and notes. Exercises are matched against the catalog with fuzzy logic; unmatched entries land as custom exercises tied to the user.

### Exports

- **CSV workout history export** (per `7e321c7 feat(export): minimal CSV workout-history export`) — Pro tier
- **Training Report PDF** (any tier with AI Coach access)
- **GDPR full export** — request via `/delete-account` flow or `swolex.com/account` → "Export my data"

---

## 14. Settings, account, & subscriptions

### Inside the app

- **Units** (lbs / kg)
- **Rest timer** (default duration, sound on/off, haptic on/off, custom sound for Pro)
- **Audio cues** (master mute)
- **Notifications** (follows, reactions, comments, completions on your posts, program-day reminders)
- **Privacy** (account visibility, who can see your workouts, who can follow you)
- **Subscriptions** — RevenueCat-backed; manage via App Store / Play Store account settings
- **Promo codes** — redeem
- **Feedback / bug report** — in-app form with screenshot attachment
- **Legal** — Privacy Policy, Terms of Service, Trainer Terms, Community Guidelines
- **About** — version + build number footer

### Account management

- Change email / password (Supabase)
- Account deletion (GDPR-compliant soft-delete + permanent purge queue)
- Re-create account after deletion is properly gated (per the recent commit `01645f4 fix(auth): clean delete-and-return cycle for accounts`)

---

## 15. Web app surfaces

`swolex.com` is a Next.js 15 App Router site. Key routes:

### Public
- `/` — landing page, three workspace cards (Member / Trainer / Creator)
- `/beta` — beta signup with AI features pitch
- `/programs` — browse public catalog
- `/programs/[id]` — single program detail
- `/trainers` — trainer directory
- `/trainers/[handle]` — trainer public profile
- `/s/[shortcode]` — shared workout deep link
- `/trainer-invite/[token]` — accept trainer invite landing
- `/status` — uptime & AI service status
- `/privacy-policy`, `/terms-of-service`, `/trainer-terms`, `/community-guidelines`
- `/delete-account` — GDPR request

### User
- `/login`, `/auth/callback`
- `/account` — enrollments, purchase history, redeem code, data export, delete
- `/account/report-bug`, `/account/bug-reports`

### Creator / Trainer console
- `/console/login`
- `/console/programs`, `/console/programs/new`, `/console/programs/[id]`
- `/console/exercises`, `/console/exercises/new`, `/console/exercises/[id]/edit`
- `/console/templates`
- `/console/covers`
- `/console/profile`
- `/console/discount-codes`
- `/console/payouts`
- `/console/analytics`
- `/console/trainer` — roster overview
- `/console/trainer/clients/[id]` — client detail
- `/console/trainer/invite`

### Admin (gated)
- `/admin` — dashboard
- `/admin/users`, `/admin/users/[id]` — with AI workouts metric
- `/admin/analytics`
- `/admin/ai-debug`, `/admin/ai-debug/[id]` — internal Kevin debugging
- `/admin/exercises`, `/admin/catalog`, `/admin/catalog/audit`
- `/admin/gym-equipment`
- `/admin/handle-claims`
- `/admin/creator-applications`
- `/admin/bug-reports`, `/admin/deletion-requests`, `/admin/beta-signups`
- `/admin/promo`

---

## 16. Platform & infrastructure

For technical-marketing or partner conversations:

- **Mobile:** React Native + Expo SDK. iOS + Android from one codebase. OTA updates supported.
- **Backend:** FastAPI (Python 3.12), async SQLAlchemy, arq background workers.
- **Database:** PostgreSQL, Alembic migrations.
- **AI:** Gemini 2.5 Flash Lite by default; swappable to GPT-4, Claude, Grok via config. (See `03_kevin_ai_coach.md`.)
- **Auth:** Supabase + Apple/Google/Snap OAuth.
- **Payments:** Stripe + Stripe Connect (creator payouts).
- **IAP:** RevenueCat (iOS + Android).
- **Storage:** Cloudflare R2 (exercise videos, share-card images, avatars).
- **Push:** Expo v2.
- **Web:** Next.js 15 App Router.
- **Versioning:** `X-App-Version` header on every mobile request; backwards-compatible API gating so old builds never break.
- **Three-tier deploy:** dev → lab → prod, zero-downtime rolling deploys behind a Caddy reverse proxy.
- **Observability:** Sentry + structured logs.
- **Catalog scale:** **376 movements × 554 variants × 181 equipment types** (curated, deterministically generated).

---

## 17. Things only SwoleX has

The "you can quote this in a deck" list — features no direct competitor ships today:

1. **Executable feed posts.** Every workout is a runnable template. **CHALLENGE ACCEPTED / I GOT THIS** is the magic button.
2. **AI weight scaling on copied workouts.** Tap someone else's lift, the weights are already yours.
3. **Attribution chain.** "Danny completed Ryan's Gauntlet" surfaces on Ryan's original post. Social proof compounds.
4. **Branded share cards baked into completion.** Auto-generated, story-ready, deep-linked back to the workout. Free tier always has access — sharing is the growth engine.
5. **Injury directives that the AI actually obeys.** Structured per-region rules, not free-text notes ignored by GPT.
6. **Equipment-aware AI with multiple gym profiles.** Home gym vs. commercial gym → different generations from the same Kevin.
7. **Three workspaces in one identity.** Member, Creator, Trainer — one login, one profile, switch on demand.
8. **Trainer tier with program-scoped Premium for clients.** Clients don't double-pay; trainers don't lose customers to the upsell wall.
9. **Calibration learning loop.** Post-workout "how was that?" feeds a per-exercise / per-user adjustment factor into every future Kevin generation.
10. **Goal-aware training-report grading.** Hypertrophy sessions aren't graded against strength benchmarks. (Fitbod and Hevy don't do this.)
11. **Hands-free conditioning circuits.** Full-screen player, color-coded phases, haptics, screen-awake — finally usable mid-workout.
12. **Creator economy with public directory.** Discoverable trainers + Stripe Connect payouts. Trainerize is B2B-only; SwoleX is consumer-facing.
13. **Multi-importer ingestion.** Fitbod, Strong, Hevy, JEFIT all welcome — no "start over from scratch" friction for the user we want most.
14. **PDF training reports.** Print-quality coach-style report a lifter can hand to a coach or their own doctor.
15. **Native Snapchat Creative Kit integration.** Most lifting apps stop at "Share Sheet"; SwoleX is one-tap to Snap Story.

---

## Cross-references

- Kevin / AI deep brief → [`03_kevin_ai_coach.md`](./03_kevin_ai_coach.md)
- Competitive context → [`04_competitive_analysis.md`](./04_competitive_analysis.md)
- Brand voice → [`05_messaging_and_voice.md`](./05_messaging_and_voice.md)
- Visuals → [`07_screenshot_index.md`](./07_screenshot_index.md)
