<?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: Prateek singh</title>
    <description>The latest articles on DEV Community by Prateek singh (@prateekiiitg56).</description>
    <link>https://dev.to/prateekiiitg56</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Prateek singh</title>
      <link>https://dev.to/prateekiiitg56</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prateekiiitg56"/>
    <language>en</language>
    <item>
      <title>Touch Grass Bingo - offline nature bingo checked by an AI that lives on your phone</title>
      <dc:creator>Prateek singh</dc:creator>
      <pubDate>Fri, 09 Oct 2026 15:48:53 +0000</pubDate>
      <link>https://dev.to/prateekiiitg56/touch-grass-bingo-offline-nature-bingo-checked-by-an-ai-that-lives-on-your-phone-2605</link>
      <guid>https://dev.to/prateekiiitg56/touch-grass-bingo-offline-nature-bingo-checked-by-an-ai-that-lives-on-your-phone-2605</guid>
      <description>&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%2Fev07klft88ux49rcxkuh.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%2Fev07klft88ux49rcxkuh.png" alt=" " width="800" height="336"&gt;&lt;/a&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;&lt;strong&gt;Touch Grass Bingo&lt;/strong&gt; is a nature bingo card that you play outside. You open it, get a seasonal card (a red leaf, an acorn, moss, a feather, a mushroom…), and put your phone away. When you find something, you take one photo. An open-weight vision model running on your phone checks it and marks the square.&lt;/p&gt;

&lt;p&gt;The center square is never free. It is &lt;strong&gt;"Touch grass"&lt;/strong&gt;: a photo of your hand on real grass.&lt;/p&gt;

&lt;p&gt;Who it is for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Families&lt;/strong&gt; who want a reason to make a walk last longer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run clubs and hiking groups.&lt;/strong&gt; Everyone types the same card code (like &lt;code&gt;FERN-42&lt;/code&gt;) and gets the same card. First to bingo wins. There are no accounts and no server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone doomscrolling&lt;/strong&gt; who needs a nudge. If you photograph your monitor, the model detects a screen and tells you that you cannot touch grass through a monitor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The screen is the shortest part of the game: one glance at the card, then the phone goes in the pocket until you find something.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Play it:&lt;/strong&gt; &lt;a href="https://prateekiiitg56.github.io/touch-grass-bingo/" rel="noopener noreferrer"&gt;https://prateekiiitg56.github.io/touch-grass-bingo/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open it on your phone. Tap &lt;strong&gt;Download photo checker&lt;/strong&gt; once on Wi-Fi (about 150 MB). After that, it works in airplane mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play the same card as a friend:&lt;/strong&gt; &lt;a href="https://prateekiiitg56.github.io/touch-grass-bingo/?code=FERN-42" rel="noopener noreferrer"&gt;https://prateekiiitg56.github.io/touch-grass-bingo/?code=FERN-42&lt;/a&gt;&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/Prateekiiitg56" rel="noopener noreferrer"&gt;
        Prateekiiitg56
      &lt;/a&gt; / &lt;a href="https://github.com/Prateekiiitg56/touch-grass-bingo" rel="noopener noreferrer"&gt;
        touch-grass-bingo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Offline nature bingo. Snap what you find outside; open-weight CLIP checks it on your phone. No signal, no uploads.
    &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;Touch Grass Bingo&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Offline nature bingo for walks, hikes and run clubs. The app deals you a seasonal bingo card (a red leaf, an acorn, moss, a feather…). You go outside and take a photo only when you find a square. An open-weight AI model running &lt;strong&gt;on your phone&lt;/strong&gt; checks the photo. No signal is needed and no photo leaves the device.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight model:&lt;/strong&gt; &lt;a href="https://huggingface.co/Xenova/clip-vit-base-patch32" rel="nofollow noopener noreferrer"&gt;CLIP ViT-B/32&lt;/a&gt; (ONNX, 8-bit quantized)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source runtime:&lt;/strong&gt; &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt; 3.7.6 on ONNX Runtime Web (WASM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No backend:&lt;/strong&gt; static files only. Host on GitHub Pages, Netlify or any static host.&lt;/li&gt;
&lt;/ul&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;
&lt;strong&gt;Field kit.&lt;/strong&gt; On Wi-Fi, tap &lt;em&gt;Download field kit&lt;/em&gt;. The model (about 150 MB) goes into the browser cache. A service worker caches the app shell and runtime. From then on the app works in airplane mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deal a card.&lt;/strong&gt; A card code (for example &lt;code&gt;FERN-42&lt;/code&gt;) seeds a deterministic shuffle of the season's item…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Prateekiiitg56/touch-grass-bingo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;a href="https://huggingface.co/Xenova/clip-vit-base-patch32" rel="noopener noreferrer"&gt;CLIP ViT-B/32&lt;/a&gt;, open weights, ONNX export, 8-bit quantized (about 150 MB).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt; on ONNX Runtime Web (WASM). Inference runs in the browser tab.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; plain HTML, CSS and JavaScript modules. No framework, no build step, no backend. Hosted free on GitHub Pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design:&lt;/strong&gt; styled like a topographic map. Grid references (A1, B2…) run along the edge of the card, so a group can shout "got B2". A finished line is drawn as an orange trail-blaze route.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline:&lt;/strong&gt; a service worker caches the app shell and runtime. Transformers.js caches the model weights in the browser. After a one-time download on Wi-Fi, the app works in airplane mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core trick is &lt;strong&gt;zero-shot classification&lt;/strong&gt;. Each bingo square is only a text prompt, for example &lt;code&gt;"a photo of an acorn"&lt;/code&gt;. When you take a photo, CLIP scores it against every item in the season's pool plus a set of distractors (a screen, an indoor room, a selfie, a document, a city street). On a laptop, one photo takes about 100 ms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the square you tapped wins, you found it.&lt;/li&gt;
&lt;li&gt;If a different unfound square on your card wins clearly, the app marks that one as a bonus ("Not running water, but it is a mushroom").&lt;/li&gt;
&lt;li&gt;If a seasonal item that is not on your card wins, you get "Good find, but it is not on this card."&lt;/li&gt;
&lt;li&gt;If a distractor wins, the find does not count, and you get a hint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first version scored photos only against the squares on the card. In testing, a red maple leaf was marked as the "yellow leaf" square with 95% confidence, because it was the closest option. Scoring against the full season pool fixed this: the same photo now comes back as "red leaf, not on this card."&lt;/p&gt;

&lt;p&gt;Group play uses a seeded shuffle: the card code, season and size feed a hash, which seeds a small PRNG that shuffles the season's item pool. Every phone with the same code deals the same card, with no network.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It works where the grass is.&lt;/strong&gt; Trails, parks and forests often have no signal. A closed vision API needs a network round trip for every photo. Open weights let the model live on the phone, so the game works in airplane mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photos stay private.&lt;/strong&gt; Families take photos of kids' hands, backyards and favorite spots. With an on-device model, no photo is uploaded to a server that the player does not control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No API key, no per-image bill, no rate limit. I can host it on GitHub Pages for free, and a whole run club can play without anyone paying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is easy to change.&lt;/strong&gt; Because CLIP is zero-shot and open, a new square is one line of text. A teacher can make a "schoolyard" card, a birding club can make a "local birds" card, and anyone can swap in a different open model (for example SigLIP) by changing one constant.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Best Use of Gemma&lt;br&gt;
Using Gemma, Google's open-weight model, in building my project&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>productivity</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
