Workout coach

Sign in

Trainers sign in with the account the admin set up for them.

Clients never sign in here; they get a one-time check-in link.
Every number cites its paper. Everything stays in one encrypted file.
signed in as

Clients

Sorted by who needs attention first (red: deload, pain or reduced readiness; amber: warnings or no recent feedback; green: fine).

Add a client
Overview

Workout coach

loading…
trainer phone view

Next-session prescription loading…

The exercises of a past session run through this client's history and the progression rules (every set done → smallest jump; missed reps → repeat; three stalls → −10 %; bodyweight → +1 rep). Programmes rotate, so pick which session it follows. Open in session log puts it in the grid to adjust and save.
exerciselast timeprescriptionwhy

Assessment

Deterministic rules computed in Rust from the log and the client's feedback; every item cites its arXiv source.

Next-session prescriptions

Loads from the weight-dependent 1RM formula (arXiv:2603.17495), adjusted for readiness / DOMS.

    Body weight & projection

    Weigh-ins from the sheet + logged; trend = linear fit over 120 d; projections integrate the Chow–Hall model arXiv:0802.3234

    Intake log

    Look up a food (Open Food Facts; USDA FoodData Central when USDA_API_KEY is set), enter grams, log it. Daily totals are compared with the expenditure estimate and the protein target; the 7-day mean gives the logged energy balance next to the one inferred from the scale.
    per 100 g:
    datemealfoodgkcalprotein

    Diet targets

    Energy: 0802.3234, compensation: 2107.13418, protein: 2410.16169

    Progress photos

    Sent by the client through the check-in link. Kept only in the encrypted record; never part of the AI context; deleted with the client.

    Estimated 1RM

    e1RM = w·(1 + (r−1)0.85/(−2.55 + 4.58·ln w)) — arXiv:2603.17495. Sets ≤ 12 reps; not always to failure → lower bound.

    Trainer's PB table over time

    Running maxima of the PB box at the top of each session block.

    Muscle strength by group

    Working max (best e1RM of the last 12 weeks) of every lift loading a group, as a body-weight multiple on the common beginner to elite standards ladder (a coaching convention, not from the papers; e1RM is arXiv:2603.17495). The body on the left paints the same: blue untrained, red advanced; switch it to 12-week progress in its controls.
    grouplevelstrongest liftx BWvs competitors12-wk trendlifts counted

    Versus competitive powerlifters (OpenPowerlifting)

    Lift catalogue

    liftpatternsessionsbest e1RMonlatest e1RM12-wk trendlast

    This week vs the plan

    Working sets per muscle group this week (Mon–today) against the target on the profile, with the last-4-week average for context. For most people 8–12 quality sets per group per week is plenty; consistency beats volume.

    Weekly volume load

    Σ reps × kg per week (bodyweight moves counted at 0.5 × body mass — an assumption).

    Acute:chronic workload ratio (EWMA 7 / 28 d, last 26 weeks)

    EWMA λ = 2/(N+1) — 1706.04336; uncoupled chronic window & 0.8–1.3 band — 1907.05326

    Fitness – fatigue (Banister impulse-response, last 52 weeks)

    P(n) = P₀ + Σ w(i)[k₁e^{−(n−i)/τ₁} − k₂e^{−(n−i)/τ₂}] — 2505.20859

    Movement-pattern balance (last 8 weeks, sets)

    Set counts by pattern from the log.

    Recovery by muscle group

    Residual fatigue = sets over 28 days decayed with a 2.5-day time constant (the DOMS window), capped, raised to the latest DOMS rating. The body on the left shows it: blue fresh, red fatigued, grey nothing logged in 28 days.
    groupstatefatiguesets 7 dsets 28 dlast trainedDOMS

    Sessions

    date#srcstatusprogramme / notessetsrepsload kgexercises

    Week

    Your bookings across all clients. Click a free slot to book; click a booking to move it, mark it done, cancel it (client or your reasons) or note a no-show. Package sessions are counted by the policy below; a client cancelling inside the late window counts as a session when that policy is on.

    Coming up

    Next two weeks, with what each session costs the client's package.

    Sessions & packages

    For the selected client: single sessions, pay-as-you-go, or a block of 6 / 12 / any number. A block is used up by done sessions, no-shows and late cancellations (policy). The client list warns when one session is left.
    boughttypeusedleftexpiresnote

    Working hours & policy

    Slots are offered inside these hours. Late-cancel window and whether a late cancellation or a no-show uses a package session.

    Log a session new

    Same columns as the trainer's spreadsheet. Start typing an exercise: the client's own exercises come first (with what they did last time), then the library. Picking one fills sets, reps and weight from the last performance plus the progression rule (shown in italics until you edit them). Notation as in the sheet: sets 3, reps 5/8-10/3X5+/10SEC, weight 70, 80, 95K/15S (dumbbell pair)/BW. A row with an empty exercise adds sets to the row above.
    Spreadsheet keysEnter down · Shift+Enter up · Tab next cell · ←↑→↓ move (left/right at the edge of the text) · Shift+click / Shift+arrows / drag select a range · Ctrl+C Ctrl+X Ctrl+V copy, cut, paste ranges (works with Excel) · Delete clear range · Ctrl+D fill down · Ctrl+Z / Ctrl+Y undo, redo · Esc cancel the edit · Alt+↑/↓ move row · right-click a row for insert / duplicate / delete · click a row number to select the row. Drafts are kept in this browser until saved.
    ExerciseInfoWarm upSetsRepsWeightRestCommentsComplete
    00:00

    What this session hits type exercises above

    Live from the grid: sets per muscle group via the exercise library; the body on the left paints it (blue nothing, red most sets, secondary muscles faint). Use it to spot gaps before you save.

    Coach's suggestions rules + AI

    Per exercise, from the client's own history: every set completed → smallest jump (+2.5 kg upper body, +5 kg squat/hinge, +1 kg per dumbbell); missed reps → repeat; three stalls → −10 % deload (arXiv:2511.17610); bodyweight → +1 rep; timed → +5 s. Loads are shown as % of the weight-dependent e1RM (arXiv:2603.17495). The AI coach then reviews the whole draft — it needs the OpenRouter key and the client's AI-coaching consent (Settings), and sees a pseudonymised context.
    Type exercises in the grid to get suggestions.

    Programme block none

    A few named sessions rotated in order (e.g. A / B, or push / pull / legs) with a lighter week every few weeks. The next-session card on the Overview follows the rotation; each template is filled with the client's last loads and the progression rules (leave weight blank to use history). Build one from past sessions or edit the rows here.

    Balance of the plan

    Sets per muscle group in the grid vs the last 28 days of training.

    Logged sessions

    Stored in the client's encrypted record; merged with the spreadsheet for every metric.
    date#programmenotesrowsRPE

    Client check-in new

    Record what the client reports (in person, by message, or from a check-in link): morning wellness items as in arXiv:2005.09024 (5 = best) and DOMS per muscle (click the body: 0→5, 5 = worst) as in 2608.06290. To let the client fill it in themselves, create a check-in link below.

    DOMS, click muscles on the body to rate soreness

    Each click adds one level (0 to 5, 5 = worst); a sixth click clears it. Saved with the feedback entry.

    Readiness today

    Combines wellness, sleep, DOMS and the load model into one call (cf. the Athlete Readiness Score in 2608.21530).

    Wellness history

    Mean of the 1–5 items, as % (5 = 100 %).

    Feedback entries

    datesessionsourcesleep hwellnessDOMSpainnotes

    Pain & injury log

    What hurts, since when, and what to keep away from. Active entries put a warning on any planned exercise that loads the site or matches an avoid keyword (in the planner, the next-session card and the phone view). Ordinary clients rarely need rest — they need a substitute; note it in the description. Mark resolved when it is gone.
    sincesitewhat / substituteavoidstatus

    Browse the library

    Pick a muscle group on the body or in the filters, or type a name. Hover a card to see its muscles on the body; pin keeps it there.

    Coach (OpenRouter)

    What the coach sees: a pseudonymised metrics JSON — no name, no phone — with the body-weight trend and diet targets, training load and readiness, lift e1RMs, recent sessions, feedback summaries and logged intake, plus the rule-based insights. Requires the client's AI-coaching consent (Settings → Profile). Answers are rendered sanitised.

    Profile

    Facts that are not in the spreadsheet. Body-fat % is estimated from BMI (Deurenberg) when empty.

    This client's data

    Export a copy, bring history in from another app, or erase everything. Kept in one encrypted file; nothing leaves the server without you.

    Import history

    Strong or Hevy CSV exports become logged sessions; an Apple Health body-mass export or a date,weight file becomes weigh-ins. Days already on file are kept.

    Right to erasure

    Removes this client's spreadsheet, log, weigh-ins, feedback, intake, photos, injuries, programme and profile, then compacts the file. Export first if the client wants a copy.

    Your account

    Signed in as . Change your password here; sessions on other devices stay signed in until they expire.

    Papers, textbooks and data sources

    Every model cites its arXiv paper (downloaded to papers/); open textbooks are linked for the physiology; datasets and licences are listed for attribution.
    arXivtitleused for
    • The Physiology of Exercise (Rosie Lanphere, open textbook): bioenergetics, metabolism, cardiovascular and endocrine responses.
    • Biomechanics of Human Movement (Hamm, open textbook): kinematics, kinetics, work and power, mechanisms of injury.
    • Basic Foundation of Nutrition for Sports Performance (Byerley, LibreTexts): digestion, energy, macronutrients, hydration.
    • OpenPowerlifting (CC BY-SA 4.0): competitor percentiles on the Strength tab.
    • Open Food Facts (ODbL) and USDA FoodData Central (public domain): food lookup.

      Getting started

      AI coach (OpenRouter)

      One key for the whole studio, kept in the encrypted store and only ever sent to OpenRouter. Trainers see whether the coach is on, never the key. An OPENROUTER_API_KEY environment variable seeds it.
      Store:

      Accounts

      You are admin, the deployment account. Onboard trainers with a welcome link: they choose their own password, nothing travels by message. Trainers see only their own clients; viewers are read-only (a physio, or a client looking at their own record).

      Admin password

      Set at deployment from WC_ADMIN_PASSWORD, or generated and written next to the database. Change it here; the file is removed once you do.

      Data, retention and backups

      Everything lives in one encrypted SQLCipher database (, key from ). Retention deletes feedback, intake, weigh-ins and logged sessions older than N days for every client.

      Backups

      Writes an encrypted copy of the database (verified by reading it back) into the backup folder. With a passphrase the key is sealed next to it, so the folder alone restores anywhere: workout-coach --restore file.db file.key.enc. Copy the folder to a cloud drive yourself; nothing is uploaded.
      Access log (last 100)
      whenwhoactionclientdetail