Luke Caporelli
B.A. Thesis

odo

Every route planner gives you a path. None of them know what kind of ride you're in the mood for.

RoleProduct design · Research · Prototype engineering
ScopeB.A. Thesis · HfG Schwäbisch Gmünd · 2025
TeamLuke Caporelli, Luca M. Ziegler Félix
odo

What this project is really about

Every major route planning tool works the same way. You enter a start point, a distance, maybe a bike type. The algorithm finds the most efficient path between the constraints. Then it offers you three variations of essentially the same route.

The problem is not the technology. The problem is the model. These tools treat personalization as a filter applied on top of distance optimization — a layer you add after the route exists. odo inverts this. Rider intent is not a constraint on the route. It is the origin of the route. Scenery, surface, shade, wind, safety — these are not preferences you toggle. They are the inputs from which the route is generated.

This changes what the system has to do. It is not a routing problem. It is a data translation problem: how do you take a rider's intent and convert it into API parameters, weighted signals, and explainable output that a cyclist can actually trust? How do you build something that shows its reasoning — so that when the app says "this is your scenic loop," the rider understands why, and agrees?

The design challenge was not the interface. It was the pipeline behind the interface — and making that pipeline legible enough to feel like a recommendation, not a black box.

Challenge

Cyclists don't want the fastest route. They want the right one for the kind of ride they're in the mood for. Existing tools — Komoot, Strava, Outdooractive, Wikiloc — are technically robust but treat personalization as secondary. None generate genuinely differentiated routes based on rider intent. The output of most planners is minor path variations, not meaningfully different ride experiences.

Strategy

Designed an intent-to-route translation system: rider preferences (scenery, surface, shade, wind, safety) are converted into weighted routing constraints and processed through real environmental APIs. The result is a set of named route profiles, each representing a distinct ride intent, that produce genuinely different loops — not the same route with slight variations. Validated the system with 100+ real cyclists before a single screen was designed.

Results

A functional vertical slice prototype using live APIs — OpenRouteService for routing and surface data, Shademap for time-based shade analysis, elevation processing for gradient metrics — proving the pipeline works with real data, not synthetic inputs. Competitive differentiation confirmed through Blue Ocean strategy analysis against Garmin, Komoot, and Strava.

01 · The Situation

A market full of tools, none of them personal.

Cyclists plan rides in two distinct settings. For familiar areas, they rely on memory and habit. For unfamiliar terrain — a new region, a travel destination, a route longer than their usual range — they turn to digital tools. This is where the planning gap lives.

The tools that exist are built primarily for two use cases: athletic performance tracking and navigation during a ride. Neither is designed for the planning phase, and neither takes the rider's intent as a primary input. Komoot offers terrain-type filtering. Strava provides segment data for athletes. Outdooractive aggregates trail information. Wikiloc crowdsources routes from other users. All of them default to the same underlying model: optimize for distance and time, then let the rider filter the results.

The result is a particular kind of frustration that cyclists describe consistently in our research: the tools give you options, but the options feel arbitrary. You don't know why the app chose this route over another. You don't know if the "scenic" option is actually scenic, or just labeled that way. You don't know how the gradient compares between routes, or which one has the most shade at 10am, or whether the gravel sections are rideable on a road bike.

Trust requires explanation. The current generation of route planners does not explain.

02 · What We Found

What 116 cyclists actually told us.

We ran a survey of over 100 cyclists before sketching a single screen. This was not a formality. The survey results fundamentally shaped the direction of the project — and in one case, overturned an assumption we had walked in with.

Preferred route format
Survey of 116 cyclists
Loop
82
Point-to-point
16
Multi-destination
14
Other
4

We assumed cyclists would be roughly split between loop routes and point-to-point. The survey showed a strong preference for loops — routes that return to the start — across all rider types. This is not a small detail. It means the entire routing model needs to generate loops, not paths. Existing tools are built around paths. odo had to be built around loops from the foundation.

The survey also showed clear hierarchy in what cyclists prioritize: scenery and safety were consistently the top two factors, well above surface type and distance. This held across casual riders, regular athletes, and touring cyclists. The insight was that scenery — something almost no existing tool addresses meaningfully — is not a nice-to-have for cyclists. It is often the reason they ride.

The nine in-depth interviews added texture to the numbers. Friction points clustered around three moments: before the ride (uncertainty about route quality, gradient, and conditions), during planning (inability to compare routes on the dimensions that actually matter), and route switching (the inability to quickly see how a different intent would change the output without reconfiguring everything from scratch).

Early concept brainstorming — handwritten exploration of phone UI states spanning emotional registers (Verlangen / desire, Sarkasmus / sarcasm, Frechheit / cheekiness, Schmerzen / pain) and interaction patterns like flipping the phone to symbolize meaning inversion. Wide ideation before narrowing to route-planning.
03 · The Real Problem

Profiles over parameters.

After research, the question was not "what features should we build?" It was "what model of personalization would actually work for this context?"

We explored three directions. The first was adventure-driven routing — routes selected based on novelty, unexplored territory, discovery. The second was safety-first — routes that explicitly minimize traffic exposure, avoid main roads, and prioritize protected infrastructure. The third was inspiration-driven — routes curated by community input, editorial selection, or social signals.

All three had appeal. None of them alone captured the dimension that our research consistently surfaced: the ride intent that changes day to day. The same cyclist wants a challenging mountain loop on Saturday and a flat scenic loop after work on Tuesday. A system built around a single persona or a single intent cannot serve them both.

Route profiles emerged as the strongest answer. A profile is not a set of filters. It is a named intent — Scenic, Safe, Challenging, Balanced — that maps to a specific combination of weighted signals, routing constraints, and avoidance criteria. Switching profiles does not reconfigure a form. It generates a different route from a different premise. The cognitive load stays low. The output stays meaningfully different.

The key tradeoff we made deliberately: explainability over sophistication. We could have built an opaque scoring system that processed dozens of signals and produced a ranked list. We chose not to. If a rider cannot understand why the app recommended this route, they will not trust it on an unfamiliar ride. The signals we used — shade at a given time, surface type per segment, gradient tier, wind direction — are ones a cyclist can verify. That verifiability is the trust mechanism.

04 · How It Works

The pipeline behind the profile.

The interface is simple. The system behind it is not. The design work that matters here is not the UI — it is the data architecture.

A route profile is a specification. When a rider selects "Scenic," odo translates that intent into a set of weighted API parameters: maximize shade coverage, prioritize unpaved surface where available, minimize main road exposure, optimize for continuous elevation change rather than flat terrain. These parameters are sent to OpenRouteService, which generates candidate routes against the constraints.

The raw routing output is then enriched. Shademap processes the route geometry against the current time and date to calculate actual shade coverage — not estimated, but computed from topographic and building data. Elevation data is processed to produce gradient metrics per segment, categorized into four tiers that match how cyclists actually think about climbs. Surface type is extracted from OpenStreetMap data via OpenRouteService and mapped to intelligible labels: paved, gravel, compacted dirt, technical trail.

Wind is the most behaviorally interesting signal. Cyclists care about wind direction relative to their route, not absolute wind speed. A strong tailwind on the outbound leg and a headwind on the return is a very different experience than the reverse. odo processes wind direction and route geometry together to produce a per-segment visualization: green above the axis for tailwind assistance, red below for headwind resistance. A rider can see, before starting, which sections will feel easy and which will be hard.

The output of all this processing is not a score. It is a set of labeled, segmented data that the interface displays in plain terms. The system is explaining itself continuously — not as a disclaimer, but as the product.

Stack

Next.js · React-Leaflet / Leaflet · OpenRouteService (routing, surface) · Shademap (time-based shade) · Custom elevation processing (gradient, segment classification)

05 · The Idea

Two flows, real data, live APIs.

We designed two entry flows based on a consistent finding in the interviews: the difference between a rider who has 15 minutes and a rider who wants to spend an hour planning.

When the rider opens the app, they're greeted with three route profiles — each with one loop route, each built around a different set of metrics. Every day, each profile regenerates a fresh route against current conditions. Three profiles, three meaningfully different rides every morning. For the commuter cyclist with five minutes to decide, this is the flow.

When the rider opens the app, they're greeted with three route profiles — each with one loop route, each built around a different set of metrics. Every day, each profile regenerates a fresh route against current conditions. Three profiles, three meaningfully different rides every morning. For the commuter cyclist with five minutes to decide, this is the flow.

Custom Ride offers full preference control. Onboarding in this flow captures rider type, bike type, specific preferences and avoidances, a time window, and a starting point. From these inputs, odo generates profiles and allows deep comparison before committing. For a cyclist planning a long weekend route in an unfamiliar region, this is the flow.

The functional prototype validated both flows using live API calls. We were not mocking data or using placeholder responses. Routes were generated from real OpenRouteService queries. Shade coverage was computed by Shademap against real topographic data for the query time. The prototype behaved as a real product would — including edge cases where API constraints produced unexpected route geometries that we had to design around.

This was the most important form of validation: the pipeline works with real signals, in real places, with real environmental variation. The concept is not theoretical.

06 · The Result

Plan. Navigate. Improve.

The final product loop has three phases, designed as a continuous cycle rather than a one-shot experience.

Main user flow for odo — profile selection on the left, route detail view in the middle, segment-by-segment preview on the right. The three phases of the plan / navigate / improve loop laid out end-to-end.

In the plan phase, the rider selects a profile and reviews the route in detail before starting. The detail view presents the key metrics a cyclist uses to make the go/no-go decision: difficulty rating, total distance, elevation gain, estimated duration, and start time. The preview divides the route into segments with per-segment data — weather, surface, gradient — and highlights each segment on the map as the rider scrolls.

The navigate phase is designed for bike computer handoff. odo is a planning tool, not a turn-by-turn navigation tool — a deliberate scope decision. Cyclists navigate with dedicated devices. odo generates the route; the device runs the ride. This keeps odo focused on what it does well and avoids competing with the hardware category where Garmin and Wahoo have deep advantages.

The feedback phase is the long-term value driver. Post-ride, the rider can rate segments and adjust preferences. Over time, the profile learns — not through opaque machine learning, but through explicit preference signals that the rider understands and controls. A rider who consistently rates gravel sections poorly will see those sections appear less in future scenic routes. The system shows its reasoning at every step, including in how it updates.

07 · What Changed

What we validated.

The most important thing we validated was not the interface. It was the feasibility of the underlying system.

100+
cyclists surveyed before any screen was designed
9
in-depth interviews shaping the core concept
4
differentiated route profiles validated with real API data
3
live environmental APIs integrated in the functional prototype

Blue Ocean differentiation

odo differentiates on four dimensions that no existing tool addresses simultaneously: intent-based routing (not filter-based), explainability (visible signals, not opaque scores), loop specialization (built around circular routes, not paths), and adaptive profile logic (the system updates based on rider feedback over time).

Environmental signals — shade at a given time, surface type per segment, gradient per section, wind direction relative to route geometry — can be sourced from existing APIs, processed without proprietary data, and translated into labels that feel trustworthy in a planning context.

This matters because the core claim of odo is not "we designed a nicer route planner." It is "we proved that intent-based routing is possible with available data, at consumer scale, without requiring a proprietary data moat." The competitive differentiation is the architecture, not the visual design.

Blue Ocean Strategy Canvas — odo (purple) compared against Garmin, Komoot, and Strava across six capability axes. odo dominates the Route Planning phase (user profiles, personalized routing, context adaptation) and intentionally scores low on the Navigating phase (live navigation, performance tracking) — a deliberate scope choice to leave hardware navigation to dedicated bike computers.
08 · What I Learned

Control beats automation every time.

The clearest finding from our research — confirmed repeatedly through interviews — was that cyclists do not want the system to decide for them. They want to understand what the system is doing, adjust it, and trust the output because they can trace it back to their own preferences.

Explainability is the feature.

Personalization only works when users understand why the system made its recommendation. The pipeline is the product — the interface is how you make the pipeline legible.

This pushed us toward explainability as a design principle, not just a feature. Every signal the system uses is visible. Every label is defined. Every recommendation comes with the reasoning behind it. This made the product harder to build — it is technically easier to produce an opaque score — but meaningfully more trustworthy.

The second reflection is about scope. We made a deliberate decision to build a vertical slice rather than a broad prototype. One city, four profiles, two flows — but with real data, real APIs, and real edge cases. That depth of validation is more useful than a wide prototype that fakes its data.

Next case

re:markt

Designing a supermarket that stays operational when the power goes out.

© 2025 Luke Caporelli