<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arjun Menon</title>
    <description>The latest articles on DEV Community by Arjun Menon (@arjun_menon_e7a7dd0cf80d8).</description>
    <link>https://dev.to/arjun_menon_e7a7dd0cf80d8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4172612%2F77d4c92a-48da-483b-b204-3ccd27161d47.png</url>
      <title>DEV Community: Arjun Menon</title>
      <link>https://dev.to/arjun_menon_e7a7dd0cf80d8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arjun_menon_e7a7dd0cf80d8"/>
    <language>en</language>
    <item>
      <title>Prairies: Find your inner peace one quest at a time</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:45:18 +0000</pubDate>
      <link>https://dev.to/arjun_menon_e7a7dd0cf80d8/prairies-find-your-inner-peace-one-quest-at-a-time-1i3k</link>
      <guid>https://dev.to/arjun_menon_e7a7dd0cf80d8/prairies-find-your-inner-peace-one-quest-at-a-time-1i3k</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Touch Grass is an offline-first walking companion that turns a short walk into a small reflective quest.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The goal is simple: make the screen the shortest part of the experience.&lt;/p&gt;

&lt;p&gt;The app includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offline walking quests based on cached OpenStreetMap data.&lt;/li&gt;
&lt;li&gt;Local route packs for offline use.&lt;/li&gt;
&lt;li&gt;Voice notes recorded directly in the browser.&lt;/li&gt;
&lt;li&gt;On-device Whisper transcription.&lt;/li&gt;
&lt;li&gt;Optional on-device Gemma 3 1B cleanup for punctuation, capitalisation, and filler removal.&lt;/li&gt;
&lt;li&gt;Formatted and raw journal-entry views.&lt;/li&gt;
&lt;li&gt;Local-first deletion of completed or incomplete journeys.&lt;/li&gt;
&lt;li&gt;Automatic cloud backup through MongoDB Atlas.&lt;/li&gt;
&lt;li&gt;Device-scoped cloud records.&lt;/li&gt;
&lt;li&gt;A minimal mobile-first green interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live demo: &lt;a href="https://prairie-erri.onrender.com/" rel="noopener noreferrer"&gt;https://prairie-erri.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The basic flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Touch Grass.&lt;/li&gt;
&lt;li&gt;Choose a walking area or use the current location.&lt;/li&gt;
&lt;li&gt;Prepare a quest.&lt;/li&gt;
&lt;li&gt;Start the walk.&lt;/li&gt;
&lt;li&gt;Record a voice note at a stop.&lt;/li&gt;
&lt;li&gt;Let Whisper transcribe it locally.&lt;/li&gt;
&lt;li&gt;Let Gemma clean the transcription when supported.&lt;/li&gt;
&lt;li&gt;Finish the walk and review the journal.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The project is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/I1gorr/touch_grass" rel="noopener noreferrer"&gt;https://github.com/I1gorr/touch_grass&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;web/&lt;/code&gt; — the installable PWA.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server/&lt;/code&gt; — the Render sync API.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lib/datatrack/&lt;/code&gt; — the original/reference Dart routing and data track.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The web app is built as a TypeScript PWA with Vite.&lt;/p&gt;

&lt;p&gt;The browser stores the local source of truth in IndexedDB:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quest details.&lt;/li&gt;
&lt;li&gt;Stops and prompts.&lt;/li&gt;
&lt;li&gt;Raw and formatted journal entries.&lt;/li&gt;
&lt;li&gt;Local photos.&lt;/li&gt;
&lt;li&gt;Pending voice recordings.&lt;/li&gt;
&lt;li&gt;Offline map packs.&lt;/li&gt;
&lt;li&gt;Downloaded model assets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whisper runs locally in the browser through WebAssembly. It converts a voice note into a transcript without uploading the audio.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Photos and audio remain local and are never uploaded to Atlas.&lt;/p&gt;

&lt;p&gt;The deployed system uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Render Static Site for the PWA.&lt;/li&gt;
&lt;li&gt;Render Web Service for the sync API.&lt;/li&gt;
&lt;li&gt;MongoDB Atlas for optional cloud backup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;The open-source and open-weight approach makes Touch Grass possible in places where a closed cloud AI workflow would be less suitable.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;This project is entering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;li&gt;Best Use of MongoDB Atlas&lt;/li&gt;
&lt;li&gt;Best Use of Render&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Teammates:&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/i1gor"&gt;@i1gor&lt;/a&gt; &lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/aardo"&gt;@aardo&lt;/a&gt; &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
