DEV Community

Cover image for I Built a Map That Remembers Where I Love to Ramble (and Nudges Me Outside)
Harshita Phadtare
Harshita Phadtare

Posted on AI-assisted

I Built a Map That Remembers Where I Love to Ramble (and Nudges Me Outside)

Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass Submission 🌿

This is a submission for the Hacktoberfest Open-Source AI Challenge: Week 1 — "Touch Grass".

What I Built

I moved to Melbourne in July to start my master's. Somewhere between lectures, a part-time job, assignments and trying to find my people, I noticed where most of my free time was actually going: at home, in front of my laptop, one more episode at a time.

If you're an international student, you probably know the feeling. There's so much going on that taking care of yourself takes real effort, and "go outside" somehow never makes the list.

One night I decided that had to change. Then I hit a surprisingly silly wall: I had no idea where to go. So I asked Claude to help me plan a day exploring somewhere new, and I simply followed the plan. That one day out gave me more energy than I'd had in weeks, and I couldn't stop telling my family and friends about it.

That place has become my spot. Whenever things feel like too much, I pack my lunch, go there and sit by the river. Later that night I realised I wanted that plan in my pocket every time: something that helps me plan outings, gets me out of the house more often, and nudges me towards new cafés and streets.

So I built Ramble.

Ramble is a personal explore map that gets you off your phone and outside. You open a link (there's nothing to install), tell it how much time you have, your mood and your energy, and it finds real parks, gardens, lookouts and beaches near you. Open-weight Gemma helps refine the suggestions and gives you a reason for each pick.

Try the live app: https://ramble-gw4t.onrender.com

Then the phone's job is mostly done: tap Walk here, follow the route, and check in when you arrive.

Every return visit levels a place up:
Want to go → Visited → Favourite → Regular → Local legend.

Each check-in can carry a short note and a photo, so over time Ramble becomes a private journal of the places that are yours.

Here's what you can do with Ramble:

  • Find a walk: choose your time, mood and energy. Ramble finds nearby places from OpenStreetMap, shows instant picks and uses Gemma to refine them with a reason for each.
  • Plan a trip in your own words: say something like, "St Kilda today, coffee and fish and chips on the way, Comm Bank on the way back." Gemma turns the request into stops, you choose a real place for each, and Ramble plans the route. You can walk, cycle or drive.
  • Walk here: follow a route and see the distance remaining. Ramble can prompt you when you arrive at a stop. Location is used during a walk.
  • Check in and level up: build a weekly goal and streak as you explore.
  • Keep a journal: add a typed or dictated note and a photo. ✨ Polish sends that one note to Gemma only when you tap the button.
  • See your progress: explore your fog-of-war map, heat map and monthly Wrapped, with weather information too.
  • Keep your memories private: journal records are encrypted on your device. Account sync is not enabled in the live demo.

The screen is meant to be the shortest part of the experience: one minute to choose, then an hour outside.

Demo

Live: https://ramble-gw4t.onrender.com

It works on a phone or laptop without signing up. The app runs on a free server, so the first load can take around 50 seconds while the server wakes up.

Try it in 60 seconds

  1. Open the live link and allow location access, or pan around the map.
  2. Open Explore → Find a walk and choose 1 hour · Nature · Easy stroll. You should see nearby suggestions, with Gemma's reasons appearing after the initial picks.
  3. Switch to Plan a trip and describe an outing in a sentence. Tap Plan it with Gemma.
  4. Choose a real place for a stop and add it to your trip.

Taking it outside

On Saturday 10 October I took Ramble out for real, all the way from home to St Kilda and Point Ormond. My note from that day:

"Got 20k steps done today haha. The way from home to St Kilda was so pretty and relaxing. I sat near Point Ormond and watched people running, cycling, laughing. It felt good."

Out there, phone in hand, I realised something I hadn't noticed at my desk: a real outing is almost never one destination. I wanted to stop at places along the way, and Ramble could only take me to one.

So when I got back, I built the trip planner. Now you can describe your outing in a sentence, add stops along the way, and plan the route there and back.

Desktop trip planner showing a coffee stop and St Kilda

The trip planner turns a plain-language outing into real stops.

The second thing I noticed was that I'd taken lots of photos that day, but none of them made it into Ramble. The journal was already there; I just never opened it, because nothing reminded me to.

So now, when you reach a stop, Ramble can prompt you: "You're here! Snap a few photos and add a note so you remember this place." One tap checks you in and opens the journal, so the memory gets saved while you're still standing there.

Desktop Ramble arrival prompt offering a check-in and memory

Desktop journal entry before Gemma Polish

My journal entry before polishing.

Desktop journal entry after Gemma Polish, with a title and tags

My quick note, then ✨ Polish: same meaning, tidier and tagged. Gemma only sees this note because I tapped the button.

And because I wanted the experience to feel rewarding beyond a single walk, Ramble also gives you a view of your progress over time.

Desktop Ramble monthly Wrapped showing outdoor streak, visits and memories

Code

Ramble

Your personal explore map. Works with zero bars.

Ramble remembers the places you love, levels them up each time you return, nudges you outside, and turns your walks into a private journal. There's nothing to install: it opens like a website and keeps working on a trail with no signal. When you're online, open-weight Gemma picks your next walk and polishes journal entries on request, and if you create an account Ramble syncs across your devices, end-to-end encrypted.

Live: https://ramble-gw4t.onrender.com · Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 1 ("Touch Grass").

What it does

  • Get me outside: pick time, mood and energy. Ramble finds real parks, gardens, lookouts and beaches nearby (OpenStreetMap), shows instant picks, then Gemma refines them with reasons.
  • Plan a trip in your own words: "St Kilda today, coffee and fish and chips on the way, Comm Bank on the way…

Ramble is MIT licensed. The README explains how to run it locally, and docs/ contains the architecture, security and implementation notes.

How I Built It

Stack: React 19 + Vite + Tailwind CSS + MapLibre (PWA) · Hono on Node.js 22 · shared Zod schemas · one Render web service serving the app and API.

Gemma at the core: rules first, Gemma second

Waiting on AI to show anything is a bad way to get someone out the door.

Ramble ranks places instantly with simple rules based on factors such as distance, available time, mood, energy and visit history. It shows those picks first, then Gemma 4 (26B) on Cloudflare Workers AI refines the suggestions and writes a short reason for each.

This design means the AI doesn't have to respond before the user can start exploring.

Gemma has several jobs in Ramble: refining walk suggestions, turning a sentence into a trip, polishing journal notes and summarising trail updates when that optional integration is configured.

Treating model output as untrusted was important:

  • Prompts live on the server, so the browser sends data rather than instructions to execute.
  • For walk suggestions, Gemma receives a short candidate list. Its response is checked against an allow-list of the IDs it was given, so it can't invent a place and have the app treat it as a valid result.
  • Each AI task has a fallback. If Gemma is unavailable or returns unusable output, rule-based suggestions, the original journal note or manual trip planning remain available.

My first live calls failed with "unusable model output": the thinking tokens were eating the budget for these short tasks. Turning thinking off for structured tasks and parsing JSON more defensively fixed the problem.

Plan a trip the way you'd say it

Real outings aren't one destination.

You can type something like:

"I'm going to St Kilda today. On the way I want a coffee and fish and chips, and on the way back I'll stop at Comm Bank, then home."

Gemma turns that request into ordered stops — coffee, fish and chips, St Kilda, Commonwealth Bank on the way back, then home — as structured data.

Gemma doesn't choose the actual café or bank. Ramble searches OpenStreetMap through Photon and shows real options for each stop. Named places are ranked by relevance; a general request like "a coffee" is ranked by how far off the route it is.

You pick the actual places. An AI confidently sending you to the wrong bank is worse than one more tap.

Then Ramble plans the route. You can also add stops manually, reorder them or change which direction of the trip a stop belongs to.

Habits, not just trips

On first open, Ramble asks one question: how many days a week do you want to get outside?

The You tab then shows a progress ring and weekly streak. The streak counts days out, not check-ins, so visiting three cafés on one walk counts as one day.

Ramble also includes a fog-of-war map showing how much of your area you've explored, a heat map, a monthly Wrapped and weather information.

The on-device experiment I dropped

My first plan was to run Gemma fully in the browser. It worked, but meant a roughly 2 GB download, and the tiny model that fit comfortably gave unusable suggestions.

For an app whose whole point is "just open it and go outside", a 2 GB download is a dealbreaker. So Gemma moved server-side.

Because the weights are open, that was a hosting decision rather than a complete rewrite of the AI integration.

Real places, even when the map API says no

Places come from OpenStreetMap through Overpass. Overpass can rate-limit shared cloud IPs, so Ramble queries it directly from the browser while also racing the server endpoint.

If the request takes too long, Ramble falls back to points of interest already present in the map tiles. Results are cached on the device for a week.

The aim is simple: don't make someone wait indefinitely just to find somewhere to walk.

Trail and park updates (optional SerpApi + Gemma integration)

When the SerpApi integration is configured, Ramble can search for recent closures, works or events near a place before you set off. The server runs the search, and Gemma can turn relevant results into a short heads-up.

Testing this taught me that a search engine can quietly broaden a quoted query when nothing matches. A search for "Merri Creek Trail" once returned creek closures in Arizona.

Ramble's filtering was tightened to keep results that actually name the place, and to say there is nothing recent when no relevant information is found. No news beats wrong news.

Places you'll love (optional TabPFN integration)

Ramble also has an opt-in TabPFN integration for learning from visit history, when the service is configured.

Instead of sending place names, coordinates or IDs, it turns history into anonymous numeric features — such as place type, distance bucket, time of day and whether it's a weekend — and asks TabPFN to score new candidates.

It is intended to stay off until there's enough history for the scores to be meaningful. This integration depends on the TabPFN API key being configured, so it may not be available in the live demo.

Privacy and security

People put photos, thoughts and locations in an app like this, so privacy cannot be an afterthought:

  • Encrypted on the device: journal and visit records are encrypted using AES-GCM-256, with keys handled through WebCrypto.
  • Your journal reaches AI only when you tap ✨ Polish: only the selected note is sent for that action.
  • Location is limited: location tracking is used during a walk, while place search and weather use rounded location data where applicable.
  • Photo metadata is stripped: images are processed to remove hidden location metadata.
  • Defensive defaults: strict Content Security Policy, security headers, same-origin API requests, rate limits and validation of untrusted inputs.
  • Account sync is part of the codebase's optional integrations, but it is not enabled in the live demo. I don't want to claim that users can sign up or sync their accounts when that isn't available in the deployed experience.

Keeping it from breaking

Midway through development, I had a stretch where every deploy seemed to break something different.

What helped was adding CI through GitHub Actions: type checking, security-focused linting, tests and the production build run on pushes. I also added npm run smoke, which checks the deployed site like a user would, including security headers, place results, an AI response and rejection of cross-site requests.

That gave me a much more reliable feedback loop than relying on the app looking fine on my laptop.

Why Does Open Innovation Matter?

  • I chose where the model runs. Gemma's open weights gave me the flexibility to test local inference and then move to Cloudflare Workers AI without making the model choice a permanent architectural lock-in.
  • Data stays where it belongs. Places and journal records are encrypted on the device. The model receives only the information needed for the task, and journal text is sent only when the user explicitly taps Polish.
  • Open all the way down: open model, OpenStreetMap data, OpenFreeMap tiles, Photon search, OSRM routing and Open-Meteo weather, alongside an open-source app.
  • Designed to stay accessible: the core map, place discovery and routing use open services, while AI and partner integrations can be enabled through configuration.

Open innovation isn't just about using an open model. It also means having the freedom to inspect the code, change the components and decide how the system is hosted.

What's Next

Ramble works today, but there are things I want to build next:

  • Offline routing and area packs: download a region and route on-device over a footpath graph, so a trail with no signal can still have real directions.
  • Loop walks: generate circular routes for requests like "45 minutes, back where I started".
  • Gemma that sees your photos: explore multimodal suggestions for birds or trees, clearly labelled as guesses.
  • Private journal search: use EmbeddingGemma to search memories on-device without sending the journal to a server.
  • Shared lists, still end-to-end encrypted: share favourite lookouts with friends without exposing the contents to the server.
  • Passkey / Face ID unlock: explore device-based unlock flows for private data.
  • Accessibility-aware picks: account for step-free paths, shade, toilets and benches in OpenStreetMap data.
  • Voice on the walk: spoken directions and arrival prompts, so the phone can stay in your pocket.
  • Seasonal nudges: autumn colour, wildflowers and sunset spots that are worth visiting right now.

Prize Categories

  • Best Use of Gemma: Gemma helps refine walk suggestions, turn natural-language requests into structured trips, polish journal notes on request and summarise trail updates when configured. Its outputs are validated and have fallbacks.
  • Best Use of Render: the PWA, API and AI calls run through a Render web service configured with a render.yaml Blueprint, health checks and a live smoke test.
  • Best Use of SerpApi: the optional integration searches for relevant closures and events near a planned walk and can summarise them with Gemma.
  • Best Use of TabPFN: the optional integration scores places using anonymous numeric features derived from visit history, without training or hosting a model of my own.
  • Best Use of GitHub Copilot: I used AI-assisted coding to work through implementation and debugging; the project's automated checks run separately through GitHub Actions, including type checking, linting, tests and the build.

Credits

Map data © OpenStreetMap contributors via Overpass · tiles by OpenFreeMap · MapLibre · search by Photon (Komoot) · routes by OSRM (FOSSGIS) · weather by Open-Meteo · Gemma by Google, served on Cloudflare Workers AI · TabPFN by Prior Labs · hosted on Render.

Top comments (0)