The challenge
Training and nutrition plans are usually static spreadsheets; the adjustments that matter happen in a coach’s head and are rarely explained.
What we built
A pure-Kotlin adaptive engine with no framework or database dependencies, wrapped in a Spring Boot API (JWT, Argon2id) and an Angular progressive web app that works offline. Table-driven engine tests, Testcontainers against a real PostgreSQL and Playwright end-to-end runs guard the behaviour.
What changed
Every session feeds the next one, and every change to a plan comes with a one-sentence reason the athlete can read.