Inspiration
When you move to a new city, you learn it the wrong way. You memorise the fastest route from home to work, home to the supermarket, home to campus, and then you walk those same three lines every day. Months later you've lived somewhere for a year and barely seen it.
Every map app is built to make that worse. Google Maps treats your time as a cost to minimise: get there faster, skip everything in between. We asked what would happen if a map did the opposite and treated time as something to spend.
That's *Roam. You say where you're going and when you need to be there, and instead of the shortest route, Roam gives you the *interesting one. It helps you get lost on purpose, without ever being late.
What it does
- Time-filling detours. Enter a start, a destination and an arrival time. Roam works out how long the direct walk takes and uses the spare time for stops along the way: hidden gems, history, nature, arts, cafés, pubs and restaurants.
- Live rerouting. A countdown runs while you walk. Linger too long at a stop and Roam notices, drops the least valuable stops and shortens the route so you still arrive on time. If you're ahead, it can add stops.
- It learns your pace. Roam measures your real walking speed and how long you tend to stay at different kinds of places, then plans around you instead of an average person.
- "Not feeling it?" One tap gives you a completely different route.
- A reverse tour guide. At each stop you teach Pip, our AI companion, what you've noticed. Pip remembers your notes, so over time the city becomes a story you wrote together.
How we built it
- Backend: Python and Flask, with SQLite for journeys and memories.
- Frontend: Leaflet maps, vanilla JavaScript and Tailwind CSS.
- Routing: OpenStreetMap data with a walking-route service for real pedestrian times.
- Places: OpenStreetMap and Wikipedia for candidate stops.
- AI: Nebius-hosted models, through an OpenAI-compatible API, rank stops by interest and power Pip's conversations.
The planner is a greedy algorithm for a classic problem called the orienteering problem: pick the best set of stops that fits inside a time limit. For each candidate stop it scores the value gained per extra minute of walking:
$$\text{score}(s) = \frac{\text{value}(s)}{t_{\text{with } s} - t_{\text{current}}}$$
and keeps adding the best-scoring stop until nothing else fits. The AI only chooses and ranks places from real map data, and all timings come from the routing engine, so the AI never invents a time or a place.
The live part runs in the browser. Every few seconds it compares the time left with the time needed to finish the remaining stops:
$$\text{slack} = t_{\text{left}} - \left(\frac{d_{\text{remaining}}}{v} + \sum_i \text{dwell}i + t{\text{buffer}}\right)$$
When $\text{slack} < 0$ it asks the server to replan from the user's current position.
Challenges we ran into
- The planner didn't use the time we gave it. Our first version always returned the same three stops, however much time you had. We replaced the fixed cap with a time-based search that keeps adding stops until the budget is full.
- Everything looked like a tourist trail. Famous landmarks dominated the results, so we added food and drink categories, route variety and a way to reject a route.
- Rerouting without walking around a city on stage. We built a simulator with a sped-up clock and a "linger 15 minutes" button so the reroute can be shown in seconds.
- Team workflow. Several of us edited the same files at once, and we hit our share of merge conflicts, missing build steps and template errors along the way.
- Making AI trustworthy. We kept the model away from anything factual. It ranks real places and listens to the user, and Pip treats what you tell it as your notes rather than verified facts.
What we learned
- Flipping an assumption (time as a budget instead of a cost) changes the whole product, not just one feature.
- Constraining the AI to choose from real data makes it far more reliable than letting it generate.
- A demo needs its own tooling. The simulator mattered as much as the algorithm.
- Small details, like a visible countdown, decide whether a feature feels real.
What's next
- Learn your pace and tastes across trips and save them to your profile.
- Hand-curated local places, so the map isn't only the famous ones.
- Turn-by-turn guidance on the phone with background GPS.
- Support for more cities, and sharing a route with a friend who has just moved too.
Built with
Python, Flask, SQLite, JavaScript, Leaflet, Tailwind CSS, OpenStreetMap, Nebius AI
Log in or sign up for Devpost to join the conversation.