Mises à jour produit, nouvelles fonctionnalités et améliorations
v1.59.0Dernier
Feed cards now open a Share modal (SharePostModal) instead of only Web Share + clipboard: copy link, system share sheet when available, and deep-link intents for X/Twitter, Facebook, LinkedIn, WhatsApp, Telegram, Reddit, and mailto. Composer-only exercise_media posts (no session) mint metadata.post_share_id plus a sharedFeedPosts Firestore doc on create; the feed GET path lazy-mints the same for older posts. Public JSON at GET /api/shared/feed-post/<id>, crawler HTML + OG at /shared/feed/<id> (Flask), and a SPA page at /lite/shared/feed/:shareId (SharedFeedPostView). Server-side Pillow compositing uploads a 1200×630 branded PNG to Firebase Storage (share-cards/feed-posts/) and og:image prefers that URL; shared session/exercise HTML already honor ogImageUrl when present. i18n for the modal, shared page, and full French parity on feed.* strings.
Nouvelles Fonctionnalités
•SharePostModal + useSocialShare.ts — platform compose URLs, clipboard fallback, and Web Share API from the feed card share icon.
•sharedFeedPosts collection, post_share_id on standalone media activities, GET /api/shared/feed-post/<shareId>, and /shared/feed/<shareId> OG shim + SharedFeedPostView for visitors.
•Branded OG card generation (share_card_service.py) on publish / lazy mint — first post image composited onto a dark AFitPilot-styled 1200×630 PNG, public Storage URL stored as ogImageUrl.
Améliorations
•View-session icon on a standalone shared post routes to shared-feed-post when only post_share_id exists (exercise share id absent).
•French locale: complete feed.* translations plus shared-post and share-modal strings.
Corrections
•Standalone composer posts previously had no share_id / exercise_share_id, so the share icon never appeared — resolved via post_share_id + sharedFeedPosts.
v1.58.0
The feed is now bidirectional. A composer sits at the top of the feed: tap "Share something with the community..." to expand, type a message, and optionally attach up to 4 photos or videos (mixed allowed) in a single post. Reuses the existing exercise_media activity type with no session linkage, so all current feed mechanics — likes, comments, share links, owner edit/delete, weekly upload limits — work out of the box. Client-side validation enforces 10 MB per image, 100 MB and 60 s per video, with mm:ss duration check via HTMLVideoElement metadata before upload. Sequential XHR upload to /api/files/upload (existing endpoint, shared weekly cap with session media) with per-item progress, then a single POST /api/feed/create-activity to publish. On success the first page reloads so the new post arrives with server-side enrichment (auto-minted share_id, reactions preview) and the view scrolls to top.
Nouvelles Fonctionnalités
•FeedComposer.vue at the top of FeedView — collapsed trigger row (avatar + "Share something with the community..." + photo/video icon) that expands into a full composer with textarea, media grid, progress, and a primary Post button.
•Mixed media support — image and video items in the same post, up to 4 total. Each preview tile shows a remove (×) button and videos get a "VIDEO" badge so it's obvious what will publish.
•Client-side guards before upload: images ≤ 10 MB, videos ≤ 100 MB AND ≤ 60 s. Video duration is read from <video preload="metadata"> so over-length clips never start uploading.
•Reuses the existing exercise_media activity path — likes, comments, owner three-dots menu (edit/delete), "Liked by …" preview, weekly upload-limit accounting, and auto-cleanup of user_uploads when a post is deleted all work with zero backend changes.
Améliorations
•createFeedPost({ athleteId, message, mediaItems }) helper added to feedService.js so any future surface can publish a user post without rebuilding the request shape.
•After posting, the feed reloads the first page rather than optimistically prepending — guarantees the new card arrives with server-minted share_id and reactions preview already populated, so external-share and "Liked by" rows behave identically to existing posts on first render.
v1.57.1
Public and username profile pages showed the right achievements in the preview strip, but the chevron sent you to your own full achievements page because the route never carried the viewed athlete id. AchievementsView already supports ?id= for which athlete to load; the preview component now passes that id when you open the full list from another user's profile (and passes your id explicitly from your own profile for consistency).
Corrections
•AchievementsPreview "view all" from UserProfileView now navigates to /achievements?id=<targetAthleteId> so the full achievements page matches the profile you were looking at.
•ProfileView passes the current athlete id into the same prop so own-profile deep links stay aligned with route/localStorage resolution on AchievementsView.
v1.57.0
Profile and public-profile TRENDS line charts (Tonnage, Volume, and Average RPE) now separate completed history from the live week. Every point through the last fully closed week stays on a solid line with filled markers. The segment from that anchor into the current week is drawn dashed — partial-week or still-moving load, not a finalized week. The trailing point for the current week uses an open ring marker so it reads as in progress at a glance. If the current week has no logged load yet, that point is omitted so the chart does not fake a dip to zero.
Nouvelles Fonctionnalités
•Shared Chart.js line styling on ProfileView and UserProfileView — for each weekly line trend, the stroke into the in-progress week index uses a dashed segment; the current-week point is a hollow ring (dark fill, colored border). Prior weeks remain solid line + filled dots.
•Zero guard for the open week — when the current week's aggregate is null or zero, the last point is dropped so athletes do not see a misleading cliff before real data lands.
Améliorations
•Aligns the chart story with how athletes actually train — week 22 may only have a few logged sessions, so the line no longer implies a false "crash" compared to a full week 21.
v1.56.0
La readiness, repensée. Moins de chiffres, plus de couleurs. Le check-in quotidien utilise désormais une échelle colorée à 5 niveaux par question — "Fresh" / "Good" / "OK" / "Tired" / "Drained" — avec un libellé adapté à chaque axe pour que "Mild" se lise naturellement pour les courbatures et "Low" pour l'humeur. Le résumé du modal, votre graphique 14 jours et le tiroir de votre coach partagent maintenant une nouvelle jauge en demi-cercle qui affiche votre readiness du jour de 0 à 100 % (plus c'est haut, mieux c'est), avec un mot-clé coloré. Le graphique de tendance se pose sur des bandes douces du vert au rouge, et chaque point quotidien prend la couleur de son niveau. Coach et athlète voient désormais exactement le même langage visuel.
Nouvelles Fonctionnalités
•Check-in quotidien — échelle de sévérité colorée à 5 niveaux par question (sommeil, courbatures, fatigue, humeur, stress). Chaque niveau est une pastille libellée qui va du vert ("Fresh" / "None" / "Great") au jaune ("OK" / "Moderate") puis au rouge ("Drained" / "Severe" / "Very high"). Les libellés s'adaptent à chaque axe pour que "Mild" ait du sens pour les courbatures et "Low" pour l'humeur — plus besoin de décoder une échelle générique de 1 à 7.
•Jauge du jour — cadran en demi-cercle dans le résumé du modal, dans l'en-tête du graphique athlète et dans le tiroir coach. Affiche votre readiness en 0–100 % (plus c'est haut, mieux c'est, l'inverse de l'index Hooper pour que le nombre se lise dans le bon sens), un mot-clé de sévérité ("Fresh" / "OK" / "Tired"…) dans la couleur correspondante, et "Today · Hooper 10/35" en dessous pour ceux qui veulent le chiffre brut.
•Bandes de sévérité sur le graphique 14 jours — des zones horizontales douces (vert, vert-jaune, jaune, orange, rouge) derrière la ligne couvrent toute la plage Hooper, donc un même point se lit instantanément comme "Good" ou "Tired" au lieu d'avoir à interpréter une légende Worst/Best.
•Points colorés par jour — chaque saisie prend la couleur de son niveau, donc un seul jour de stress élevé ressort en orange ou en rouge sur une rangée de jours verts, sans qu'il faille calculer l'écart.
•Parité coach et athlète — le mini-graphique 14 jours du tiroir athlète côté coach reprend votre vue profil à l'identique : jauge du jour, bandes de sévérité, points colorés. Quand un coach parcourt votre fiche, il voit exactement ce que vous voyez sur votre propre profil.
•Langage de sévérité partagé — les cinq mêmes niveaux ("Fresh" / "Good" / "OK" / "Tired" / "Drained") alimentent désormais toutes les surfaces de readiness dans l'app, donc les prochains écrans (télémétrie admin, résumés hebdo, notifications) reprendront automatiquement les mêmes couleurs et libellés.
Améliorations
•La nouvelle saisie à 5 niveaux est mappée sur la même échelle 1–7 côté serveur, donc vos saisies passées restent comparables à l'identique avec les nouvelles. Rien dans votre historique n'a été perdu ni recalculé.
•La ligne de tendance du graphique drift est passée en gris neutre pour laisser les bandes de sévérité et les points colorés porter le sens. La ligne montre toujours la continuité jour après jour, sans rivaliser avec les couleurs.
•L'infobulle du graphique met maintenant en avant une pastille de sévérité colorée ("Tired · Hooper 22/35") au lieu de "(5 best — 35 worst)". L'index Hooper est conservé pour les utilisateurs avancés ; la pastille répond d'abord à la question "est-ce que ça doit m'alerter ?".
•Le texte de l'état vide simplifié — le graphique n'a plus besoin d'expliquer le sens de l'échelle Hooper. L'UI colorée porte désormais cette sémantique.
•La légende "Worst / Best" sur l'axe Y est conservée sur le grand graphique athlète mais discrétisée visuellement ; pour les nouveaux athlètes, la jauge et les bandes enseignent le sens plus vite que la légende.
Corrections
•"Hooper index 17 / 35" gave athletes no intuition for whether 17 was a good day or a bad day — the number sat in a neutral blue summary box with no semantic framing. The number is preserved for power users, but the headline is now the severity word + colored gauge.
•Old 1–7 numeric chips required users to mentally decode "is 4 closer to fresh or to exhausted?" every time. Replaced with five labeled, color-ramped options that read in under a second.
•Coach drawer mini-chart and athlete chart used different visual treatments — the coach version was a plain blue line with a 3-metric strip, the athlete version had hover tooltips and the same blue line. Both now share the severity-band visual language so context is identical across surfaces.
v1.55.2
Public profile benchmarks now reflect what the athlete actually trains. Profile and public-profile views previously hardcoded four powerlifting 1RMs (bench / squat / deadlift / OHP) for everyone — irrelevant for the bodyweight, calisthenics, endurance, and 60+ crowd. The fitness baseline now picks each athlete's most-logged public benchmarks (any of Strength / Endurance / Conditioning / Power / Skill / WOD; BodyComp and Readiness excluded as those aren't public achievements), ranked by total logs then most recent, capped at six cards. The unified percentile lookup gained reps (push-ups, pull-ups, dips), isometric holds (plank), and time-based cardio (5K / 10K / half / full marathon, lower-is-better) on top of the existing bodyweight-multiplier 1RM tables, all age- and sex-adjusted via the same level-band interpolation. Each card now shows a "vs M, 60–69" cohort caption beneath the percentile so older athletes can see their plank or push-up numbers ranked against the right comparison group instead of an unstated 25-year-old default. Durations format as mm:ss (a 1:25 plank, not "85 seconds"). First-time athletes with zero logs still get the four-lift seed CTAs on their own profile to bootstrap engagement; everyone else stops seeing CTAs for lifts they'll never do.
Nouvelles Fonctionnalités
•Per-athlete benchmark selection on the public profile and own profile — driven by getAllBenchmarksWithStats with includeGlobal=false, filtered to public categories (Strength / Endurance / Conditioning / Power / Skill / WOD), sorted by total logs then latest log date, capped at six cards. A 60+ athlete with plank holds and push-ups gets plank holds and push-ups; a powerlifter still gets bench / squat / deadlift.
•Unified getBenchmarkPercentile(typeId, value, {gender, age, bodyweight}) covers four shape families in one API: strength (bodyweight-multiplier 1RM tables — existing), reps (push-ups, pull-ups, dips), isometric holds (plank), and time-based cardio (5K / 10K / half marathon / marathon, with lower-is-better correctly inverted). All branches share the same age-adjustment factors and level-band → percentile interpolation as the original strength path.
•Cohort caption "vs M, 60–69" beneath each card's percentile bar, banded as <20 / 20–29 / 30–39 / 40–49 / 50–59 / 60–69 / 70+ and prefixed with M / F. Surfaces the comparison group explicitly so an "Intermediate" plank for a 65-year-old is read as intermediate-for-cohort, not intermediate-for-everyone.
•Duration-aware value formatting on baseline cards — plank holds and 5K times now render as mm:ss via formatDuration instead of raw seconds; weights/reps continue to use formatValue with type decimals.
Améliorations
•Standards tables expanded in web/data/strengthStandards.js: ENDURANCE_STANDARDS picked up dips_max, ISOMETRIC_STANDARDS is new (plank_hold), CARDIO_STANDARDS gained 10K / half / full marathon. The 5K key was renamed from five_k_time to 5k_time so it matches the canonical id in server/data/benchmark_catalog.json — previous standards were unreachable due to the key mismatch.
•BodyComp (bodyweight, body fat %) and Readiness explicitly excluded from public profile cards via PROFILE_BENCHMARK_CATEGORIES — those aren't achievements people choose to publish, and the admin aggregation report shows they were the dominant logged category, drowning the actual lifts.
•Missing-baseline CTA cards are now first-time-only — they only render when the athlete has zero benchmark logs at all (Strength / Endurance / wherever). Existing athletes no longer see "+ Log your bench 1RM" prompts on their profile if they've already logged plank, pull-ups, or a 5K instead.
•cohortLabel(gender, age) helper is exported from strengthStandards.js for reuse by future surfaces (coach drawer, admin views) that want consistent cohort framing.
Corrections
•Profile benchmarks were unreachable for the majority of users — the four hardcoded 1RM types ignored the long tail of logged benchmarks (plank, push-ups, pull-ups, 5K, body weight). Per the admin report 7 athletes log body weight, 5 log plank, 4 log push-ups, 3 log pull-ups; before this release none of those values surfaced on the profile cards. They now do.
•CARDIO_STANDARDS.five_k_time was set up but never matched any logged data because the canonical type id is 5k_time. Renamed the key; existing 5K logs now resolve to a percentile.
•Card values previously displayed as "{value} {unit}" — "85 seconds" for a plank — instead of formatted time. Now formatted via the same helpers used by BenchmarkDetailModal.
v1.55.1
Readiness telemetry, history, and customizable windows. Athletes pick their own readiness chart window (7 / 30 / 90 days) on Profile and Insights instead of being stuck at 14. Skips/dismisses are now persisted server-side at athletes/{id}/readiness/{date} as sentinel docs (submit always wins on overwrite), so engagement is queryable rather than device-local. New admin Readiness Telemetry view at /admin/readiness with compliance (% submitted / dismissed / no engagement), weekly engagement stack, daily mean Hooper across active athletes, and current-week per-axis distributions — gated by admin claim and active-athlete-denominator scoped to the last 30 days so abandoned accounts don't drown the signal.
Nouvelles Fonctionnalités
•Athlete-facing window selector — segmented 7d / 14d / 30d / 90d control above HooperDriftChart on ProfileView (drives both chart and history list) and InsightsView Summaries tab (chart only). Choice persists per athlete via readiness:windowDays:<id> in localStorage; default stays 14d to match the coach drawer.
•Server-side dismiss persistence — new POST /api/readiness/dismiss writes a sentinel doc {date, dismissed: true, dismissedAt} to athletes/{id}/readiness/{YYYY-MM-DD}. No-ops if a real submission already exists for that date (submit wins; dismiss never overwrites real Hooper data). Client write stays optimistic and offline-safe — the network call is fire-and-forget.
•Admin Readiness Telemetry view at /admin/readiness — compliance summary card (active athletes, athlete-days, % submitted / dismissed / no engagement), weekly engagement stack bars by ISO week, daily mean Hooper SVG line chart with N-counts overlaid (submitted entries only — dismisses are not "feeling fine"), and per-axis histograms for sleep / soreness / fatigue / mood / stress for the current week. Window selector mirrors the athlete chart (7 / 30 / 90).
•Admin endpoint GET /api/admin/readiness/aggregate?days=N — admin_required; iterates collection_group("readiness") in the window and returns compliance, weeklyTrend, meanHooperByDay, axisDistributions in one round trip. Days clamped to [1, 90].
•Active-athlete denominator — scoped to athletes who submitted or dismissed in the last 30 days, so churned accounts don't register as "skipping every day" and bury the engagement signal. Dismisses count as engagement (athlete saw the prompt and made a choice).
Améliorations
•New ReadinessWindowSelector.vue component used on both ProfileView and InsightsView, keeping the segmented control consistent across surfaces and avoiding duplicated markup.
•Admin nav: added Readiness Telemetry link to DebugAdmin alongside User Analytics Dashboard.
•Server route file split — admin readiness lives in its own server/routes/admin_readiness.py blueprint to keep the public /api/readiness endpoints separate from admin-only aggregation.
•Aggregation service computes everything (compliance, weekly stack, daily mean, axis distributions) from a single collection_group scan instead of N per-athlete reads — fine for tens of thousands of docs at v1; the doc captures the precompute path if it gets slow.
Corrections
•Skips were previously device-local only — there was no aggregate visibility, so admin compliance numbers were guesswork. Now every dismiss is durable in Firestore and queryable.
•Athlete history was hardcoded to 14 days even though the server already supported up to 90 — the chart bind now follows the user's window choice.
•Days before the dismiss-tracking deploy date are reported as "no engagement" rather than "skipped" in the admin view — we never recorded those dismisses, so we don't fabricate them. Allow ≥1 week of dismiss data after this release before reading compliance numbers as ground truth.
v1.55.0
Load monitoring overhaul — Phases 1–5 shipped. Tonnage is no longer the primary load metric. Sessions now carry an Arbitrary Units (AU) load number using Foster's sRPE × duration method, optional per-set RIR (Reps In Reserve) feeds RIR-aware e1RM, every week aggregates a weekly AU split across Strength / Endurance / Mixed modalities, daily Hooper-Mackinnon readiness (sleep, soreness, fatigue, mood, stress) is captured at first app open, and a nightly EWMA job produces descriptive 7-day acute / 28-day chronic load trends. Athlete-facing surfaces added on Profile (14-day Hooper drift + submission history) and Insights (weekly AU + modality stack + Hooper drift). Coach drawer gets the 14-day readiness drift and the EWMA trend chart, both deliberately neutral-styled per Impellizzeri 2020/2023 — no severity colors, no injury-risk framing.
Nouvelles Fonctionnalités
•Phase 1 — sRPE → AU per session. PostSessionModal asks "How long did this take you?" with planned duration as default, persists logData.actualDurationMin and logData.sessionAU = sessionRPE × actualDurationMin (Foster method). Session card now leads with AU as the primary load number; tonnage demoted to a secondary row.
•Phase 1 — historical backfill. Every existing completed session gets sessionAU computed from rpe × planned duration, flagged as estimated with an asterisk so coaches don't over-trust historical AU.
•Phase 2 — per-set RIR in strength logging. Exercise actuals now support a setEntries[] array with optional reps / weight / rpe / rir (0–4 chip menu, never required). e1RM compute uses per-set RIR when present and falls back to per-exercise RPE otherwise. Tonnage compute correctly sums across the new setEntries shape; flat {sets, reps, weight, rpe} historical data still reads through the dual-structure fallback.
•Phase 3 — weekly AU rollup with modality split. New athletes/{id}/weeks/{weekId}/load_summary doc with weeklyAU, weeklyAUByModality (3-bucket coarse: Strength / Endurance / Mixed), weeklyTonnageKg, sessionCount, modalitySource. New WeeklyAULoadCard on the athlete Insights view and modality stack on the coach WeeklySummaryStrip.
•Phase 3 — modality classification (Path A + B). LLM populates session.modality at plan generation (week_plan_v4, master_plan_V2_pruned prompts updated to require it); deterministic modality_classifier.py infers from session.focus / sessionType / exercise composition as a fallback for historical sessions or malformed output. Mirrored client-side in WeeklySummaryStrip + WeeklyAULoadCard for parity.
•Phase 3 — weekly summary LLM context. generate_weekly_summary_v4.py passes weeklyAU into the prompt; weekly_summary_v4_pruned.txt teaches the model to cite AU in commentary alongside tonnage.
•Phase 4 — daily Hooper readiness capture. New DailyReadinessPrompt modal (sleep, soreness, fatigue, mood, stress on a 1–7 scale where 1 = best, 7 = worst) fires on the first authenticated route of the day at the LiteLayout level so it surfaces from /plan, /session, /dashboard, or /insights. Skippable, never blocking. One submission per UTC calendar day; resubmissions overwrite via idempotent upsert.
•Phase 4 — server route. POST /api/readiness writes athletes/{id}/readiness/{YYYY-MM-DD} with the five axes plus computed hooperIndex (5..35). GET /api/readiness/{athleteId}?days=N returns the last N days for chart and history rendering.
•Phase 4 — coach 14-day drift chart on AthleteInfoDrawer Profile tab. Hand-rolled SVG; missing days render as gaps in the line, not zero-fill, so a flat trend always means submitted not missed.
•Phase 4 — athlete-facing readiness surfaces. New HooperDriftChart and ReadinessHistoryList components reused on ProfileView (paired chart + per-day submission history with date / per-axis values / Hooper sum) and InsightsView Summaries tab (chart only, alongside weekly AU).
•Phase 5 — EWMA descriptive load trends. New compute_load_trends.py nightly job writes athletes/{id}/load_trends/current with acuteAU_7d (alpha = 2/(7+1)), chronicAU_28d (alpha = 2/(28+1)), and trend (rising / falling / stable) computed from the 7-day slope. Coach drawer renders a 12-week chart with explicit "descriptive only — does not predict injury risk" legend, single neutral color, no severity badges.
Améliorations
•Daily readiness prompt has a ?readiness=force query-param bypass for QA and dev testing — re-opens the modal even when localStorage has already recorded today's submit/dismiss. Server upsert is idempotent so duplicate submissions during testing are harmless.
•Readiness gate uses two localStorage keys (readiness:lastSubmitted:<id>, readiness:lastDismissed:<id>) keyed by athlete id, so impersonation and multi-account testing don't collide.
•Modality classifier mirrored client-side in three places (server, WeeklySummaryStrip, WeeklyAULoadCard) so all three render the same modality split for the same session — drift target ≥95% agreement with LLM-explicit modality on a 50-session validation set.
•Estimated-AU sessions (where actual duration is missing and planned duration is used) are flagged with an asterisk on session cards and on the weekly AU card, with a tooltip explaining the substitution.
•New backfill scripts: backfill_session_au.py (Phase 1) and backfill_load_summary.py (Phase 3) support --limit, --athlete, --live, and --production flags so dry-runs and per-athlete recoveries are safe by default.
•EWMA chart and load-trend doc deliberately omit colored severity badges to prevent coaches reading the chart as an injury-risk signal — Phase 5 doc explicitly calls out the literature reasons (Impellizzeri 2020/2023) and locks neutral framing as a hard rule.
Corrections
•Daily readiness modal originally only mounted on TrainingDashboardView so it almost never fired — most athletes live on /plan, never opening /dashboard. Mount lifted to LiteLayout.vue, gated once per session across any authenticated user-portal route, with the existing localStorage gate intact and the ?readiness=force bypass preserved.
•Hooper drift line on the coach drawer no longer zero-fills missing days — gaps in submissions render as breaks in the line, so a coach can't mistake "athlete didn't submit" for "readiness is fine".
•Tonnage compute correctly sums across setEntries[] when per-set logging is used; flat {sets, reps, weight} historical sessions still aggregate to the same total through the dual-structure read.
v1.54.0
Correction-driven fixes roadmap complete — seven PRs motivated by cluster analysis of the first 14 plan correction events. Constraints now apply as structured filters before the LLM sees them, a post-generation validator catches empty sessions and coach-note violations, every correction can be promoted to a permanent athlete constraint in one click, established session templates persist across regenerations, travel/injury/race/distress context gates route around heavy LLM regen, goals are a typed array with tier + movement pattern + frequency, and a tonnage-plausibility gate stops progression logic from building off 1kg-barbell-RDL data corruption.
Nouvelles Fonctionnalités
•Structured constraint filters — bannedExercises, bannedMovementPatterns, bannedEquipment, and preferredDays are enforced before prompt construction, so the LLM never sees forbidden options. Pattern-level bans also catch near-name variants ("Dead Bug" vs "Straight Leg Dead Bug")
•Post-generation plan validator — four deterministic checks run after every regeneration: no empty sessions, primary-goal movement pattern presence, progression cap, and a coach-note keyword blocklist. Blocking failures trigger one prompt-addendum retry; persistent failures auto-log a correction event for admin review
•Correction → constraint promotion — submitting a correction on a flagged exercise now opens a dialog to add it (and its inferred movement pattern) to the athlete's permanent constraints. The AthleteInfoDrawer shows applied constraints as removable chips
•Session template persistence — master plans carry sessionTemplates with anchor exercises and default volumes. Weekly regeneration modulates volume inside the template rather than rebuilding from scratch, so a 7-week posterior-chain session doesn't get replaced with mobility work on recovery weeks
•Coach-initiated template rotation — POST /api/coaching/athletes/{id}/rotate-template lets coaches deliberately rotate a session template without a full plan regeneration
•Pre-generation context gates — travel/unavailability substitutes a bodyweight template, competition withdrawal blocks regen and flags for coach review, race proximity (<7 days) applies a hard taper, and life-state distress signals cap sessions at 3 and RPE at 6. Gate decisions write to an append-only audit subcollection
•Typed goals schema — goals is now a structured array with id, text, tier (primary/maintenance/deferred), movement_pattern, pattern_min_frequency, mesocycle_id, and target. Coach can edit tier and minimum weekly frequency per goal from the AthleteInfoDrawer
•Tonnage plausibility gate — every logged exercise weight is now scored against a movement-pattern × equipment threshold table (e.g. barbell RDL floor = 0.3× bodyweight). Implausible entries are skipped by progression logic and coach-note working weights override the LLM's prescribed load
Améliorations
•Migration script for typed goals — server/scripts/migrate_goals_to_typed.py produces a per-athlete dry-run diff before committing; conservative keyword inference keeps ambiguous goals in "maintenance" for coach review
•Validator auto-log path — validator failures write correction_events with cause_bucket=architecture_error and a tag per failing check, so the admin panel can filter them out of athlete-facing analytics
•Context signal classifier — keyword-first pass on athlete weekly notes, with optional Haiku 4.5 LLM fallback. Classified {intensity, domain, tags} feeds both the pre-gen gate and the main generation prompt
•admin_review_flags collection — gate-blocked regenerations surface to a top-level collection for admin triage, with Firestore rules locking writes to the server
•Shadow mode everywhere — every new behaviour (validator, template persistence, context gates, typed goals, tonnage gate) ships behind a feature flag that gates side effects only. Telemetry is recorded unconditionally so false-reject rates can be measured before enforcing
Corrections
•Banned exercises no longer bypass exclusion by using a near-name variant — movement-pattern and equipment filters compose with the name-based ban list
•Preferred training days are enforced programmatically at session-day assignment rather than being delivered as prose to the LLM
•Empty placeholder sessions (warmup/main/cooldown all blank) are rejected by the validator instead of reaching the athlete
•Recovery-week regeneration no longer replaces a 7-week established session template with a generic mobility circuit — volume is modulated inside the persisted template
•Travel coach-notes logged hours before a regen now route to a bodyweight travel template instead of generating a full gym plan
•Corrupt 1kg-barbell-RDL log entries no longer drive bogus progression targets — the plausibility gate skips them and falls back to the most recent plausible log or to coach-note baselines
•Coach-note working weights (e.g. "goblet squat working weight 10 kg") now override LLM-prescribed loads deterministically after generation
v1.53.0
Exercise Library programming types expanded from two (strength/rehab) to five: strength, weightlifting, conditioning, mobility, and rehab. Each type now has its own dedicated LLM enrichment prompt tailored to that modality, and conditioning playlists carry a sport tag (running, sprinting, swimming, cycling, rowing, general) that further narrows the prompt.
•Conditioning prompt — classifies energy_system (aerobic/anaerobic_alactic/anaerobic_lactic/mixed), drill_type (technique/intervals/tempo/plyometric), typical_distance_m, typical_duration_sec, and work_rest_ratio. Prompt persona narrows to the selected sport
•Mobility prompt — classifies stretch_type (static/dynamic/PNF/flow/soft_tissue/joint_mobilization), target_area, hold_duration_sec, and includes Sanskrit aliases for yoga poses
•Sport selector on conditioning playlists — Import tab and Playlists tab expose a sport dropdown (running, sprinting, swimming, cycling, rowing, general) that appears only when conditioning is selected
Améliorations
•Enrichment batch loop now groups by (programming_type, sport) so each LLM call uses the tailored prompt for that bucket
•Multi-playlist exercises resolve programming_type by priority: rehab > weightlifting > conditioning > mobility > strength, so the most sensitive context wins
•Playlist type change through PATCH supports both programming_type and sport; either changing triggers soft re-enrichment flags on affected exercises
•Preview modal chips now show combined tags like "conditioning · running" so admins can see the sport context at a glance
v1.52.0
Exercise Library now distinguishes rehab exercises from strength & conditioning, with a dedicated clinical enrichment prompt and rehab-specific metadata (target joint, indications, contraindications, rehab phase). The "Enrich Unenriched" flow now shows a review modal so admins can see exactly what will be enriched — grouped by playlist — before committing to the LLM run.
Nouvelles Fonctionnalités
•Playlist programming type — Imported Playlists tab has a per-row Strength / Rehab dropdown, and the Import tab exposes the same selector on first import. The tag flows through to every exercise source on that playlist
•Split enrichment prompts — the LLM uses a clinical physiotherapy persona with rehab-specific fields (target_joint, rehab_phase, progression_axis, indications, contraindications) for rehab exercises, and the existing S&C persona for strength exercises
•Rehab metadata surfaced in the exercise detail modal — new "Rehab" section shows target joint, phase, progression axis, indications, and contraindications when present
•Enrichment review modal — "Enrich Unenriched" now opens a preview listing pending exercises grouped by playlist, with programming-type chip, count, and expandable sample names. Admin selects which playlists to enrich before anything hits the LLM
•Bulk "Suggest rehab playlists" — keyword scan (rehab, prehab, range of motion, impingement, rotator cuff, etc.) flags untagged rehab-flavoured playlists and batch-tags them after admin confirmation
•Detailed enrichment progress panel — replaces the old tiny toast; shows current batch names, running enriched/failed counts with playlist chips, and the exact failure reason per exercise
Améliorations
•Soft re-enrichment — changing a playlist's programming type flags already-enriched exercises from that playlist with review_status="needs_reenrichment" so they are picked up next time admin runs enrichment, under the correct prompt
•Untagged and orphan playlists are disabled in the preview with a clear nudge ("Tag this playlist as Strength or Rehab before enriching") — prevents mis-enrichment
•Enrichment batches dropped from 20 to 8 exercises and max_tokens raised to 16k — fixes the JSON truncation failures that were causing entire batches to fail
•Pending queue now includes needs_reenrichment docs, not just enriched=false, so re-tagged playlists are picked up automatically
Corrections
•Enrichment no longer wipes whole batches when the LLM response exceeds token limits — output now fits under max_tokens, and per-exercise failure reasons are surfaced instead of silent failures
v1.51.0
Foundation Summary now handles empty-state onboarding and French users get full translations. Fixed a 500 error on the training timeline endpoint caused by Firestore server-timestamp sentinels leaking into JSON responses.
Nouvelles Fonctionnalités
•Foundation Summary empty state — when an athlete has no foundation data yet, the strip now shows a dashed-accent prompt ("Set up your training foundation") with an "Add" CTA instead of hiding, turning the component into a capture surface rather than a silent summary
Améliorations
•French translations added for the foundation strip (review_button, add_button, empty_title, empty_description, snapshot_description, review_title)
Corrections
•Training timeline GET endpoint — create_timeline, backfill_timeline, and sync_timeline no longer leak firestore.SERVER_TIMESTAMP sentinels into the returned dict, fixing "Object of type Sentinel is not JSON serializable" 500 errors
v1.50.0
System adaptation events are now automatically written to the Context Timeline whenever a plan is generated or regenerated. The timeline shows what the system changed, why, and the volume/intensity deltas applied — closing the loop between athlete updates and system responses.
Nouvelles Fonctionnalités
•System adaptation events on master plan regeneration — when a master plan is regenerated, a purple "System" entry appears on the timeline showing the new version, reason, and which profile fields changed
•System adaptation events on weekly plan regeneration — coach-triggered week regenerations now log to the timeline with the reason and any coaching notes
•System adaptation events on automatic next-week generation — after a weekly summary, the auto-generated next week creates a timeline entry showing volume/intensity deltas, recalibration triggers, and deload decisions
Améliorations
•Timeline entries include volume delta (e.g. +5%), intensity delta, recalibration reasons (underwhelm detected), and deload status (applied/skipped) when applicable
•All system events are non-blocking — failures to write the context event never interrupt plan generation
v1.49.0
Athlete Foundation — onboarding context (training age, competing demands, failure modes, benchmarks, what a good week looks like) is now visible and editable from the Timeline, and flows into weekly plan and summary generation. Foundation data is treated as living training context, not buried settings.
Nouvelles Fonctionnalités
•Foundation Summary strip pinned at the top of the Context Timeline — a compact one-line display showing the most training-relevant foundation fields (e.g. "Training consistently · 5-10 yrs · Young kids · Burnout risk") with a Review button
•Foundation Review Sheet — tapping Review opens a modal (bottom sheet on mobile) split into read-only Starting Point (entry state, onboarding context) and editable Current Context (training age, competing demands, failure modes, good week description, structured benchmarks, activity level)
•athleteFoundation context block injected into weekly plan and summary LLM prompts — the system now knows WHO the athlete is (background, tendencies, constraints) alongside what happened recently
•Meaningful diff-based timeline events — when foundation data is updated, only significant changes (new competing demands, changed failure modes, benchmark updates) generate a readable timeline event. Typo fixes are filtered out
Améliorations
•Staleness nudge — foundation summary shows a subtle reminder when data hasn't been reviewed in 8+ weeks, helping athletes and coaches notice when assumptions may be stale
•Structured benchmarks consolidated — removed duplicate free-text benchmarks field from Profile Settings in favor of the structured model (squat/bench/deadlift/OHP weight×reps, 5K time) editable from the Foundation Review
•Coach foundation access — coaches can review and update editable foundation fields from CoachAthleteView timeline, with changes attributed to the coach
•Foundation metadata — foundationLastReviewedAt, foundationUpdatedAt, and foundationUpdatedBy tracked on the profile document for audit and staleness detection
Corrections
•ChatDrawer onSnapshot listener no longer fires redundant logs on metadata-only Firestore re-emissions
v1.48.0
Masterplan V2 adaptive engine — the training plan is no longer a static document. After each weekly summary, the system evaluates execution signals (adherence, RPE, missed sessions) and adjusts volume, intensity, and progression speed automatically. Signal-based deloads are inserted when fatigue criteria are met. Adaptation triggers are now machine-evaluated with live status in the coach UI. Coaches can revise the active training phase without rebuilding the entire plan.
Nouvelles Fonctionnalités
•Live activeParameters — after each weekly summary, a rule-based engine computes volume/intensity deltas and progression speed from the last 4 weeks of execution data. Weekly plan generation reads these live targets instead of the static microcycle strings when schemaVersion >= 2
•Signal-based deload detection — when avgRpe exceeds 8.0 for 3+ consecutive weeks or adherencePct drops below 60 for 2+ weeks, a deload week is automatically inserted. Coach UI distinguishes scheduled vs. signal-triggered deloads
•Phase revision operation — coaches can revise just the active mesocycle based on recent performance data, without rebuilding the entire plan. Version increments as -r1, -r2 suffixes. Weekly plan history is preserved
•Live adaptation trigger evaluation — triggers are now structured predicates (metric, condition, threshold, consecutive weeks) evaluated automatically after each summary. Escalated triggers surface as coach notifications with a "Revise Phase" CTA. Legacy free-text triggers are lazily migrated to structured format on first read
Améliorations
•Shadow mode for adaptive parameters — all computation runs in shadow mode by default (MASTERPLAN_ADAPTIVE_PARAMS_ENABLED=false), logging results without writing to Firestore. Flip the flag to activate live behavior
•Parameter audit log — every automated change to activeParameters writes a ParameterAuditLogEntry with the trigger source, reason, and a snapshot of the summary metrics that drove the change
•Coach UI trigger status — adaptation triggers tab shows live status (dormant/warning/escalated), consecutive weeks met, and last evaluated time instead of static text
v1.47.0
Expanded the movement pattern taxonomy from 9 gym-centric categories to 13 patterns covering endurance, team sport, hybrid, and functional fitness athletes. All 2,108 exercises in the library have been reclassified with the new taxonomy.
Nouvelles Fonctionnalités
•Expanded movement pattern taxonomy — new patterns: rotation (woodchops, Pallof press), locomotion (running, cycling, crawling), isometric (wall sit, plank hold, dead hang), agility (ladder drills, cone drills), and single_leg replaces lunge to cover all unilateral lower-body work
•Full exercise library reclassification — all 2,108 production exercises re-evaluated by LLM with sport-aware classification rules. 94 exercises moved to more accurate patterns (e.g. assault bike from plyometric to locomotion, Russian twists from core to rotation, pistol squats from squat to single_leg)
Améliorations
•Radar charts, stacked bars, and training distribution views in TrainingDashboard, ProfileView, and UserProfileView now display all 13 movement patterns with distinct colors
•LLM prompts for exercise swap, master plan, and weekly plan now reference the full 13-pattern taxonomy for better exercise selection and balance
•OpenRouter provider now respects max_tokens parameter from calling code instead of hardcoding 16,000 — reduces cost and prevents insufficient-credits errors on smaller accounts
v1.46.0
New Context Timeline view — a vertical feed that shows the full history of athlete updates, coach notes, and system adaptations in one scrollable timeline. Athletes can post updates (voice or text) directly from the view, and coaches see the same timeline with their own input.
Nouvelles Fonctionnalités
•Context Timeline view — a new dedicated tab showing a vertical timeline with system adaptations on the left and human inputs (athlete updates, coach notes) on the right. Desktop uses a true left/right split; mobile uses a single-column layout with colored source indicators
•Quick-add input at the top of the timeline — athletes can speak or type updates about injuries, schedule changes, or new goals. Posts are auto-classified by event type and severity
•Coach timeline integration — coaches see the same timeline in CoachAthleteView as a new view mode toggle alongside Week, Calendar, and Dashboard. Coach posts are attributed with their name
Améliorations
•Timeline cards show event type badges, severity indicators, tags, plan impact scope, and resolved status at a glance
•Events grouped by month with separator headers, paginated with load-more
v1.45.1
Hotfix: Follow/unfollow and ~60 other API-backed features were silently broken in production because the frontend was pointing API calls at http://localhost:5050 instead of the real backend. Every service, store, composable, view, and component that built API URLs from VITE_API_BASE_URL has been migrated to the canonical getApiBaseUrl() helper, which correctly resolves to relative /api/* URLs (via the Vercel rewrite) in production and falls back to localhost only in dev.
Améliorations
•Single source of truth for API base URL — every frontend module that talks to the backend now routes through getApiBaseUrl() in web/utils/config.js, which already handles localhost dev, Vercel production rewrites, and the kevin.afitpilot.com → staging API special case. Touched ~60 files across services/, stores/, composables/, views/, and components/{lite,coaching,engagement,profile,predictions,insights,design-system}
Corrections
•Follow / unfollow silently failed in production — clicking Follow on another athlete's profile appeared to do nothing on refresh. Root cause: socialStatsService.js (and 50+ other files) used the pattern `import.meta.env.VITE_API_BASE_URL || 'http://localhost:5050'`. In the production build VITE_API_BASE_URL is intentionally empty (so fetches use relative /api/* URLs that hit the Vercel rewrite to the real backend), but the `||` fallback treats empty string as falsy, so the production site was POSTing to http://localhost:5050/api/social/follow. The browser blocked the request (mixed content / connection refused) and the optimistic UI update reverted on the next page load when the authoritative read returned isFollowing: false
•Other features broken by the same bug — notifications, nudges, week freeze / unfreeze, returning-user welcome-back, Stripe subscription checks, coach chat (send messages, file uploads), session sharing, achievements, GDPR export, LLM routing, weekly plan / master plan regeneration, profile completeness, onboarding email checks, predictions, exercise progressions, benchmarks, events, and several admin views were all hitting localhost in production and failing silently in their try/catch blocks
•Engagement components had no fallback at all — BuddyNudgeButton, SessionCompletionPrompt, WeekFreezeBanner, NudgeCandidatesCard, WelcomeBackModal, and NotificationCenter were using `${import.meta.env.VITE_API_BASE_URL}/api/...` with no `||` fallback. In dev (where VITE_API_BASE_URL was unset for some setups) this rendered as the literal string `undefined/api/...`, breaking nudges and notifications entirely on local dev environments
•Profiles confirmed public by default — investigated as part of the follow bug: isPrivateAccount defaults to false in generate_onboarding_plan.py, and follow requests only trigger when the target account is private (social_api.py:354-428). The follow request flow itself was correct; only the URL the frontend was hitting was wrong
v1.45.0
Feed posts now have a "View session" button that opens a full public session page — complete with all exercises, blocks, drills, RPE, feedback, benchmarks, and the photos and videos the athlete attached during the workout. The page is auth-free and externally shareable, so you can drop the link in a chat or social post and anyone can see exactly what you did.
Nouvelles Fonctionnalités
•View-session button on feed posts — every workout completion and exercise-media post on the Feed now shows a document icon next to Like and Comment. Tapping it opens the full session page for that post, so you can see exactly what the athlete trained without leaving the feed
•Public shared-session page with media — the /shared/session/:shareId view now renders captured photos and videos under each exercise, circuit exercise, and skill drill, with a fullscreen lightbox (prev/next, image + video controls) on click. Previously the public view only showed the workout structure and stats
•Auto-minted share links on session completion — when you log a session, the app now mints a public share link in the background and stamps it onto the resulting feed post. The view-session button uses that link, so the page works for any viewer (no login needed) and can be shared externally — paste the URL into a chat, a tweet, anywhere
•Live media on shared sessions — the public share endpoint now reads the live session from Firestore on every view, so any photos or videos you add after sharing show up automatically. The original snapshot is kept as a fallback in case the source plan is ever deleted
Améliorations
•Feed view-session routing — the button prefers the public /shared/session/:shareId route over the in-app /session?id= route, so non-owners get a clean public viewer instead of an authenticated in-app page they may not have access to. Legacy posts without a share_id still fall back to the in-app route
•Shared session sanitizer — the backend whitelist that prepares sessions for public viewing now includes mediaItems on top-level exercises, circuit-block exercises, and skill-block drills, with a dedicated _sanitize_media_items helper that strips internal fields (activityId, etc.) so only {url, type} is exposed publicly
Corrections
•View-session button missing on photo/video posts — the button only appeared on workout completion posts because exercise_media posts were never given session_id / week_index in their metadata. SessionFeedback now plumbs both fields (plus the new share_id) through to the activity, and FeedActivityCard renders the button for both post types
v1.44.0
Other-user profile pages now use the same modern layout as your own profile — streak + fitness baseline overview, the full grouped Trends chart with 12 metrics (tonnage, volume, RPE, movement patterns, muscles, equipment, joint stress heatmap, and more), and a responsive two-column desktop layout. The old 4-stat row and last-7-days chart are gone.
Nouvelles Fonctionnalités
•UserProfileView layout overhaul — viewing another athlete's profile now renders the same overview-section, grouped Trends selector, and chart fullscreen overlay as your own ProfileView, instead of the legacy 4-stat OverviewMetrics row and basic last-7-days chart
•Fitness baseline on other-user profiles — Bench / Squat / Deadlift / OHP cards now appear with strength-percentile bars and level labels (computed from each athlete's gender, bodyweight, and age), powered by the existing benchmark stats endpoint
•Training timeline on other-user profiles — the full 12-week training timeline (tonnage, volume, RPE, movement patterns, muscle groups, body regions, modalities, equipment, force types, difficulty, compound/isolation, joint stress) is now available on other athletes' profiles, with the same fullscreen chart overlay
Améliorations
•Other-user profile desktop layout — UserProfileView now uses the same sticky two-column layout as ProfileView (360px identity column on ≥1024px, widening to 380px on ≥1400px), with the overview grid scaling from 2 → 3 → 4 columns across breakpoints
Corrections
•Other-user profile showed outdated layout and stats — UserProfileView was still rendering the pre-1.40 OverviewMetrics + basic 7-day chart while ProfileView had moved on to the streak + fitness baseline + grouped Trends layout. Both views are now in sync
v1.43.0
Achievements tab is back on the Insights page with a proper responsive desktop layout, and the Socialite achievement now shows up for existing athletes who were created before it was added to the default roster.
Nouvelles Fonctionnalités
•Achievements tab restored on Insights — the Insights page gains back a dedicated Achievements tab (sits between Summaries and Benchmarks on desktop, and in the mobile dropdown) with separate "In Progress" and "Unlocked" sections, Load More pagination on each, and lazy-loading so the API call only fires the first time you open the tab
Améliorations
•Achievements grid desktop layout — the achievements grid is now responsive instead of locked to a single column: 1 column on mobile (<769px), 2 columns on tablet (≥769px), 3 columns on desktop (≥1200px), and 4 columns on large desktops (≥1600px), with larger section titles and wider gaps at each breakpoint so achievement cards breathe on wide viewports
Corrections
•Socialite achievement missing for existing athletes — `get_achievements` now backfills the Socialite achievement onto any athlete doc that doesn't have it yet, the same way feedback_champion and benchmark_improver are already backfilled. Previously Socialite was only seeded into new athletes via create_default_achievements, so anyone created before Socialite was added to the roster never saw it in their list even though the increment handler was still firing on friend congratulations
v1.42.0
Feed desktop UX overhaul — the right rail is now a proper utility dashboard with a "Your week" summary, an "Up next" session preview, and the existing Suggested Athletes widget. Adds skeleton loading, an always-visible quick-comment composer on every post, and full keyboard navigation (j/k/l/c) for power users.
Nouvelles Fonctionnalités
•Your Week summary widget — new sidebar card on the desktop Feed showing sessions logged this week (derived from your feed activities so it costs zero extra Firestore reads), current week streak with flame indicator, cheers received, and a weekly goal progress bar. The goal pulls from your profile's trainingFrequency (1–7) rather than a hardcoded value, so it matches whatever you set in onboarding
•Up Next session widget — new sidebar card that reads your current week's plan and surfaces the next non-complete, non-skipped session with day, focus, and exercise count. Clicking "Start session →" jumps straight into the SessionView for that session. Shows an "all caught up ✅" state when the week is done and auto-hides for athletes without a plan yet
•Inline comment composer — every post on desktop now has an always-visible "Write a comment..." stub below the action row. Clicking (or tabbing + Enter) expands the full comments section and focuses the input in one step, instead of the previous click-the-icon-then-click-the-field dance. Mobile behavior unchanged
•Keyboard navigation on the Feed — power users can now drive the feed without touching the mouse: j / ↓ next post, k / ↑ previous post, l to like the focused post, c to open its comment composer. Arrow keys only engage once j/k has been pressed so we don't steal normal page scrolling, and the handler respects input focus, modal state, and modifier keys
Améliorations
•Feed loading state — replaced the centered spinner with 3 skeleton cards that mirror real card dimensions (avatar, header lines, text, media block, action pills) so there's no layout shift when activities load and perceived performance jumps
•Feed desktop layout polish — widened the right rail to 320px (340px at ≥1280px), tightened column gap to 32px, bumped the feed title to 2rem with tighter letter-spacing, and gave the sticky header cleaner borders so it reads as an app header rather than a flat row. Header now aligns with card content instead of floating on its own padding
•Feed focus ring — the keyboard-focused post gets a subtle purple glow (box-shadow with rgba(142, 94, 255, 0.6)) on desktop only, so sighted keyboard users can always tell which card will react to l/c
v1.41.0
Suggested Athletes widget + desktop layout overhaul — a new follow-suggestion widget on the Feed and Plan pages (vertical sidebar on desktop, Twitter-style horizontal strip on mobile), plus desktop layout improvements across Feed, Plan, Session, Master Plan, Insights, and Training Dashboard so the app finally takes advantage of wide viewports.
Nouvelles Fonctionnalités
•Suggested Athletes widget — new component that surfaces athletes you don't yet follow, with inline Follow buttons, optimistic UI (cards slide out on successful follow), rollback on error, and a "Requested" state for private accounts; appears on both the Feed and Plan pages
•Suggested Athletes — Twitter-style responsive variants: vertical list in the desktop sidebar, horizontally scrollable card strip on mobile/tablet with scroll snapping. A single widget instance switches layouts via matchMedia so only one API call is made per page load
•Suggested Athletes — refresh button rotates through the fetched batch locally before re-hitting the API, and the widget hides itself entirely when there are no suggestions so pages never render an empty card
•Backend suggestions endpoint — new GET /api/social/suggestions/<athlete_id>?limit=N that streams the profiles collection group, excludes the current user and everyone they already follow (checking both the social/following/users subcollection and the legacy following schema), and returns up to 30 candidates
Améliorations
•Feed desktop layout — the feed container becomes a 2-column CSS grid on ≥1024px with a sticky right rail for Suggested Athletes (600px feed column + 320px sidebar, widens to 620px + 340px at ≥1280px). The sticky header picks up a backdrop blur and subtle shadow so it reads as a proper app header
•Feed loading state — replaced the single spinner with full skeleton cards that match real card dimensions (avatar, header lines, text, media, action pills) so there's no layout shift when activities load
•Plan desktop layout — introduced a sticky left sidebar that holds the Progress card, Plan Info card, and Suggested Athletes widget on ≥1024px; sessions list uses lg:grid-cols-2 on wide desktop. Mobile/tablet behavior is unchanged (display:contents on the grid wrapper)
•Session View desktop layout — exercise cards now use a 2-column grid where stats (sets/reps/rest/RPE/weight/notes) sit on the left and the YouTube demo sits in a capped-width column (380px → 440px at 1280px+) on the right. Fixes huge 16:9 iframes ballooning on wide screens. Also caps page width at 1100px
•Master Plan desktop layout — tabs moved into a sticky 320px left sidebar as a vertical nav (ditched the horizontal pills) while tab content fills the right column. Page cap widens from 896px to 1300px (1400px at ≥1280px)
•Insights desktop layout — Summaries tab switched from a single-column vertical list to a responsive grid (auto-fill, minmax(460px, 1fr)) so weekly summary cards no longer stretch the full 1200px page width. Cards become flex columns so the "View details" footer button pins to the bottom when rows stretch to match the tallest card
•Training Dashboard desktop layout — capped page width at 1400px, sticky dashboard header with backdrop blur, KPI row locked to 4 columns on ≥1024px (was auto-fit generating up to 10 skinny columns), chart grid jumps from 2 to 3 columns at ≥1280px with wide cards spanning 2 of 3 (instead of the entire row), benchmark grid raised from 200px to 260px minimum so percentile bars breathe
Corrections
•Fixed attached videos and YouTube demo iframes ballooning to nearly full-screen width on the desktop Session View by capping them inside a fixed-width column
•Fixed Chart.js canvases in the Training Dashboard blocking grid cells from shrinking by adding min-width:0 to chart cards
v1.40.0
Decision Memory layer — the AI now sees recent exercise swaps, session regenerations, and coach plan corrections during every generation, and coaches get a new "AI Memory" panel to inspect that context and flag anything the system is misreading.
Nouvelles Fonctionnalités
•Decision Memory context — new prompt addendum that surfaces the in-session modification trail (exercise swaps, session regenerations, coach overrides linked to recent weeks) so the LLM sees what was changed, by whom, and why, on top of the existing tendency profile and exercise feedback layers
•AI Memory coach panel — new "AI Memory" section on the coach athlete view showing structured cards for recent exercise swaps, session regenerations, coach plan corrections, and exercise preferences (liked/disliked) so coaches can verify what the AI is being told about each athlete
•Complaint telemetry — every AI Memory card has a "Flag" button that opens a capture modal, letting coaches report sections that misrepresent the athlete; complaints are logged to athletes/{id}/ai_memory_complaints for architecture review without mutating the underlying data
•Data-quality warnings — the Exercise Preferences card now detects and flags exercises that appear in both liked and disliked lists, surfacing feedback conflicts that the aggregated views previously buried
Améliorations
•Athlete Intelligence context and Decision Memory are now injected into the primary weekly generation path (canonical_generate_next_week) and the session regeneration path, not just the week-regeneration path — every generation surface now sees accumulated tendencies and recent modifications
•Exercise swap normalization — the decision memory reader now collapses equipment qualifiers (e.g. "Barbell Bench Press" vs "Bench Press") so renames no longer leak into the prompt as fake swaps, and filters out system-tag reasons like "ai_swap" that carried no signal
•Structured AI Memory API — new GET /api/coaching/athlete/:id/ai-memory endpoint returns JSON versions of the decision memory and exercise preferences addenda, sharing collection logic with the markdown prompt builder so the two views can never drift
Corrections
•Fixed swap direction in the decision memory reader: swaps were displaying original and replacement reversed because swap.replacedWith stores the old name while item.name is the new one — now renders in the correct direction for both the LLM prompt and the coach panel
v1.39.0
Profile Joint Stress trend — the heatmap scrolls sideways on small screens and opens centered on your current training week so the right column is visible without swiping through older weeks first.
Améliorations
•Joint Stress heatmap (Profile) — horizontal scroll inside the chart card keeps multi-week grids contained on narrow viewports
•Joint Stress heatmap — when you select the trend, the scroller aligns to your current week from app context (saved week or URL) and centers that column when possible, with fallbacks when that week is outside the weeks shown
Corrections
•Fixed Joint Stress heatmap overflowing the profile chart container on mobile
v1.38.0
Insights consistency map now opens on the current part of the year — the heatmap scrolls to center today on first load instead of leaving you at January.
Améliorations
•Training consistency heatmap — horizontal scroll initializes to the week that contains today so you see where you are in the year without swiping across months first
v1.37.0
Weekly Summary V5 rollout — the reskinned summary modal now opens correctly after every completed week and from the insights history, with a dedicated empty state for fully-skipped weeks.
Nouvelles Fonctionnalités
•Rest-week empty state — fully-skipped weeks now show a dedicated "Rest week" card instead of an empty chart, with an encouraging message and a skipped-session count
•Insights history routing — tapping a summary in the insights tab now opens the V5 modal when the doc has chart-ready metrics, and falls back to the original V4 modal for older summaries so past history stays untouched
Corrections
•Fixed weekly summary auto-open: completed weeks were incorrectly routing v4.0.0 summaries to the old V4SummaryModal instead of the new V5 layout — all completion flows now open V5 consistently
v1.36.0
Athlete Intelligence Layer — the system now accumulates prescribed-vs-actual patterns across weeks into a durable tendency profile, and injects threshold-based insights into every plan generation prompt so the AI adapts to each athlete's real behaviour over time.
Nouvelles Fonctionnalités
•Tendency Profile Service — rolling 12-week aggregation of effort deltas (RPE gap), volume completion, load progression rate, exercise preferences, coach override patterns, and adherence shape, persisted at training_meta/tendency_profile after each weekly summary
•Athlete Intelligence Context — threshold-based insight engine that reads the tendency profile and recent context events, firing actionable insights (e.g. "athlete consistently undershoots RPE by 1.8 — prescribe higher intensity") only when patterns cross significance thresholds
•Event Pattern Detection — scans context events for recurring signals: repeated injury sites, frequent schedule disruption, goal instability, and heavy coach steering, surfacing systemic patterns the AI should account for
Améliorations
•Intelligence context injected into all three generation paths: two-stage Stage 1 decisions, two-stage regen Stage 1, and week regeneration prompts — ensuring accumulated knowledge informs every plan
•Exercise preference tracking extended from 4-week window to full 12-week rolling history for more durable signal accumulation
•Adherence shape analysis identifies best and worst training days per athlete, enabling smarter session scheduling recommendations
v1.35.0
Weekly Summary Redesign — rebuilt the weekly summary modal as a decision dashboard instead of a data dump. Redundant stat cards removed, terminology clarified, units normalized, and insights rewritten to deliver interpretation rather than restating visible numbers.
Nouvelles Fonctionnalités
•Performance Snapshot block — new interpretation-first section directly below the top strip, surfacing adherence, load adherence, effort control, and top performer with honest labeling ("Slightly above target" instead of over-smoothed "On target")
•Interpretive insights engine — replaces factual stat restatements with coach-like interpretations that combine signals (e.g. "Reduced workload with stable effort suggests good fatigue management rather than underperformance")
•Collapsible secondary distribution — Muscle Groups promoted to primary distribution; Movement Patterns and Modalities moved behind an expandable toggle so tertiary analytics no longer compete with core performance blocks
Améliorations
•Top strip reduced from four stat cards + adherence ring to three focused KPIs: Sessions (with adherence label), Total Load, Effort (with target comparison inline)
•Workload vs Plan section is now the single source of truth for planned vs actual — "Volume" relabeled as "Reps Volume" to disambiguate from tonnage
•Consistent unit formatting across the entire modal — unified formatLoad() helper renders load as "12.4 t" or "850 kg" everywhere (no more mixing t/k/kg)
•Effort dial lifted out of the comparison grid into its own section, shown only when effort data exists
•Tightened Top Exercises rows with compact sets/reps formatting and reduced vertical spacing
Corrections
•Fixed triple-display of the same RPE metric across top strip, target-vs-actual, and effort block
•LLM analysis bullets are now filtered to skip lines that merely restate chart numbers ("Volume was 5% below target")
v1.34.0
Modal Queue System — centralized coordinator that prevents system-triggered modals from stacking on top of each other. All auto-triggered modals (achievements, summaries, welcome, feedback, install prompts, etc.) now go through a priority queue that shows one at a time.
Nouvelles Fonctionnalités
•Modal Queue Service — new centralized priority queue (modalQueueService.js) that enforces one system-triggered modal at a time, with five priority levels from critical to lowest
•Priority-based sequencing — policy updates show first (critical), then achievements and summaries (high), welcome-back and life stress (medium), nutrition and feedback (low), install prompts (lowest)
•Achievement sub-queue integration — global achievement celebrations register a single slot in the modal queue; individual achievements still cycle internally, then release the slot for the next modal
Améliorations
•Removed scattered setTimeout chains and manual modal-overlap guards from Plan.vue — sequencing is now handled by the queue service instead of ad-hoc checks
•Layout-level modals (nutrition preferences, feedback) and view-level modals (summary, welcome, life stress) now share the same global queue, eliminating cross-layer collisions
•Install prompts (PWA and iOS) deferred to lowest priority so they never interrupt onboarding or celebration flows
Corrections
•Fixed overlapping modals when multiple system events fire simultaneously (e.g. nutrition prompt + feedback modal on route change)
•Fixed achievement celebrations overlaying on top of summary or welcome modals with both visible simultaneously
•Fixed install prompts appearing over policy update or achievement modals on first page load
v1.33.0
Exercise Review Flow — coaches now review unmatched exercises before weekly plans are saved. LLM-generated exercises that fail to match the canonical library are flagged with suggested alternatives, and confirmed replacements auto-merge as aliases to prevent recurrence.
Nouvelles Fonctionnalités
•Exercise Review Panel — new step between plan generation and save, showing each unmatched exercise with top-5 fuzzy library suggestions including match score, movement pattern, equipment tags, and video status
•Coach Resolution Actions — three options per flagged exercise: pick a library alternative, keep the original name, or create a custom exercise with video URL and immediate LLM enrichment
•Alias Auto-Merge — when a coach picks a library alternative, the original LLM name is automatically added as an alias so the same mismatch never happens again
•Custom Exercise Creation with Video — coaches can create new library exercises inline during review, attaching a video URL that is immediately stored as the preferred demo source
•Pending Plan Storage — unreviewed plans are held in a pending_reviews collection until the coach commits, preventing unenriched exercises from reaching athletes
Améliorations
•Stricter parenthetical matching — noise modifiers like (Beginner), (Intermediate), (Advanced), (Modified), (Tempo) are now stripped before matching, fixing false mismatches like "Childs Pose (Intermediate)"
•Parenthetical variant matching — equipment parentheticals like "Face Pulls (resistance band)" now try both stripped ("Face Pulls") and prepended ("Resistance Band Face Pulls") forms through the full matching cascade
•Enhanced validation report — new validate_and_report_exercises() returns detailed location info and top-N fuzzy suggestions for every unmatched exercise across the entire weekly plan
•Library index now carries movement_pattern, equipment, and enriched status for better suggestion quality and filtering
Corrections
•Exercises with difficulty-level parentheticals no longer slip through as unenriched (e.g. "Cobra Pose (Beginner)" now matches "Cobra Pose")
•[CUSTOM]-prefixed exercises with equipment parentheticals now match correctly through variant expansion
v1.32.0
Living Context System — replaced the freeform primaryGoal text blob with a structured context events timeline. Athletes and coaches now post typed updates (schedule changes, injuries, travel, goal shifts) that the system classifies and feeds into plan generation as structured context, not unstructured text.
Nouvelles Fonctionnalités
•Context Events Timeline — new chronological feed of athlete updates, coach notes, coach overrides, and system adaptation events stored as typed documents in Firestore
•Current Context Snapshot — top-of-page summary showing what is effectively true right now: active injuries, coach overrides, schedule changes, travel context, goal modifiers
•Auto-Classification — keyword-based classifier turns natural language updates into typed events (injury_update, schedule_change, travel_context, goal_change, etc.) with severity and plan impact scope
•Resolved Context Builder — on-read computation merges base profile + active context events into a single effective state for the planning engine
•Plan Impact Routing — each event gets classified by scope (none/session/week/masterplan) so posting "session felt rough" no longer triggers master plan regeneration
•Coach Override Events — coaches can post overrides (e.g. "No sprinting this week") that are treated as high-priority constraints in plan generation
•Context Event Cards — color-coded timeline entries with type badges, severity indicators, plan impact labels, and resolve/delete actions
Améliorations
•Planning engine now reads structured liveContextSummary instead of parsing the primaryGoal text blob for schedule/injury/equipment context
•MasterPlanTriggerEngine extended with evaluate_context_event() — classifies events by type and severity instead of raw string comparison on primaryGoal
•Dual-write backwards compatibility — new events still append to primaryGoal and coachNotesTimeline so existing code paths continue working during migration
•Training Profile page restructured: Current Context Snapshot at top, Context Timeline as primary interaction surface, Base Profile collapsible below
Corrections
•Fixed false-positive master plan regeneration triggered by every athlete update (previously any primaryGoal text change was treated as a major goal change)
•Coach notes no longer stored in three disconnected places — unified into context events timeline with legacy dual-write for backwards compatibility
v1.31.0
Weekly Summary Revamp — replaced the text-heavy LLM summary with a data-driven, chart-rich dashboard. Tonnage, volume, RPE with target-vs-actual deltas, muscle group distribution, movement pattern radar, and energy system donut — all computed server-side from exercise library metadata.
Nouvelles Fonctionnalités
•Weekly Metrics Engine — new backend service resolves exercise names to library metadata and aggregates tonnage by muscle group, sets by movement pattern, and sets by modality/energy system
•Session Tonnage Bar Chart — vertical bars per session with RPE target vs actual line overlay
•Target vs Actual Gauges — three semicircular dials for volume (reps), effort (RPE), and load (tonnage) with delta badges
•Movement Pattern Radar Chart — spider chart showing push/pull/squat/hinge/carry/core/lunge/plyometric distribution
•Muscle Group Distribution — horizontal bar chart showing top 8 muscles by tonnage percentage (primary 100%, secondary 50% weighting)
•Energy System Donut — ring chart showing strength/endurance/mobility/sport drill split by sets
•KPI Row — sessions completed, total tonnage, total reps with volume delta, avg RPE with effort delta
•DeltaBadge component — reusable +/- badge with color coding for KPI cards
Améliorations
•Exercise name resolution — exact, alias, normalized, and fuzzy matching (0.80 threshold) against the exercise library for accurate classification
•Weekly metrics saved to Firestore summary doc — no recomputation needed on subsequent reads
•All chart components are hand-rolled SVG — zero new dependencies, native Tailwind dark theme integration
Corrections
•Removed redundant RPE data displayed three times (KPI row, RPE planning hierarchy, session table)
•Removed verbose LLM text sections (key insights paragraphs, performance benchmarks, next week focus cards, training adjustment pills)
v1.30.0
Training Analytics Dashboard — a full coach-facing dashboard with training load timelines, exercise metadata spider charts, week-by-week stacked bars for every metric, joint stress heatmaps, and demographic fitness baseline comparison. Plus enhanced print sheets with exercise metadata tags and weekly training profile summaries.
Nouvelles Fonctionnalités
•Training Dashboard — new "Dashboard" view toggle in CoachAthleteView with selectable time range (4w–1yr)
•Training Load Timeline — weekly tonnage, volume (reps), average RPE, and session count line/bar charts over time
•Exercise Profile Radar Charts — current-week vs period-average radar for movement patterns and primary/secondary muscle coverage
•Week-by-Week Stacked Bars — movement patterns, muscle groups, body regions, training modality (strength/endurance/mobility/sport drill/warmup/cooldown), equipment usage, force type (push/pull/isometric/dynamic), compound vs isolation, and exercise difficulty per week
•Joint Stress Heatmap — color-coded heatmap table showing per-joint stress load per week (green/amber/red intensity), with normalized joint names
•Fitness Baseline Comparison — athlete benchmarks (squat/bench/deadlift/OHP 1RM) ranked against population percentiles by gender, bodyweight, and age using NSCA/ExRx strength standards
•Enhanced Print Sheet — exercise metadata tags (movement pattern, body region, target muscles) shown per exercise in both plan and logged print views
•Weekly Training Profile — print sheet summary section with movement pattern distribution bars, top muscles targeted, and body region balance percentages
•Strength standards data module — normative body-weight multiplier tables with age adjustment factors and percentile interpolation
Améliorations
•Muscle name normalization — obliques, deltoids, and 30+ muscle name variants collapsed to canonical names across dashboard, radar charts, and print sheets (matching backend audit service)
•Joint name normalization — lower_back/lower back, shoulders/shoulder, and other variants unified in stress heatmap
•Bulk-lookup API extended — now returns targetMuscles, secondaryMuscles, modality, equipment, difficulty, is_compound, force_type, and joint_stress
•Training timeline API — new GET /api/progression/{id}/training-timeline endpoint with multi-week session logs and full exercise metadata aggregation
•chart.js + vue-chartjs added for Line, Bar, Radar, and Doughnut chart types
v1.29.0
Training Metrics Glossary — a new public lexicon explaining how Afitpilot calculates tonnage, volume, RPE, e1RM, and session quality. Every formula, every limitation, every planned improvement — disclosed openly.
Nouvelles Fonctionnalités
•Training Metrics Glossary — public multi-page lexicon at /training-lexicon with 14 defined terms across 5 categories (Strength & Load, Volume & Work, Intensity & Effort, Progress Tracking, Quality & Trends)
•Individual term pages — each metric has its own dedicated page with formula, example, fun-facts comparison table, known limitations, related improvements, and science context
•Room for Improvement page — dedicated methodology roadmap showing planned, in-progress, and future improvements with links to related terms
•Fun-facts comparison tables — scannable tables showing typical values for powerlifters, hybrid athletes, regular gym-goers, runners, and active aging (60+) users
•SEO & social sharing — schema.org DefinedTermSet + FAQPage structured data, Open Graph + Twitter Card meta tags with auto-generated OG image (1200x630 JPG), optimized for WhatsApp, Messenger, LinkedIn, Telegram, and iMessage previews
•Image optimization script — reusable scripts/optimize-og-image.sh generates OG (1200x630 JPG <150KB) and hero (1920px WebP) variants from any source image
Améliorations
•Training Lexicon accessible from Account Settings under Support section
•Connected users see Back button (no CTA); public visitors see CTA (no Back button) — context-aware UI based on auth state
•useMetaTags composable now supports og:image:width, og:image:height, and og:image:type for reliable social previews
v1.28.0
Coach view stability — drag-and-drop session moves, exercise swaps, segment swaps, and deletions no longer trigger a full page reload. The session drawer stays open during edits, and sessions keep their assigned days instead of being displaced sequentially.
Nouvelles Fonctionnalités
•Optimistic drag-and-drop — moving a session to another day updates the calendar instantly without a server round-trip or page flash
•Drawer persistence — swapping exercises, segments, blocks, or drills no longer closes the session detail drawer; it stays open with refreshed data
Améliorations
•All post-mutation refreshes (swap, reorder, delete, add, regen) now update data in-place without skeleton loaders, keeping the coach workflow uninterrupted
•Session day assignment for legacy plans now uses strategic intent metadata and avoids collisions with already-assigned days
•Week plan reads no longer write back to Firestore on every load, preventing accidental day reassignment from the sequential fallback
Corrections
•Fixed sessions being displaced to sequential days (Mon, Tue, Wed...) after dragging one session to a new day
•Fixed session detail drawer closing on every exercise swap, segment swap, or inline edit
•Fixed full-page skeleton flash when reordering exercises within the drawer
v1.27.0
Universal feedback — like, dislike, and comment on every item in a session: warm-up and cool-down exercises, circuit exercises, skill drills, endurance segments, strength and WOD block exercises, cardio segments, and free-text workouts. Coaches see all feedback in the session drawer and printed PDFs, and the AI adaptation engine uses it to shape future plans.
Nouvelles Fonctionnalités
•Feedback on warm-up & cool-down exercises — like/dislike/comment on individual exercises inside warm-up and cool-down blocks
•Feedback on circuit block exercises — like/dislike/comment on each exercise within circuit/HIIT/conditioning blocks
•Feedback on skill drills — like/dislike/comment on individual drills inside skill blocks
•Feedback on endurance block segments — like/dislike/comment on interval, steady, warm-up, and cool-down segments within endurance blocks
•Feedback on strength & WOD block exercises — like/dislike/comment on exercises inside inline strength and WOD blocks
•Feedback on free-text workouts — like/dislike/comment on the overall workout when it is a free-text plan
•Feedback on cardio segments — like/dislike/comment on top-level cardio/endurance segments
•Coach feedback for all item types — coaches can like/dislike and reply to drills, block exercises, and segments from the session detail drawer
•Reusable BlockItemFeedback component — shared feedback UI used by all block types for consistency
Améliorations
•Performance summary now includes feedback from all block types, drills, and segments — not just top-level exercises
•Printed logged PDFs now show feedback for drills and segments alongside exercise feedback
•AI adaptation engine scans drills, endurance block segments, and workout-text feedback when building athlete preference context
•Week grid feedback counters now include all item types
v1.26.0
Exercise details revamp — the "Show Details" dropdown now displays rich metadata from the exercise library inline: overview, classification, muscles, step-by-step instructions, equipment, tips, coaching cues, and variations. Exercises not yet in the library can be generated on demand and are flagged for admin review.
Nouvelles Fonctionnalités
•Inline exercise library details — expanding "Show Details" fetches and displays the full exercise metadata (overview, instructions, muscles, equipment, tips, coaching cues, variations) directly in the session view
•Classification badges — movement pattern, body region, difficulty, and modality shown as color-coded badges in the details dropdown
•On-demand exercise enrichment — exercises not found in the library can be created and enriched via LLM with a single button press
•Pending review flag — exercises generated on demand are flagged as pending_review in the admin Exercise Library for verification and video linking
•New API endpoint POST /api/exercise-library/enrich-single — creates a new exercise in the canonical library with full LLM enrichment
Améliorations
•Exercise lookup endpoint now returns movement_pattern, body_region, difficulty, and modality fields
•Generate Instructions button only appears when the exercise is not yet in the library, instead of always showing
•Exercise details are fetched once per expand and cached for the session duration
v1.25.0
Exercise feedback becomes a two-way conversation — athletes and coaches can both like/dislike exercises and exchange threaded comments. Feedback is visible everywhere: session view, coach drawer, performance summaries, week grid, and PDF exports. The AI uses both athlete and coach sentiment to shape future plans.
Nouvelles Fonctionnalités
•Per-exercise feedback — thumbs up/down and threaded comments on any exercise, available as soon as the session is opened (no completion required)
•Threaded comments — timestamped conversation thread per exercise between athlete and coach, replacing the old single-comment field
•Coach exercise sentiment — coaches can independently like/dislike exercises from the session detail drawer, labelled separately from athlete sentiment
•Coach reply to exercise threads — coaches can add comments to any exercise thread directly from the session detail drawer
•AI exercise preference loop — disliked exercises from the last 4 weeks (both athlete and coach) are collected and injected into plan generation, session regeneration, and exercise swap prompts
•Coach dislikes prioritised in AI context — coach-flagged exercises appear as high-priority avoids in generation prompts, above athlete dislikes
•Exercise feedback in PDF exports — Print Logged PDF now includes per-exercise sentiment badges (labelled Athlete/Coach) and full comment threads for both regular and block exercises
•Exercise feedback analytics — new exercise_feedback_submitted event tracks exercise name, sentiment, and session for engagement and swap correlation analysis
•Feedback Champion counts exercise feedback — each exercise with feedback (sentiment or comment) increments Feedback Champion progress on session completion
Améliorations
•Coach session drawer always shows feedback section on every exercise — not gated behind athlete feedback existing
•Sentiment badges labelled by author — "Athlete" (blue) and "Coach" (amber) labels distinguish who liked/disliked each exercise
•Coach session drawer shows aggregated exercise feedback summary (liked/disliked/comment counts) between athlete feedback and session totals
•Session performance summary Exercise Feedback card shows last comment and thread count per exercise
•Backward compatible with old single comment field — legacy data rendered as one-entry thread, migrated to array on next write
•Neutral comment placeholder ("Add a note...") replaces sentiment-specific placeholder text
•Fixed active state colors on like/dislike buttons using valid CSS rgba() syntax
v1.24.0
Celebration system overhaul — achievements now reliably appear without being blocked by the weekly summary modal. New celebrations for session completion and first exercise of the week, with full i18n support and analytics tracking.
Nouvelles Fonctionnalités
•Weekly notes — athletes can now write free-text reflections about their whole week (energy, stress, life events) from the Plan view via a floating notes button
•Weekly notes auto-save — debounced save to localStorage (500ms) and Firestore (1500ms) with voice dictation support, mirroring session notes UX
•Weekly notes in AI summaries — athlete weekly reflections are fed into the V4 weekly summary generation pipeline for smarter adaptation
•Weekly notes coach visibility — coaches see athlete weekly notes in the athlete dashboard and in both Plan and Logged PDF exports
•Session completion celebration — full-screen celebration with SessionAchievementIcon after every session is logged
•First exercise of the week celebration — ExerciseAchievementIcon celebration when the first exercise across all sessions in a week is completed
•Streak celebrations after next week plan generation — streak achievements are checked and celebrated after the coach or user generates the next week plan
•Celebration continue button analytics — new celebration_continue_clicked event tracks celebration type, achievement ID, name, and time-to-dismiss
•Exercise completion timestamps — each exercise now records a completedAt ISO timestamp for moment-by-moment tracking
Améliorations
•Streak celebrations no longer blocked by the weekly summary modal — celebrations always show first, summary modal defers until all celebrations are dismissed
•Global celebration state check — Plan view now checks both local and global celebration queues before showing the summary modal
•Deferred summary modal — handleAllAchievementsComplete now shows the summary modal after all celebrations finish
•SessionAchievementIcon replaces inline SVG render function in AchievementCelebration component
•Weekly notes context displayed in post-session feedback view so athletes see their own weekly reflection when logging feedback
Corrections
•Fixed weekly streak celebration being overridden by the WeeklySummary modal on page load
•Fixed fromSummaryGeneration path not checking global celebration state before showing summary modal
v1.23.0
Exercise display intelligence — context-aware rendering for mobility, bodyweight, and cardio equipment exercises. Exercises now display with appropriate fields based on their type instead of treating everything like a weightlifting set. Improved exercise swap quality with category preservation rules.
Nouvelles Fonctionnalités
•Exercise type classification system — shared utilities detect mobility, bodyweight, and cardio equipment exercises by name pattern for consistent display across the app
•Cardio equipment exercise display — stationary bike, rower, ski erg, treadmill, etc. now render with duration and effort instead of sets/reps/weight
•Exercise feedback tracking — liked/disliked sentiment and comments collected per exercise for training adaptation
Améliorations
•Mobility exercises (CARs, scapular work, thoracic rotations, planks, stretches, foam rolling, yoga) no longer show RPE, tempo, or weight — only duration/reps and notes
•Bodyweight exercises (hollow hold, barbell rollout, knee tucks, ab wheel, dragon flag, pallof press, etc.) no longer prompt for target weight in performance logging
•Performance logging modal skipped entirely for mobility and cardio equipment exercises — just mark complete
•Mobility exercises excluded from session-level RPE calculation so they don't skew effort metrics
•LLM exercise generation now requires non-empty notes/instructions for all exercises, with specific formatting rules for mobility (duration-based reps, no weight/RPE) and cardio (duration-based, intensity guidance)
•Training consistency map UI improvements and load-based scoring
•Session feedback improvements with exercise-level sentiment tracking
Corrections
•Fixed Stationary Bike and similar cardio exercises rendering as weightlifting blocks with sets/reps/rest instead of duration/effort
•Fixed Scapular CARs, Planks, Side Planks, Thoracic Rotations showing sets/reps/weight/RPE when their prescription is time or reps per side
•Fixed exercise swaps replacing stretches with resistance exercises (e.g. pancake stretch → waiter's bow with weight and RPE 7)
•Fixed LLM generating exercises like Standing Forward Fold with no video, no cues, and no instructions
v1.22.0
Vert-Measure booth night architecture — multi-screen booth setup with dedicated capture station, public leaderboard display, and product conversion screen. Improved jump detection reliability, skeleton overlay, tracking feedback, and stillness-based auto-calibration for live event use.
Nouvelles Fonctionnalités
•Booth capture screen (/vert-measure/capture) — fullscreen camera view for vertical monitor with skeleton overlay, stillness-based auto-calibration, countdown, and auto-reset for continuous walk-up use
•Public display screen (/vert-measure/display) — leaderboard spectacle monitor that polls backend every 3s, shows latest jump result, today's best, top 5, tier ladder, and "Beat The Founder" challenge
•Product conversion screen (/vert-measure/product) — static product pitch monitor with "Why Vertical Jump?" cards, 3-step Afitpilot explanation, and large QR code for signup
•Station mode (/vert-measure?station=1) — streamlined iPhone capture flow with auto-submit, 6s result display, and auto-reset for fast booth throughput
•Latest-result API endpoint (GET /api/vert-measure/leaderboard/latest) — returns most recent leaderboard entry for cross-device display polling
•HTTPS dev server support — Vite basic-ssl plugin for iPhone camera access over local network
Améliorations
•Stillness-based jump calibration — baseline reference line sets only when the user has been in frame 2+ seconds AND standing still for ~1 second, preventing passerby false triggers
•Skeleton bone overlay — 12 joint connections drawn between keypoints for visible body tracking feedback
•Jump detection reliability guards — minimum 80ms flight time and 5cm height thresholds reject noise readings
•Tracking status badges on camera feed — "Stand in frame", "Step back", "Raise both hands", "Hold steady" contextual cues
•Leaderboard header shows "TOP 5 TODAY" with today's best score highlighted in amber
•Larger hero metric typography for distance readability (countdown up to 10rem, result up to 8rem)
•Challenge framing with "Today's best: XX cm — Can you beat it?" header callout
•Tighter booth reset (8s auto-reset) and single-attempt flow for queue throughput
•Dashed cyan baseline reference line replacing solid white for better visibility
Corrections
•Fixed sub-80ms flight time noise registering as valid jumps in noisy booth environments
v1.21.0
Exercise audit overhaul & exercise quality improvements — full-database athlete scanning, LIVE/SANDBOX mode toggle, French exercise translation fallback, smarter fuzzy matching, tighter LLM naming constraints, and anti-generic-bias prompting to improve exercise variety and video link rates.
Nouvelles Fonctionnalités
•Exercise audit now discovers all athletes via collection group query — previously missed "phantom" athlete documents that only had subcollections, going from 1 to 53 athletes scanned
•LIVE/SANDBOX mode toggle on Exercise Audit page — matches the analytics admin pattern, defaults to Live production data
•French/Spanish/German exercise translation fallback — 80+ non-English exercise terms automatically translated to English for library matching (e.g. "Développé couché avec haltères" → Dumbbell Bench Press)
•Exercise name pre-cleaning — strips "(or Banded Rows)" alternatives, "Circuit:" prefixes, and compound "X to Y" names before matching
Améliorations
•Plural→singular normalization in fuzzy matching — "Dead Bugs" now matches "Dead Bug", "Face Pulls" matches "Face Pull"
•Stripped "max reps" suffixes and [CUSTOM] prefix during normalization for better match rates
•Stronger bilingual prompt instructions with concrete wrong/right examples to prevent French exercise names in generated plans
•New "VARIETY & SPECIFICITY" and "AVOID GENERIC FALLBACK" prompt sections — explicitly discourages over-use of Front Plank, Bird-Dog, Goblet Squat, RDL across all athletes
•Sport type now passed through to exercise library pre-filtering for more relevant exercise selection
•Exercise naming rules added to prompts — name field must be exercise name only, no coaching notes, alternatives, or form cues
Corrections
•Fixed *Focus parsing artifact — session focus metadata was being extracted as exercise names (28 fake prescriptions)
•Fixed non-dict session entries causing "str has no attribute get" crash during audit generation
•Fixed audit scanning only sandbox database — frontend now passes mode parameter to generate and latest endpoints
v1.20.0
Smarter onboarding baseline tests & UX fixes — baseline fitness tests now match your actual fitness level regardless of training role (removed supplement archetype), complementary athletes get gym-purpose-specific programming, and multiple UI bugs fixed including progress counter, toast validation, phone label, and referral follow-ups.
Nouvelles Fonctionnalités
•Fitness-level-driven baseline tests — removed the supplement archetype so complementary athletes (BJJ, rugby, swimming, etc.) now receive baseline tests matching their fitness level (beginner, intermediate, advanced) instead of irrelevant generic tests
•Gym work purpose field — complementary athletes now specify their gym training goal (performance transfer, durability, aesthetics, general fitness) via gymWorkPurpose, giving the AI precise context for program design
•Poster/flyer referral follow-up — selecting "Poster or Flyer" as referral source now prompts a follow-up question asking where they saw it, matching the pattern of other referral channels
•Baseline fitness & lifestyle activity restore from dummy profiles — dummy athlete loader now correctly pre-fills baselineFitness test values and currentActivity.lifestyleActivity fields
Améliorations
•Updated 25 dummy athlete profiles with all new onboarding fields: dateOfBirth, gender, trainingRole, gymWorkPurpose, baselineFitness, currentActivity, nutrition, phoneNumber, referralSource
•Toast validation on all stages — Stage 8 (and all other stages) now shows error toasts when required fields are missing, instead of silently blocking submission
Corrections
•Fixed "Step 8 of 7" progress counter — introduced displayStage computed that adjusts step numbers when nutrition stage is skipped (nutritionEnabled=false)
•Fixed phone label showing "Phone Number (optional)" with a required asterisk — removed misleading "(optional)" text from EN and FR translations
•Fixed supplement archetype showing irrelevant tests (e.g. "Squat 60×8" with no unit) to complementary athletes like rugby players and swimmers
v1.19.0
iOS Home Screen install tip — iOS users now get a browser-aware guided modal showing how to add Afitpilot to their Home Screen, with video demos, confetti celebration on completion, escalating retrigger cooldowns, and full device analytics tracking.
Nouvelles Fonctionnalités
•iOS install tip modal — auto-detects iOS devices (iPhone, iPad) on any browser and shows a guided "Add to Home Screen" walkthrough with video demo
•Browser-aware instructions — Safari users see Share → Add to Home Screen steps, Chrome users see Menu → Add to Home Screen, with matching demo videos and poster images
•Confetti celebration — tapping "Added" triggers a confetti animation with a success message before auto-closing
•Escalating retrigger schedule — "Skip" cooldowns escalate from 3 days → 7 days → 30 days; "Added" permanently dismisses the tip
•Device analytics — all PWA install events (iOS tip shown/skipped/installed, Android/Desktop browser prompt) now track device type (iPhone, iPad, Android phone/tablet, Desktop) to Firestore analytics_events
•Bilingual support — full French translations for all modal text, steps, and celebration messages
Améliorations
•PwaInstallPrompt now also writes pwa_installed events to Firestore analytics_events with device info, alongside existing gtag tracking
v1.18.0
Smarter week-to-week intelligence — the AI now detects when your prior week was a testing week, extracts your actual competition lift numbers, and receives sport-specific coaching guidance so post-testing weeks are programmed correctly instead of defaulting to generic recovery.
Nouvelles Fonctionnalités
•Week intent detection — the system now auto-detects whether your prior week was a testing, deload, or normal training week based on session names, benchmark flags, volume data, and masterplan test windows
•Key lifts extraction — your heaviest working sets on competition movements (squat, bench, deadlift) are extracted from the prior week and fed to the AI so it can program accurate percentages
•Sport-specific context injection — powerlifting athletes now receive tailored coaching rules (competition movement requirements, proper deload protocols, post-testing guidance) injected into the generation prompt
•Specific sport resolution — sport context files are matched against your specific sport (e.g., "Powerlifting") before falling back to the broad category (e.g., "Strength")
Améliorations
•Testing week underwhelm suppression — below-target RPE on testing weeks is no longer misinterpreted as chronic underwhelm, preventing false recalibration triggers
•Prompt template updated with prior week intent section — the AI now receives explicit guidance on how to handle post-testing, post-deload, and normal training transitions
•Key lifts data includes session focus inheritance — generic exercise names like "3RM Attempt" are correctly mapped to their competition movement based on session context
Training Consistency Map — a GitHub-style heatmap showing your full year of training at a glance, with daily intensity scoring, streak tracking, and session tooltips with effort/volume/load breakdowns.
Nouvelles Fonctionnalités
•Training Consistency Map — 52-week heatmap grid with 5-level teal intensity scale driven by session RPE, showing completed, skipped, and rest days at a glance
•Daily contribution scoring — each day scored 0–4 based on session completion status, RPE intensity, multiple sessions, and tonnage
•Streak & stats bar — current streak, longest streak, active days, consistency %, and total sessions computed from real training data
•Session tooltips — hover any day to see session name, RPE, tonnage, and effort/volume/load domain deltas with color-coded variant indicators
•Recent activity feed — last 4 logged sessions with color-coded intensity dots, dates, and RPE
•Privacy toggle — switch between private (full tooltips) and public (grid + stats only) view modes
Améliorations
•New "Consistency" tab in Insights view, set as the default landing tab when athletes navigate to Insights
•Data aggregation service queries all weekly plans client-side with zero new backend endpoints — follows existing exerciseStatsService pattern
v1.16.0
Coach-generated future weeks, structured coach notes timeline, and masterplan attribution — coaches can now generate upcoming weeks for athletes with email notifications and in-app previews, coach notes are stored as timestamped entries for smarter AI context, and masterplan regenerations are attributed to coach or athlete.
Nouvelles Fonctionnalités
•Coach generate week — coaches can now generate future weeks for athletes from the coaching dashboard, triggering the full two-stage LLM pipeline with coach instructions
•Coach-generated week email — athletes receive a bilingual email notification when their coach generates their next week, with optional coach notes preview (EN + FR)
•Athlete "View Next Week" preview — a locked preview card appears on the athlete's plan page showing upcoming coach-generated sessions, with navigation gated behind current week completion
•Structured coach notes timeline — coach notes are now stored as timestamped entries (coachNotesTimeline) with coach name, type, and ISO date, replacing the raw text approach
•Masterplan regen attribution — master plan regenerations now carry a generatedBy field (coach or user) stored in plan metadata for audit and display
•Masterplan regen cross-notifications — coaches receive batched email digests when athletes regenerate their masterplan, and athletes receive in-app + email notifications when coaches do
Améliorations
•Coach notes included in all LLM generation paths — coachNotes and coachNotesTimeline (last 5 entries) are now injected into both regen and next-week context builders
•Week regen modal adapts for new week generation — header and placeholder text change based on whether generating a new week vs regenerating an existing one
•Coach week preview shows locked state — when the athlete hasn't finished their current week, the preview shows a "complete your current week" message instead of a navigation button
•Profile timeline in coach drawer now prefers structured coachNotesTimeline data with coach name badges, falling back to legacy primaryGoal parsing
Corrections
•Fixed new week generation failing with 404 — build_current_plan_context now returns empty dict instead of raising ValueError when plan doesn't exist
•Fixed current week hiding when coach preview appeared — removed conflicting v-if condition that was hiding progress card and sessions
v1.15.0
Coach-generated week emails, masterplan regeneration notifications, and smarter plan regeneration — coaches and athletes are now notified when masterplans are regenerated, coaches can send week previews via email, and masterplan regeneration no longer overwrites the current week.
Nouvelles Fonctionnalités
•Coach-generated week email — when a coach writes sessions for an athlete's week, the athlete receives an email with a preview of what's in store (EN + FR templates)
•Masterplan regen notifications — athletes receive in-app and email notifications when their coach regenerates their master plan, and coaches are notified when athletes regenerate their own
Améliorations
•Masterplan regeneration no longer regenerates the current week — the current week is preserved as-is, keeping the athlete's in-progress training intact
•Coach week preview component enhanced with additional session metadata
•Week regen modal improvements for smoother interaction
v1.14.0
Coach notes and enhanced exercise validation — coaches can now add notes to athlete profiles that flow to the AI and appear in a shared profile timeline, with email and in-app notifications. Exercise names are validated against the canonical library during session regeneration and workout text structuring.
Nouvelles Fonctionnalités
•Coach notes — coaches can add observations and instructions to an athlete's profile from the coaching dashboard, appended to the profile timeline as [Coach Note] entries
•Profile timeline — new section in the coach's athlete info drawer showing an interleaved chronological view of athlete updates and coach notes with color-coded pills
•Coach note notifications (email) — athletes receive an amber-themed email when their coach adds a note, with note preview and CTA to their training profile (EN + FR templates)
•Coach note notifications (in-app) — coach notes appear in the notifications modal with a dedicated icon and amber styling, clicking navigates to the training profile
•Exercise validation on regeneration — exercise names are now checked against the canonical exercise library during session regeneration and workout text structuring
Améliorations
•Coach notes flow to AI prompts — the coachNotes field is included in essential_fields so all AI generation paths see the coach's latest observations
•Athlete profile updates thread now recognizes [Coach Note — timestamp] entries alongside [Update — timestamp], displaying them with an amber "Coach note" pill and left-border accent
•Notification click routing — coach_note_added notifications navigate to the training profile instead of the plan page
v1.13.0
Multilingual exercise library support — coaching text now generates in the athlete's language while exercise names stay in English for tracking, exercise library documents support translated names, and the frontend resolves translated exercise names at display time.
Nouvelles Fonctionnalités
•Bilingual session generation — coaching text (titles, cues, notes) is now written in the athlete's language while exercise names remain in English for validator and library linking
•Exercise name translations — exercise library documents now carry a translations map with per-language display names (e.g., translations.fr.name = "Développé couché")
•Batch translation script — new CLI tool to translate exercise library names to any supported language via LLM, with dry-run, force, and multi-language support
•Display-time translation — SessionView, block components, and ExerciseDemoModal resolve translated exercise names from the library cache based on the app locale
Améliorations
•Generalized French-only language hack in two-stage generation to support all 13 languages with English exercise name constraint
•Language threaded through all generation paths — session generation, two-stage pipeline, and week regeneration all respect the athlete's language setting
•New public bulk-translations API endpoint for lightweight exercise name resolution without auth
•[CUSTOM] prefix exercises now run through the full matching pipeline instead of being skipped — exercises like "Glute Bridge" that exist in the library are correctly linked
•Exercise prompt budget increased from 60 to 200 — more exercises reach the LLM prompt, reducing unnecessary [CUSTOM] escapes
Corrections
•Fixed enrichment batch crash (404) when trying to update an exercise document that was merged/deleted mid-batch
v1.12.0
Exercise library architecture overhaul — unified name normalization and matching into shared modules, added modality dimension for smarter exercise filtering, typed video sources for future multi-format support, and slug collision protection on import.
Nouvelles Fonctionnalités
•Modality dimension — exercises are now classified as strength, mobility, endurance, sport_drill, warmup, or cooldown for smarter filtering in session generation
•Typed video sources — each video source now carries content_type (demo, explanation, follow_along), language, and duration metadata, preparing the library for coach explanations and multi-language content
•Slug collision guard — importing exercises with similar names no longer silently overwrites existing entries; collisions get unique suffixes automatically
•Modality filter on admin list endpoint — filter the exercise library by modality in the admin dashboard
•Modality breakdown in library stats — see how exercises are distributed across training modalities
Améliorations
•Unified name normalization — three duplicated normalization functions consolidated into a single shared module (exercise_name_utils.py) with tiered normalization levels
•Unified matching engine — hybrid scoring (character-level + token-level + Jaccard) now shared between import dedup and post-generation validation via exercise_matcher.py
•Improved import dedup — playlist import now uses hybrid scoring instead of SequenceMatcher-only, catching more true duplicates
•Backfill migration script — single script handles both modality inference and video source type tagging for existing exercises, with dry-run support
v1.11.9
Coach-written week awareness — when your coach has already prepared your next week's sessions, you now see a real preview of what's in store (session titles, durations, target RPE, key exercises) instead of generic volume/intensity metrics, with a direct "Go to Week" button that skips AI generation.
Nouvelles Fonctionnalités
•Coach week preview — when your coach has written sessions for your next week, see a detailed preview with session titles, durations, target RPE, exercise counts, and key exercise names
•Direct navigation — "Go to Week X" button replaces "Build Week X" when coach-written sessions exist, navigating directly without AI generation
Améliorations
•Next week detection now checks whether sessions were coach-authored and shows the appropriate preview variant
v1.11.8
Training role intelligence — AFitPilot now asks whether you want it to be your training program or support your existing sport coaching. Complementary users (yoga, running, tennis club, etc.) get strength and conditioning gaps filled instead of sport drills they already do elsewhere. Also fixes fitness level being ignored in plan calibration, adds sport-specific prompt guidance, and detects equipment underutilization.
Nouvelles Fonctionnalités
•Training role question — new onboarding question after sport selection: "Do you already train this with a coach or program?" Routes to complementary (gym support only) or primary (full sport programming)
•Complementary training mode — athletes who train their sport externally now get plans focused on strength gaps, injury prevention, mobility, and general conditioning instead of sport-specific drills
•Primary training mode — athletes who want AFitPilot to be their training program get full sport-specific movement patterns, energy system development, and sport-relevant benchmarks
•Fitness level cross-reference — intermediate/advanced athletes starting fresh are no longer treated as sedentary beginners. An experienced tennis player returning to training gets moderate calibration, not knee push-ups
Améliorations
•Sport-specific prompt guidance — racquet and hybrid sport athletes now get rotational power, lateral movement, and interval conditioning guidance injected into all generation prompts
•Sport-aware benchmarks — calibration tests now match the athlete's sport. Racquet sport athletes get agility and power tests instead of 5K time trials
•Training role context injected across all generation entry points — onboarding, recurring weeks, regeneration, and two-stage pipeline
•Equipment underutilization detection — the validator now flags when available equipment (barbell, kettlebell, bench, bands) is consistently ignored in generated plans
Corrections
•Fixed _compute_onboarding_adaptation_guidance() ignoring fitnessLevel entirely — intermediate athletes with starting_fresh entry state no longer fall to sedentary_beginner calibration
•Fixed duplicate adaptation guidance function in two_stage_generation.py not cross-referencing fitness level
v1.11.7
Benchmark system overhaul — fixed custom benchmark creation crash, expanded the global catalog from 45 to 134 benchmarks (cycling, swimming, Olympic weightlifting, powerlifting RM ranges), improved mobile modal UX, and added the ability to delete custom benchmarks.
Nouvelles Fonctionnalités
•Expanded benchmark catalog — 134 benchmarks across 9 categories including Olympic weightlifting (snatch, clean, jerk variants), powerlifting RM ranges (1RM/3RM/5RM), swimming (50m–1500m + CSS pace), cycling (TT times, FTP, power curve), mobility, and more
•Delete custom benchmarks — remove custom benchmark types you no longer need, with two-step confirmation and safeguards preventing deletion when logs exist
•Auto-open log dialog — after creating a custom benchmark, the log dialog opens automatically so you can record your first score immediately
Améliorations
•Success toast after creating a custom benchmark — clear confirmation instead of silent redirect
•Benchmark detail modal now renders above navigation bars on mobile via Teleport — no more content hidden behind top/bottom navbars
•Body scroll locking when benchmark modals are open on mobile
Corrections
•Fixed "Object of type Sentinel is not JSON serializable" crash when creating custom benchmarks — Firestore timestamp sentinels no longer leak into API responses
•Fixed duplicate ID bug where custom benchmarks with conflicting slugs could write to the wrong Firestore document
v1.11.6
Feedback collection is now a three-tier system — quick micro check-ins after early value moments, PMF surveys after meaningful engagement, and deep diagnostics after extended use — replacing the old first-visit wizard with value-based triggers.
Nouvelles Fonctionnalités
•Tier 1 Micro Feedback — 2-slider check-in (week usefulness + confidence direction) with optional comment, designed for 60-second completion
•Tier 2 PMF Survey — 5-step wizard with satisfaction, Sean Ellis PMF question ("If AFitPilot disappeared tomorrow..."), split AI trust (correctness + clarity), willingness to pay, and one-thing-to-improve
•Tier 3 Deep Diagnostic — 9-10 step wizard with core ratings (UX, Adaptation, Sessions, Progress), optional extended ratings (Speed, Exercises, Predictions), frustrations, frequency, and open-ended feedback
•Value-based triggers — feedback is prompted after engagement milestones (sessions logged, weeks completed, plan regenerations) instead of on first visit
•Behavioral snapshot — every submission captures engagement metrics (sessions logged, weeks completed, streak, days since signup) for segmented analysis
Améliorations
•Split AI trust into two dimensions: "Did the adjustments feel correct?" and "Did you understand why?" — replacing the single AI trust score
•PMF deduplication — Tier 3 skips the PMF question if already answered via Tier 2 in the last 90 days
•Manual access via Account Settings — three entries (Quick Feedback, PMF Survey, Detailed Feedback) under the Support section
•Admin dashboard updated with tier selector tabs, PMF distribution chart, AI correctness/clarity distributions, completion rates per tier, and behavior segmentation by sessions-logged bucket
v1.11.5
Performance logging modal now shows the weight field for all resistance exercises — not just those with a pre-filled weight — and pre-fills prescribed loads when available.
Améliorations
•Weight input now shown for all resistance exercises (e.g. Hip Thrust, Incline DB Press, Overhead Press) even when the plan uses RPE-based or no prescribed weight
•Prescribed weights pre-fill the modal when available (e.g. "180–187.5kg / ~80%" pre-fills 180 kg) — percentage-only and RPE-only values start empty so you enter what you actually lifted
Corrections
•Fixed weight field hidden for exercises with null, "RPE-based", or percentage-only weight prescriptions — the modal now defaults to showing weight and only hides it for true bodyweight exercises
v1.9.9
Smarter onboarding for active athletes — the system now asks about your current activity level, estimates your training load, and calibrates Week 1 to match your actual fitness instead of defaulting to a sedentary baseline.
Nouvelles Fonctionnalités
•Current activity capture — new onboarding section asks weekly hours, activity description, and typical intensity so the system knows what you already do
•Enhanced sport context — other sport input now captures frequency and session volume (e.g., "3x/week, 5-10K per run") for precise load estimation
•Load estimation engine — converts your self-reported activity into concrete internal load numbers (sRPE), sport-specific volumes, and a per-session load floor
•Mandatory calibration tests — Week 1 now includes required benchmark tests (5K time trial, max push-ups, plank hold, etc.) when the system lacks data about your capacity
•Active beginner detection — athletes who are physically active but new to structured training get plans that match their fitness level, not a beginner walkthrough
Améliorations
•Week 1 plans are now load-calibrated — prescribed volume and intensity match your estimated capacity instead of using a one-size-fits-all baseline
•Post-generation validation detects gross mismatches between your activity level and the prescribed plan (e.g., run-walk intervals for a 5-10K runner)
•Simplified Stage 5 benchmarks for active beginners — see endurance-relevant benchmarks instead of the full strength testing battery
•Adaptation guidance is now dynamic — starting calibration level (active_beginner, moderate_beginner, sedentary_beginner) flows into all LLM prompts
v1.9.8
Endurance progression tracking is here — log swim, run, bike, and row performance with sport-specific metrics, and see your pace and fitness trends over time.
Nouvelles Fonctionnalités
•Endurance progression tracking — view pace, duration, and heart rate trends for running, swimming, cycling, rowing, and more
•Sport-aware performance logging — completing a segment now opens a modal with fields tailored to your sport (swim: distance in meters, pace per 100m, stroke count; bike: speed, power; row: split per 500m)
•Endurance progression cards — new cards on the Progression tab showing per-modality trends, pace charts, and 4-week projections
•Endurance data in predictions — endurance trends are now included in AI-generated performance predictions alongside strength data
Améliorations
•Segment cards now display the full workout description from your plan instead of showing only name and duration
•Segment category badges visible on each segment card for quick identification
•Endurance block segments in workout blocks now show pace, effort, description, and notes inline
•Endurance progression targets are injected into weekly plan generation for smarter programming
v1.9.7
Coaches can now add sessions to athlete weekly plans and view athlete benchmarks with full logging — no more placeholder modals.
Nouvelles Fonctionnalités
•Coach Add Session — coaches can add new sessions to an athlete's week via AI generation (describe what you want) or custom creation (title, duration, effort, details)
•Coach Benchmarks tab — new "Benchmarks" tab in the athlete info drawer showing all tracked benchmarks with latest values, personal records, trend arrows, and sparkline charts
•Coach benchmark logging — coaches can log benchmark values on behalf of athletes directly from the benchmarks tab
•Benchmark detail view — click any benchmark card to see the full progress chart, log history, and stats
Améliorations
•Add Session modal now uses authenticated API requests with proper auth headers
•Benchmark data lazy-loads only when the tab is first opened for fast drawer performance
v1.9.6
Next week preview now shows hard metrics instead of vague teasers — volume and intensity deltas, next-week progression targets, and predictions with real numbers.
Nouvelles Fonctionnalités
•Next week at a glance — load block with Volume % and Intensity % (or "No change")
•Progression targets for next week — 2–4 concrete targets (e.g. "DB Bench: 3x10 @ 12kg → 3x10 @ 14kg") generated from your exercise history
•Predictions preview — performance predictions (current → predicted in N weeks) or goal timelines from stored predictions
Améliorations
•Next week preview no longer uses LLM-generated teaser copy; all data is from summary, progression service, and predictions
•Preview response is cached per athlete and week so progression targets are computed once
•Optional 4-week regression-based progression preview and a short focus line when available
•Minimal next-week plan loading screen — short headline ("Building your plan.") and concise step labels (Review, Context, Generating, Saving) in EN/FR instead of long typewriter text
v1.11.4
Custom session generation now uses a two-stage architecture with a stronger AI model and rich athlete context — sessions are written by Claude Sonnet as natural coaching text, then parsed into structured data by Gemini Flash.
Nouvelles Fonctionnalités
•Two-stage session generation — Stage 1 writes the session as natural coaching markdown (no JSON pressure), Stage 2 extracts structured exercises/segments for tracking
•Claude Sonnet for coaching quality — custom sessions now use a stronger model for writing the workout, producing richer coaching cues and smarter exercise selection
•Training history in prompts — the AI now sees your recent exercises with progression trends, endurance paces, and overall training status when writing sessions
Améliorations
•Fixed athlete profile field mapping — fitness level, equipment, injuries, goals, and availability now correctly reach the AI instead of silently returning empty
•Text mode for OpenRouter — the LLM provider now supports raw text responses (json_mode=false) so coaching prompts are not forced into JSON output
•Endurance baselines — if you have run/swim/bike history, the AI uses your actual current pace as the starting point for interval targets
Corrections
•Fixed empty session bug — sessions no longer return valid metadata with empty exercise/segment arrays; worst case, the markdown coaching text is always preserved
•Fixed generic coaching cues — prompt now includes good/bad cue examples and rejects filler like "Focus on good form"
v1.11.3
Self-service changes are now properly attributed — athletes no longer receive "your coach made changes" notifications when they modify their own program, and coaches get a batched email digest when athletes add exercises, swap items, create sessions, or regenerate plans.
Nouvelles Fonctionnalités
•Actor attribution — every change is now tagged with who made it (coach or athlete) so notifications route to the right person
•Coach email digest — when an athlete adds exercises, swaps items, creates sessions, or regenerates plans, their coach receives a batched email summary after a 15-minute quiet period
•Self-added badges — coach WeekGrid now shows green "(Self)" badges on items the athlete added or modified, and a "Self-added" badge on athlete-created sessions
Améliorations
•Benchmark exercises now include addedBy and itemOrigin metadata for proper attribution
•New sessions include a createdBy field tracking whether the coach or athlete created them
•Swap endpoint now sends notifications (previously had none) with correct actor routing
Corrections
•Fixed athlete self-service changes (add exercise, add benchmark, create session, swap item) incorrectly sending "Your coach made changes" notifications and emails to the athlete
•Fixed regeneration endpoints (week and session) not notifying the coach when an athlete regenerates their own plan
v1.11.2
Impersonation banner is now a small draggable box you can open and close so it stays out of the way while navigating.
Améliorations
•Impersonation banner is collapsed by default into a small "Impersonating" pill — click to expand and see athlete ID, collapse (−) to minimize, or Exit to stop impersonation
•Banner remains draggable in both states so you can move it anywhere on screen; viewport clamping keeps it visible
v1.11.1
Fixed 228 masterplan validation errors caused by schema drift — stored masterplans now validate cleanly against the Pydantic model.
Corrections
•Masterplan schema no longer rejects stored metadata fields (athleteId, llmLogs, createdAt, updatedAt, regeneration flags) — extra fields are now silently ignored instead of causing validation errors
•Mesocycle fields cycleIndex, why, binarySuccessMetric, and fallbackPath are now optional with defaults for backward compatibility with legacy masterplans
•Increased max_length on targetRPE, fallbackPath, why, binarySuccessMetric, pass_criteria, and fail_action to accommodate longer LLM-generated descriptions
•Progression template rpe field now accepts string ranges like "6-7" instead of requiring an integer
•Progression template progression field now accepts string descriptions alongside structured week lists
•Expanded sport_type pattern to include powerlifting, crossfit, running, cycling, and swimming
v1.11.0
Weekly summary now puts hard metrics first — prescribed vs actual load, internal and external load with real numbers, and added load (extra sessions or exercises) so the system can recalibrate what you can actually manage.
Nouvelles Fonctionnalités
•Prescribed vs actual load — new section in the week summary modal showing duration, volume, tonnage, effort load, and average intensity with prescribed → actual (and adherence %)
•Added load for recalibration — extra sessions you add or custom exercises are counted separately so the system knows what you did on top of the plan and can adjust future prescriptions
•Coach summary and next week focus are collapsible — both blocks are collapsed by default so you see metrics and load data first; expand to read the narrative when you want it
Améliorations
•Backend now splits load into prescribed (original plan only), actual-from-prescribed, added (unprescribed sessions + custom exercises), and total actual for capacity signals
•Summary modal shows "Added" and "Total actual" when you did more than the prescription (e.g. +45 min added, total actual 2h45)
•i18n for load labels in EN/FR (Prescribed vs actual, External/Internal load, Adherence, etc.)
Corrections
•Chat drawer on mobile no longer auto-focuses the message input when opened, so the keyboard does not open immediately and the input bar stays visible; tapping the field scrolls it into view above the keyboard
v1.10.0
Post-session celebration now shows real progression data — computed weight trends, pace improvements, and 4-week projections from your actual training history instead of AI-generated predictions.
Nouvelles Fonctionnalités
•Real progression celebration — after completing a session, see your actual weight gain per week, current prescription, and computed 4-week projections instead of generic motivational text
•Endurance progression celebration — endurance sessions show your real pace trend (e.g., "3.2s/week faster") and projected pace based on historical data
•Confidence-based display — projections only shown when backed by sufficient data (3+ data points, strong statistical fit); otherwise shows current trends only
•Building Your Baseline state — new athletes see an honest "we need more sessions" message instead of fabricated predictions
Améliorations
•Post-session flow no longer calls the LLM for predictions — faster response, zero AI cost per session completion
•Session-relevant exercise matching — celebration prioritizes exercises from the session you just completed
•Sport-aware segment logging — performance modal now shows sport-specific fields (swim: stroke count, pace per 100m; bike: speed, power; row: split per 500m)
v1.9.5
Fixed segment rendering for endurance and running sessions — workout instructions are now fully visible instead of showing empty cards.
Corrections
•Segment cards now display work instructions, rest periods, interval reps, and intensity zones instead of showing only a type label
•Notes are shown directly on segments with workout instructions instead of being hidden behind a toggle
v1.9.4
Major overhaul of the Vertical Jump feature — clearer tier system, all-time leaderboard, participant names, video links, redesigned results, and a new dedicated Booth mode for events and fun fairs.
Nouvelles Fonctionnalités
•Five-tier classification system — Beginner, Intermediate, Advanced, Elite, and Pro with color-coded badges and height ranges
•Jump Levels legend on the idle screen showing all tiers with colors and height thresholds
•Participant name input — enter your name before submitting to the leaderboard instead of showing as "Participant"
•Leaderboard video links — "Watch" link on leaderboard entries that have a recorded jump video
•Booth mode — full-screen arcade-style dashboard for events and fun fairs with dedicated route and components
•Typewriter headline animation on the idle screen
•Responsive desktop/tablet background video with separate mobile and desktop assets
Améliorations
•Leaderboard is now all-time "Top 5" instead of "Top 5 Today" — no more empty leaderboard when starting fresh
•Redesigned result page with large hero height display and colored tier badge instead of flat metric list
•Redesigned post-jump share overlay — result-first layout with big height, tier badge, video preview, and smaller QR code
•Leaderboard and Jump Levels displayed in a two-column grid on desktop
•Wider layout for Vertical Jump pages on tablet and desktop (max-w-5xl / max-w-6xl)
•Leaderboard entries now show tier color dots next to participant names
•Backend returns created_at timestamps for leaderboard entries
Corrections
•Fixed height validation to accept 0 cm and cap at 120 cm instead of rejecting zero values
•Fixed layout overflow issues caused by double containment in LiteLayout wrapper
v1.9.3
New achievement celebrations for benchmarks and feedback milestones, streak celebration fixes, improved email readability, and the Nutrition feature has been temporarily removed while we refine it.
Nouvelles Fonctionnalités
•Benchmark achievement celebration — unlock a dedicated celebration screen when you hit benchmark milestones
•Feedback achievement celebration — get recognized for consistently providing session feedback
Améliorations
•Email styling overhaul — fonts are now readable and consistent across all major email providers (Gmail, Outlook, Apple Mail, etc.)
•Cleaner achievement celebration UI with proper icon mapping for all achievement types
Corrections
•Fixed streak achievement celebrations not triggering correctly
•Removed Nutrition feature temporarily — it will return once the experience is precise, consistent, and fully polished
v1.9.2
Track your training progress and see where you're headed. New Progression and Predictions tabs give you a clear picture of your exercise history and future performance projections.
Nouvelles Fonctionnalités
•Progression tab — view exercises tracked, compound movements count, and overall trend at a glance
•Exercise history — see per-exercise session counts, latest prescriptions, target effort, and historical data
•Predictions tab — unlock personalized performance predictions and goal projections as you complete more sessions
•Time range filtering — analyze your progression over the last 6 weeks or other custom periods
Améliorations
•New tabbed navigation across Progression, Predictions, Analytics, and Summaries for a unified insights experience
v1.9.1
Your profile, your look. Upload a custom profile photo and background image to make your profile truly yours.
Nouvelles Fonctionnalités
•Custom profile photo — upload your own photo directly from your device to replace the default avatar
•Custom background image — personalize your profile header with your own background image
•Image cropping and preview — see exactly how your photo will look before saving
Améliorations
•Profile page now clearly shows upload buttons for both profile photo and background image
•Smoother image upload flow with progress feedback
v1.9.0
Personalized nutrition is here. Get daily calorie and macro targets tailored to your goals, with full meal plans you can customize — all synced to your training schedule.
Nouvelles Fonctionnalités
•Fuel Targets card — see your daily calories and protein/carbs/fat breakdown at a glance with a visual macro bar
•Fuel Plan — tap into a full meal-by-meal plan with concrete food portions color-coded by macro type
•Nutrition preferences setup — choose your dietary restrictions, preferred proteins, nutrition goal, and meals per day
•Training-aware nutrition — training days automatically get higher carbs and calories, rest days stay at baseline
•Pre and post-workout meals — training days include properly timed workout nutrition (carb-forward pre, protein-rich post)
•Customize and regenerate — tell the AI your available ingredients and regenerate any day's meal plan on the fly
Améliorations
•Macro targets are computed deterministically from your weight and goal — consistent numbers every time
•Dietary restrictions are enforced as hard constraints — vegetarian, vegan, gluten-free, nut allergy, halal, and kosher fully respected
•Nutrition auto-prompts on first visit if preferences aren't set — no passive banners, just a quick setup modal
v1.8.7
All 51 benchmark types are now available to every athlete — browse the full catalog freely by category without profile-based restrictions.
Nouvelles Fonctionnalités
•Full benchmark catalog: all 51 benchmarks across Strength, Endurance, Conditioning, Power, Skill, WOD, Body Comp, and Readiness are now visible to every athlete
•Free browsing: no more profile-based filtering — explore and log any benchmark regardless of sport type or goals
Améliorations
•Simplified benchmark loading — faster response times by removing the merge engine overhead
•Add Benchmark and Create Custom Benchmark modals now use a scrollable body with sticky footer on mobile so Save/Cancel are always reachable
v1.8.6
Fixed coach message email links — "View Conversation" now opens the app with the chat drawer visible instead of redirecting to a non-existent page.
Améliorations
•Coach message email "View Conversation" button now opens the app and auto-opens the chat drawer
Corrections
•Fixed "View Conversation" link in coach message emails leading to a "Page Not Found" error
v1.8.5
Coaches can now view full athlete profiles, training goals, equipment, and master plans directly from the coaching dashboard — and edit them on the fly.
Nouvelles Fonctionnalités
•Athlete profile drawer: slide-out panel showing complete athlete details including goals, sport type, training frequency, equipment, injuries, and physical stats
•Master plan viewer: browse the full periodization plan with expandable mesocycles, focus distribution charts, microcycle details, and deload schedules
•Coach profile editing: update athlete goals, sport type, training frequency, equipment, fitness level, and injury notes directly from the dashboard
•Coach master plan editing: adjust macrocycle goals with automatic versioning and audit logging
•Profile chips in athlete header: quick-glance badges showing sport type, primary goal, training frequency, and injury warnings
Améliorations
•Coaching dashboard now provides full athlete context without leaving the weekly plan view
•All coach edits are audit-logged for accountability and traceability
v1.8.4
Improved daily workout email experience with direct session links, login modal for unauthenticated users, and enhanced shared workout views.
Nouvelles Fonctionnalités
•Daily workout emails now link directly to the session view instead of the plan page
•Login modal overlay for unauthenticated users arriving via email - see your workout in the background while signing in
•Post-login redirect brings you back to the exact session you clicked on
•Shared workouts now display freetext workout format (workout text)
•Shared workouts now show benchmark results and personal records
•Shared workouts now include session feedback, effort ratings, and completion logs
Améliorations
•Smarter login modal with workout-specific messaging when arriving from email links
•Shared session links now handle malformed URLs from messaging apps that append extra text
Corrections
•Fixed shared workout links breaking when messaging apps append share text to the URL
v1.8.3
Enhanced privacy with Zero Data Retention (ZDR) for all AI requests and expanded model selection.
Nouvelles Fonctionnalités
•Zero Data Retention (ZDR) routing enabled for all AI requests - your data is never stored by AI providers
•Added new high-quality AI models: Kimi K2, MiniMax M2.1, Qwen3 235B, GLM 4.7, DeepSeek R1
•Added ZDR-specific model variants for Claude and GPT models via Google Vertex AI and Azure
Améliorations
•Default AI model changed to GPT-5 (ZDR) via Azure for enhanced privacy
•Updated privacy policy to reflect OpenRouter as data processor and ZDR routing
•Added Data Protection Impact Assessment (DPIA) documentation
v1.8.2
Fixed email workout links that were not redirecting properly.
Corrections
•Fixed "View Full Workout" links in daily workout emails not redirecting to the session view
•Fixed API routing configuration for improved email click tracking
v1.8.1
Improved coaching experience with better notifications and enhanced chat functionality.
Nouvelles Fonctionnalités
•Coaches now receive notifications when athlete programs are edited or updated
Améliorations
•Redesigned onboarding layout for a smoother signup experience
•Improved coaching chat interface with better mobile support
•Enhanced vertical jump measurement with new API and updated display components
•Better form accessibility throughout the app
•Smarter athlete profile retrieval for faster loading
•More reliable chat connections with improved rate limiting
v1.8.0
Major coaching update with real-time chat, workout text support, and enhanced exercise tracking.
Nouvelles Fonctionnalités
•Implement coaching dashboard and enhance workout text support
•Add workout text completion feature and update notifications
•Implement coach notification system for exercise updates
•Implement real-time coaching chat system and enhance user presence tracking
•Enhance chat functionality with file upload support and workout text regeneration
•Implement LLM privacy boundary and enhance exercise dashboard
•Add phone number and referral source fields to onboarding process
Améliorations
•Upgraded AI model from Gemini 2.5 Flash to GPT-5 as the main generator
•Update email template loading to support Jinja2 extends/macros
•Enhance authentication persistence and improve coaching service
•Enhance chat notification system with unread message detection
•Enhance exercise dashboard with multiple video link support and improve workout text handling
•Enhance session adaptation and week plan structure with workoutText format
•Enhance logging and implement new API route exclusions
•Update email API rate limiting and enhance logging
•Remove Psychological Adaptation Layer components for cleaner architecture
Corrections
•Include freetext workouts in exercise completion counts
•Fix coach name in chat component and adjust avatar logic
•Fix following/followers functionality
v1.7.4
Fixed equipment validation bug that caused plans to ignore gym access.
Corrections
•Fixed critical bug where athletes with full gym access were incorrectly treated as bodyweight-only, causing exercises to be flagged as violations
•Equipment validation now correctly reads the equipmentRaw field from athlete profiles
•Athletes with gym access will no longer see barbell/machine/cable exercises incorrectly replaced
v1.7.3
Critical stability fixes for session data integrity.
Corrections
•Fixed critical bug where exercise swaps could overwrite entire weekly plan sessions
•Fixed "Session not found" errors appearing after swap operations
•Fixed session data corruption when updating exercise completion status
•Removed debug logging that was causing console errors
v1.7.2
Improved benchmark tests and unit display for better tracking.
Améliorations
•Benchmark tests now display "time" instead of "seconds" for duration-based metrics (5K run, plank hold, etc.)
•AI-generated benchmark tests are now validated to ensure they produce measurable, repeatable results
•Vague assessments like "Run 20-30 minutes" are no longer marked as benchmarks - only true max-effort tests qualify
Corrections
•Fixed benchmark log dialog showing confusing "seconds" unit for time-based benchmarks
•Fixed error in swap modal when loading benchmarks
v1.7.1
Exercise video demos and streak tracking fixes.
Nouvelles Fonctionnalités
•Exercise video demos - watch proper form demonstrations for each exercise in your workout
Corrections
•Fixed weekly streaks count not updating correctly
v1.7.0
Completely redesigned onboarding to capture richer athlete context for smarter, more personalized training plans.
Nouvelles Fonctionnalités
•New 7-stage onboarding flow that captures entry state, training history, competing demands, and failure modes
•Entry state detection - tell us if you're training consistently, returning from a break, transitioning sports, or starting fresh
•Competing demands tracking - identify what competes for your time (other sports, physical job, kids, travel, stress)
•Failure mode awareness - help us understand when your training typically goes wrong so we can plan around it
•Structured benchmarks - log your current lifts (squat, bench, deadlift, OHP) and endurance markers (5K time, longest run)
•Training age tracking for experienced athletes to calibrate intensity appropriately
Améliorations
•Cleaner, more intuitive button selection styling throughout the onboarding
•Better visual feedback with solid blue backgrounds for selected options
•Equipment normalization to handle different naming conventions
•Support for custom equipment entries beyond the standard options
v1.6.0
Aperçus intelligents de la semaine prochaine, profils athlètes enrichis et outils d'analyse admin.
Nouvelles Fonctionnalités
•Aperçus de la semaine prochaine - découvrez des insights personnalisés sur votre semaine d'entraînement à venir avant de la générer
•Révélation animée style machine à écrire pour les cartes d'aperçu avec un retour visuel engageant
•Champs de profil enrichis - heure préférée, jours d'entraînement, type de sport, taille, poids, masse grasse et type de personnalité
•Tableau de bord analytics admin pour suivre l'activité des utilisateurs et les raisons de régénération des plans
Améliorations
•Les highlights du résumé hebdomadaire s'affichent maintenant à des seuils plus bas pour une meilleure visibilité
•Ajout de célébrations de jalons aux semaines 4, 8 et 12
•L'animation du bouton s'active après la révélation de tous les aperçus
•Les données d'aperçu sont mises en cache pour éviter la régénération à chaque chargement
v1.5.1
Share your workouts with anyone using a simple link.
Nouvelles Fonctionnalités
•Shareable workout sessions - share any session with friends, coaches, or on social media with a single tap
•Public workout view - recipients can see your workout details without needing an account
v1.5.0
Deeper athlete profiling, smarter weekly adaptations, and improved master plan logic.
Nouvelles Fonctionnalités
•Improved profile completion with deeper profiling questions - the system now understands athletes more precisely
•Two-way adaptation system - weekly sessions now adapt more intelligently instead of staying generic
•Better master plan regeneration logic - longer-term structure stays coherent when profiles evolve
Améliorations
•Multiple UI fixes and refinements by Kevin
v1.4.0
Major update with feature suggestions, live session notes, and profile customization.
Nouvelles Fonctionnalités
•Feature Suggestions - vote and comment on upcoming features
•Product Updates page - browse all updates with search and filtering
•Live feedback drawer - take notes during your workouts in real-time
•QR code sharing for user profiles
•Background animation options for profile customization
•Bio field for user profiles
Améliorations
•More Email Notifications
•Improved image lazy loading for better performance
•Session completion validation before finishing workouts
•Better profile customization with new save options
v1.3.0
Debug tools for testing and policy update notifications.
Nouvelles Fonctionnalités
•Admin debug panel for athlete impersonation in sandbox mode
•Policy update notification system - users are now notified when terms or privacy policy change
•Product updates page with search and filtering
Améliorations
•Refactored Firestore queries to use FieldFilter for improved readability
•Enhanced logging and event categorization for LLM generation and adaptation events
•Improved Firestore indexing for analytics events
v1.2.0
Major improvements to training plan generation and session management.
Nouvelles Fonctionnalités
•Session swap functionality - easily replace sessions with AI-generated alternatives
•Custom session creation - add your own workouts to your training plan
•Benchmark tracking integration in sessions
Améliorations
•Faster plan generation with optimized AI prompts
•Better mobile responsiveness across all views
•Enhanced weekly summary insights
Corrections
•Fixed session completion not being tracked correctly
•Resolved issue with effort slider on touch devices
•Fixed timezone issues in session scheduling
v1.1.0
Introducing insights and analytics to track your progress.
Nouvelles Fonctionnalités
•Insights dashboard with training analytics
•Weekly summaries with AI-powered coaching feedback
•Achievement system to celebrate your milestones
Améliorations
•Improved onboarding flow for new users
•Better exercise instructions and demonstrations
•Enhanced profile customization options
Corrections
•Fixed login issues on Safari browsers
•Resolved notification permission prompt timing
v1.0.0
Initial release of Afitpilot Lite - your AI-powered training companion.