How far to the next stop?
Plan a route with a lunch stop and a mountain pass in the middle, start navigating, and until today the app would tell you exactly one thing about time: when you'd reach the end. The intermediate stops — the whole reason the route has that shape — were invisible from the saddle.
Partials everywhere the trip is shown
Multi-stop routes now carry per-stop arithmetic through the whole app:
- In the HUD, three new cycling metric slots: NEXT STOP (distance to the next intermediate stop), STOP ETA (the arrival clock at it), and a STOP counter ("2/4"). The final-destination ETA is untouched.
- Before you ride, the route planner's stops editor lists each stop's own leg distance, riding time, and projected arrival clock — so you can see at a glance that lunch lands at 14:30, not 12:00.
- On CarPlay and Android Auto, a new Stops button during multi-stop navigation opens a dedicated list page: every stop with its remaining distance and arrival time. The car's own estimate still means the final destination — CarPlay models one trip, one estimate, and pretending otherwise would corrupt the ETA the car shows in its cluster.
The engine room is deliberately boring: the navigation store already kept the route's legs, and the ETA estimator already weighted remaining time by Valhalla's per-maneuver durations (so a route mixing motorway and switchbacks doesn't drift). Per-stop partials are prefix-sum subtractions over that same distribution — the last stop's numbers are identical to the trip totals by construction, and a test pins that identity at arbitrary points along the route.
When the honest answer is a dash
The interesting design work was deciding when not to show a number.
An out-and-back track — Sommeiller, Jafferau — is one leg whose geometry is a palindrome. The turnaround is not a stop, and "Stop 1 of 1" would be noise pretending to be information. A TET section or imported GPX rides as a chain of stitched legs whose boundaries are chunking artifacts, not places anyone plans to stop. And after an off-route reroute rebuilds the trip as "approach + trail", reaching the trail again is a milestone, not a stop.
In all of those cases the stop metrics show a plain —. The rule the implementation follows, and the tests enforce: degrade to blank rather than lie.
