DEV Community

Aditya Kumar
Aditya Kumar

Posted on AI-assisted

Walkworth: Walk it. Say it. Keep it. A spoken trek journal on local open-source AI

Hacktoberfest: Maintainer Spotlight

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

What I Built

Walkworth is a trek journal you speak instead of type. Before a walk you open the app once on Wi-Fi so it caches. On the trail you put the phone in your pocket, and when something is worth keeping you tap once, say it out loud, and tap again. "Langurs on the wall near the gate, three of them, totally unbothered." That's a whole entry. The phone buzzes when it starts and stops listening, so you never have to look at it.

Back home, your laptop turns the voice notes, photos and GPS track into a journal. There's a cover with your route drawn on it, chapters in time order, your own words set large as quotes, and photos pinned to where you took them. You can print it, publish it, or paste it into a DEV post like this one.

I wanted the screen to be the shortest part of the day. On the trail the whole interface is one button. It's for people who walk a lot and can't remember any of it by Monday, and for anyone who'd like a record of a walk without spending the walk on their phone.

Demo and live link


Walkworth demo screenshot 1Walkworth demo screenshot 2Walkworth demo screenshot 3Walkworth demo screenshot 4Walkworth demo screenshot 5Walkworth demo screenshot 6

Code

Walkworth

Walk it. Say it. Keep it.

A spoken trek journal. You talk while you walk and your phone stays in your pocket. Each voice note and photo uploads as you go (or waits on the phone until you're back in range). Then Gemma writes the journal around your own words, and every line it adds cites the notes it came from. A line that cites nothing is dropped before the journal is made.

How it works

  1. Start a walk. One big button: tap, talk, tap. The phone buzzes when it listens, and each note gets a GPS fix.
  2. It uploads as you go. Notes and photos are kept in the browser until the server has them, so a dropped signal or a closed tab loses nothing.
  3. Make the journal. A Temporal workflow transcribes (ElevenLabs Scribe), lines notes up with the GPX track, picks out what you saw, captions photos…

How I Built It

The phone only records. Everything smart happens on the laptop afterwards, and I made that split on purpose. Fort trails around Pune often have no signal, and I didn't want a trek journal that needs a network or burns battery running models in my pocket.

On the phone. A PWA built with Vite and TypeScript. A service worker handles offline caching, MediaRecorder does the audio, each note grabs one GPS fix, and IndexedDB stores it all. For the continuous route I use OpenTracks, an open-source Android tracker, because browsers pause GPS when the screen locks. The PWA also counts how long the screen was on, which is where the screen-time number comes from.

On the laptop.

  • whisper.cpp (the small model) transcribes every clip. It copes with Hindi, Marathi and English in the same sentence, which is how I talk anyway.
  • Gemma 3 through Ollama does the rest: it pulls structured observations out of each transcript, captions the photos, and writes the short connecting lines. I run gemma3:4b by default and gemma3:12b when the machine allows. The model name is one line in walkworth.config.toml.
  • Temporal runs the pipeline as a single workflow: import, transcribe, align, extract, caption, compose. Each step is a durable activity with retries.
  • FastAPI and SQLite hold the data. No cloud database.
  • Render hosts one thing, the finished journal as a static site.

The one rule I'm strict about. The journal can't lie. Every sentence the model writes has to carry the ids of the notes it came from, and a sentence with no source gets dropped before it renders. Your quotes always appear word for word. So the model can arrange and trim, but it can't invent a sighting you didn't make. I'd rather lose a nice sentence than print a fake langur.

What went wrong. I started OpenTracks forty minutes late. I was already past the first bend at Atkarwadi, chai in one hand, when I remembered. So the first 2 km of the climb has no track at all. The app rebuilt it from the GPS fixes on my voice notes, and the route on the cover has one straight line where the switchbacks should be. I left it.

Whisper struggled with the fort. It heard "Tanaji Kada" as "tanaji cada" and "Kalyan Darwaja" as "kalyan the wajah". Everything else came out clean, so I didn't notice until I read the landmark chips and 5 of the 9 were gibberish. I added a short glossary of 12 fort names, and now it fixes them before anything else sees the transcript.

The fog was the worst. Around 7:50 at the top I said four notes in a row into a wind so loud that two of them are just noise, with my voice buried somewhere underneath. The journal skips them. The gap sits between the gate and the bhaji stall. I could've faked a line to fill it, but every sentence in this thing is supposed to be something I actually said. So it stays empty.

Why Does Open Innovation Matter?

Here's what going open actually bought me, from things that happened while I built this.

The fort has no signal. A closed API would stop working at the base of the climb. With Whisper and Gemma on my laptop the whole pipeline runs with Wi-Fi off.

The recordings are my voice and several hours of my location history. I didn't want either on a server I don't control. With local models nothing leaves the laptop. When I publish, only the finished journal goes online, and there's a switch that hides the first and last 300 metres of the route so nobody can tell where I started.

And I can swap models by changing one line in the config. When Whisper mangled the fort names, the fix was a small glossary file I could edit myself. You can only make that kind of fix when you own the stack. It costs nothing per trek, too.

Prize Categories

  • Best Use of ElevenLabs: I used ElevenLabs to narrate the voiceover of the demo video and also for text to speech and speech to text generations ElevenLabs is being used.
  • Best Use of Gemma: Gemma 3 runs locally through Ollama for extraction, captions and journal writing.
  • Best Use of Temporal: the whole post-trek pipeline is one workflow.Temporal workflow screenshot for Walkworth

  • Best Use of Render: the finished journal is deployed as a static site from a render.yaml

Top comments (0)