Coach Adaptatif
Sport science without the complexity — running in production at coach.jjoly.eu
the problem
Most strength-training apps hand you a rigid programme and a set counter. The models sport scientists have been using for fifty years — fitness-fatigue, Bayesian 1RM estimation, volume landmarks — are available nowhere to an ordinary lifter.
the solution
A self-hosted coach that runs those models in the background and adapts each session (load, volume, rest, exercise selection) to what the body actually went through:
- Banister model (1975): long-term fitness (CTL, 42 days) vs short-term fatigue (ATL, 7 days) → Training Stress Balance, the same approach used for professional athletes.
- 2D Bayesian Kalman filter: 1RM estimation with a genuine confidence interval and a projected trajectory.
- MEV/MAV/MRV volume landmarks (Israetel / Renaissance Periodization), calibrated against the Schoenfeld 2017 meta-analyses.
- Block periodisation (Issurin) and internal load via the session-RPE method (Foster, 1998).
- On-the-fly exercise swapping when pain is reported, guided stretching targeted at the sub-muscles actually worked, and a reaction-time test after each set.
technical choices
- Single-binary Go backend (~200 MB of RAM), framework-free frontend, distroless Docker image.
- Data sovereignty: fully self-hosted, GDPR compliance by design (explicit article 9 consent, articles 15-22 rights, audit log with 12-month rotation).
- Security: mandatory TOTP 2FA, AES-GCM encrypted integration tokens, read-only container with no capabilities.
- Strava integration (OAuth + webhooks), full data import and export.
in production
deployment k3s + Flux CD (GitOps) — see the infrastructure case study
pipeline push to main → tests → build → Trivy scan → GHCR → staging
tag vX.Y.Z → production (rollback = git revert)
monitoring native k8s probes, daily encrypted backups
The version actually running is shown, and dated, on the home page.