This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.
What I Built
Touch Grass is an offline-first walking companion that turns a short walk into a small reflective quest.
The app prepares a street-routed walking loop while the user is online. Once the quest is ready, the user can walk without a connection, visit suggested places, record voice notes, take a photo, and later review the experience as a journal.
The goal is simple: make the screen the shortest part of the experience.
The app includes:
- Offline walking quests based on cached OpenStreetMap data.
- Local route packs for offline use.
- Voice notes recorded directly in the browser.
- On-device Whisper transcription.
- Optional on-device Gemma 3 1B cleanup for punctuation, capitalisation, and filler removal.
- Formatted and raw journal-entry views.
- Local-first deletion of completed or incomplete journeys.
- Automatic cloud backup through MongoDB Atlas.
- Device-scoped cloud records.
- A minimal mobile-first green interface.
The app is designed for people who want a reason to go outside without depending on a constant network connection or sending their voice recordings to a remote AI service.
Demo
Live demo: https://prairie-erri.onrender.com/
The basic flow is:
- Open Touch Grass.
- Choose a walking area or use the current location.
- Prepare a quest.
- Start the walk.
- Record a voice note at a stop.
- Let Whisper transcribe it locally.
- Let Gemma clean the transcription when supported.
- Finish the walk and review the journal.
Code
The project is available on GitHub:
https://github.com/I1gorr/touch_grass
The repository contains:
-
web/— the installable PWA. -
server/— the Render sync API. -
lib/datatrack/— the original/reference Dart routing and data track.
How I Built It
The web app is built as a TypeScript PWA with Vite.
The browser stores the local source of truth in IndexedDB:
- Quest details.
- Stops and prompts.
- Raw and formatted journal entries.
- Local photos.
- Pending voice recordings.
- Offline map packs.
- Downloaded model assets.
Whisper runs locally in the browser through WebAssembly. It converts a voice note into a transcript without uploading the audio.
The formatted journal entry is produced by an on-device language model. The cleanup prompt asks Gemma to preserve the speaker's meaning, fix punctuation and capitalisation, remove filler words, and return only the cleaned text.
The app also validates Gemma's output. If the result appears to invent information, repeat the prompt, or change the meaning too much, the app falls back to deterministic rule-based cleanup.
MongoDB Atlas stores separate documents for walks, stops, entries, and reports. Each record is associated with a device ID, so one installation cannot overwrite another installation's records.
Photos and audio remain local and are never uploaded to Atlas.
The deployed system uses:
- Render Static Site for the PWA.
- Render Web Service for the sync API.
- MongoDB Atlas for optional cloud backup.
Cloud synchronisation is automatic after local changes, when the browser comes back online, and periodically while the app is open. If a connection fails, local data remains available and is retried later.
Why Does Open Innovation Matter?
The open-source and open-weight approach makes Touch Grass possible in places where a closed cloud AI workflow would be less suitable.
The most important benefit is privacy. Voice notes can be transcribed on the phone instead of being uploaded to a third-party speech service. The user can also choose whether to download and use a language model locally.
The offline design is equally important. A walk should not stop being useful just because the user loses signal. The route, notes, recordings, and downloaded models remain available locally.
Using open-weight models also keeps the system replaceable. Whisper and Gemma are model choices rather than permanent dependencies on a single paid API. They can be swapped, tested, or improved independently of the rest of the application.
This architecture also keeps the recurring cost low for a small deployment. The app can use local inference for voice and text processing, while MongoDB Atlas only stores the compact backup metadata required by the application.
Prize Categories
This project is entering:
- Best Use of Gemma
- Best Use of MongoDB Atlas
- Best Use of Render
Gemma is used for local journal cleanup and quest text generation. MongoDB Atlas provides device-scoped cloud backup. Render hosts the deployed PWA and sync API.
Top comments (0)