<?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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4163534%2F22bbc977-ff45-4abe-a2a8-c98f16a3f0e1.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>Walkthrough sorts a listing shoot into a house tour, and no photo ever leaves the laptop</title>
      <dc:creator>Prateek singh</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:28:27 +0000</pubDate>
      <link>https://dev.to/prateekiiitg56/walkthrough-sorts-a-listing-shoot-into-a-house-tour-and-no-photo-ever-leaves-the-laptop-2agg</link>
      <guid>https://dev.to/prateekiiitg56/walkthrough-sorts-a-listing-shoot-into-a-house-tour-and-no-photo-ever-leaves-the-laptop-2agg</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Walkthrough&lt;/strong&gt; is a small tool for real estate photographers. It does the dull job that comes after every shoot.&lt;/p&gt;

&lt;p&gt;A photographer leaves a property with 30 to 60 photos, named &lt;code&gt;IMG_4012.jpg&lt;/code&gt; to &lt;code&gt;IMG_4071.jpg&lt;/code&gt;. Before the agent can use them, someone has to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Put them in tour order. The front of the house goes first, because the first photo is the cover on most listing sites. Then the living spaces, kitchen, bedrooms, bathrooms, and the backyard.&lt;/li&gt;
&lt;li&gt;Take out the bad frames: underexposed shots, a soft frame from a bumped tripod, and three almost identical angles of the same bathroom.&lt;/li&gt;
&lt;li&gt;Rename everything so the agent and the listing site keep the order.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Walkthrough does all three in one pass. You drop the shoot onto the page. An open-weight vision model, running in the browser tab, decides which room each photo shows. The app puts the photos in order, sets aside the dark, soft and repeated ones, and gives you a zip:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;12-oak-street-01-front-exterior.jpg
12-oak-street-02-front-exterior-2.jpg
12-oak-street-03-living-room.jpg
...
shot-list.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The original files go into the zip unchanged, with no re-compression. You can still change a room, drag a photo to a new place, pick a different cover, or put a set-aside photo back. The model makes the first draft, and the photographer has the final say.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who would pay for it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solo real estate photographers.&lt;/strong&gt; This is the main customer. They shoot several homes a day, and every shoot ends with the same sorting job.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small agencies and the assistants who upload listings for them.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents who shoot their own listings on a phone.&lt;/strong&gt; They do not know the "front exterior first" rule until a listing goes live with a toilet as the cover photo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How it would make money:&lt;/strong&gt; a flat $9 a month for unlimited listings. Because the model runs on the customer's own computer, each extra listing costs me nothing. A flat price works, and I never need to count photos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://prateekiiitg56.github.io/walkthrough/" rel="noopener noreferrer"&gt;https://prateekiiitg56.github.io/walkthrough/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No photos to hand? Click &lt;strong&gt;Try it with 14 sample photos&lt;/strong&gt;. The sample set is a real house front and a real apartment (CC BY-SA, from Wikimedia Commons). I added one blurred copy and one darkened copy so you can see the app set them aside.&lt;/p&gt;

&lt;p&gt;The first run downloads the model one time: 176 MB on a computer with WebGPU, or 89 MB without. After that, the app works with no connection.&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/walkthrough" rel="noopener noreferrer"&gt;
        walkthrough
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Sorts a real estate photo shoot into listing order in your browser. Open-weight CLIP, 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;Walkthrough&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Walkthrough sorts a real estate photo shoot into listing order, in your browser.&lt;/p&gt;

&lt;p&gt;Drop in the photos from a property shoot. Walkthrough:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;puts them in tour order: front of the house, living spaces, kitchen, bedrooms, bathrooms, then outside;&lt;/li&gt;
&lt;li&gt;sets aside photos that are too dark, out of focus, or almost the same as a better shot;&lt;/li&gt;
&lt;li&gt;renames the original files in order (&lt;code&gt;12-oak-street-01-front-exterior.jpg&lt;/code&gt;) and downloads them as a zip with a &lt;code&gt;shot-list.csv&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can change any room, drag photos into a new order, pick a different cover, or put a set-aside photo back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://prateekiiitg56.github.io/walkthrough/" rel="nofollow noopener noreferrer"&gt;https://prateekiiitg56.github.io/walkthrough/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photos are never uploaded. The model runs in the browser tab.&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;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;, open weights, ONNX.&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; 3.7.6
&lt;ul&gt;
&lt;li&gt;With WebGPU and 16-bit float support, the fp16 vision model runs on the graphics card. That is about 80 ms per photo and a 176 MB one-time…&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Prateekiiitg56/walkthrough" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&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.&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; in the browser.

&lt;ul&gt;
&lt;li&gt;With WebGPU, the fp16 vision model runs on the graphics card. On my laptop, that is about &lt;strong&gt;80 ms per photo&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Without WebGPU, the 8-bit model runs on WebAssembly. That is about 0.8 s per photo: slower, but it works everywhere.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; plain HTML, CSS and JavaScript modules. No framework, no build step and no backend. &lt;a href="https://stuk.github.io/jszip/" rel="noopener noreferrer"&gt;JSZip&lt;/a&gt; makes the download, and GitHub Pages hosts the files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rooms are just text.&lt;/strong&gt; CLIP puts images and text into the same vector space. Each room type is one to three short prompts, such as &lt;code&gt;"a real estate photo of a kitchen with an oven and a sink"&lt;/code&gt;. A photo goes to the room whose prompts are closest to it. To add a room type, you add a line of text. There is no training.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Only half the model goes to the browser.&lt;/strong&gt; The room prompts never change while the app runs, so I embed them once with a small Node script and ship the 14 vectors as a 60 KB JSON file. The browser downloads only CLIP's vision encoder. That cut the download and removed a whole model from the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One embedding does three jobs.&lt;/strong&gt; Each photo goes through the model once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Room:&lt;/strong&gt; cosine similarity against the 14 room vectors, then a softmax. If the top room is below 50%, the card says "Check room".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order:&lt;/strong&gt; rooms in listing order. Inside a room, the photo the model is surest about goes first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates:&lt;/strong&gt; two photos of the same room with a cosine similarity of 0.95 or more are the same shot, so the weaker one is set aside.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dark and soft come from the pixels, not the model.&lt;/strong&gt; In my first test, the blurred kitchen photo came back as "hall and stairs". A blurry photo loses the details that tell rooms apart. So the app checks focus and brightness separately, on a 256 px grayscale copy of the photo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft focus:&lt;/strong&gt; the variance of the Laplacian (how strong the edges are). The blurred copy scores about 2. The sharp photos score from 11 to 240. Plain white bathrooms are the lowest, because tiles have few edges. I set the cut-off at 5 so a clean bathroom is never mistaken for a blurry one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too dark:&lt;/strong&gt; mean brightness below 0.30.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A bug I only found by measuring.&lt;/strong&gt; My first duplicate threshold was 0.93, tuned on the 8-bit model in Node. When I switched the browser to the fp16 model on WebGPU, two different angles of the same house front were set aside as "the same shot". Similarity scores move a little between quantizations. I measured the pairs on both versions of the model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pair&lt;/th&gt;
&lt;th&gt;8-bit (CPU)&lt;/th&gt;
&lt;th&gt;fp16 (GPU)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Two near-identical bathroom shots&lt;/td&gt;
&lt;td&gt;0.966&lt;/td&gt;
&lt;td&gt;0.977&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two angles of the house front&lt;/td&gt;
&lt;td&gt;0.889&lt;/td&gt;
&lt;td&gt;0.913&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two angles of the living room&lt;/td&gt;
&lt;td&gt;0.913&lt;/td&gt;
&lt;td&gt;0.888&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Real duplicates sit above 0.96 and different angles stay below 0.92 on both. I moved the threshold to 0.95, and now both engines give the same result on the sample set.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The photos are the inside of someone's home.&lt;/strong&gt; Before a listing goes live, these photos show who lives where, what is inside, and where the cameras are not. An agent should not need to upload them to a third-party server to get them sorted. With open weights, the model comes to the photos instead. Walkthrough has no server at all, so there is nothing to leak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The business only works if each photo costs nothing.&lt;/strong&gt; A busy photographer sorts thousands of photos a month. A cloud vision API charges for every image, and every re-sort costs again. That pushes you toward per-listing pricing and makes you watch usage. With an open model on the customer's own machine, my cost per photo is zero. Hosting is a free static site, so a flat monthly price is safe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works on site.&lt;/strong&gt; Photographers often sort in the car between shoots, sometimes with a weak signal. After the first download, Walkthrough works offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I control the rooms.&lt;/strong&gt; Australian listings say "lounge", American ones say "family room", and a lake house needs "boat dock". With CLIP, that is a prompt change and one script run, not a feature request to a vendor. I can also swap in a stronger open model, such as SigLIP, by changing one constant, and nobody can change the price or retire the model under me.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <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>
