<?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: Abhyuday Sharma</title>
    <description>The latest articles on DEV Community by Abhyuday Sharma (@abhyuday_sharma_4093).</description>
    <link>https://dev.to/abhyuday_sharma_4093</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%2F4169607%2F3b960b39-40bc-4e08-acbf-67ad4bf7aafc.jpg</url>
      <title>DEV Community: Abhyuday Sharma</title>
      <link>https://dev.to/abhyuday_sharma_4093</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhyuday_sharma_4093"/>
    <language>en</language>
    <item>
      <title>🌿 Tahal: A Little Less Screen, A Little More Green</title>
      <dc:creator>Abhyuday Sharma</dc:creator>
      <pubDate>Sun, 11 Oct 2026 14:58:10 +0000</pubDate>
      <link>https://dev.to/abhyuday_sharma_4093/tahal-a-little-less-screen-a-little-more-green-49oh</link>
      <guid>https://dev.to/abhyuday_sharma_4093/tahal-a-little-less-screen-a-little-more-green-49oh</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;What I Built&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every "go touch grass" app has the same plot hole: to use it, you have to look at it.&lt;/p&gt;

&lt;p&gt;Tahal (टहल, Hindi for a stroll, the thing your dadi tells you to do after dinner) fixes that by being something you listen to. You say how long you have, pick who should guide you, pick a language, and an open Gemma model running on your own laptop writes you a short walk. Then you put the phone in your pocket and the walk is spoken to you, one stop at a time, with a soft chime in between. After that the app never asks for your eyes again.&lt;/p&gt;

&lt;p&gt;A stop sounds something like this:&lt;br&gt;
👂 One minute of quiet. Stop. Cup your ears and count how many different sounds you can find. Don't name them, just count. (three minutes pass, a chime rings, the next stop begins)&lt;br&gt;
Who guides you is a personality, not a setting:&lt;/p&gt;

&lt;p&gt;Dadi ji calls you beta and teases you about your phone.&lt;br&gt;
Birdwatcher is far too excited about leaves.&lt;br&gt;
Gully detective treats your walk like a case. The culprit is, reliably, a squirrel.&lt;br&gt;
Quiet monk says almost nothing and leaves long silences for you to fill.&lt;/p&gt;

&lt;p&gt;It speaks English, हिन्दी or Hinglish, because "go outside" lands differently when it's said in the language you grew up hearing it in.&lt;/p&gt;

&lt;p&gt;It's for anyone who says "I'll go for a walk" and then opens fourteen tabs. (Developers. I mean developers.)&lt;/p&gt;

&lt;p&gt;The one rule I held myself to: the screen should be the shortest part of the experience. Setup takes about twenty seconds. The walk takes as long as you like and needs the screen for none of it.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Demo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Live demo, no install: [&lt;a href="https://abhyudaysharma.github.io/TAHAL/" rel="noopener noreferrer"&gt;https://abhyudaysharma.github.io/TAHAL/&lt;/a&gt;] plays three hand-written sample walks (English, Hinglish and Hindi) right in your browser, with the same spoken voice, timers, pocket mode and journal. It has no model behind it, so it's the walking experience, not Gemma's writing. Walks you pack yourself are written by Gemma on your own machine (setup below).&lt;/p&gt;

&lt;p&gt;📸 &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2u2any0oz379urll5ou.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2u2any0oz379urll5ou.png" alt=" " width="800" height="748"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F30amm345jtffk7gwdrcz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F30amm345jtffk7gwdrcz.png" alt=" " width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole page wears the real sky where you are: golden hour is amber, dusk is indigo, night is deep blue, and the sun on the arc sits where the sun actually is for your coordinates.&lt;/p&gt;

&lt;p&gt;To have Gemma write walks for you, three commands (you need Node 18+ and Ollama):&lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;
ollama pull gemma3:4b&lt;br&gt;
git clone &lt;a href="https://github.com/Abhyudaysharma/TAHAL.git" rel="noopener noreferrer"&gt;https://github.com/Abhyudaysharma/TAHAL.git&lt;/a&gt;&lt;br&gt;
cd TAHAL &amp;amp;&amp;amp; node server.js   &lt;/p&gt;
&lt;h1&gt;
  
  
  then open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Add ?fast=1 to the address and every "minute" lasts two seconds, so you can watch a whole walk play out in under a minute.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Code&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Abhyudaysharma" rel="noopener noreferrer"&gt;
        Abhyudaysharma
      &lt;/a&gt; / &lt;a href="https://github.com/Abhyudaysharma/TAHAL" rel="noopener noreferrer"&gt;
        TAHAL
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Tahal (टहल) 🌿&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A walk guide that talks, so your phone can stay in your pocket.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tahal&lt;/em&gt; is Hindi for "a stroll". You tell it how long you have, pick a guide (Dadi ji, a bird-nerd, a gully detective or a quiet monk) and a language (English, हिन्दी or Hinglish). An open &lt;strong&gt;Gemma&lt;/strong&gt; model running on your own machine writes a short walk. Then you put the phone away and the walk is &lt;em&gt;spoken&lt;/em&gt; to you, stop by stop, with a chime between stops. The screen goes black and takes a press-and-hold to wake, so it is safe in a pocket.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try it without installing anything:&lt;/strong&gt; the &lt;a href="https://abhyudaysharma.github.io/Tahal/" rel="nofollow noopener noreferrer"&gt;live demo&lt;/a&gt; plays three &lt;em&gt;hand-written&lt;/em&gt; sample walks (English, Hinglish and Hindi) in your browser, with the same voice, timers, pocket mode and journal. It has no model, so writing new walks needs the setup below.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pack&lt;/th&gt;
&lt;th&gt;Walk&lt;/th&gt;
&lt;th&gt;Pocket&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Abhyudaysharma/TAHAL/docs/home.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FAbhyudaysharma%2FTAHAL%2FHEAD%2Fdocs%2Fhome.png" alt="home"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Abhyudaysharma/TAHAL/docs/player.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FAbhyudaysharma%2FTAHAL%2FHEAD%2Fdocs%2Fplayer.png" alt="player"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Abhyudaysharma/TAHAL/docs/pocket-rest.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FAbhyudaysharma%2FTAHAL%2FHEAD%2Fdocs%2Fpocket-rest.png" alt="rest"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What makes it different&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Voice-first,&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Abhyudaysharma/TAHAL" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Zero dependencies, so there is no npm install. Plain Node on the server, vanilla JS in the browser, system fonts only, and nothing loaded from a CDN.&lt;/p&gt;

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

&lt;p&gt;**&lt;br&gt;
The open pieces: Gemma (default gemma3:4b, with gemma3n:e2b as a lighter option) served locally through Ollama. The server talks to it over localhost, and nothing in the app calls a hosted LLM.&lt;/p&gt;

&lt;p&gt;A few decisions mattered more than I expected:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Small models get a short leash. A 4B model is good, not magic, so the server doesn't trust it blindly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ollama's JSON mode, plus a fallback that digs the first {…} out of chatty answers.&lt;br&gt;
"The stops must add up to 30 minutes" is arithmetic, and small models are bad at arithmetic. The server rescales the stop times so they add up to your time budget exactly.&lt;br&gt;
Spoken text is stripped of emoji, asterisks and markdown, because a text-to-speech voice reading "asterisk asterisk phone asterisk asterisk" is a bad time.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;It can only name places you taught it. Models love inventing a lovely "Maple Grove Trail", which is worse than useless for a hyperlocal guide. So there's a Your neighbourhood list: you add the gate, the banyan tree, the chai stall, and the prompt says if you mention any place, use only these, by exactly this name. With no places added, it names none and talks only about what anyone would find outside. That list lives in your browser and never leaves your machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The sky is the interface. Sunrise and sunset come from a small piece of solar maths that runs on-device (the tests check it against published Greenwich solstice times). From that I get five phases (dawn, day, golden hour, dusk, night) that tint the whole UI. The same sunset and golden-hour information goes into the prompt, so the guide knows how much light you actually have left. It also knows the Indian season (ritu): in October it's Sharad, the clear skies after the monsoon.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pocket mode. Phones in pockets get touched. After a few seconds the screen goes pure black with one slowly breathing dot, and a tap does nothing: you press and hold to wake it. The screen wake lock is requested where the browser allows it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pack at home, walk offline. You generate a walk while you're next to your laptop. It's saved on the phone and played back with browser APIs only (speech synthesis, Web Audio, timers), so the model isn't needed on the trail.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you get back, you write one line about what you noticed. Gemma answers in your guide's voice, and you can download a shareable walk card.&lt;/p&gt;

&lt;p&gt;Testing: a dependency-free test suite runs against a fake Ollama (the sun maths, phase of day, minute fitting, output cleaning, the place whitelist, model swapping, error paths). I also drove the whole flow in headless Chromium: pack, walk, pocket rest, press-and-hold wake, journal, walk card.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How it went outside&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✏️ REPLACE THIS WHOLE SECTION with your real walk. Keep it short and honest; a real failure is worth more than a polished claim. Fill in the blanks:&lt;/p&gt;

&lt;p&gt;Where and when: I took it out around ___ (time) near ___ (place), with ___ as my guide, in ___ (language).&lt;br&gt;
Gemma and my laptop: gemma3:4b / gemma3n:e2b on a ___ laptop took about ___ seconds to write the walk.&lt;br&gt;
What worked: ___&lt;br&gt;
What was awkward or just wrong: ___&lt;br&gt;
One thing I actually noticed out there: ___&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What's still rough&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Gemma's Hindi from a 4B model is the part I trust least. It's the thing to judge on your own device, and it's also the thing the open approach lets you fix: edit a prompt, or swap in a bigger model from the dropdown. My automated tests use a fake model, so they prove the plumbing, not the poetry.&lt;/p&gt;

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

&lt;p&gt;I tried to answer this by asking what would break if the model were a closed API.&lt;/p&gt;

&lt;p&gt;The trail has no signal. The whole point is to be outside. Once a walk is packed it needs no connection and no model. A guide that only works while a data centre is reachable is a guide for the sofa.&lt;br&gt;
Your neighbourhood is yours. The places you pass every day, the line you write when you get back, and where you were at 5 p.m. are about as personal as app data gets. Here the model, the server and the journal all live on my machine. The only thing that can leave it is an optional weather lookup with coordinates rounded to about 1 km, and NO_WEATHER=1 switches that off completely.&lt;br&gt;
Rerolling is free. Asking for a different walk ten times because the first one said "find a bench" costs nothing. There's no key, no quota and no bill.&lt;br&gt;
I can change how it behaves. One dropdown swaps the model. One edited string creates a new guide. Because the weights are open, fine-tuning a more natural Hindi Gemma is a real next step, not a feature request in someone else's queue.&lt;br&gt;
Anyone can fork it for their own city. Change the default location, add your region's seasons, write a guide in Tamil or Bengali.&lt;/p&gt;

&lt;p&gt;Where a closed model would honestly win: raw eloquence and the very best Hindi. A 4B model writes decent walks, not poetry. For this job I'll take private, free, offline and editable over a slightly nicer sentence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Agent Session&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn't save this session with DevRelay or Entire, so there's nothing to embed. To be upfront about how it was made: I built Tahal together with Claude (Anthropic's AI assistant), which wrote most of the code and tests and drafted this post. I chose the direction (a hyperlocal, voice-first walk guide in Hindi for my own city) and ran it myself.&lt;/p&gt;

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

&lt;p&gt;Best Use of Gemma. Gemma runs locally through Ollama and is the core of the app: it writes every walk and every post-walk reflection, you can swap between Gemma variants from the UI, and it is steered by persona, language and place-whitelist prompts built around it.&lt;/p&gt;

&lt;p&gt;Go for a tahal. The app will be here when you get back. 🌿&lt;/p&gt;

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