Features
Generated by node scripts/check-features.ts --write from docs/features.json and the [Fxx] tags in test names. Do not edit by hand.
62 of 62 features are proven by tests (β done, π‘ partly done).
| ID | Status | Feature | Where in gymgym | Tests | Note |
|---|---|---|---|---|---|
| F01 | β | Body-weight tracking with chart, goal line, gains/losses coloured toward the goal | Stats β Body weight; Home body-weight card; logBodyweight | apps/web/e2e/app.spec.tspackages/api/test/features.test.ts |
|
| F02 | β | Weekly plan: a routine per weekday | Plan β Weekly plan; setWeekday; domain plan.ts | apps/web/e2e/app.spec.tspackages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F03 | π‘ | Exercise library: 1,324 exercises, searchable, animated demos, localized instructions | packages/catalog; Exercises tab; instruction packs per locale | apps/web/test/exercises.test.tspackages/catalog/test/catalog.test.ts |
Animated demos are gated behind MEDIA_BASE_URL: the media is Β© Gym visual and needs a licence. |
| F04 | β | Reschedule any day without touching the weekly plan | Home week strip β day sheet; rescheduleDay / setDayOverride | apps/web/e2e/app.spec.tspackages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F05 | β | Guided workouts: todayβs session, body-weight check-in, pre-filled weights, rest timer, PR detection, per-exercise working weight | Workout view; nextTargets; finishWorkout records; working-weight prompt | apps/web/e2e/app.spec.tsapps/web/test/workout-store.test.tspackages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F06 | β | Keep the screen awake while training (re-acquired after tab switches; switchable) | Workout view useWakeLock; Settings β Keep screen awake | packages/api/test/features.test.ts |
|
| F07 | β | Supersets: build them, log back-to-back, rest only after the pair | Routine editor superset link; workout nextInSuperset | apps/web/test/workout-store.test.tspackages/api/test/features.test.ts |
|
| F08 | β | Timed exercises with a work timer that logs the time actually held, optionally loaded | SetMode time; work timer; time progression | apps/web/test/workout-store.test.tspackages/api/test/features.test.tspackages/domain/test/progression.test.ts |
|
| F09 | β | Progression rules: linear, Greyskull LP, double, time; per routine with per-exercise override; reasons; stalls and deloads computed from the log | packages/domain progression.ts; reason.* strings | apps/web/e2e/app.spec.tspackages/api/test/features.test.tspackages/domain/test/progression.test.tspackages/domain/test/reasons.test.ts |
|
| F10 | β | Estimated 1RM per exercise naming its source set, curve, calculator, no estimate above 12 reps | domain onerm.ts; exercise sheet | packages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F11 | β | Effort per set (RIR or RPE), off by default, each set keeps its scale, stepping rules | domain effort.ts; workout effort cell; Settings | apps/web/e2e/app.spec.tsapps/web/e2e/training.spec.tspackages/api/test/features.test.tspackages/domain/test/insights.test.tspackages/domain/test/training.test.ts |
|
| F12 | β | Effort statistics: average, near-failure share, rated share, weekly chart, distribution | Stats β Effort; viewer.effort | packages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F13 | β | Bodyweight exercises: no load column, added load, repsβsets with a ceiling | domain progression bodyweight; exercise settings | packages/api/test/features.test.tspackages/domain/test/progression.test.tspackages/domain/test/training.test.ts |
|
| F14 | β | Reps per side for unilateral work (log total, show split, step in twos) | domain progression perSide; workout set rows | packages/domain/test/progression.test.ts |
|
| F15 | β | Cardio: time + speed | SetMode cardio | packages/api/test/features.test.tspackages/domain/test/progression.test.ts |
|
| F16 | β | Share a plan (file and link), merge on import, optional week takeover, printable PDF | Plan β Share; planFile/importPlan/createPlanShare; /share/[token]; /app/print | apps/web/e2e/app.spec.tspackages/api/test/features.test.tspackages/domain/test/plan-share.test.ts |
|
| F17 | β | Filter by equipment with adaptive facets ordered by popularity | apps/web lib/exercises.ts equipmentFacets | apps/web/e2e/app.spec.tsapps/web/test/exercises.test.ts |
|
| F18 | β | Custom exercises: name + body part, description, edit/delete, behave like built-ins | saveCustomExercise/deleteCustomExercise; exercise sheet | apps/web/e2e/app.spec.tspackages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F19 | β | Activity heatmap (year, by time trained) | Stats β Activity; viewer.activity | packages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F20 | β | Muscle map: period balance, untrained muscles, routine preview, finish screen, hard-sets mode, male/female | body-map.tsx; muscleBalance; routine editor; workout summary | apps/web/test/ui-rules.test.tspackages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F21 | β | Push notifications: rest timer with the app closed, workout-day reminder in the userβs timezone | RestTimer Durable Object; cron runReminders; Settings β Notifications | packages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F22 | β | Sign-in and per-user data: passkeys (+ Google, GitHub), sign out, sign out everywhere | Better Auth; /login; Settings β Account | apps/web/e2e/app.spec.tspackages/api/test/features.test.ts |
|
| F23 | β | Admin dashboard: users with counts and last activity, drill-down, live training now, disable accounts, invite-only codes | Admin view; admin GraphQL; INVITE_ONLY | packages/api/test/features.test.ts |
|
| F24 | π‘ | Light/dark themes and 8 accent colours with contrast-picked label colours | design/DESIGN.md β styles/design-tokens.css (stitch2 tokens); Settings β Theme | apps/web/e2e/app.spec.tsapps/web/test/ui-rules.test.tspackages/api/test/features.test.ts |
Light and dark themes are done. One accent (Ember) instead of eight: DESIGN.md is the single source of the palette, so it is not a user setting. |
| F25 | β | 12 UI languages; numbers and dates follow the UI language | apps/web/src/i18n | apps/web/e2e/app.spec.tsapps/web/test/i18n.test.tspackages/api/test/features.test.ts |
|
| F26 | β | Import from FitNotes, Strong, Hevy and Apple Health with a summary, name matching, RPE, idempotent | domain import/*; Settings β Import; importHistory | apps/web/e2e/app.spec.tspackages/api/test/features.test.tspackages/domain/test/import.test.ts |
|
| F27 | β | JSON backup export/restore and guest mode | viewer.backup / restoreBackup; anonymous sign-in | apps/web/e2e/app.spec.tspackages/api/test/features.test.ts |
|
| F28 | β | Installable PWA with offline workout logging | manifest + service worker; SDK offline queue | apps/web/e2e/app.spec.tsapps/web/test/workout-store.test.tspackages/sdk/test/client.test.ts |
|
| F29 | β | Rest timer anchored to timestamps with β15 s / +15 s / skip, sound and vibration | workout-store rest; RestBar | apps/web/e2e/app.spec.tsapps/web/test/workout-store.test.ts |
|
| F30 | β | Minimize the exercise animation during a workout (remembered) | ExerciseMedia compact; settings.demoMinimized | packages/api/test/features.test.ts |
|
| F31 | β | Home: week strip, todayβs session, body weight, streak | Home view | apps/web/e2e/app.spec.tspackages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F32 | β | Per-exercise progress card: top set, 1RM and effort curves | exerciseStats; exercise sheet chart | packages/api/test/features.test.tspackages/domain/test/training.test.ts |
|
| F33 | β | Numeric fields accept a comma decimal and keep partial input | domain parseDecimal; NumField | packages/domain/test/training.test.ts |
|
| F34 | β | Units kg / lb (weights stored in kg, converted per row on import) | settings.unit; fmt.weight | packages/api/test/features.test.ts |
|
| F35 | β | Starter plans | loadStarterPlan (PPL, full body, upper/lower) | apps/web/e2e/app.spec.tspackages/api/test/features.test.tspackages/domain/test/starter.test.ts |
|
| F36 | β | Multi-user isolation (row- and column-level security) | ScopedData; D1 owner guards; isolation test | packages/api/test/db.test.tspackages/api/test/features.test.tspackages/api/test/isolation.test.ts |
|
| F37 | β | Workout history: browse, edit, delete | History view; saveWorkout/deleteWorkout | packages/api/test/features.test.ts |
|
| F38 | β | Delete all training data | resetData | packages/api/test/features.test.ts |
|
| F39 | β | Progression per routine slot; planned sessions start from the plan or the last session; an edited plan restarts progression | domain slotHistory; nextTarget start/planChanged; Settings β Planned sessions start from | packages/api/test/training-batch.test.tspackages/domain/test/training-batch.test.ts |
|
| F40 | β | Warm-ups (planned, ramped), drop sets and rest-pause bursts; out of progression and records | SetKind; withPlannedExtras; routine editor counts; set-number menu; w:/d:/rp: in documents | apps/web/e2e/training.spec.tspackages/api/test/training-batch.test.tspackages/domain/test/training-batch.test.tspackages/sdk/test/documents.test.ts |
|
| F41 | β | Plate loading per set from the plates owned (barbell, EZ, trap bar, Smith / no bar) | domain plates.ts; workout set rows; Settings β Plates and bars | packages/domain/test/training-batch.test.ts |
|
| F42 | β | Rest timer: pause, off switch, Ready with overtime, screen flash, rest per exercise | workout-store restAfter/pauseRest; Settings β Rest timer, Flash the screen | apps/web/e2e/training.spec.tsapps/web/test/workout-store.test.tspackages/api/test/training-batch.test.ts |
|
| F43 | β | Assisted machines progress by less assistance; resistance bands count as bodyweight | domain fromCatalog assisted/band; ASSISTED_CODES; detectRecords | packages/domain/test/training-batch.test.ts |
|
| F44 | β | Favourite exercises sort first in the library and picker | setFavourite; exercise sheet star; Favourites chip | apps/web/e2e/training.spec.tspackages/api/test/training-batch.test.ts |
|
| F45 | β | The week starts on Monday or Sunday | settings.weekStart; weekDates/byWeekStart | apps/web/e2e/training.spec.tspackages/api/test/training-batch.test.ts |
|
| F46 | β | Edit a saved workoutβs date, start time and duration; log a past or missed workout | History β Log a past workout; workout editor; Home day sheet β Log this day | apps/web/e2e/training.spec.ts |
|
| F47 | β | βDonβt count for progressionβ for an exercise or a workout; planned deload routines | skipProgression; routine.deload; exerciseSessions forProgression | packages/api/test/training-batch.test.tspackages/domain/test/training-batch.test.tspackages/sdk/test/documents.test.ts |
|
| F48 | β | Change a running workout: swap, move, remove, pair as superset, pull in another routine; keyboard and swipe; list layout | workout-store replace/move/remove/toggleSuperset/addRoutine; workout menus | apps/web/e2e/training.spec.ts |
|
| F49 | β | Muscle map modes: balance, fatigue (recovery) and strength (time since trained) | Stats β Muscle balance mode switch; viewer.muscleRecovery; domain recovery.ts | apps/web/e2e/insights.spec.tspackages/api/test/insights.test.tspackages/domain/test/insights.test.ts |
|
| F50 | β | Routine editor: replace an exercise keeping its config, copy a routine, print one routine | RoutineEdit replace/copy; /print?routine= | apps/web/e2e/training.spec.ts |
|
| F51 | β | Balance between the main lifts, naming the weakest one | Stats β Lift balance; viewer.liftBalance; domain liftBalance | apps/web/e2e/insights.spec.tspackages/api/test/insights.test.tspackages/domain/test/insights.test.ts |
|
| F52 | β | Equipment profiles: the library, picker and muscle explorer follow the active one; the routine editor flags missing equipment | Settings β Equipment profiles; settings.equipmentProfiles/activeProfile; library profile chip | apps/web/e2e/insights.spec.tspackages/api/test/insights.test.ts |
|
| F53 | β | Notes on an exercise during a workout, pinned to come back next time | LoggedExercise.note/notePinned; viewer.pinnedNotes; note sheet | apps/web/e2e/training.spec.tspackages/api/test/training-batch.test.tspackages/sdk/test/documents.test.ts |
|
| F54 | β | Activity heatmap by time or by volume; weekly body-weight averages | Stats β Activity switch; ActivityDay.volume; Body weight β Weekly averages | apps/web/e2e/insights.spec.tspackages/api/test/insights.test.tspackages/domain/test/insights.test.ts |
|
| F55 | β | Save a logged workout as a routine; copy a workout as text; explore exercises by muscle | History β workout β Save as routine / Copy as text; Library and picker β By muscle | apps/web/e2e/insights.spec.tspackages/domain/test/insights.test.ts |
|
| F56 | β | Optional password sign-in, set in Settings; rename and remove passkeys | PASSWORD_LOGIN=1; Settings β Account β Password / Passkeys; setPassword | apps/web/e2e/app.spec.tspackages/api/test/accounts.test.ts |
Admin reset codes are not needed: passwords are added to accounts that already sign in with Google, GitHub or a passkey, which also restores access. |
| F57 | β | Instance switches: guest accounts off, default language | ALLOW_GUEST=0, DEFAULT_LANG; AppConfig.guestAccess/defaultLocale | packages/api/test/accounts.test.ts |
|
| F58 | β | Admin sign-in log | Admin β Recent sign-ins; admin.signIns (method, device, country; no IP; 90 days) | packages/api/test/accounts.test.ts |
|
| F59 | β | Sync status: what is waiting to upload, server reachability, sync now | Settings β Sync (/app/sync); the offline banner links to it | apps/web/e2e/training.spec.ts |
|
| F60 | β | Import straight from Hevy with an API key | Settings β Import β Hevy API key; gymgym import hevy; viewer.hevyWorkouts + fetchHevy | apps/web/e2e/app.spec.tspackages/api/test/hevy.test.tspackages/domain/test/hevy-api.test.ts |
|
| F61 | π‘ | Your own photo on your own exercises, with location data removed | Exercise sheet β Add a photo (custom exercises); setCustomExercisePhoto; R2 bucket MEDIA | apps/web/e2e/training.spec.tspackages/api/test/media.test.ts |
Photos only; video uploads are not supported. |
| F62 | β | More UI languages: Ukrainian, Hungarian, Thai, Brazilian Portuguese and Arabic (right to left) | apps/web/src/i18n/locales/{uk,hu,th,pt-BR,ar}.ts; dir=rtl for Arabic; pt-BR negotiated before pt | apps/web/test/i18n.test.ts |
Exercise names stay English; instructions fall back to English in these languages. |