How it works
A race is not an average speed.
It is a few thousand short segments that each cost you something. Everything here comes from that one idea. Below is the shape of the math, and an honest account of where it is least reliable.
Three steps
GPX in, plan out.
-
1
Define the trail
Drop in a GPX from a race listing, Trailforks, RideWithGPS, Komoot, Strava or your head unit, or stitch several into one route. The terrain is read off the file, the trail’s own corners suggest where the ground changes, and you name each section or describe the course in a sentence.
-
2
Set the pace
One slider across the top, drawn on what each pace costs and buys: finish time falling, reserve at the line collapsing, and a red band where you empty before the finish. Weight and FTP are set once and stay set.
-
3
Fuel it, mark it, take it with you
Carbs per hour on the same kind of slider, feeds placed for you, markers that ride to your head unit, and a one page sheet, top tube sized.
What you need
A GPX file and your weight will produce a plan.
Everything else sharpens it.
Speed
A force balance, solved segment by segment.
Your watts push forward. Gravity, rolling resistance and air drag push back. Whatever is left over accelerates or slows you, and that speed carries into the next segment, which is why momentum over short risers is preserved instead of being averaged away.
Three different things can be the limit at any moment:
- Power on climbs. You are simply against gravity.
- Handling on twisty trail. Curvature sets a ceiling that no amount of fitness gets you past, which is why watts have diminishing returns on singletrack.
- Braking on steep descents, so speed builds into the ceiling and bleeds off rather than being pinned flat.
Riders also do not hold one number. The model surges above average on climbs and soft pedals on descents, the way people actually ride.
Fatigue
Two loads run at once.
Aerobic load accrues every second you are on course and is never repaid mid race, so a long day costs more than a short one over identical terrain. Acute load is the sharp stuff: it builds when you are above your own average effort and pays back when you drop below it, which is what makes climbs bite and descents feel like relief.
Both are scored against what is sustainable for a race of that length, not against a fixed line. Holding 78% of FTP is a fair ask for two hours and an impossible one for six, so the reference slides with duration.
100% does not mean you stop. It means you have reached the end of what the model can express. If you are pegged there with half the race left, the viability banner says so in words, because a percentage cannot show how far past the limit a plan actually is.
Anaerobic reserve
A second clock, for the sharp end.
The fatigue curve above is built for a long day. It was fitted against races of two and a half hours and up, and it measures the thing that decides those: how much of yourself you have spent by the time the hard part arrives. Under about ninety minutes it reads structurally low, because there was never time to accumulate a day’s worth of load, and a hard fifty-minute lap does not fail on that mechanism anyway.
It fails on this one. Above your threshold you draw on a finite reserve, the anaerobic work capacity that physiologists call W′. Below threshold it refills, faster the further under you sit, which is the published critical power model rather than a rule of thumb. Empty it and you cannot hold power above threshold any more, whatever your legs or the fatigue curve say. That is a mechanical ceiling, not a warning, and the plan reports where on the course it would hit it and by how many kilojoules the plan overspends.
The acute load in the fatigue curve is the rough version of the same idea, scored against your own average effort. The reserve does it properly, against your threshold, with the recovery kinetics from the literature. Both run on every plan. On a short course the reserve is the constraint that binds and the fatigue percentage is context; over a few hours it reverses, the pace preset scales down with duration, the reserve sits comfortable and fatigue and fuel become the story. The verdict says which one is deciding this ride rather than reciting both.
One correction sits between the physics and the reserve, and it is the same steep-pitch problem noted under known gaps below. The speed solver holds a minimum speed and will demand whatever wattage keeps you moving on a wall, which for most riders is far more than they can produce. That is a fair simplification for predicting time, since you either make the power or you walk and the clock runs either way. Fed straight into the reserve it would drain you against watts you never made. So efforts are capped at your aerobic ceiling, about 1.2 times threshold, and the segment is stretched to conserve the work the hill actually costs: you do not do less, you take longer, and the reserve pays for the grind rather than the fantasy.
The size of the reserve is the softest number here. It defaults to 20 kJ, the middle of the range for trained amateurs, and you can set your own in your profile from a three-minute all-out test. Until it is your number rather than a population one, the reserve alone is not allowed to declare a plan unrideable; it can say hard, and it can say where, but the harshest verdict on the page is reserved for evidence that does not rest on a default.
Why FTP matters
Terrain demands absolute watts. What they cost is personal.
A steep pitch costs the same wattage whoever is riding it. The difference is what that wattage means to you. A pitch that sits at 70% of a strong rider’s threshold might be 130% of yours, and you will be over threshold on every climb while also being out on course much longer. The cost compounds twice.
If your FTP is wrong, the speed prediction stays roughly right but the fatigue and viability verdicts drift. It is the number most worth testing honestly.
Fueling
You cannot fix a deficit at the moment you feel it.
Calories come from your watts. Crank power already includes every metre of climbing, so the burn is watts times hours times one fixed conversion: about 22% of the food energy you spend becomes work at the pedals and the rest is heat. Climbing is not added a second time. Your training calibration then scales that figure to you.
You start with a glycogen store that scales with your weight: about 1,800 kcal for an 84 kg rider who is rested and fed normally. Muscle glycogen is a concentration, so a bigger rider carries more of it. Loading for two or three days adds about a third, a hard ride the day before takes about a quarter off, and the plan asks which of those describes your morning. Only the carbohydrate share of your burn draws on the store, and that share rises with intensity, which is why a hard short race can still empty the tank.
Only carbohydrate counts. Fat and protein are real calories, but they cannot be oxidised fast enough to defend glycogen at race intensity. A 220 kcal bar that is 30% fat delivers about 155 usable kcal; a gel is close to pure carbohydrate. Your fuel total counts every calorie you packed. Your deficit counts only the carbohydrate.
Your gut ceiling depends on what you are eating, not on you. Glucose and maltodextrin cross the gut wall on the same transporter, and it saturates near 60 g per hour however practised you are. Fructose uses a second transporter that does not compete, so a glucose-fructose mix carries 90 to 100 g per hour. That is 240 against 400 kcal per hour, and on a long day it decides whether a fuel plan can close at all. You tell the app which you are on; check the label rather than guessing.
Fuel you eat goes to your gut first. Swallowing a large amount at once does not erase a deficit the moment you swallow it, and eating past the ceiling is not counted as helping, because it does not.
Performance fades well before empty. A quarter of the way into the store, recovery between efforts starts to blunt, which is the part riders actually feel. Past a third, every effort reads harder than the watts say it should. That is why the plan puts fuel in long before you would think to reach for it.
Physics sliders
Two riders with identical FTP still differ.
Three settings describe how you handle terrain, which is the part of riding that physics cannot read off a GPX file. They change how much the day costs your legs. They do not change your predicted finish time.
The defaults are fitted against real race telemetry. Leave them there until you have raced with the app and know how the curve compared to your day, then move the one you have a genuine opinion about. Honest self-assessment produces a plan you can ride; optimistic self-assessment produces one you cannot. Nothing is kept until you save, so trying a setting out cannot quietly rewrite your profile.
Surface
The ground is worth more than the bike.
Measured against a race file with power: the same cross country bike needed less than half the rolling resistance on Birkie trail and forest road that it did on singletrack. That is 13 to 17% of your finish time, a larger effect than the gap between any two bikes in the list. Which makes treating a whole course as one surface a real problem, because almost no course is.
So the route can be split into sections, each priced separately. Rolling resistance and the handling limits are resolved per section, and the physics runs across the joins exactly as it does everywhere else, carrying your speed from the pavement onto the gravel rather than starting fresh.
Where surface bites hardest is where it is flat. Measured inside one ride that was part sealed road and part forest road, pavement was 46% faster on flat ground and no faster at all on a 3 to 6% climb. Rolling resistance is a fixed force, so once the road tilts up, gravity swamps it. On a steep course this setting changes little. On a flat one it changes everything.
Where the sections come from
Three ways in. The trail’s own corners suggest where the ground changes, since singletrack turns and a forest road does not, and you name each piece. Or draw the sections yourself on the profile. Or describe the course in a sentence. Whichever way, anything you have not answered stays marked as not set and is modelled as the picker says, never guessed, so pressing Suggest sections cannot change your finish time on its own.
Telling it, in the way you would tell a friend
Dragging boundaries around a map is slow, and nobody thinks about a course that way. So you can write it down instead: “first 13 miles paved, then forest road to mile 69, singletrack to 70.4, gravel home”, and that becomes the sections the model uses.
Worth being precise about what this does, because the distinction matters. It restructures what you said. It does not look the trail up. A language model has no map data, so asking it what surface sits at a coordinate would get you something confident and invented, and a made up surface tag looks exactly like a measured one while quietly changing every number that follows. The distances and the surfaces both come from you. Its whole job is turning your sentence into breakpoints. What comes back is shown for review before it is applied, and anything it cannot place is simply left alone.
Once tagged, the map and the elevation profile can be colored by surface, so you can see the ground change under you and check the tagging against what you know of the course.
Play by play
Not a prediction to admire. A search for advantage.
A finish time tells you what the day costs. It does not tell you where the day is won, and on singletrack those are not the same question. So the solver records something extra on its final pass: at every step, what actually set your speed.
There turn out to be two answers rather than three. Either your legs set it, in which case more power really does mean more speed. Or the trail set it: the corner you are in has a speed above which you do not hold the line, and the brakes are simply what brings you down to it. Braking is the visible half of the same state, and it is energy you already paid for being turned into heat in a rotor.
Every stretch where it was not your legs becomes a play: where it starts, how long it runs, what it costs you, and what to do there in a sentence written from the ground rather than from a template. A braking descent reads differently from switchbacks on a climb, and both read differently from a tight flat section. Stretches where your anaerobic reserve refills are plays too, because knowing where the trail gives something back is worth as much as knowing where it takes.
They are drawn twice and you pick which: an overhead of the trail with each play numbered on it, or the elevation profile with the plays shaded under the line. Hover the picture and the play you are in lights up in the list beside it. Click a play and every other chart on the page locks onto that point, so you can read what your legs are doing when you get there.
Onto the bars
Mark the plays and each one becomes a note at the start of its stretch, carrying a cue short enough for a head unit to show: Set speed, Roll turns, Carry it, Let it run, Rhythm, Smooth, Recover. A note rather than a range, because a range takes its own metric value as its name, and 180W is not what you want read out to you at the top of a braking descent.
The plays come out of the same physics as the plan, so they move when the plan does. Change the surface on a section, say the day is muddy, put wider tires on, and they re-solve. They are not notes somebody wrote about this course; nobody has ridden it for you. The one thing they do not know yet is you. How hard you personally brake into a corner is not a slider and is not yet fitted from your rides, so the ceiling is the bike and the ground rather than your hands. That is the next thing calibration gets to.
Ride markers
The plan is no use in the car park.
A plan you read the night before is a plan you are recalling from memory at hour three, which is exactly when recall is worst. So the parts that decide the day can be marked and carried with you.
Drag across any chart to select a stretch, and the marker reads back what the plan already predicts across it. You are not typing a target in and hoping. You are reading out what the model says, which is why the number moves the moment your FTP, your bike or the surface does.
Your fuel points can be dropped in as markers too, so the unit tells you when to eat as well as when to push. A feed the model placed for you is named by what to eat there rather than by a number: 67 g carbs, or 1 gel · 23 g carbs.
Getting it onto the bike
Export the course and every marker as a GPX or a TCX course file. The difference is worth understanding, because head units do not agree. A GPX waypoint is a bookmark that happens to sit near a route. A TCX course point is part of the course itself, which is why a Garmin announces one and ignores the other.
Checked against each vendor’s own documentation in September 2026. If your unit is not in that list, the route will still import; whether the markers come with it is the part that varies.
After the ride
The plan gets better once you hand the ride back.
Everything above runs on a course file and a profile. None of it has seen you ride. The first time it does is when you give it a recording of a ride on a course you planned, and that is the point where the model stops being a generic physics engine with your weight typed in and starts being fitted to you.
Two ways in, and they are not equal
Either way the ride is checked before it is kept. If you started the watch at the trailhead and stopped it in the driveway, the part that is not on the course is found and offered as a cut, with the distance stated; you can decline and keep the whole thing, in which case it is marked as not calibrating. A file that averages 35 mph, or jumps distance, or carries a minute at car speed, is flagged before it can teach the model anything.
Calibration: one number, and how sure of it
The solver takes the ride’s recorded moving time and average power and asks a single question: what scale on your stated FTP makes this model reproduce this ride on this course? The answer is one scalar. 0.93 means the model was running you about 7% strong; 1.04 means you rode a little better than your number. It is one parameter on purpose. A fit with more knobs than rides will reproduce any single ride perfectly and predict the next one worse.
Alongside the scalar comes a band. The same solve is repeated with rolling resistance moved 15% either way and moving time moved 2% either way, and the spread of answers is stored with the number. A tight band clear of 1.0 means the ride separated you from the model. A band that crosses 1.0 means it did not, however good the ride felt. That band is what the rest of the app reads to decide how precise it is allowed to be.
Two rides do not calibrate at all, and the app says so rather than fitting them anyway: a plan with drafting on, because the shelter of the riders in front would be fitted into your FTP and then applied to every solo ride after it, and a Strava import, for the reason above.
Precision is the confidence display
No number on the plan is shown more precisely than the data behind it earns. With no ride of yours in the model, the finish is a range rather than a time, because 1h 47m would be fake precision. Calibrated with a wide band, it is a single time to the nearest five minutes with an approximate mark. Calibrated with a tight band, it is to the minute. The color says which: green, orange, or a translucent amber for no data yet, with a legend under the tiles.
Progression
Every ride you log on a course is kept against the plan it was compared to, in order, and the Progression page reads them together: how far each landed from its plan, and between your first ride and your latest, where on the course the time moved. Adjacent stretches that moved the same way are merged so a two-part climb reads as one place, anything under twenty seconds is left out as noise, and the three biggest gains and losses are named by distance.
The first line on that page is how much of a claim the data can support. Twelve weeks out with two rides logged does not get a fitness verdict, and it does not go red either, because red reads as unfit and the data cannot say that. It says what would change it. And the page is plain that it is not yet corrected for wind, heat or ground between the two days, which move a finish time more than a month of training does. That correction is what comes next.
Accuracy and limits
Where it is good, and where it is not.
The speed model is fitted against real race files with power meters on them, by solving for the power that reproduces the actual moving time and then comparing predicted speed to recorded speed section by section. Across flat, rolling and moderately climbing terrain, which is the large majority of a typical course, predictions land within a couple of miles per hour.
How well fitted is not the same as how well tested
Worth stating plainly, because most calculators do not. The constants in this model come from a small number of race files, from a small number of riders, on Midwest courses. On those files it is accurate to within a few percent on finish time. That is the fit working, and it is the minimum you should expect, not proof of anything.
What it does not yet show is how the model behaves on terrain it has never seen: high mountain courses, deep sand, sustained rock, anything far outside the ground it was measured on. Files from new courses are what close that gap, and until they arrive the honest position is that this is a physics model with a narrow evidence base rather than a broadly validated one.
Two things follow. Treat a prediction on unfamiliar terrain as a good estimate rather than a number to plan a season around. And if a race goes very differently from the plan, that is worth knowing about, not embarrassing.
Two known gaps, both on steep ground
- Steep unpaved climbs, over-predicts. On sustained pitches of roughly 14% and above, many riders get off and walk. The speed model always assumes you keep pedalling, so it can predict a speed well above what you will really do. The anaerobic reserve no longer inherits this: it caps those pitches at your aerobic ceiling and charges you for the grind, as described above. The finish time still does not, and remains optimistic on walls.
- Steep paved climbs, under-predicts. The model applies off-road rolling resistance and handling limits everywhere. On pavement you keep full traction and can put power down, so real speed can run above the prediction.
There is no surface type in a GPX file, so the model cannot read it from the course. What it can do is be told, and it can now be told section by section rather than once for the whole route: see below. On courses that mix pavement with dirt, the steepest paved sections remain the least reliable part of the plan. Everything else holds up.
On elevation gain: it is read from the GPS trace and smoothed. On files with noisy altitude data it can read meaningfully higher than the figure your head unit reports, because barometric altimeters filter small bumps more aggressively. If total climbing looks high, that is why.
On the file itself: two recordings of the same course are not the same input. Handling limits are read from curvature, which is degrees of turn per metre, and a file recorded at one point per second through the corners describes a very different trail from one that has been thinned out for sharing. We have measured the same course coming out more than twice as twisty on one file as on another. Prefer the densest file you can get, and expect a re-exported or simplified route to predict slightly faster than the real one.
No card. No account needed to try it.