>>> AI cycling coach for amateur racers

Built from your data. not a template.

Most personal coaches adapt a cookie-cutter plan to you. Good Legs studies your training history, learns which stresses your body actually adapts to, and builds the plan from there.

Systems fit
0
Workouts
0
Plans tried
0k
FTP / WATTS410340374W · baselineMAYJULSEPNOVJANMARMAY
13-month FTPflat ~ no gain

>>> How it learns

Six adaptation curves. All yours.

Aerobic endurance adapts in months. Anaerobic capacity adapts in days. Good Legs reads your past training day by day and learns the rate each system in your body absorbs stress and shakes off fatigue. The numbers below are what your data says, not a population average.

SystemDays to absorb (fit) / dissipate (fatigue)
Aerobic endurance
38d
Tempo
21d
Threshold
14d
VO2max
10d
Anaerobic
6d
Neuromuscular
3d

Each row is a system in your fitness model. The bar shows days to absorb training stress. The notch shows the days that fatigue lingers. These come straight from your individual posterior, not population averages.

L1 fitness-fatigue fit

State-space model in NumPyro. 1,000 MCMC samples, full posterior preserved. The numbers you see are individual to you, not population averages.

Rolling critical-power refit

P(t) = CP + W'/t fit on a 42-day rolling window, restruck every 7 days. CP and W' tracks form as fitness shifts.

Durability beyond fresh

Power retention after 1,500, 2,500, and 3,500 kJ of work in the same ride. The metric race-day pacing actually depends on.

Tell us your goal. We test forty thousand plans against your model.

Lift your 5-minute power. Raise FTP. Win the climb in August. Good Legs searches across eight training philosophies and a thousand candidate plans inside each, then surfaces the one that actually moves your number on your fitness curve.

  • 5goal metrics (1m, 5m, 20m, FTP, VO2max)
  • 8training philosophies, real citations
  • 1,000plans per philosophy, scored each time
  • 40ktotal evaluations against your model
Best plan per philosophy

HIT block

Rønnestad 2014

374W

14.2 h/wk

Norwegian threshold

Bakken, adapted

371W

17.1 h/wk

Sweet-spot build

Coggan, TrainerRoad

369W

13.4 h/wk

Sustained-power classic

Allen, Friel

366W

15.8 h/wk

Polarized 80/20

Seiler 2010

362W

16.2 h/wk

Pyramidal

Lucia, Mediterranean

358W

15.6 h/wk

Reverse periodization

Friel, UESCA

351W

18.4 h/wk

Sprint endurance

Mujika, Bosquet

339W

12.8 h/wk

>>> The library

Two thousand workouts. The right one for your week.

The model picks the shape of your week. The catalog fills it with the actual workout that matches your goal, your phase, and what your body responded to last time. Every option is a named coaching protocol with real power targets and recovery ratios.

/Rønnestad 30/15 118%FTP/Sweet-spot 4x12 91%FTP/Norwegian 6x6 96%FTP/Coggan tempo 90/10/VO2 5x5 114%FTP/Microburst 30/30 120%FTP/W' burner 10x1 150%FTP/Standing-start sprint 8x10s/Threshold 2x20 98%FTP/Over-unders 95-105%/Race-sim crit 60min/Pre-race openers 3x30s/Rønnestad 30/15 118%FTP/Sweet-spot 4x12 91%FTP/Norwegian 6x6 96%FTP/Coggan tempo 90/10/VO2 5x5 114%FTP/Microburst 30/30 120%FTP/W' burner 10x1 150%FTP/Standing-start sprint 8x10s/Threshold 2x20 98%FTP/Over-unders 95-105%/Race-sim crit 60min/Pre-race openers 3x30s
/Climbing repeats 4x8 100%FTP/Tempo cruise 2x40 85%FTP/VO2 pyramid 1-2-3-3-2-1/Anaerobic 4x2 130%FTP/Endurance Z2 3.5h/Sweet-spot 3x15 92%FTP/Flying sprint 6x12s/Threshold 4x10 100%FTP/Norwegian sub-thr 5x8/Torque reps 50rpm/Active recovery 50min/Long Z2 with surges/Climbing repeats 4x8 100%FTP/Tempo cruise 2x40 85%FTP/VO2 pyramid 1-2-3-3-2-1/Anaerobic 4x2 130%FTP/Endurance Z2 3.5h/Sweet-spot 3x15 92%FTP/Flying sprint 6x12s/Threshold 4x10 100%FTP/Norwegian sub-thr 5x8/Torque reps 50rpm/Active recovery 50min/Long Z2 with surges
450

Endurance + tempo

Z2 steady, sub-threshold inserts, Coggan 90/10 tempo, low-cadence climbing.

410

Threshold

2x20, 3x15, 4x10. Norwegian 5x8 and 6x6 sub-threshold. Threshold pyramids.

590

VO2max

Classic 4x4 and 5x5. Rønnestad 30/15. Microbursts 30/30 and 40/20. Tabata.

380

W' and sprint

W' burners 10x1. Standing-start and flying sprints. Roll-down race sequences. Torque reps.

Cited protocols include Seiler 2010, Rønnestad 2014, Coggan and Allen (Training and Racing with a Power Meter), Bakken sub-threshold (adapted), Friel (Training Bible), Mujika on tapering, Issurin on block periodization.

The verdict cites your data, line by line.

Every number the diagnostic states is traced back to a row in your data. We strip uncited claims at runtime, so what you read is what we can prove.

Verdict

Every number traces back to a row in your data

Your FTP at 360W has held inside a 6W band for the last 13 months^1. The model says you have room. Three things explain why you haven't moved it.

  1. 1. Back-to-back hard days

    Out of your last 14 hard sessions, 9 landed less than 24 hours after the prior hard session^2. Threshold τ_fit is 14d, τ_fat is 7d. The next stimulus arrived before the last one finished.

  2. 2. Anaerobic system dormant

    30-second to 2-minute power is flat across the season. W' is 18.4 kJ, 14% below your career peak^3. No race-attack repeats or 30/15s in the log for the last 9 weeks.

  3. 3. Durability cliff

    5-minute retention drops from 95% fresh to 78% after 2,500 kJ^4. The literature (Maunder, Van Erp) calls this a finishing-strength gap, not a fitness gap.

Citation table

  • ^1users.ftp_w 12-month series= 374W -> 360W (-3.7%)
  • ^2context_tags hard_back_to_back= 9 / 14 sessions (64%)
  • ^3L1 fit, w_prime_kj_median= 18.4 kJ
  • ^4durability_observations.retention_pct 2500kJ_p300= 78%

>>> The simulator

Try a change. See it on your numbers first.

Add a VO2 session. Cut a hard week. Drag the levers and the simulator rolls your model forward and shows what your 1, 5, 20-minute power and FTP land at, with the model's own range. You decide before you train it.

  • Named scenarios pre-fill
  • Drag the levers live
  • Model range, directional
  • Adopt it as your plan
Counterfactual rolloutmodel range · directional
1m5m20m60m

1m

+0W(+0.0%)

5m

+0W(+0.0%)

20m

+0W(+0.0%)

60m

+0W(+0.0%)

Start from a scenario

Endurance6h/wk
Threshold1/wk
VO2max1/wk
Sprint0/wk
Recovery50%
Horizon60d

~6h Z2 · 2 hard/wk · 60d rollout

Adopt this plan

From your data to your plan in four moves.

Every piece above is one part of a single loop. Here is the path you actually walk, from the first connection to the plan that keeps re-fitting to your real training.

Connect your power data

Link Strava or intervals.icu, or drop a CSV. Good Legs reads your history. It never writes back to it.

  • /Strava, intervals.icu, or CSV
  • /Tokens encrypted at rest, AES-256-GCM
  • /Power-meter data, read-only

Stop adapting a template. Get a plan made for your body.

Connect your power data. Pick the goal you want to move. Good Legs reads your history, fits the model to you, and hands back a 12-week plan that earned its place against forty thousand alternatives.

Free for early riders. No credit card.