<?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: SUNNY TIWARI</title>
    <description>The latest articles on DEV Community by SUNNY TIWARI (@sunny_tiwari_1921).</description>
    <link>https://dev.to/sunny_tiwari_1921</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%2F4177696%2Ff301d96d-aa9f-4545-918b-6bc0256c96fe.jpg</url>
      <title>DEV Community: SUNNY TIWARI</title>
      <link>https://dev.to/sunny_tiwari_1921</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sunny_tiwari_1921"/>
    <language>en</language>
    <item>
      <title>Touch Grass Bingo: an AI that runs in your browser and sends you outside</title>
      <dc:creator>SUNNY TIWARI</dc:creator>
      <pubDate>Sun, 11 Oct 2026 20:53:33 +0000</pubDate>
      <link>https://dev.to/sunny_tiwari_1921/touch-grass-bingo-an-ai-that-runs-in-your-browser-and-sends-you-outside-1k8i</link>
      <guid>https://dev.to/sunny_tiwari_1921/touch-grass-bingo-an-ai-that-runs-in-your-browser-and-sends-you-outside-1k8i</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;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Touch Grass Bingo is a small web app. You type your city or area, pick how much time you have (15 minutes to 2 hours) and a vibe (chill walk, photo hunt, street food and people, nature and wildlife). An open-weight AI model then writes a 5x5 bingo card for you: "Spot a street dog", "Hear a temple bell", "Find a flower".&lt;/p&gt;

&lt;p&gt;Then you put the phone in your pocket and go tick the squares off. The middle square is free. Get a line and you get a BINGO.&lt;/p&gt;

&lt;p&gt;The idea is simple: the app should be the shortest part of your day. You open it for 30 seconds, then you leave.&lt;/p&gt;

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

&lt;p&gt;Live app: &lt;a href="https://sanny1921.github.io/touch-grass-bingo/" rel="noopener noreferrer"&gt;https://sanny1921.github.io/touch-grass-bingo/&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%2Fazr3mb96dxxzbsywcf9a.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%2Fazr3mb96dxxzbsywcf9a.png" alt="Start screen of Touch Grass Bingo" width="420" height="900"&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%2Fpeqss5npqixp56o44kjx.jpg" 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%2Fpeqss5npqixp56o44kjx.jpg" alt="A real card generated on my Android phone" width="610" height="1356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second screenshot is a real card, generated on my own Android phone in Chrome. It is not a mock.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/Sanny1921/touch-grass-bingo" rel="noopener noreferrer"&gt;https://github.com/Sanny1921/touch-grass-bingo&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Llama 3.2 1B Instruct, an open-weight model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; WebLLM, which runs the model inside the browser on WebGPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; one plain HTML file with no framework, no backend and no API key. It is hosted free on GitHub Pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first time you press "Generate my card", your browser downloads the model (about 700MB). After that it is cached on your device. Everything after that happens on your phone.&lt;/p&gt;

&lt;h3&gt;
  
  
  The struggle (v1 to v3)
&lt;/h3&gt;

&lt;p&gt;I built this overnight, and the first version did not work on my phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v1:&lt;/strong&gt; I asked the model to return a JSON array of 24 strings. On my phone the model loaded fine, but it kept returning broken JSON. After 3 retries the app gave up and showed a built-in starter card instead. So I had an "AI app" that was not using the AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v2:&lt;/strong&gt; I figured a 1B model is just bad at strict JSON. I changed the contract to a plain numbered list ("1. Spot a street dog") and wrote a forgiving parser. It ignores numbering styles, bullets, markdown and duplicates, and drops junk lines. I also tried a bigger model, Qwen2.5 1.5B. But that was a 1GB download and it kept failing on my wifi with a cache error. Lesson: on a phone, model size is part of the product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v3:&lt;/strong&gt; I went back to Llama 3.2 1B, which my phone had already downloaded, and kept the numbered list. I also added a salvage step: the app keeps the best of 3 attempts, and if the model gives at least 14 good squares, it fills the rest from a starter list instead of throwing everything away. I also added retries for the model download and a visible progress percentage.&lt;/p&gt;

&lt;p&gt;That worked. The card in the screenshot above came from the model on my phone.&lt;/p&gt;

&lt;p&gt;Honest limits: a 1B model writes simple squares, and they can be generic ("Find a flower"). It is not a travel guide. A bigger model would write sharper, more local cards, and that is the first thing I would change with more time.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your location stays with you.&lt;/strong&gt; You type where you are. That text goes to a model running on your own phone, not to someone else's server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; There is no API bill, so I can leave it up for anyone. Hosting is a single static file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could swap the model.&lt;/strong&gt; While building this I changed models and prompts several times by editing one line. With a closed API I would have been stuck with whatever it gave me.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Would Do Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Let people pick a bigger model if their phone and wifi can handle it.&lt;/li&gt;
&lt;li&gt;Save a card and share it with friends so you can race on the same one.&lt;/li&gt;
&lt;li&gt;Use the time and weather to tune the card.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This project does not use any partner tool. It is an open-weight model (Llama 3.2) running in the browser with WebLLM, so I'm entering for the overall prize.&lt;/p&gt;

&lt;p&gt;Thanks for reading. Now go touch some grass.&lt;/p&gt;

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