trails/openspec/changes/hiking-time-estimate/proposal.md
Ullrich Schäfer 5dd4968626 docs+openspec: prior-art research (Organic Maps, Endurain, wanderer) and 15 proposals
Add docs/inspirations.md as the durable record of the 2026-07-05/06
prior-art research — per-project learnings with source paths, canonical
credit lines, and the changes each spawned — and extend the
acknowledgment lists in philosophy.md/architecture.md (Organic Maps,
Endurain, wanderer).

New OpenSpec changes (proposal/design/specs/tasks each):
- Organic Maps: elevation-profile-hardening, gpx-parser-robustness,
  hiking-time-estimate, poi-index, hiking-foot-profile
- Endurain: account-export, activity-duplicate-review,
  fit-parsing-hardening, activity-locations, self-hosting-guide,
  activity-privacy-controls
- wanderer: federation-hardening, link-share-tokens
- credits-page (user-visible acknowledgments)

Updated in-flight changes with wanderer prior-art sections:
route-federation, route-discovery.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 07:23:00 +02:00

2.7 KiB
Raw Blame History

Why

The planner shows distance and ascent for a planned route but no time estimate, even though "how long will this take?" is the first question a hiker asks of a plan — and even though BRouter already returns elevation-tagged geometry that makes a good estimate cheap to compute. Tobler's hiking function (speed as a function of slope, the model Organic Maps uses for pedestrian ETA) turns the existing route geometry into a credible walking-time estimate with a small pure function. Bonus: the multi-day-routes spec already requires per-day "estimated duration", which was never implemented — this change closes that drift.

What Changes

  • New pure function in @trails-cool/gpx: Tobler-based walking time over a sequence of points with elevation (speed = 6·e^(3.5·|slope+0.05|) km/h per segment, flat-ground fallback when elevation is missing).
  • The planner sidebar shows estimated walking time alongside distance and ascent when the routing profile is the foot profile (trekking, labeled "Hiking" in the UI). Cycling/car profiles show no estimate (out of scope for now).
  • computeDays gains an opt-in per-day estimatedTimeSec so the multi-day day breakdown shows a time per day (planner only; journal's computeDays call is unaffected).
  • Estimates are labeled as walking time without breaks (signpost convention), localized in English and German.
  • Not in scope: cycling time estimates (BRouter's total-time is already summed in EnrichedRoute.totalTime and could be surfaced later), journal route detail display, rest-break padding (DIN 33466-style), and any change to routing itself.

Capabilities

New Capabilities

  • hiking-time-estimate: Tobler-based walking-time estimation for planned routes — the model, where it appears (whole-route stats, per-day stats), when it applies (foot profile), and its fallback behavior without elevation data.

Modified Capabilities

Impact

  • packages/gpx/src/hiking-time.ts (new) + tests — the Tobler function and a cumulative variant for day splits.
  • packages/gpx/src/compute-days.ts — optional estimatedTimeSec on DayStage behind an opt-in flag; existing callers unchanged.
  • apps/planner/app/lib/use-routing.ts — compute estimatedTimeSec into route stats when the profile is trekking, from the enriched route's elevation-tagged coordinates.
  • apps/planner/app/components/WaypointSidebar.tsx + DayBreakdown.tsx — display whole-route and per-day time.
  • packages/i18n — new planner strings (en + de).
  • No API, schema, or BRouter changes.