
Roam
I love riding my bike around Stockholm whenever possible, but I find myself going down the same familiar roads and cycleways day after day. One night I was struck by inspiration: what if I had a map-based head’s up display that could keep track of every path I’ve biked before and push me to explore new ones? In the day of AI-assisted coding agents, all I needed was this small nugget of an idea to start making it a reality.
location
Stockholm, Sweden
role
Full-stack designer
Responsibilities
Concepting
UX & UI
Development & Testing
tools used
Codex + Android Studio
MapLibre
Supabase
Defining the scope
This idea didn’t come out of nowhere, it was inspired by the road discovery feature in the Forza Horizon open world racing games. In those games you can clearly see where you’ve been and where you haven’t on the world map and mini-map. When you fully explore a road from end to end, you get a satisfying notification, nudging you to keep finding new roads. Why not apply the same principles to real life on my bike?

Road discovery in Forza Horizon 6
A couple of other products have looked into doing something similar IRL, namely Fog of World and Wandrer, but I found that both of them lacked the clean design language and satisfying real-time map experience that I was envisioning. Wandrer only works after your travels, meaning you don’t get feedback to adjust your route and cover unexplored territory during your ride. I felt confident that I could make something more satisfying and fun.
I wrote a concise product requirements document (PRD) spelling out the concept, requirements, desired, experience, initial scope, and technical considerations.. This is always helpful for me to organize my thoughts, but it’s even more helpful for giving AI agents context and keeping them on-task.
Since AI coding agents are a constantly changing landscape, I did deep research to figure out which would work best for my needs on this project. I had more experience with Claude Code than any other agent, but I also find the Claude desktop app to be lacking compared to Cursor and Codex. A number of YouTube videos and articles later, I opted to use Codex because of the versatility of its models (GPT-5.6 and GPT-6) and the robustness of its desktop app experience.
An MVP in 3 days
With my project scoped, a Github repository ready, and my AI coding tool defined, I could finally get started with the build. I worked with Codex to create a more concrete development plan based on my PRD, which led me to make a progressive web app (PWA) that could later be wrapped into a standalone Android or iOS app using Capacitor.

Agentic development in Codex with live preview.
I made a conscious choice not to use Figma to design my app up-front. Given the complexity of working in 3D mapping frameworks, I felt that designing directly in Codex and refining as I went would help me get farther faster than pre-defining everything in Figma beforehand. I stand by this choice, though it did lead to some headaches and additional work refining my design system later on.
The process looked something like this:
Day 1
Set up core progressive web app architecture, including React + Vite for frontend, MapLibre for map data, and Turf.js for calculating the player’s progress.
Defined initial color palette and design language for app: Geist Sans & Geist Mono type, dark background, warm white foreground, teal and orange accents.
Laid out tab framework (Map, Sessions, Progress, Settings).
Added Vercel deployment to see the live site on web.
Queried Open Street Map data for my local bike routes to define which paths should be considered ‘bikeable’ and which shouldn’t. This was a very time consuming process, and still could use further adjustment.

Day 2
Added toggleable 3D building and terrain support to the map view.

Set up location tracking permissions and triggers.
Set up a job to index all of the bikeable roads in my nearby neighborhoods into 12m chunks.
Implemented client-side road progress calculation.
Tested webapp in real-world conditions and got annoyed with the finnicky camera controls.
Added Google Maps-style tracking view where the camera moves and rotates with the player.
Day 3
Extended indexed roads to all of Stockholm and added boundaries for all 117 districts and 11 administrative regions in the city. Also added all regions / districts to the Progress page with accurate progress calculations.

Added background location tracking and session recording.
Added tracked sessions to the Sessions tab, including .gpx import and export functionality.
Created a set of consistent design system tokens, including typography scales, colors, spacing, and corner radii. This was in response to growing lack of consistency across pages.

Updated my app’s frontend to use shadcn components wherever possible.
Wrapped the webapp using Capacitor to create a standalone Android app. iOS will come later.
Tested standalone app with background location tracking enabled, quickly noticed issues with background tracking while moving quickly on the bike.
Increased background location ping cadence when a session is actively being recorded.




This initial AI-assisted build process was extremely fun, fulfilling, and educational for me. Early on you feel like you’re making massive leaps of progress every day, but in the back of my head I was thinking about the old adage that the last 20% of the project takes 80% of the time. I knew that if I ever wanted to share this app with a wider audience, I would have to put my head down and put in the hours to make it something special.
Now comes The hard part
With a working (and genuinely fun) MVP already built, my task now is to refine what I have into something more sophisticated, delightful, reliable, and performant. This work is ongoing, but I wanted to share my work-in-progress already because I’m excited about it and I find the added accountability motivating.
My current focus (as of September 2026) includes:
Adding account creation and cloud sync support across devices (mostly done)
Creating a scalable system to index paths across Sweden (and then the rest of the world)
Making the core discovery experience more delightful through animation
Improving performance and reducing battery consumption
After that, I’ll move onto:
Beta testing with a wider subset of users
Refining the app’s visual language, including branding
Adding integrations for activity tracking apps like Strava, Komoot, and Ride With GPS
Adding social leaderboards
Improving the Progress tab’s visual presentation i.e. video game-style region progress
Adding more game systems, i.e. badges and unlockable temporary boosts to discovery radius
Adding a walk / bike toggle, which also changes which paths should be indexed and counted for progression
Improving performance and reducing battery consumption
Adding offline map support
Creating a dedicated version of the app for my Hammerhead Karoo bike computer (which is just a tiny Android device)
