← tillbaka
0.7.1
senaste
2026-05-13
- Hugin: Plutonchef-läge — toggle GRUPPCHEF/PLUTONCHEF, klistra in gruppchefsrapporter och slå ihop till en summerad plutonsrapport.
- Hugin: rapportformat uppdaterat till brackets [P]/[E]/[D]/[A]/[R]/[S].
- Alla appar: integritetsnotis (ingen molnlagring, all data lokalt) och uppmaning att spara på hemskärmen.
- Hugin & Bifrost: appikon med vit symbol mot grön bakgrund för hemskärmen.
- Bifrost: ny hubbsida med direktlänkar till Hopper, Njord och Hugin.
0.6.0
2026-05-12
- Hugin: ny subsite för snabb PEDARS-rapportering (P/E/D/A/R/S) med formulär, rapportgenerering och kopiering till urklipp.
0.5.99
2026-05-11
- Njord: varje dagkort har en ▾-knapp som expanderar en 6h-periodvy (00–06, 06–12, 12–18, 18–24) med temp och vind per källa — YR, SMHI och Open-Meteo.
- Njord: fetchAll samlar perioder parallellt med dagdata utan extra API-anrop för YR/SMHI; Open-Meteo hämtar hourly i samma request.
- Njord: Summary-vyn visar nu vindriktning tillsammans med vindstyrka (konsensusriktning via cirkulärt medel av tillgängliga källor).
- Njord: Sammanfattning är nu standardvy för nya besökare (tidigare Källor).
0.5.98
2026-05-11
- Njord: Sources-vy visar nu vindriktning (t.ex. '5 m/s SW'), upplevd temperatur ('Känns') och luftfuktighet ('Fukt.') per källa.
- Njord: Summary-vy visar Känns och Fukt. som konsensusrader (median av tillgängliga källor).
- Njord: Open-Meteo hämtar apparent_temperature_min/max direkt från daily-API; YR och SMHI beräknar kyleffekt per timme med JAG-formeln.
- Njord: undviker missvisande vindriktning när riktningsmedel tar ut sig (t.ex. motsatta vindar) — kompasssuffix utelämnas i stället.
0.5.97
2026-05-11
- Njord: ny app-ikon — drakens huvud från vikingaskeppet, vitt på mörkgrön bakgrund (192 px, 512 px, maskable).
- Njord: byter font-display från optional till swap + lägger till rel=preload för stencil-typsnittet så det laddas korrekt vid första besök.
0.5.96
2026-05-11
- Njord: fix crash i renderPanel när getCached returnerar null — förhindrade att prognoser visades för nya orter.
0.5.95
2026-05-11
- Njord: ersätter dubbla prick-rader med en toppdots-rad (navigation) + fristående stor +-knapp nedtill.
- Njord: +-knappen visas ej med 0 orter (söksektionen är primär CTA); visas alltid vid 1+ orter.
- Njord: fixar iOS-bugg där smooth-scroll i showSearch() förhindrade click-event på sökresultat.
0.5.94
2026-05-11
- Njord: swipe dots now appear both above the forecast (navigation) and below (with + button).
- Njord: add-location button next to bottom dots made larger and more prominent.
0.5.93
2026-05-11
- Njord: const/let in all rendering and statistics functions (appendSummaryDayBlock, computeDayAgreement, mergeSummary*, buildSummaryPrecipLine).
- Njord: search results now have tabindex and role=option/listbox; Enter/Space activates selected result for full keyboard navigation.
0.5.92
2026-05-11
- Njord: var→const/let in all API and utility functions (fetchYr, fetchSmhi, fetchNoaa, fetchOpenMeteo, fetchAll, searchLocation, location/cache helpers).
- Njord: @font-face changed to font-display:optional — if the external brand font is unavailable the system fallback is used immediately without layout shift.
0.5.91
2026-05-11
- Njord: top-level JS constants and DOM refs converted to const/let (module-level var eliminated).
- Njord: loading spinner now pulses with CSS animation; respects prefers-reduced-motion.
0.5.90
2026-05-11
- Njord: show error message instead of perpetual loading spinner when all weather sources fail.
- Njord: /njord/ HTML response now served from in-memory cache (invalidates on deploy); fixed mimetype assignment.
0.5.89
2026-05-11
- Njord: reverse geocoding for GPS now uses Nominatim (was Open-Meteo search — broken for coordinates); added User-Agent header to YR.no calls per their ToS.
- Njord: service worker no longer gets no-store cache header (fixes iOS Safari SW registration); 10 s fetch timeout on all API calls; GPS errors shown inline instead of alert().
- Njord: language toggle now re-renders from cache instead of re-fetching all forecasts; location dots show place names in aria-labels.
- Njord: added route tests for /njord/, sw.js, manifest and path-traversal protection.
0.5.88
2026-05-10
- Njord: standalone weather PWA at /njord/ (renamed from Weather) — 10-day forecast comparison from YR.no, SMHI, Open-Meteo, and NOAA with swipeable saved locations, dark/light theme, and EN/SV toggle.
- Njord: NOAA as fourth forecast source for US locations (auto-detected); SMHI uses snow1g/v1 API.
0.5.87
2026-05-06
- Hopper: equipment setup replaced with a step-by-step yes/no wizard — one question per piece of kit with a short explanation, progress dots, and Ja/Nej buttons.
0.5.86
2026-05-01
- Hopper + Gota: 30-min+ 'For Time' sessions now generate two separate race blocks with different movements and 2 min rest between — shorter sessions keep the single-block format.
- Hopper + Gota: box jumps can no longer be paired with leg-fatiguing movements (lunges, air squats, box step-ups) to reduce injury risk.
0.5.85
2026-04-30
- Hopper + Gota: install banner now appears at the top of the page in browser mode — tap 'Install' to add to home screen, or 'Not now' to dismiss (remembered per device).
- Hopper: faint lion watermark now appears in the lower portion of the screen background.
- Gota: faint blue logo watermark now appears in the lower portion of the screen background.
0.5.84
2026-04-30
- Hopper + Gota: emomFactor speed scaling now applies to all per-move workouts (AMRAP and EMOM), not just EMOM — e.g. 9 jump rope DU becomes 45 DU per round.
- Hopper: AMRAP Mode A now always shows fixed reps per movement — the 50/50 'ladder mode' that showed movement names with no rep counts is removed.
- Hopper: 'For Time' schemes (21-15-9, 50-40-30-20-10, 100-80-60-40-20) are now always single-block Mode A — they can no longer end up as multi-block per-move AMRAP where rep counts are too high to complete even one round.
- Hopper: per-move cycling workouts now always show 'AMRAP' header — 'For Time' was contradictory when the format is 'do the movements in order, start over'.
- Hopper: warmup (~2 min) + transition (1 min) = 3 min are now always deducted from schedulable time — a 15 min session gives at most 12 min of actual work blocks.
- Hopper: rest caps now tiered by work block length — ≤3 min work → 1 min rest, ~4 min work → 2 min rest, 5–7 min work → 3 min rest.
0.5.83
2026-04-30
- Hopper + Gota: AMRAP/For Time header now shows actual work minutes after warmup deduction — a 15 min session shows 'AMRAP 12 min', not 'AMRAP 15 min'.
- Gota: all workout generation fixes ported from Hopper — warmup/transition deduction, rest tiering, for_time→Mode A, jump-cardio filter, AMRAP always per-move, timerExtra placement, no bullet asterisks.
- Hopper: EMOM reps now scaled by movement speed via per-movement emomFactor — jumping jacks/mountain climbers get ×5 (30–50 reps), air squats/sit-ups/lunges/KB swings/push-ups get ×2, deadlifts get ×1.5. Burpees and box jumps unchanged.
- Hopper: EMOM block count is now always divisible by the number of movements — e.g. EMOM-10 with 3 movements becomes EMOM 9 min so the session ends on the last movement.
- Hopper: EMOM interval info ('9 × 60 s · no rest between minutes') now appears directly under the EMOM header instead of at the bottom of the workout.
0.5.82
2026-04-30
- Hopper: round/rest info ('3 rounds · 3 min work · 3 min rest') now appears directly under the AMRAP/For Time header instead of after the movement list.
- Hopper: removed bullet asterisk (*) from warmup and movement lines in workout output — numbers now appear directly without a leading *.
- Hopper: AMRAP time cap now correctly subtracts the 2-minute warm-up buffer so a 30-min session generates AMRAP ~28 min instead of the full 30.
- Hopper: jump rope (DU), jumping jacks, and box jumps can no longer appear together in the same workout — at most one jump-cardio movement per session.
0.5.81
2026-04-29
- Hopper: buttons and time-selection chips now use FM Stencil (same as the Hopper logo).
- Hopper BRAK: portrait splash added — animated rotate-device icon with 'Vänd telefonen' / 'Rotate device' shown when phone is held upright; disappears automatically when rotated to landscape.
- Hopper BRAK: no duplicate movement picks in generated BRAK rounds (deduped warm-up/strength pools). BRAK team timer UI in landscape now prioritizes exercise readability, uses smaller WORK/REST chips, hides non-interval modes in settings, and Reset restarts the fixed 10-round 45/15 BRAK flow instead of clearing to zero.
- Hopper PWA update flow hardened: service worker registration now uses a versioned URL plus updateViaCache=none and immediate reg.update() so clients pick up fresh deploys more reliably.
- Hopper BRAK team timer: phase labels now stay uppercase in landscape/horizontal mode (WORK/REST and ARBETE/VILA), and Swedish done label is standardized to KLAR.
- Hopper timer UI: landscape/low-height view now uses a denser bottom bar with less wasted space, larger exercise text, and clearer phase/clock sizing. Rest line now shows upcoming block as 'Upcoming: ...' / 'Kommande: ...'. End-state phase label is now uppercase DONE / KLAR.
- Hopper BRAK: fixed timer config — rounds now correctly pre-set to 10 via URL params (gym_timer.js was overriding the inline pre-config with its own default of 3). Removed duplicate BRAK team button and BRAK title text from the timer page.
- Hopper BRAK: during rest intervals the exercise banner now shows the upcoming exercise name instead of the one just completed.
- Hopper: BRAK team button — opens a fullscreen interval timer (VITAIL gym_timer) pre-configured with 10 rounds, 45 s work / 15 s rest, 10 s countdown. Alternates warm-up and strength exercises from the BRAK pool; exercise name shown prominently above the digits. Landscape mode supported via gym_timer.css.
- Hopper: BRAK reformatted as 45 s warm-up / 45 s strength / 15 s rest interval circuit. Picks 1 exercise from a warm-up pool (arm circles, inchworms, air squats, scapular push-ups, shoulder rolls, toy soldiers, plank to toe touch) and 1 from a strength pool (duck walk, bear walk, jumping jacks, air squats, sit-ups, lunges, mountain climbers, push-ups, burpees). Timer runs 6 pairs × 45+45+15 s ≈ 10 min. Explain panel shows coaching notes for the two chosen exercises.
- Hopper: BRAK button added — 10-min bodyweight circuit to activate circulation. No warm-up section; designed as a quick wake-up for cold or tired soldiers.
- Hopper + Gota: two new warm-up exercises added — Toy soldiers (triggered by box jumps, box step-ups, and running) and Plank to diagonal toe touch (triggered by push-ups, burpees, bear walk, and duck walk). Both include EN + SV coaching notes in the help/explain panel.
0.5.80
2026-04-28
- Hopper + Gota: EMOM workouts now show explicit minute-by-minute format with rep counts (e.g. Minut 1: 6 Box jumps, Minut 2: 8 Push-ups, etc.) and rest stations. Format clearly shows station count and repeat count (e.g. → Upprepa 3 varv).
- Hopper + Gota: AMRAP instructions simplified to 'Do the movements in order. When done, start over.' and 'Gör övningarna i ordning. När klar börja om.' (SV) for clarity.
- Hopper + Gota: EMOM instructions removed in favour of self-explanatory minute-by-minute format.
- Hopper + Gota: movement rep counts now displayed inline (e.g. '5 Burpees') instead of as bullet list.
- Hopper + Gota: burpees and push-ups are now blocked from ladder-mode for-time WODs when the total reps per movement would exceed 100 (e.g. 50-40-30-20-10 and 100-80-60-40-20 schemes). Per-move format and AMRAP schemes are unaffected.
- Hopper + Gota: all volume and doability limits (rep caps, time-fill fractions, distance limits, session-length thresholds) extracted into a named constant block for easy tuning.
- Hopper + Gota: EMOM sessions with multiple rounds now use one of two distinct formats — 4-station EMOM (3 movements + 1 built-in rest station per cycle, e.g. rest at min 4, 8, 12 …) or multi-round EMOM (N × EMOM-K with 3 min between rounds, rest info shown in header). The two formats no longer share prescription text, removing the previous confusion where the body text implied a continuous EMOM but a footer note revealed a hidden rest break.
0.5.79
2026-04-27
- Hopper: new intro on first visit (language choice) and again after a week away or from the gear — typewriter text in a compact pass-style card over a light dim, primary 'Skip to settings' / 'Till installningar' button (same weight as New workout), tap the text to advance, reduced-motion support, and intro date in localStorage.
- Hopper: opening the gear still shows the intro from the language step if needed; the primary control skips straight to the equipment screen so settings stay reachable.
- Hopper intro: reordered screens (what Hopper is now before the Armed Forces slide), consistent two-space indent on all EN texts, language buttons side by side, auto-scroll during typewriter so the last screen never needs manual scrolling, thin 3 px accent-coloured scrollbar, feedback email clickable in brand orange.
- Hopper intro: fixed Swedish phrasing on splash screen 3 (Du anger vilken utrustning / hur lang tid).
- Hopper intro: removed the 'no kudos / no streaks' screen; easy mode line now points to settings; last screen rewritten (tracking note at the end, email in orange).
- Hopper intro: backdrop blur + stronger dim behind the splash overlay; panel now has card background, border and shadow so it reads cleanly over the dimmed app.
- Hopper intro: feedback email moved to its own final screen (screen 7).
- Hopper intro: removed hardcoded mid-sentence line breaks from all splash screens — text now wraps naturally to viewport width.
- Hopper: warm-up exercises now appear in Help (movements section) and in the workout explain panel, each with a short technique note in EN and SV.
- Hopper: multi-round EMOM -- session time is now filled with N rounds of EMOM-K and 3 min rests between rounds.
- Hopper + Gota: timer scheduling info moved to bottom of prescription; double unders minimum 9 reps; push-ups capped at 10 reps per round; feasibility check always-on; Gota gets warmup guide, explain panel warmup, multi-round EMOM, and all recent Hopper improvements.
0.5.78
2026-04-22
- Hopper: during single-block workouts (solo 5 km or a Mode A ladder) the timer sub-line now shows just the scheme name instead of the awkward 'Block 1 / 1' label.
- Hopper: movements.json now times out after 8 seconds on a stalled network so the welcome screen no longer hangs silently; the PWA service worker also auto-reloads the page once it takes control so you see the latest version right after a deploy.
- Hopper (internal): new 95-test deterministic unit suite for pure helpers (formatting, rep math, scheme eligibility, pool filters, feel-bias, warm-up text, solo_5k output) plus pytest coverage for PNG icons and the nosleep.js fallback. All tests run on every push.
0.5.77
2026-04-22
- Hopper: each workout now opens with a short adaptive warm-up (about 2 minutes) tailored to the movements you drew. The timer still only counts the work itself.
- Hopper: countdown beeps 3-2-1-GO before every work and rest block, plus a half-way cue for longer work intervals so you know when you're at the halfway mark.
- Hopper: new EMOM formats (every minute on the minute) — EMOM-10 and EMOM-12 rotate through your drawn moves one minute at a time.
- Hopper: Copy-text button next to Save-image so you can share the workout straight into chat or notes.
- Hopper: after the timer runs out, a quick Too hard / Just right / Too easy tap logs how the session felt; two 'too hard' sessions in a row automatically pull the next workout toward the easier pool.
- Hopper: installable as a home-screen app on iOS and Android — works offline after the first visit (new manifest, service worker, and dedicated 192 / 512 px icons).
- Hopper: iOS Safari screens no longer dim mid-workout — a silent-video fallback keeps the screen awake on older iPhones that lack the modern Wake Lock API.
- Hopper: the 'Too easy / too hard' cool-down block has been removed — it was noise most users skipped. Warm-up stays because it's on the action path.
0.5.76
2026-04-22
- Hopper: duck walk and bear walk are excluded from Mode A AMRAP schemes — they cap at the same distance every round, making the ladder look identical at every step.
- Hopper: For Time workouts now require an estimated time between 35 % and 90 % of the session length, preventing workouts that are far too short or too long for the chosen duration.
- Hopper: push-ups and burpees are excluded from AMRAP schemes whose highest rep step exceeds 9 — high rep sets cause intensity loss in continuous AMRAP format.
0.5.75
2026-04-21
- Longevity · bodyweight: program copy and docs now match the rolling 3-day A/B/C rotation and per-day tier rules (8-week overview is a timeline, not six separate pattern days).
- Profile & welcome: if menopause is post, menstrual cycle tracking is turned off (server-side) and the cycle UI is hidden with a short explanation.
- Welcome (female): menopause is chosen with radio buttons and short explanations (pre/peri/post); cycle tracking notes that Today’s phase shapes only that day’s plan (no diary stored).
- Workout: Longevity · bodyweight no longer opens the barbell max-lift PR modal or the provisional-weight hint (calisthenics users are not nudged toward bar/plate tests).
- Workout: the per-lift PR reminder only appears when the session’s main lift maps to a barbell max on My Records (squat, bench, deadlift, OHP) — not for calisthenics names like push-ups.
- Admin → Users: last sign-in times are shown in Swedish local time (Europe/Stockholm).
- Admin → Users: sort every column (email, plan, sex, age, last sign-in) and filter by email text, goal, sex, age range, and last sign-in date range (server-side, pagination preserved).
- Endurance: removed the separate trail-run modality — long trail distances are entered under Running, and saved trail times are merged into running automatically.
- My Records: all discipline sections and strength lifts start collapsed (no auto-open on profile focus).
- Onboarding: if you select female, you now set menopause phase and optional cycle tracking before leaving step 1.
- Beta: default account cap is 40 sign-ups when BETA_MAX_USERS is unset; set BETA_MAX_USERS=0 for unlimited registration.
- Conditioning (erg): bike distances in workout text are the reference; SkiErg and row show ~50 % metres. Fixed duplicate halving and lowercase bike/ski/row labelling for your preferred machine.
- Workout block timers: Prep now has the same tap-to-start timer (uses the estimated prep time when available). Blocks that spell out rounds plus work and rest durations (e.g. four rounds, three minutes work, one minute rest) get an interval countdown instead of a naive count-up; every start still begins with the 10 s get-ready countdown.
- Workout: main-lift set timer matches block-timer layout (time + controls on one row); the 10 s get-ready runs only once when you first start the timer, not between rests; a short hint explains that the chip counts rest between sets while the tile header minutes are a full-block estimate.
- Today’s primary-block minute estimates for calisthenics (longevity bodyweight) are tightened so they better match short sessions; rest timers still show the programmed rest between sets (e.g. 3:00), not the whole block.
- Workout header: for Longevity · bodyweight / calisthenics, the profile line no longer repeats the goal twice (drops the redundant “Longevity bodyweight” protocol label when the track already says bodyweight).
- Workout: session context (goal, structure, time, failure policy, notes) is merged into one collapsed “About this session” block with a one-line teaser; repeated time-budget phrasing is not duplicated in the notes line when minutes are already shown under structure.
0.5.74
2026-04-20
- Bodyweight / calisthenics track rewrite: the programme now runs a rolling 3-day A/B/C rotation (Day A: Push, Day B: Pull + Hinge, Day C: Squat + Skill) instead of the old 6-pattern system.
- Every session includes bear walk in the mobility warm-up. Day B adds a dedicated hinge complement block.
- Conditioning block scales with available time: 2 rounds at 30 min, 3 at 45 min, 4 at 60+ min. Movements rotate through a per-day pool and adapt to your equipment.
- New profile and onboarding question: available equipment (pull-up bar, resistance band, jump rope, parallettes, box/chair, running). Exercises adapt automatically when gear is missing.
- Each strength tier now shows an exit criterion so you know exactly when you're ready to progress.
0.5.73
2026-04-20
- New profile field: preferred erg machine (Bike / Ski erg / Row). Bike conditioning distances stay full; ski/row distances are halved to reflect real effort equivalence.
- Primary strength tile now shows the lift name directly above the spec bar, so you don't have to scroll up to see which lift you're working.
0.5.72
2026-04-20
- Block timer now uses the stated time cap (e.g. 'Time cap: 14 min') as the target duration, taking priority over AMRAP or general time estimates.
0.5.71
2026-04-20
- 5×5, GVT, and linear tracks now use the same per-set rest timer as Wendler — consistent timer behavior across all strength protocols.
0.5.70
2026-04-19
- Block timers now auto-detect AMRAP and timed blocks (e.g. 'AMRAP 12 min', '10 min') and count up to that duration, then stop with a 'Time!' display. Audio beeps at 3-2-1 during get-ready, a longer Go beep at start, and a done beep at finish.
0.5.69
2026-04-18
- Tap-to-start count-up timer added to the Secondary, Accessory, and Aerobic workout blocks — enable it under Profile. Includes a 10 s get-ready countdown before each block. For mixed-metcon sessions with a short WOD, the aerobic timer pre-seeds the timecap so you can see when you go over.
0.5.68
2026-04-18
- Swedish users now see workout instructions in Swedish: all session coaching notes, goal axis lines, aerobic blocks, secondary exercises, Hyrox station blocks, and metcon descriptions are fully translated.
- All hardcoded English aria-labels and title attributes in templates are now localised (workout time-budget pill, nav landmark, vote buttons, changelog link).
- Remove "prototype" from the site footer — the app is in production.
0.5.67
2026-04-18
- Fix workout page screen lock: the screen no longer stays dark after switching tabs or locking the phone mid-session — the wake lock is now reacquired whenever the workout page becomes visible again.
0.5.66
2026-04-18
- Make Wendler 5/3/1 deload week optional: after the last heavy session (week 3), user can choose to run the deload week as usual or skip it and restart the cycle with bumped training maxes immediately.
0.5.65
2026-04-18
- Add opt-in per-set rest timer on workout page (profile setting `workout_timer_enabled`, default off; shows prestart +10s, countdown, pause/resume, auto-hides when done).
0.5.64
2026-04-17
- **CrossFit benchmark library** — 61 named WODs (Girls, Heroes, AMRAPs, Open workouts) now live in the conditioning pool with muscle-group conflict filtering, kg/lb loads, and scaled variants. Mixed metcon track picks a fitting benchmark daily; HSPU/muscle-up/pistol workouts filtered out for wider accessibility.
0.5.63
2026-04-15
- **Conditioning engine** — Smart workout picker that selects complementary conditioning based on today's barbell lift. 50+ original workouts in two pools (erg intervals + strength-metcon). Muscle-group conflict filter prevents doubling up — no thrusters after squats, no push-ups after bench.
0.5.62
2026-04-14
- **Auto-progression** — 5×5, Linear 3×5, and GVT now automatically bump your working weight after each session when you trained fresh/stable and cadence allows (7 days if under 40, 14 days if 40+).
0.5.61
2026-04-10
- **5×5 intensity** — Raised from ~74% to ~81% of 1RM, matching standard straight-set 5×5 literature.
0.5.60
2026-04-10
- **GVT rest periods** — Changed from E3M (3 min) to E90s (90 sec) matching Poliquin's original protocol.
- **GVT intensity** — Raised from 55% to 60% of 1RM (standard GVT load = your 20RM).
- **GVT tempo** — Added 4-0-2 tempo prescription to coaching text and intensity display.
- **GVT coaching** — Rewritten beginner and Rx coaching text (EN + SV) with correct rest, tempo, and intensity.
0.5.59
2026-04-10
- **Profile: experience gates programs** — Beginners: Linear 3×5 only. Intermediate: Linear, 5×5, 531. Advanced: all incl. GVT.
- **Profile: field reorder** — Experience now comes first (before goal and days), since it determines available programs.
- **Onboarding: same filtering** — Welcome wizard shows only programs matching selected experience level.
- **Backend validation** — Server-side clamp prevents invalid experience+program combos even with manual POST.
0.5.58
2026-04-10
- **About page** — Added Linear 3×5, 5×5, and GVT protocol explanations (progression, intensity, fatigue rules).
- **About page** — Contact line now points to the in-app feedback icon instead of an email address.
0.5.57
2026-04-09
- **UX: About page** — Restructured from flat list to 3 logical groups (Training, Body & Recovery, Numbers).
- **UX: About page** — Each section is now collapsible — page is scannable instead of a wall of text.
0.5.56
2026-04-09
- **UX: Workout page — less noise** — Hero identity chips (goal/level/protocol) compressed to a single muted line.
- **UX: Workout page** — Duplicate lift name removed from Primary tile (already shown in hero headline).
- **UX: Workout page** — Duplicate goal/protocol pills removed from Context details section.
- **UX: Workout page** — Prep and Recovery sections are now collapsible (closed by default, open for beginners).
0.5.55
2026-04-09
- **UX: Login page** — added value proposition subtitle and clearer "Switch server" label (was "NW").
- **UX: Register form** — logo shrinks when registering so the full form (disclaimer + button) fits without clipping.
- **UX: Today page** — added visible "Daily check-in" heading.
- **UX: Workout page** — empty blocks (secondary, accessory, aerobic) are now hidden instead of showing "(omitted)".
- **UX: Workout log** — dates are grouped as sub-headers within each week instead of repeating per row.
- **UX: Profile** — added visual separator between Save and Clear profile buttons.
- **UX: Top controls** — increased spacing between icons for better touch targets.
0.5.54
2026-04-08
- **Error pages:** Custom **404** and **500** error pages with i18n support (EN/SV).
- **Health check:** New `/health` endpoint returns JSON `{status: ok}` with DB ping — for monitoring and orchestration.
- **Session security:** Explicit **7-day session lifetime** (`PERMANENT_SESSION_LIFETIME`); `session.permanent = True` at login/register.
- **Input hardening:** `parse_profile()` no longer crashes on missing `age`/`training_days` form fields — uses safe `.get()` with defaults.
- **Beginner glossary overhaul:** Expanded from 18 to 30+ terms — added DU, HSPU, GHD, Z2, superset, compound, antagonist, unilateral, ROM, GPP, deload, tempo notation (3-0-1-0), grinders. Fixed Swedish OHP translation (militarypress → axelpress).
- **About page:** Added changelog link and contact email to the about page footer.
- **Data export (GDPR):** New `/export` route downloads all your data as JSON — profile, workout logs, and PR history.
0.5.53
2026-04-08
- **Coaching tone:** **`intermediate`** and **`advanced`** use terse **Rx-style** **`primary_coaching`** (**`rx_coaching_*`**) and short barbell **`movement_prep`** / **`recovery_transition`** (**`rx_movement_prep_barbell`**, **`rx_recovery_transition_strength`**). **`beginner`** keeps long **`beginner_coaching_*`**, verbose prep/recovery, and glossary expansion.
0.5.52
2026-04-07
- **Logs redesign:** Workout log entries grouped by **ISO week** — compact single-line rows that expand on tap. Week headers show session count and average effort. Much faster to scan training history.
- **Program overview:** Workout plan page shows **key-value overview** (template, duration, frequency, progress bar) instead of prose paragraphs. Phase cards include **inline week pills** with current-week highlight. Standalone week strip removed.
- **Wendler fix:** Clearing all workout logs now **resets wendler_week to 1** and clears wave state — prevents stale deload trigger after log wipe.
- **PR-only weights:** Working weights always derived from saved **profile PRs** (``pr_*``). Removed dual weight tracking via ``user_progression.weight``. The **/prs** page shows a **cycle-progression badge** when a lift's 1RM was auto-calculated after a Wendler cycle.
- **Changelog rule:** Added **CLAUDE.md** project rules and a **pre-commit hook** that warns when user-facing files change without a changelog update.
0.5.51
2026-03-27
- **Beginner copy:** When **`experience` is `beginner`**, session plans use plain-language **`primary_coaching`** from i18n (**`beginner_coaching_*`**) plus **`simplify_session_text`** (`vitail_session/_simplify.py`) to expand abbreviations (RPE, AMRAP, E3M, zone 2, RDL, etc.) once per string field after injury/time modifiers. **`compute_daily_session(..., locale=...)`** (Today POST passes UI locale). Workout page shows **`workout_badge_e3m_expanded`** instead of raw **E3M** for beginners. Plan preview applies the same rules. Docs: **`VITAIL_Session_Engine.md`**, **`VITAIL_Training_Programs.md`**, **`VITAIL_User_State_Schema.md`**. Tests: **`tests/test_simplify.py`**, **`tests/test_beginner_session_copy.py`**.
0.5.50
2026-03-26
- **Tooling:** Ruff now includes **B** (bugbear), **SIM** (simplify), and **RUF** (excluding ambiguous-Unicode rules **RUF001–003** project-wide so ×/dashes in training copy stay). **SIM** cleanups (e.g. `contextlib.suppress`, merged profile branches) and **RUF** nits (redundant `int()`, unused unpack). **`vitail_web.deployment`:** single **`is_hosted_deployment()`** shared by factory and auth.
0.5.49
2026-03-26
- **Architecture:** Flask routes split into the **`vitail_web`** package: **`auth`** (login, register, welcome, password reset), **`training`** (Today, workout, profile, PRs, logs, program preview, feedback board), and **`admin`** (``/admin/users``). **`web_app.py`** remains the entrypoint (`python web_app.py` / `web_app:app` for Gunicorn). URLs unchanged; template **`url_for`** targets use blueprint endpoints (e.g. **`training.today`**, **`auth.login`**).
0.5.48
2026-03-26
- **Profile:** Removed **race / event** training UI (event text, date, web “Research”) and **`/profile/research-event`**. Saving profile **clears** stored event fields; session builders no longer use event context (DB columns kept for compatibility). Removed **`vitail_goal_research.py`**.
- **i18n / workout:** Dropped unused **event** translation keys and the dormant **event-alignment** tile on the workout page.
0.5.47
2026-03-26
- **Workout copy:** Physiology-driven tweaks (cycle / menopause) set **`bio_adjustments`** on saved plans. **Why today** bullets and the program line can add **today’s sets×reps** when they differ from the enrolled template (e.g. 5×5 chip vs 3×5 prescription). Coaching footnote clarifies that **sets × reps above** are authoritative when bio rules changed volume.
0.5.46
2026-03-26
- **Cleanup:** Removed unused **``get_recent_readiness``** (DB) and **``wendler_week_for_today_post``** — Today POST now uses **``clamp_wendler_week(profile)``** only (no latest-plan / same-day session heuristics). Re-introduce history-driven logic deliberately later if needed.
0.5.45
2026-03-26
- **Workout complete:** Barbell **progression / rotation** (``update_progression``) runs on **every** logged session, not only the **first** of the calendar day — fixes same-day Wendler (and other) multi-session flows repeating the same main lift. **`get_next_lift`** uses **``LIFTS`` order** (Squat → Bench → Deadlift → Overhead Press) when ``last_done`` ties instead of SQLite’s arbitrary row order. Plan preview copy (EN/SV) clarifies app-chosen queue vs user order.
0.5.44
2026-03-26
- **Tests:** **pytest** + **Flask test client** integration tests (auth, welcome, Today → workout, public routes, admin gate) with **isolated temp SQLite**; existing Wendler unit tests unchanged. **`make test`** / **`make install-dev`**; **`requirements-dev.txt`**. **GitHub Actions** workflow runs **``pytest``** on push/PR to **``main``**.
0.5.43
2026-03-26
- **PostgreSQL:** App database connections use a **process-local pool** (``psycopg_pool``) with ``close_returns`` so existing ``conn.close()`` paths return connections to the pool. Optional **``VITAIL_PG_POOL_MIN``** / **``VITAIL_PG_POOL_MAX``** (defaults 1 / 12). **``close_pg_pool``** runs on process exit (``atexit``). Schema init still uses a one-off connection. Requires **``psycopg[pool]``** in dependencies.
0.5.42
2026-03-26
- **Admin:** **/admin/users** lists accounts in **pages of 50** (``ORDER BY id``) with **Previous / Next** and a total count — avoids loading every row for large deployments.
0.5.41
2026-03-26
- **Password reset email:** Uses **default SSL context** for ``SMTP_SSL`` / ``starttls`` (SNI and cert verification). **ASCII subject line.** Resend: **fail fast** if user/password missing; on any send failure, logs a reminder about **verified ``SMTP_FROM``** and the from-address used.
0.5.40
2026-03-26
- **Password reset email:** SMTP supports **implicit TLS on ports 465 and 2465** (Resend), **STARTTLS on any port** when enabled (fixes Resend on port 25), optional **``SMTP_STARTTLS=0``** for plain relays, **``SMTP_TIMEOUT``** (default 30s), and trimmed **``SMTP_PASS``**. Warn in logs if **smtp.resend.com** is used without user/password. **Resend** setup documented in README (``SMTP_USER=resend``, verified **``SMTP_FROM``**). On **production**, a failed or unconfigured send no longer exposes the reset link in the flash message (local dev still shows the link when SMTP is unset).
0.5.39
2026-03-26
- **Welcome wizard:** Step 1 is now **age**, **training days per week**, and **sex**; step 2 is **goal**, experience, and goal-specific program/focus; summary lists demographics first.
0.5.38
2026-03-26
- **Admin:** ``users.admin`` flag (set via SQL). Admins see an **Admin** link under Account in the bottom nav; **/admin/users** lists masked email, plan, sex, age, last sign-in, and **Remove** (cannot remove self). Feedback replies use the same admin flag instead of a hard-coded email.
0.5.37
2026-03-26
- **Accounts:** Each successful **Sign in** updates ``users.last_login_at`` (UTC) and increments ``users.login_count``. No IP stored. New installs and migrated DBs get the columns via ``init_db``.
0.5.36
2026-03-24
- **Welcome wizard:** Step 2 now asks for goal-specific settings — **strength** program (5×5 / 5/3/1 / GVT), **hybrid** flavor, **endurance** primary (+ optional 2nd/3rd discipline), **longevity** barbell vs bodyweight. Summary step shows **Focus**; inactive goal fields are disabled so POST stays clean. Flash on validation error.
0.5.35
2026-03-24
- **Workout hero:** Two-layer header — eyebrow, large headline (primary lift / modality / recovery), identity row (goal · level · program · longevity track when relevant), tinted **today** strip for state + duration; progress line unchanged.
0.5.34
2026-03-24
- **Today:** The four-lift **PR seed** card only shows for profiles that use barbell maxes (**strength**, **hybrid**, **longevity** with barbell track). **Endurance** users without primary-discipline times see a **nudge** to My Records instead; **longevity bodyweight** no longer gets the lift seed. **`POST /today/pr-seed`** is ignored when the profile should not use strength seed.
0.5.33
2026-03-24
- **Wendler 5/3/1:** `wendler_week` advances only after all four main lifts (Squat, Bench, Deadlift, OHP) are completed in the current meso week, in any order — not once per calendar day. Profile stores **`wendler_wave_state_json`**; Today POST no longer double-advances from a completed 531 row. Undo restores wave state.
0.5.32
2026-03-20
- Removed the top-bar **Add to home screen** control (Material `add_to_home_screen`); manifest / icons / service worker unchanged so manual install from the browser remains possible. `pwa.js` now only handles the help tooltip; static cache bumped to **v6**.
0.5.31
2026-03-20
- **Longevity bodyweight track (full):** Profile field **`longevity_track`** (`barbell` or `bodyweight`) + persisted **`longevity_bw_progress_json`** (rotation & per-pattern tiers). `vitail_bodyweight` builds daily sessions; `compute_daily_session` returns protocol **`bodyweight`** (skips barbell rotation). Completion advances progression; deleting the log restores prior JSON via the same undo mechanism as Wendler/meso. Workout plan overview, time-budget pass, program header line, EN/SV copy, and schema docs updated.
0.5.30
2026-03-22
- PWA / Add to Home Screen icons: **light plate** (`#EEECF8`) with **thicker, higher-contrast** mark so the app reads on dark wallpapers (iOS home screen). Regenerated `icon-192.png`, `icon-512.png`, `apple-touch-icon.png` from updated `vitail-logo-app.svg` / `scripts/build_app_icons_from_symbol.py`; `manifest.json` `background_color` aligned.
0.5.29
2026-03-22
- Primary goal **`hybrid`** is labeled **Functional** (EN) / **Funktionell** (SV); the stored value stays `hybrid`. Program flavor **`crossfit`** becomes **`mixed_metcon`** (DB migration + normalization on load/save). Legacy form values `crossfit` / `wod` / `cf` still map to the same behavior. User-facing copy avoids third-party trademarks; rotating benchmark metcons and Wendler barbell template for that track are unchanged.
0.5.28
2026-03-22
- Removed **Tactical** as a primary goal (unclear in product). Profiles with `goal=tactical` migrate to **`hybrid`** (UI: Functional) on DB init; forms and loads coerce the same. CLI goal menu updated. Workout Plan copy for tactical phases removed; longevity overview notes a planned **bodyweight** track under the same goal (docs + i18n roadmap).
0.5.27
2026-03-22
- Workout log (/logs): delete restores saved state when possible — on complete, the app stores an undo snapshot (user_progression for that lift, Wendler week, running meso week). Deleting the log entry applies it then removes the row. Older log rows without a snapshot are only removed from the list.
0.5.26
2026-03-22
- PWA: service worker at /sw.js precaches same-origin /static assets (CSS, JS, icons, manifest) and serves them from cache when offline or slow; bump CACHE_VERSION in static/vitail-sw.js when changing cached files.
0.5.25
2026-03-22
- Today check-in: time available (30–90 min) is parsed from the form and passed into session generation (previously ignored on submit). Endurance plans now run the same time-budget pass as strength (rationale tag + estimated duration / block times).
0.5.24
2026-03-22
- Profile injury/limitation notes are always woven into generated session plans (rationale, failure policy, prep, primary and supporting blocks) and shown in a prominent banner on the workout page from the live profile (EN/SV).
0.5.23
2026-03-22
- Feedback page (/requests): same form for feature ideas and bug reports; optional type (feature / bug), stored and shown as a badge; copy and nav label updated (EN/SV).
0.5.22
2026-03-22
- Timer: large settings (gear) button always visible — portrait scrolls to controls, landscape toggles sheet; larger tune control in landscape; EN/SV aria labels.
0.5.21
2026-03-22
- PostgreSQL (e.g. Railway): on init, try CREATE EXTENSION pg_stat_statements so platform query-stats UI stops logging “relation does not exist” (ignored if the role lacks permission).
0.5.20
2026-03-22
- Feature requests: normalize created_at to strings for PostgreSQL (fixes /requests 500 when slicing dates in the template). Docker: run with Gunicorn instead of flask dev server.
0.5.19
2026-03-22
- PWA: fix Add to Home Screen on iPhone — tapping the icon no longer immediately closed the instruction bubble (clicks targeted the inner span). Show the install hint on all iOS browsers (not only Safari). Clearer Share / Add to Home Screen copy.
0.5.18
2026-03-22
- Feature requests (/requests): fix internal server error — ensure DB migration runs on each load, rewrite vote aggregation with a subquery (PostgreSQL/SQLite-safe), and broaden areas_json column detection to any schema on search_path.
0.5.17
2026-03-22
- Workout log: fix crash for Wendler sessions (work sets use kg, not weight) and for secondary/aerobic stored as lists or objects. Feature requests: optional multi-select areas including aerobic (and Today, workout blocks, log, My Records, etc.), stored and shown as tags.
0.5.16
2026-03-22
- Workout: short “Why today’s plan” card from Today check-in; enrolled-program progress line; link to Timer with URL presets (interval/rest matched to primary work). My Records: modalities in collapsible sections, vertical distance rows (no horizontal scroll), “Previous best” under strength and endurance fields. Copy aligned with Workout log / My Records; Today controls use tap-friendly min height.
0.5.15
2026-03-21
- Security: on hosted deploys (FLASK_ENV=production or Railway production), the app refuses to start without SECRET_KEY or FLASK_SECRET_KEY. Event-goal research API (/profile/research-event) now requires a signed-in user; it stays available during profile onboarding.
0.5.14
2026-03-21
- UI polish: Inter font weights 300–600, antialiased body text, shared design tokens (--radius-*, --text-muted). Database module uses a single open_connection() entry point; PostgreSQL placeholder helper is adapt_sql (alias of internal _q).
0.5.13
2026-03-21
- Registration requires accepting a health & liability disclaimer (own risk, not medical advice, limitation of liability). Feature Requests (/requests) is login-only; guests are redirected to sign in.
0.5.12
2026-03-21
- Optional beta registration gate: set BETA_MAX_USERS (e.g. 10) to cap accounts, and BETA_INVITE_CODE or BETA_INVITE_CODE_HASH (SHA-256 hex) so new sign-ups need a shared invite. Unset env vars = unchanged open registration.
0.5.11
2026-03-21
- Gym timer: in landscape orientation, the control sheet closes automatically when you press Start so the digits stay full-screen while the session runs.
0.5.10
2026-03-21
- Gym timer sounds reworked: sine waves with attack/release envelopes and light low-pass filtering (less clicky than square-wave pings). Slightly retuned frequencies for armed / countdown / GO.
0.5.9
2026-03-21
- Gym timer: Web Audio beeps — short armed tone on Start; during +10s pre-start, beeps on 3-2-1 and a double GO at zero. Interval and EMOM modes use the same 3-2-1 + GO at each phase / round boundary. Sound toggle below +10s (default on).
0.5.8
2026-03-21
- Added Feature Requests page (/requests) — a lightbulb icon in the top controls opens a public board where logged-in users can submit ideas and everyone can browse them. Email addresses are masked (first 2 characters visible, rest hidden).
0.5.7
2026-03-21
- Added Workout Log page (/logs) under the Account menu. Shows all completed sessions with primary lift, secondary work, aerobic block, readiness signals (sleep/hydration/fatigue), perceived effort rating, and session notes.
0.5.6
2026-03-21
- Sleep input changed from a numeric hours slider to a simple Poor / OK / Good selector, consistent with the hydration field. Session state logic updated accordingly.
0.5.5
2026-03-21
- Extended database to track user-executed workouts: added session_sets table for per-set logging (weight, reps, RPE, distance, pick-one choice) and pr_history table for longitudinal PR trending.
- Daily readiness check-in (sleep, hydration, fatigue, cycle phase, time available) is now stored alongside each session for rolling fatigue analysis.
- Post-session feedback added to workout completion: perceived effort rating (1–5 with emoji) and a free-text session note.
- Profile enriched with four new fields: body weight (kg), equipment available (full gym / dumbbells / bodyweight / home), event date, and injury/limitation notes.
- PR saves now automatically append a snapshot to pr_history for both strength lifts and endurance times.
0.5.4
2026-03-21
- Replaced all custom SVG and emoji icons with Material Symbols (Google's Material Design icon library). Covers top controls (info, install, theme) and the nav bar (today, workout, timer, account).
0.5.3
2026-03-21
- Login and register merged into a single tabbed page — Sign In / Register tabs, no redirect bounce. Register errors stay on the register tab with email pre-filled.
0.5.2
2026-03-21
- Added N/A as a third sex option on the profile page. Menopause/cycle-tracking fields remain female-only.
0.5.1
2026-03-21
- Field-level encryption for sensitive profile data (sex, menopause status, event goal summary) using AES-128 Fernet. Requires VITAIL_ENCRYPT_KEY env var; degrades gracefully to plaintext if unset.
- Updated 'About VITAIL' tooltip to accurately reflect data storage (server-side, encrypted, no analytics).
0.5.0
2026-03-21
- UI redesign: premium light-mode palette aligned with brand colors (accent #534AB7, text #1A1A2E).
- Top controls converted from separate floating buttons to a single grouped pill toolbar.
- Version badge moved from fixed top-left to footer alongside copyright.
- Navigation: borderless tiles with SVG icons above labels; active tab is a filled purple pill.
- Account tab chevron replaced with a person icon.
- User info shown in a card with accent left border; 'Sign out' styled as a ghost button.
- Cards: 16px border-radius, soft shadow in light mode (no hard border).
- Tagline clamped to 2 lines with max-width 260px to prevent single-word wrapping on mobile.
- Horizontal padding increased to 24px throughout; section spacing increased to 32px.
- Inter loaded as primary UI font.
0.4.4
2026-03-21
- Brand assets integrated: SVG favicon (symbol), app icons regenerated from real logo, Inter 300 loaded for wordmark rendering.
- Header wordmark replaced with branded 'vitail' logotype — 'vit' and 'l' in theme-adaptive text color, 'ai' in brand orange (#FF6B00), font-weight 300.
- Manifest theme_color updated to brand purple (#534AB7).
0.4.3
2026-03-21
- Added PWA support: manifest, app icons, and iOS meta tags so VITAIL can be installed to the home screen on any device.
- Added 'Add to Home Screen' install button next to the language flags: shows the native install prompt on Android/Chrome, and a Safari share-sheet instruction on iOS.
- Mobile layout audit: fixed header padding to clear the expanded top-bar, added narrow-screen (≤400px) breakpoint so all four controls fit cleanly on iPhone SE.
0.4.2
2026-03-21
- Added forgot-password flow: request a reset link by email, then set a new password via a secure one-time token (expires in 1 hour).
- When no SMTP server is configured (local dev), the reset link is printed to the server log and shown as a dev-mode flash message.
0.4.1
2026-03-21
- Fixed: progression table no longer corrupted when doing a one-off session under a different program (e.g. Wendler user doing a Functional pass). Lift rotation still advances correctly, but weight and progression timestamp are protected unless the session protocol matches the user's current profile.
0.4.0
2026-03-21
- Workout now realistically fits your chosen time budget.
- Time tier logic corrected: 45 min removes both secondary and accessory (previously only accessory); 60 min removes accessory (previously nothing was removed).
- Mixed-metcon benchmark workouts filtered by available time — e.g. 45 min budget only picks shorter benchmarks (Fran, Grace, Annie, etc.); Murph/Eva/Chelsea reserved for 75–90 min sessions.
- Each workout tile now shows an estimated duration (~X min), and the session hero shows total estimated time with a color-coded warning if it exceeds your budget.
- Metcon estimates shown inline (e.g. named benchmark ~10 min).
0.3.9
2026-03-21
- Fixed: 'No saved max for Bench Press' modal appearing even after saving a bench PR. The modal now checks the live profile instead of the stored session flag.
- Saving PRs now invalidates the current draft session so the next workout is regenerated with the correct working weights.
0.3.8
2026-03-21
- Time input fields now accept plain minutes — typing '28' is interpreted as 28:00, '28.5' as 28:30. mm:ss and h:mm:ss still work as before.
- Improved error message when a time value can't be parsed.
0.3.7
2026-03-21
- Hybrid / functional programs now meaningfully distinct: Hyrox, mixed metcon, and balanced GPP each have a unique prep, secondary, accessory, and conditioning block.
- Mixed metcon track: named benchmark workouts rotate daily — Annie, Helen, DT, Fran, Grace, Cindy, Murph, and 13 others. Today's pick is shown in the aerobic tile.
- Hyrox track: dedicated station block (wall ball, sled push, sandbag lunges, burpee broad jumps) + specific running/erg engine intervals.
- Balanced GPP track: unilateral accessories, loaded carry superset, broad mixed-modal finisher at conversational effort.
0.3.6
2026-03-21
- BikeErg PR distances updated to standard Concept2 test distances: 500m, 1k, 2k, 5k, 10k, 20k.
0.3.5
2026-03-21
- Endurance Engine: endurance goal users now get a proper endurance-primary session (Zone 2 / tempo / intervals / absorb) instead of a barbell session with endurance notes bolted on.
- Endurance primary rotates through a 4-week meso cycle: base (Z2), build (tempo/threshold), quality (intervals), absorb (recovery).
- Strength maintenance secondary block preserved for endurance users — low volume, no leg grinders.
- Event research UI: enter a race name on the profile page and click Research to auto-fill event details via web search (+ AI summary when OPENAI_API_KEY is set).
- Event parsing extracted into vitail_event.py (internal refactor — no behaviour change).
- Changelog page added; version badge in top-left is now a link to it.
0.3.4
2026-03-21
- Changelog page — this view, accessible from the version badge top-left.
0.3.3
2026-03-21
- Endurance onboarding: first profile save redirects straight to My Records for pace calibration.
- My Records: strength section collapsed by default for endurance users; endurance times shown first with primary discipline highlighted.
- Workout PR splash: endurance users see a discipline-specific time-trial guide instead of the barbell starting-weight prompt.
- Language switcher: English (🇬🇧) and Swedish (🇸🇪) flags added to the top bar.
- Full Swedish translation across all pages and flash messages.
- Endurance focus selection on profile: choose primary, optional secondary, and optional tertiary discipline (running, cycling, SkiErg, etc.).
- Session hints and goal-axis text now reflect the chosen endurance discipline order.
0.3.2
2026-02-01
- Endurance PR grid: enter best times per distance; app derives pace per km or /500 m split.
- Time-budget bar on Today check-in; meso-week counter.
- Delete account flow with full data wipe.
- PR form hardening: better validation and error messages.
- Fix: init_db now runs before every auth and profile DB operation.
- Fix: login next-URL guard prevents open-redirect abuse.
- Deploy: VITAIL_APP_VERSION env override; git SHA baked into Docker image.
0.3.1
2025-12-10
- Running / endurance goal with pace-aware session extras.
- Welcome splash and profile-first onboarding for new users.
- Show / hide password toggle on login and register.
- Fix: sessions behind reverse proxy (ProxyFix, Secure cookies, SameSite=None).
- Fix: configurable SQLite path for containerised deployments.
0.3.0
2025-10-18
- Draft workout flow: generate, review, and mark complete — progression and history update on completion.
- Workout history: last 8 sessions shown on the Workout page.
- Gym timer: count-up, countdown, E×M, and interval modes.
- Hybrid strength programs added (GVT 10×10, Classic 5×5).
- Dockerfile for container deployment (Gunicorn, $PORT).
0.2.0
2025-08-05
- Full Flask web app replacing the CLI prototype.
- Today check-in: sleep, stress, soreness, and energy sliders feed the readiness model.
- Max-lift entry and bar-maths for Squat, Bench, Deadlift, OHP.
- Wendler 5/3/1 progression with auto-advancing meso weeks.
- Dark / light theme toggle persisted in localStorage.
0.1.0
2025-06-01
- Initial VITAIL physiological decision engine.
- Readiness model from sleep, HRV-proxy, stress, and soreness inputs.
- Session-state machine: fresh → normal → fatigued → overreached → deload.
- SQLite persistence for profile, progression, and session history.
- Linear 3×5 and basic periodisation logic.
← tillbaka
© 2026 SQUAB, Sverige. Alla rättigheter förbehållna.