Intelligent Gym Workout Planning — not just a logbook.
repIQ is a SwiftUI iOS app that calculates per-set targets using a real progressive-overload engine. It blends e1RM trending, RPE-based autoregulation, mesocycle awareness, and stall detection to tell a lifter what to do next — not just what they did. Currently shipping at v1.5 (build 9).
Most gym apps record what you did. repIQ guides what you should do next.
- Progressive Overload Engine — Per-set target weight / reps / RPE based on recent sessions, with e1RM confidence weighting, RPE fatigue detection, mesocycle RPE drift modeling, and off-day escalation. (ProgressionService.swift)
- Hypertrophy vs Strength Modes — Toggled per exercise. Hypertrophy targets ~10–15 reps at RPE 8; strength targets 3–5 reps at RPE 8.5.
- 17 Built-in Programs — Hypertrophy (PPL 6/3-day, U/L 4-day, Arnold, Bro, FB 3-day), Strength (5/3/1, 5/3/1 BBB, Starting Strength, StrongLifts 5×5, Texas Method, GZCL, nSuns), Hybrid (PHUL, PHAT, Conjugate, Reddit PPL).
- Real-Time PR Detection — Weight, rep, volume, and e1RM PRs detected and celebrated mid-workout.
- Inline Target Reasoning — Every prescription comes with the why ("Hit top of rep range. Increasing weight and resetting reps.") shown directly in the active workout view.
- Smart Rest Timer — Auto-bumps after hard sets (RPE ≥ 8.5), trims after easy ones (RPE ≤ 6). Toggleable.
- Voice Logging via Siri / App Intents — "Hey Siri, log a set in repIQ." Three-prompt resolution gathers weight, reps, optional RPE; power users can wire a one-shot custom Shortcut on top of the same
LogSetByVoiceIntent. - Interactive Live Activity — Lock Screen / Dynamic Island steppers + LOG button log working sets without opening the app. Rest timer ticks via
Text(timerInterval:). - Home Screen Widget — Streak, weekly working-set count, last PR, and last-trained on Small + Medium families.
- Repeat Last Workout — One-tap dashboard pill re-runs the most recent template+day with fresh targets.
- Social + Gamification — Friends, fist-bumps, comments, gym communities, head-to-head challenges, clubs, matchmaking, weekly progression races, leagues (Bronze→Diamond), IQ points, badges, milestones — all earned through real training, no streak freezes or paid shortcuts.
- Smart Nudges + Wrapped — Coaching nudges grounded in the user's analytics + social graph; weekly digests; monthly Wrapped report.
| Layer | Technology |
|---|---|
| Frontend | SwiftUI (iOS 17+) |
| Architecture | MVVM with @Observable |
| Backend | Supabase (Auth, PostgreSQL, RLS) |
| Charts | Swift Charts |
| Live Activities & Widgets | ActivityKit + WidgetKit (single extension, repIQActivity) |
| Intents | App Intents (button + voice) |
| Dependencies | supabase-swift v2.x, MuscleMap (single SPM dep each) |
Design system in repIQ/Design/ — dark theme, electric blue accent (#00AAFF).
- v1.5 (build 9) — Auto-detect goal completion: workout completion now re-evaluates every active goal against fresh training data, marks any that hit target as
completed, and surfaces a celebration card on the workout summary. New onboarding step for body context + injuries (sex, birth date, height, body weight, injury list) — all optional, stored in metric on the server, ready to feed future relative-strength stats and injury-aware programming. - v1.5 (build 8) — Monthly Wrapped rebuild: Spotify-style 10-slide story flow (tap-to-advance, swipe-to-dismiss), training-archetype reveal (PR Hunter / Volume Hammer / Consistency King / Variety Seeker / Steady Builder), memorable-unit volume comparisons ("3.2× a Toyota Corolla"), 9:16 share-card export via SwiftUI
ImageRenderer, dashboard banner card on the 1st–14th, push notification on the 1st of each month, dot badge on the Progress tab until viewed. Fixed a long-standing silent bug where the wrapped query selected a non-existentexercise_namecolumn onpersonal_records. Real consecutive-day streak calc replaces the placeholder. Newmost_consistent_muscleaggregation (the column existed but was never populated). - v1.4 (build 7) — Voice set logging via App Intents + AppShortcuts, RPE-aware smart rest timer with Profile toggle, "Repeat last workout" one-tap dashboard pill, real home screen widget suite (Small + Medium) replacing the stub, interactive Live Activity logging, minimize-bug fix.
- v1.3 — Workout mini-bar above the tab bar (manual
ZStackoverlay;tabViewBottomAccessorywas unreliable), minimizable workout, Live Activity for in-progress workouts. - v1.2 — Progress tab revamp: recap card, projections, body diagram, polish; insight section overhaul; consistency heatmap.
- v1.1 — Auto-save fixes, scope trajectories by workout day, custom exercises, incomplete-set prompts, smarter Strength Trajectory, monthly stats header.
Older history in git log.
SwiftUI Views ── @Observable ViewModels ── Services ── Supabase
└── Engines (in-process pure logic)
- Services wrap Supabase queries (one per domain: workouts, templates, social, gamification, etc.).
- Engines are pure logic (
ProgressionService,SetFeedbackEngine,InsightEngine,ProgramEngine,PlateCalculator). - Coordinator (
WorkoutCoordinator) owns the active-workout view model so it survivesexpanded ↔ minimizedtransitions. - App Intents (
repIQ/Intents/) live in both the main app and the activity extension via shared file references; the bridge (WorkoutIntentBridge) lets intents from either process reach the live view model in the host app.
repIQ/
├── Config/ Supabase client, app constants, smart-rest thresholds
├── Data/ Programs (Hypertrophy/Strength/Hybrid catalogs),
│ AchievementCatalog, MilestoneDefinitions, VolumeLandmarks
├── Models/ Codable structs — Profile, Exercise, Template, WorkoutSession,
│ WorkoutSet, PersonalRecord, Goal, ProgressionTarget, etc.
│ Models/Social/ — friendship, feed, challenge, club, matchmaking
├── Services/ 27 services — Auth, Workout, Template, Progression, Analytics,
│ Insight, Goal, Social, Feed, Challenge, Gymnastics, Matchmaking,
│ Gamification, Notification, Nudge, Digest, Tips, LiveActivity,
│ Widget, Export, OfflineSetQueue, NetworkMonitor, etc.
├── ViewModels/ @Observable — Dashboard, Auth, Profile, Goal, Progress,
│ ActiveWorkout, WorkoutCoordinator, TemplateEditor/List,
│ ProgramBrowser, ViewModels/Social/
├── Views/
│ ├── App/ RootView (auth gate), MainTabView
│ ├── Auth/ SignIn, SignUp
│ ├── Onboarding/ 7-step flow (experience, goal, frequency, program, goal builder, gym, how-it-works)
│ ├── Dashboard/ Quick start (with repeat-last variant), templates, history, calendar, goals
│ ├── Templates/ List, Detail, Editor, DayEditor, ExercisePicker, ProgramDetail, ProgramBrowser
│ ├── Workout/ Active workout, exercise log, set row, plate breakdown, day picker
│ ├── Progress/ Recap card, exercise progress, session detail, charts
│ ├── History/
│ ├── Goals/
│ ├── Social/ Feeds, friends, challenges, clubs, gym, matchmaking
│ ├── Profile/ Settings (rest timer, smart rest toggle, weight unit, gym), notifications, privacy, export, account
│ └── Components/ RQButton, RQCard, RQTextField, RPESelector, FirstTimeTooltip, etc.
├── Design/ Theme (RQColors, RQTypography, RQSpacing, RQRadius)
├── Extensions/ Color hex init, Date relative/short/day, Double formatting
├── Utilities/ PlateCalculator
├── Intents/ LogSetIntent, AdjustSetIntent, SkipRestIntent (Live Activity buttons),
│ LogSetByVoiceIntent (Siri voice), repIQAppShortcuts (auto-discovered phrases),
│ WorkoutIntentBridge
├── PrivacyInfo.xcprivacy
├── repIQ.entitlements (App Group: group.com.repiq.shared)
└── repIQApp.swift
repIQActivity/ Single WidgetKit extension hosting both:
- repIQActivityLiveActivity (in-progress workout)
- repIQHomeWidget (home screen, Small + Medium)
Note: A legacy
repIQWidget/folder exists on disk but is not inrepIQ.xcodeproj. Slated for cleanup.
25 PostgreSQL tables in Supabase, all with Row-Level Security:
- Core training:
profiles,exercises,templates,workout_days,workout_day_exercises,workout_sessions,workout_sets,personal_records,progression_log,goals - Social:
friendships,feed_items,feed_reactions,feed_comments,challenges,clubs,club_members - Gamification:
iq_points_ledger,badges,user_badges,user_milestones - Engagement:
weekly_digests,monthly_wrapped,exercise_tips,tip_votes
19 migrations in supabase/migrations/ (001_initial_schema.sql through 20260408_progression_log_workout_day.sql). Run them in order.
- Clone the repo.
- Open
repIQ.xcodeprojin Xcode 26+ (project targets iOS 17+; current build uses iOS 26.2 SDK). - SPM auto-resolves
supabase-swiftandMuscleMap. - Create a Supabase project. Copy your URL + anon key into
repIQ/Config/Supabase.swift. - Run all 19 migrations in
supabase/migrations/via the Supabase SQL editor (orsupabase db push), in filename order. - Build & run on iPhone 17 Pro simulator.
Tracked in .claude/plans/. Current near-term plan focuses on small, high-leverage wins:
- Set quick-tag chips — "form clean", "form broke", "felt heavy" as one-tap tags on a working set.
- Profile editing for body & injuries — captured at onboarding; users should be able to update height, weight, injuries, etc. from the Profile screen later. Currently captured-but-not-editable.
- Injury-aware exercise filtering — body data is captured but not yet used to filter or warn on exercises that conflict with declared injuries.
- Wrapped Tier 3 — AI-narrated insights (Anthropic API grounded in user data), year-over-year comparison slide, cohort comparison slide, PR mini-replay animations.
Bigger explorations on the back burner: VBT via accelerometer, on-device Vision form check, AI coach grounded in user data, periodization planner, adaptive programs, gym equipment heatmap, NFC quick-start tags, AR bar-path overlay.
Apple Watch companion is planned for a future update.