<?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: Yash Dharme</title>
    <description>The latest articles on DEV Community by Yash Dharme (@yash_dharme).</description>
    <link>https://dev.to/yash_dharme</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%2F4155661%2F4bbda09d-5581-4730-b139-e1b1974401a0.jpg</url>
      <title>DEV Community: Yash Dharme</title>
      <link>https://dev.to/yash_dharme</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yash_dharme"/>
    <language>en</language>
    <item>
      <title>Side Quest: an AI that sends you on a walk, and never learns where you are</title>
      <dc:creator>Yash Dharme</dc:creator>
      <pubDate>Thu, 08 Oct 2026 16:57:56 +0000</pubDate>
      <link>https://dev.to/yash_dharme/side-quest-an-ai-that-sends-you-on-a-walk-and-never-learns-where-you-are-21fo</link>
      <guid>https://dev.to/yash_dharme/side-quest-an-ai-that-sends-you-on-a-walk-and-never-learns-where-you-are-21fo</guid>
      <description>&lt;p&gt;&lt;em&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;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✏️ &lt;strong&gt;TODO before publishing:&lt;/strong&gt; fill every &lt;code&gt;TODO&lt;/code&gt; below, then delete this line.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;Side Quest&lt;/strong&gt; turns the streets around you into a short scavenger hunt.&lt;/p&gt;

&lt;p&gt;You tell it how long you have (15 to 60 minutes) and what kind of clues you like (playful, poetic, detective, or for kids). It finds a few interesting places within walking distance (a temple, a mural, an old bookshop, a pond) and plans a loop that fits your time. Then &lt;strong&gt;Gemma, running inside your browser, writes a riddle for each stop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then you put the phone away.&lt;/p&gt;

&lt;p&gt;When you think you've found the place, you check in. The app shows you one small thing to notice before you move on: &lt;em&gt;count the bells&lt;/em&gt;, &lt;em&gt;find the oldest crack in the wall&lt;/em&gt;, &lt;em&gt;listen for one sound that repeats&lt;/em&gt;. At the end, Gemma writes a three-line postcard about the walk. It is saved only on your device.&lt;/p&gt;

&lt;p&gt;Most "AI + outdoors" apps keep you looking at the screen while you're outside. I wanted the opposite: &lt;strong&gt;the screen is on for about ten seconds per stop&lt;/strong&gt;, and the rest of the time you're looking at the street.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TODO (your own words, 2–3 sentences): why you wanted this. Who would you hand it to? A friend who never leaves the hostel? Yourself after a 10-hour study day?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://hacktoberfest-26.vercel.app" rel="noopener noreferrer"&gt;https://hacktoberfest-26.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try it from your desk:&lt;/strong&gt; &lt;a href="https://hacktoberfest-26.vercel.app/?at=18.5195,73.8553&amp;amp;sim" rel="noopener noreferrer"&gt;https://hacktoberfest-26.vercel.app/?at=18.5195,73.8553&amp;amp;sim&lt;/a&gt; starts you at Shaniwar Wada in Pune and adds a &lt;em&gt;Teleport&lt;/em&gt; button, so you can play a whole quest without walking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need a browser with WebGPU for the model: Chrome on Android 12+, or Chrome/Edge on Windows or macOS. The first run downloads Gemma once (~0.7 GB). Without WebGPU, the walk still works with simple built-in clues.&lt;/p&gt;

&lt;p&gt;TODO: a 30–60s screen recording, or 3 screenshots: clue → "Found it" → postcard&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&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/Yash11778" rel="noopener noreferrer"&gt;
        Yash11778
      &lt;/a&gt; / &lt;a href="https://github.com/Yash11778/Hacktoberfest-26" rel="noopener noreferrer"&gt;
        Hacktoberfest-26
      &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;Side Quest&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A short walking scavenger hunt around wherever you're standing. The clues are written
by &lt;strong&gt;Gemma, running entirely in your browser&lt;/strong&gt; (WebGPU via &lt;a href="https://github.com/mlc-ai/web-llm" rel="noopener noreferrer"&gt;WebLLM&lt;/a&gt;)
Your location never leaves the phone.&lt;/p&gt;
&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05" rel="nofollow"&gt;Hacktoberfest Open-Source AI Challenge, Week 1: Touch Grass&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Pick how long you have (15–60 min) and a clue style (playful, poetic, detective, for kids).&lt;/li&gt;
&lt;li&gt;The app finds interesting places nearby from &lt;strong&gt;OpenStreetMap&lt;/strong&gt; and &lt;strong&gt;Wikipedia&lt;/strong&gt;:
parks, temples, murals, old trees, bookshops, historic buildings.&lt;/li&gt;
&lt;li&gt;A small planner picks a loop of 2–4 varied stops that fits your time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma writes a riddle for each stop&lt;/strong&gt; plus one small thing to notice when you get there.&lt;/li&gt;
&lt;li&gt;Put the phone away. Check in when you think you've found it (it buzzes if the screen is on).&lt;/li&gt;
&lt;li&gt;At the end, Gemma writes you a three-line postcard of the walk, saved only on your device.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Yash11778/Hacktoberfest-26" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT licensed. About 1,000 lines of TypeScript, no framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your phone ──► snap location to a ~1 km grid square
           ──► OpenStreetMap + Wikipedia: "what's interesting in this square?"
           ──► planner: pick 2–4 varied stops that fit your time
           ──► Gemma (WebGPU, in a Web Worker): write a riddle per stop
           ──► walk · check in · notice something · next clue
           ──► Gemma: write a postcard of the walk → saved on the device
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1. Finding places, with two free and keyless sources.&lt;/strong&gt; OpenStreetMap (via the public Overpass API) gives the small stuff: parks, temples, murals, named bakeries, old trees. Wikipedia's geosearch API gives named landmarks &lt;em&gt;with a line of description&lt;/em&gt;, which turns out to be great riddle material. Near Shaniwar Wada in Pune, one query returned 188 candidate places.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Planning the loop, deliberately without AI.&lt;/strong&gt; A small randomised search tries 400 greedy loops and keeps the one with the most stops, the most &lt;em&gt;variety&lt;/em&gt; (it heavily penalises a second temple in a row), and a total time closest to what you asked for. Walking speed is 70 m/min and streets get a 1.3× detour factor. A planner is the right tool here: it's deterministic and checkable, and a 1B model is bad at geometry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Writing the clues, which is where the model earns its place.&lt;/strong&gt; Each stop's OpenStreetMap tags and Wikipedia summary go to Gemma with one job: hint at the place without naming it, and suggest one thing to notice with your senses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`You write clues for a real-world walking scavenger hunt.

The walker must find this place: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;.

Write:
1. A riddle of at most two short sentences that hints at the place without saying its name.
   Use what someone would see, hear or smell there.
2. One small thing to notice once they arrive, using their senses. One sentence.

Tone: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;VOICE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;vibe&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;. No emoji. No hashtags.

Reply in exactly this format and nothing else:
CLUE: &amp;lt;riddle&amp;gt;
NOTICE: &amp;lt;thing to notice&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the model's answer can't be parsed, or it gives the name away, a template clue takes over and the screen says so honestly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TODO: paste 2–3 real clues Gemma wrote for you, with the place each one was for. Real output is more convincing than any description.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Open Matters Here
&lt;/h2&gt;

&lt;p&gt;This is the part I care about most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A hosted model would need your live location for every clue.&lt;/strong&gt; Here nothing about where you're standing ever reaches an AI provider, because the AI provider is your own GPU. Gemma runs in the browser through &lt;a href="https://github.com/mlc-ai/web-llm" rel="noopener noreferrer"&gt;WebLLM&lt;/a&gt; on WebGPU, inside a Web Worker.&lt;/p&gt;

&lt;p&gt;The only network requests are the map lookups, and even those never carry your exact position. The query box is snapped outward to a 0.01° grid (about 1.1 km) before it leaves the phone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * A bounding box snapped outward to a 0.01° grid (~1.1 km). This is the only
 * thing about your location that ever leaves the phone: the map server learns
 * which grid squares you asked about, never the point you're standing on.
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;snappedBbox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LatLng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;radiusM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everyone standing anywhere in the same square sends the identical request.&lt;/p&gt;

&lt;p&gt;The rest follows from using open pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; There are no API keys and no accounts. It's a static site plus one tiny cached relay function on Vercel's free tier. With a closed model API I'd be paying per riddle, or asking you for a key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline after the first run.&lt;/strong&gt; The model weights are cached by the browser, and map results are cached per area for a week, so a second walk in the same neighbourhood works with no signal at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is swappable.&lt;/strong&gt; You can pick Gemma 3 1B (~0.7 GB, sized for phones) or Gemma 2 2B (~1.4 GB, better clues on a laptop). Swapping is one line in &lt;code&gt;MODELS&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Went Wrong (and What I Changed)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The public Overpass server turns away browsers.&lt;/strong&gt; It worked from my dev machine, then failed on the deployed site: &lt;code&gt;overpass-api.de&lt;/code&gt; answers anonymous browser requests with &lt;code&gt;406 Not Acceptable&lt;/code&gt; and no CORS header, so the browser reports a CORS error that hides the real reason. The server wants clients to identify themselves, and a browser isn't allowed to set &lt;code&gt;User-Agent&lt;/code&gt;. The fix is a ~50-line Vercel function, &lt;code&gt;api/places.ts&lt;/code&gt;. It accepts &lt;em&gt;only&lt;/em&gt; a grid-snapped box (anything off-grid or over ~9 km is rejected), sends the fixed query with an identifying &lt;code&gt;User-Agent&lt;/code&gt;, falls back across four mirrors, and sets &lt;code&gt;s-maxage=604800&lt;/code&gt; so the CDN answers repeat boxes for a week without touching OpenStreetMap at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Even when it identified itself, Overpass was often overloaded&lt;/strong&gt;, with &lt;code&gt;504 Gateway Timeout&lt;/code&gt; more often than not during testing. So OpenStreetMap and Wikipedia run &lt;strong&gt;in parallel&lt;/strong&gt;, OSM gets a hard time budget, and either source alone is enough to plan a walk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wikipedia was silently dropping most results.&lt;/strong&gt; The geosearch generator returned 47 pages, but only 10 had coordinates attached. &lt;code&gt;prop=coordinates&lt;/code&gt; has its &lt;em&gt;own&lt;/em&gt; limit (&lt;code&gt;colimit&lt;/code&gt;) that defaults to 10. Adding &lt;code&gt;colimit=max&lt;/code&gt; took the area from 1 usable landmark to dozens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;'gpu' in navigator&lt;/code&gt; is not enough.&lt;/strong&gt; A browser can expose WebGPU and still have no usable adapter. Chrome on Linux does exactly that by default. The check now actually calls &lt;code&gt;requestAdapter()&lt;/code&gt;, and if the model can't start, the walk still happens with built-in clues instead of an error screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browsers pause GPS when the screen is off.&lt;/strong&gt; I can only buzz you on arrival while the screen is on. Otherwise you tap &lt;em&gt;I think I'm here&lt;/em&gt;. Honestly, that turned out to be part of the fun.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I Took It Outside
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;TODO (bonus points, and the best part of the post): go on 1–3 real walks. Where did it send you? Which clue made you laugh, and which was too vague? What did you find that you'd walked past for years? Add a photo or two.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fine-tune a small Gemma on good riddles, since the 1B model's clues vary in quality.&lt;/li&gt;
&lt;li&gt;A "share this quest" link, so friends can walk the same route without either of you sending your location anywhere.&lt;/li&gt;
&lt;li&gt;Hindi and Marathi clues.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma is the only AI in the app. It runs entirely on-device via WebGPU and writes every clue and postcard.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Map data © OpenStreetMap contributors (ODbL). Wikipedia text CC BY-SA. Built with AI assistance (Claude Code) for the scaffolding and debugging.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
