The problem
Most training plans are written once and then followed. By the third week they no longer match what the runner has actually done: a missed session, a cold, a race that went better than expected. Apps accept any goal time without asking whether it's realistic, and a human coach costs more than most amateur runners will pay.
I'm one of those runners, and I wanted a plan that reacts to what actually happened.
How it works
Roen connects to Strava and reads the runner's history2. Before any plan exists it answers one question honestly: is this goal realistic from where you are now? If it isn't, it says what would need to change first.
- A plan with phases and rules. Base, build, peak and taper, with hard limits on weekly load, long runs and how hard days are spaced. The limits are enforced by the engine, not suggested.
- Re-planning after every run. When a run is missed, the volume is dropped rather than squeezed into the following days. When a runner reports pain, the plan opens a 72-hour protected window with lighter load before rebuilding.
- An explanation for every change. Each adjustment comes with the reason behind it, in plain language.

Why it's built this way
The planner is deterministic: the same inputs always produce the same plan, and every rule can be traced to the code that applies it. A language model reads free text, such as "my calf felt tight today", but it never makes a training decision.

It's the same discipline a good valuation model needs. Assumptions are explicit, the rules can be audited, and the results can be reproduced. When I change a rule, a sweep regenerates 954 plans across every distance and level and shows what moved3.
Where it is now
The engine, API and web app are live, and a small group of runners is using it in a private alpha1. Next are race-day pace projections, fuelling guidance and sending sessions to a watch.
Sources
- 1Founder's count of invited athletes, October 2026.
- 2Live product.
- 3tools/sweep_event_specs.py and the engine's mathematical specification. The repository is private.