Route Engine: how Moveee picks the right road for tomorrow's workout
The Moveee team
Free coaching · a real route for every ride
A workout says "5 × 5 minutes at VO₂". It does not say where. If you live somewhere flat, your five-minute efforts end up on a road with traffic lights; if you live in the hills, they end up on a descent. The Route Engine's job is to answer the "where" for each planned session: it builds a loop from your door that puts the efforts on ground that fits them, on roads you already ride, at about the right length. This post explains how it decides, and where it still falls short.
Where you see it
Open any planned session from the calendar and scroll to the "Recommended route" card. While the engine is still working it reads "Finding the best route for this workout…"; when it is done you get a map with the route drawn on it, a fit score badge out of 100, distance and climbing, a small elevation profile and up to three plain-English reasons, such as "Do your efforts on Šmarna gora — 4.1 km at 7%, 6 km from home" or "A regular of yours — ridden 4× lately". If nothing fits it says so and offers the route builder instead.
The recommendations are computed in the background right after a plan is built, for every upcoming ride that does not already have a route, so the plan appears first and the routes fill in behind it. Rest days and explore days are skipped.
Step one: turn the workout into a spec
The engine first compiles the session into requirements. The session kind sets a goal and an assumed speed: 21 km/h for recovery, 26 for endurance, 25 for interval days, 19 for hills, 27 for long rides. Duration times speed gives a target distance, and the engine accepts anything from 80% to 120% of it. A 90-minute endurance ride therefore wants roughly 39 km, and anything from 31 to 47 km is a candidate.
Interval sessions also get a terrain need. The engine finds the main work block (the longest block at 83% of FTP or more) and takes its length as the effort length. VO₂ sessions want repeatable efforts on a climb; threshold and tempo want a sustained climb. Very short repeats, such as 30/30s, are treated as needing a usable interval hill of about five minutes rather than a thirty-second bump, because you ride reps up a hill, not up a speed hump. Long and endurance rides have no terrain need; they are scored like a good loop.
Step two: find the ground
For a session with a terrain need, the engine looks for "effort venues" near your home. It routes six spokes outward, 12 km each, biased towards the compass directions you already ride, and runs terrain detection along each one. A climb counts if it gains at least 25 m at 3% or steeper, allowing small dips; a flat drag counts if it runs at least 1.2 km within ±2%. Each venue gets an estimated effort time (climbs at about 11 km/h, flats at about 29 km/h) so it can be compared with the interval length.
Then it picks. A venue must sit naturally inside the ride: the approach is capped at 40% of the target distance or 15 km, whichever is smaller, because nobody rides 17 km out to do 30/30s. Among the usable venues it scores how well the effort time matches the interval and how close the home–venue–home loop lands to the target distance, and routes a loop through the winner. That is why the reason line can name a specific climb and its gradient: the engine has real elevation for it.
The physiology behind this is straightforward. Sustained uphill riding is a different task from flat riding: professional climbers and flat specialists are separable by their power-to-weight and their ability to hold power at low speed, and the reason short and long intervals produce different adaptations is largely about the time you can spend near VO₂max, which a climb protects because you cannot coast. A VO₂ set on a descent is a VO₂ set that did not happen.
Step three: build fresh loops
Alongside the venue loop the engine also draws up to four fresh loops from your door. Waypoints are picked from your own heatmap, one per compass sector at roughly a fifth of the target distance from home, routed on a quiet-road profile, and each loop is rescaled once if it comes out more than 20% short or 30% long. If you have too little history to anchor on, it falls back to plain compass-bearing triangles.
The loops are oriented by wind. The engine reads the current wind at your home, sends the outbound legs upwind first, and tags a route "Tailwind for the ride home" only if the wind is at least 10 km/h and the final fifth of the route heads within 60° of downwind. The aerodynamic reason is well established: air resistance grows with the square of your speed through the air, so a headwind on the way out costs you far less energy than the same headwind on tired legs at the end.
Only when neither the venue loop nor the fresh loops produce anything does the engine fall back to your ride history: outdoor loops from within 15 km of home, in the distance band, from the last 90 days first and widening to a year and then all time if it finds fewer than six. Commutes are excluded by shape (a loop is compact; a commute is a line) and trainer rides by name.
Step four: score and explain
Every candidate is scored 0 to 100 on fixed weights, with no randomness, so the same inputs always give the same answer. For an interval session the weights are terrain fit 38%, "heat" 27%, distance 23% and start 12%. For easy rides there is no terrain term and the weights become heat 32%, distance 26%, elevation 18%, novelty 12%, start 12%.
- Terrain rewards a verified venue most, a fresh loop moderately, and your history least, because a past ride has no per-point elevation and the engine will not pretend to know its terrain.
- Heat is how much of the route lies on roads you rode in the last 90 days, measured on a grid of roughly 100 m cells. A past loop of yours scores high automatically; a built route is scored by overlap. This is the truest "you would actually ride this" signal the engine has.
- Distance is a bell curve around the target. Elevation checks metres per kilometre against the goal: recovery wants under 4 m/km, endurance and long rides near 11, hills above 22. Start is ideal within 3 km of home. Novelty rewards loops you have not ridden lately.
The reasons are templated from the same numbers, never generated: distance ("42 km — right for a 90-min intervals ride"), venue, climbing, tailwind, familiarity ("Mostly on roads you ride (78%)"), "Starts from home". At most three are shown. If a phrase is on the card, a number behind it earned it.
What it needs from you
- A home location. Without one there are no venues, no fresh loops and no start score; only your history is left, and even that cannot be filtered by distance from home. Set it in the route builder ("Set as default start" or "Save as my home address").
- Some outdoor history. The heatmap needs your recent tracks. A new rider with an empty Strava gets compass-bearing loops and no "on your roads" reasons until a few rides come in.
- Roads the routing engine can see. The venues and loops come from a routing service over OpenStreetMap; a private road or a new path it does not know will not be used.
Honest limits
- No traffic, no surface preference, no weather beyond wind. Loops use a quiet-road profile, and the card shows a surface mix where the routing returns one, but the engine does not know the road is closed on Tuesdays or that it rained last night.
- One recommendation per session. The card shows the best route, not a shortlist. The stand-alone "ride of the day" page, which ranks several familiar and fresh loops for a goal and time, exists behind a coming-soon gate and is not offered yet.
- Terrain is best-effort. Venue discovery and loop building each need live routing calls. If one fails you get fewer candidates, and occasionally a history ride the engine cannot verify.
- It does not export the route to your head unit. The workout export menu gives you FIT, ZWO, ERG and MRC files for the session structure; the route itself is a map on the session page. Build or save it in the route builder to download a GPX.
- It will not choose for you. The card is a suggestion. Riders who read how to read a route profile and loop versus out-and-back will spot when the engine's pick is not the one they would make.
The Route Engine is deliberately unglamorous: fixed weights, real numbers, and a sentence you can check against the map. When it says do your efforts on a named climb 6 km from home, that climb is there, that long, that steep. Whether you go is still up to you.
Sources 5
Where this article summarises a study, the study itself is linked — not a write-up of it.
- 1 Padilla S, Mujika I, Cuesta G, Goiriena JJ Level ground and uphill cycling ability in professional road cycling · Medicine & Science in Sports & Exercise · 1999
- 2 Rønnestad BR, Hansen J, Vegge G, Tønnessen E, Slettaløkken G Short intervals induce superior training adaptations compared with long intervals in cyclists – An effort-matched approach · Scandinavian Journal of Medicine & Science in Sports · 2015
- 3 Seiler S, Sylta Ø How Does Interval-Training Prescription Affect Physiological and Perceptual Responses? · International Journal of Sports Physiology and Performance · 2017
- 4 Martin JC, Milliken DL, Cobb JE, McFadden KL, Coggan AR Validation of a Mathematical Model for Road Cycling Power · Journal of Applied Biomechanics · 1998
- 5 Seiler S What is Best Practice for Training Intensity and Duration Distribution in Endurance Athletes? · International Journal of Sports Physiology and Performance · 2010
Build a route that is actually worth riding
The Route Engine works from real surface and elevation data and favours quiet roads, so it finds the lanes a fastest-way-there app routes you straight past. Give it a distance and a direction and it does the rest.
Build a routeKeep reading
Planned vs actual: reading your Moveee calendar after a week of riding
How to read the week banners, the day cells and the four ride verdicts, how a ride is matched to a session, what the check-in does, and the honest gaps: no missed state, and verdicts only on the ride page.
How Moveee builds your training plan: what the wizard asks and why
A walk through the plan wizard, question by question: what each answer changes in the engine, how the weekly load budget is set, where hard days land, and what the wizard does not ask.
Power Profile explained: how Moveee places you from sprinter to diesel
Where every number on the Power Profile page comes from: the 3–30 minute Critical Power fit, estimated FTP, thresholds and FatMax, the VO2max regression, the Power Index spider, glitch nets, and lab test uploads.
Blocked dates: telling your plan about the week you can't train
How to block a day on the calendar, what the engine does with its share of the week, why blocking after the fact does not rebuild the plan, and how much fitness a short break really costs.
What happens after a hard ride: how an adaptive plan eases your next day
The evening re-tune, step by step: the verdict on your ride, the deviation number, the window it edits, what gets eased and by how much, the card with Undo, and what the adaptive plan does not do.
Upload a lab test and let your zones come from real lactate numbers
How the Power Profile reads LT1, LT2, VO2max, FatMax and the lab's zone table out of a PDF, what it shows, and why it leaves your FTP for you to set.
From Free to Pro: what changes in your plan the day you upgrade
What Free includes, how the 14-day adaptive trial works, and exactly what switches on when you go Pro: adaptation resumes, the coach unlocks, the caps lift. Nothing is rebuilt.
The check-in emails, and what your answers do (and don't) change
Seven check-in emails, three questions, a 30-day pause when you answer, and a clear line: the survey is read by a person and never edits your plan. The post-ride check-in is the one that does.
Connect Strava, Garmin, Wahoo and WHOOP: what syncs where
Strava does the work today; WHOOP syncs recovery in; Garmin, Wahoo and Karoo are built but waiting on their providers. A plain map of the Integrations page, direction by direction.
The Vipava valley: fast roads and the wind that decides your day
Slovenia's fastest flat roads, two of its hardest climbs up to Nanos and the Gora plateau, and the burja, with the traffic authority's four wind levels and what they mean on a bike.
Finding the climbs near you (even if you live somewhere flat)
A good training climb is a specific thing, and it is rarely the famous one. What makes a climb worth training on, four ways to find them on a map, and three honest options if your area has no hills at all.
7 rules for building the perfect cycling route (climbs, surfaces, wind and coffee stops)
A great ride is designed, not stumbled upon. These seven rules — from riding into the wind first to matching climbs to your goal — turn any loop into a route you'll want to do again.