Smartphone screen displaying an event registration app featuring an Indoor Futsal event on Thursday with 14 spots remaining, scheduled for January 15, 2026, 9:00 to 10:30 PM at Farsta Sim & Idrottshall with map, participant info, and instructions on playing in rotating teams, wearing indoor shoes, and arriving early.

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?

Event registration page showing 'Test Event' with 15 spots remaining scheduled for Saturday, January 10, 2026, at 19:30:00 in Kanalhallen with 0 of 15 participants. Section below lists confirmed participants with none yet. On the right, a sign-up form is displayed with fields for Name, Email, and optional Phone, and a teal 'Sign Up' button.

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.

User Management dashboard listing users with columns for name, email, current role, assign role dropdowns set to No role, and join dates from August and September 2026, plus a delete icon in each row. A search bar and role filter dropdown are above the list, with a total count showing 128 users. A Create event button and user profile picture are in the top right corner against a dark background.

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.

    User interface design system sample showing typography with sans, mono, and serif fonts including type scale headings and body text, spacing and layout settings with container padding and max width, colors categorized by surfaces, text, actions, status, and borders with focus states, and border radius examples in large, medium, and small sizes.

Day 2

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

    3D digital map of a cityscape at night showing streets, buildings, waterways, and some bridges with neon-like outlines highlighting roads and infrastructure.
  • 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.

    Dark-themed map showing a network of roads and water bodies across an urban and rural area with multiple islands and peninsulas.
  • 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.

    Design system interface displaying typography styles and semantic color palette for an outdoor map instrument. Left side shows text type scale in two categories: Foundations with headings, body text, and subheadings in various sizes and line heights; Monospace with display percentages and map-related labels in monospace font. Right side presents semantic colors including map status colors in turquoise and coral, surface colors in dark shades, content text colors in off-white and grays, border colors in various muted shades, and an orange accent color.
  • 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.

Mobile app screen titled 'Sports Signup' showing an upcoming event for Indoor Futsal on Thursday, Jan 15, 2026, from 21:00 to 22:30 at Farsta Sim & Idrottshall with 1 of 15 participants signed up and 14 spots left. There is a button to create an event and a section for Past Events with a count of 4.
Mobile app screen titled Create New Event with fields filled: Event Name is Indoor Futsal (Thursday), Date is January 15th, 2026, Time from 21:00 to 22:30, Location is Farsta Sim & Idrottshall shown with a small Google map pin, Maximum Participants set to 15, and part of a Description visible mentioning 3 rotating teams.
Mobile screen showing event details for Indoor Futsal on Thursday with 14 spots remaining, 1 of 15 participants, date Thursday, January 15, 2026, time 21:00 to 22:30, location Farsta Sim & Idrottshall with a Google map and directions link, notes about rotating teams of 5, indoor shoes required, and arriving 15-20 minutes early, and a confirmed participant named Tim Plummer.
Email confirmation for Indoor Futsal event on Thursday, January 15, 2026, at 21:00, location Farsta Sim & Idrottshall, with buttons to view event and get directions.

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)

contact