<?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: Forenche</title>
    <description>The latest articles on DEV Community by Forenche (@forenche).</description>
    <link>https://dev.to/forenche</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%2F728118%2Fdf6efc4f-434b-409b-9d03-fcb38572c4bb.jpeg</url>
      <title>DEV Community: Forenche</title>
      <link>https://dev.to/forenche</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/forenche"/>
    <language>en</language>
    <item>
      <title>Fridge List: one photo of your fridge, one grocery list, zero effort</title>
      <dc:creator>Forenche</dc:creator>
      <pubDate>Mon, 26 Oct 2026 05:15:38 +0000</pubDate>
      <link>https://dev.to/forenche/fridge-list-one-photo-of-your-fridge-one-grocery-list-zero-effort-1545</link>
      <guid>https://dev.to/forenche/fridge-list-one-photo-of-your-fridge-one-grocery-list-zero-effort-1545</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Making a grocery list means standing in front of the open fridge, checking every shelf, typing things into your phone, and still forgetting the onions. Fridge List skips all of that.&lt;/p&gt;

&lt;p&gt;You take one or two photos of your fridge and shelves, and it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what it can see in there, with rough amounts ("half a carton of milk")&lt;/li&gt;
&lt;li&gt;a shopping list grouped by store section, as checkboxes you can paste into your notes app&lt;/li&gt;
&lt;li&gt;one meal you can make right now with what's already there, for when you're too lazy to go shopping at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You tell it your staples once (milk, eggs, bread, whatever you always want around) and any diet notes, so it knows what "running out" means for you and never suggests things you don't eat.&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/Forenche" rel="noopener noreferrer"&gt;
        Forenche
      &lt;/a&gt; / &lt;a href="https://github.com/Forenche/fridge-list" rel="noopener noreferrer"&gt;
        fridge-list
      &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;Fridge List&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Take a photo of your fridge, get a grocery list grouped by store section, plus one meal you can make with what's already there.&lt;/p&gt;
&lt;p&gt;Runs an open-weight Gemma model through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. No API keys, no account, photos of your kitchen never leave your machine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Install Ollama from https://ollama.com, then:&lt;/span&gt;
ollama pull gemma4:e4b

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Install and start the app&lt;/span&gt;
pip install -r requirements.txt
python app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open the local URL Gradio prints. Use a bigger model with &lt;code&gt;MODEL=gemma4:26b python app.py&lt;/code&gt;, or point at another Ollama host with &lt;code&gt;OLLAMA_URL&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Limits&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;It only knows what's visible in the photo. Things hidden at the back of a shelf get missed, and it can't tell whether food has gone off. Tell it your staples so it knows what "running out" means for you.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;MIT&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Forenche/fridge-list" 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;p&gt;One Python file, about 120 lines.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma 4 (&lt;code&gt;gemma4:e4b&lt;/code&gt;), Google's open-weight model, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. Gemma 4 takes images as input, so one small model reads the fridge and writes the list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI:&lt;/strong&gt; Gradio. A photo upload, a staples box, a diet box and one button.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images:&lt;/strong&gt; photos are shrunk to 1024px before they go to the model. Phone photos are huge and it doesn't change what the model can see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured output:&lt;/strong&gt; Ollama's &lt;code&gt;format: "json"&lt;/code&gt; mode returns a fixed shape (items seen, shopping list by section, meal idea), which the app turns into a checkbox list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt rules that keep it honest:&lt;/strong&gt; only flag something as low if it's visibly low, never claim food is expired (it can't know that from a photo), and respect the diet notes in every suggestion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a small edge model looking at a crowded fridge, so it misses things hidden at the back. Treat the list as a strong first draft that took zero effort, not an inventory system.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your kitchen stays private.&lt;/strong&gt; A photo of your fridge says a lot about your diet, health and household. Running Gemma locally means none of that gets uploaded or logged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free to use every day.&lt;/strong&gt; A grocery list is a habit, not a one-off. A paid vision API would charge for every fridge photo; locally it costs nothing, forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account, no setup per use.&lt;/strong&gt; Open the app, drop a photo, done. That's the lazy part.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can swap the model.&lt;/strong&gt; A bigger Gemma that spots more items is a one-line change (&lt;code&gt;MODEL=...&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a closed model would win: a large cloud vision model would recognise more items in a cluttered fridge. For a grocery list you're going to glance at in the shop anyway, free and private is the better deal.&lt;/p&gt;

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

&lt;p&gt;Best Use of Gemma&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Listing Lens: product photos in, marketplace listing out, all on your laptop</title>
      <dc:creator>Forenche</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:33:00 +0000</pubDate>
      <link>https://dev.to/forenche/listing-lens-product-photos-in-marketplace-listing-out-all-on-your-laptop-2ap5</link>
      <guid>https://dev.to/forenche/listing-lens-product-photos-in-marketplace-listing-out-all-on-your-laptop-2ap5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Listing Lens is for people who sell things online on the side: handmade jewellery on Etsy, thrifted clothes on eBay, home bakers on an Instagram shop. Taking the photos is the fun part. Writing a title, a description, bullet points and search tags for every single item is the part that makes people give up.&lt;/p&gt;

&lt;p&gt;You drop in up to four product photos, pick the marketplace and a tone, optionally type a few notes (size, material, price), and it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a title that fits within 80 characters&lt;/li&gt;
&lt;li&gt;a short description&lt;/li&gt;
&lt;li&gt;bullet points for the key features&lt;/li&gt;
&lt;li&gt;search tags&lt;/li&gt;
&lt;li&gt;a checklist of things a buyer will ask about that it couldn't see in the photos, like capacity, dimensions or condition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part is the one I care about most. It is told to never invent a brand, a material or a measurement. If it can't tell, it says so and asks you, instead of making something up that gets you a return or a bad review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fd709oxtv1b7n9ejujz8e.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%2Fd709oxtv1b7n9ejujz8e.png" alt="Listing Lens turning product photos into a listing" width="799" height="442"&gt;&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/Forenche" rel="noopener noreferrer"&gt;
        Forenche
      &lt;/a&gt; / &lt;a href="https://github.com/Forenche/listing-lens" rel="noopener noreferrer"&gt;
        listing-lens
      &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;Listing Lens&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Turn product photos into a ready-to-paste marketplace listing: title, description, bullet points and search tags, plus a checklist of details you still need to add.&lt;/p&gt;
&lt;p&gt;Runs an open-weight Gemma model through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. No API keys, no subscription, your product photos never leave your machine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Install Ollama from https://ollama.com, then:&lt;/span&gt;
ollama pull gemma4:e4b

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Install and start the app&lt;/span&gt;
pip install -r requirements.txt
python app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open the local URL Gradio prints. Use a bigger model with &lt;code&gt;MODEL=gemma4:12b python app.py&lt;/code&gt;, or point at another Ollama host with &lt;code&gt;OLLAMA_URL&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Limits&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;It only describes what it can see and what you type in the notes box, and it's told never to invent brands, materials or measurements. A 4B model can still get things wrong, so read the listing before you post it.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;MIT&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Forenche/listing-lens" 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;p&gt;One Python file, about 115 lines.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma 4 (&lt;code&gt;gemma4:e4b&lt;/code&gt;), Google's open-weight model, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. Gemma 4 takes images as input, so one small model looks at the photos and writes the copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI:&lt;/strong&gt; Gradio. A photo upload, a marketplace dropdown, a tone picker, a notes box and one button.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images:&lt;/strong&gt; photos are shrunk to 1024px before they go to the model. Phone photos are huge and it doesn't change what the model sees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured output:&lt;/strong&gt; Ollama's &lt;code&gt;format: "json"&lt;/code&gt; mode returns a fixed shape (title, description, bullets, tags, missing info), which the app turns into a single block you can paste straight into a listing form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honesty rules in the prompt:&lt;/strong&gt; describe only what's visible or written in the notes, trust the seller's notes over the photo, no fake urgency, and anything unknown goes into the "fill these in" checklist.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing per listing.&lt;/strong&gt; A seller with 200 items would pay for every single listing on a closed API or an AI listing subscription. Running Gemma locally, the 200th listing costs the same as the first: nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product photos stay private.&lt;/strong&gt; Unreleased designs and handmade work are the seller's whole business. None of it gets uploaded to a server they don't control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account, no rate limits.&lt;/strong&gt; Batch-listing a whole new collection at midnight doesn't hit a quota.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can swap or tune the model.&lt;/strong&gt; A bigger Gemma is a one-line change (&lt;code&gt;MODEL=...&lt;/code&gt;), and a seller with a niche (vintage watches, saree weaves) could fine-tune it on their own past listings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a closed model would win: a large cloud vision model would recognise brands and fine details better. For a seller who checks every listing before posting anyway, free and private wins.&lt;/p&gt;

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

&lt;p&gt;Best Use of Gemma&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Grass Quest</title>
      <dc:creator>Forenche</dc:creator>
      <pubDate>Sat, 10 Oct 2026 07:21:18 +0000</pubDate>
      <link>https://dev.to/forenche/grass-quest-1nkm</link>
      <guid>https://dev.to/forenche/grass-quest-1nkm</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;Grass Quest is a photo scavenger hunt where the game master is a local AI.&lt;/p&gt;

&lt;p&gt;You press one button and get a mission, like "find a leaf with a hole in it" or "three different shades of green in one frame." Then the phone goes in your pocket and you go look for it. When you find it, you take one photo, and the same model looks at the photo and decides whether it counts.&lt;/p&gt;

&lt;p&gt;The screen is only there at the start and the end. Everything in between happens outside, which is the point. It's for anyone who goes on a walk and ends up staring at their phone the whole time: the app gives you a reason to look at the world instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fc2is3pk899z9awnls5tb.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%2Fc2is3pk899z9awnls5tb.png" alt="Grass Quest giving a mission and judging a photo" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo Image from: &lt;a href="https://in.pinterest.com/pin/97460779408386405/" rel="noopener noreferrer"&gt;https://in.pinterest.com/pin/97460779408386405/&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/Forenche" rel="noopener noreferrer"&gt;
        Forenche
      &lt;/a&gt; / &lt;a href="https://github.com/Forenche/grass_quest" rel="noopener noreferrer"&gt;
        grass_quest
      &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;Grass Quest&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An offline photo scavenger hunt. A local Gemma model gives you a mission to do outside ("three different shades of green in one frame"), you go find it, and the same model looks at your photo and decides if it counts.&lt;/p&gt;
&lt;p&gt;Runs an open-weight Gemma model through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. No API keys, no cloud, your photos never leave your machine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Install Ollama from https://ollama.com, then:&lt;/span&gt;
ollama pull gemma3:4b

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Install and start the app&lt;/span&gt;
pip install -r requirements.txt
python app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open the local URL Gradio prints. To use it from your phone, start it with &lt;code&gt;SHARE=1 python app.py&lt;/code&gt; and open the &lt;code&gt;gradio.live&lt;/code&gt; link Gradio prints (this tunnels through Gradio's servers while it's running).&lt;/p&gt;
&lt;p&gt;Use a bigger model with &lt;code&gt;MODEL=gemma3:12b python app.py&lt;/code&gt; (needs more VRAM), or point at another Ollama host with &lt;code&gt;OLLAMA_URL&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Limits&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The judge is a 4B vision model. It's good…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Forenche/grass_quest" 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;p&gt;One Python file, around 130 lines.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma 3 (&lt;code&gt;gemma3:4b&lt;/code&gt;), Google's open-weight model, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. Gemma 3 understands images as well as text, so one small model does both jobs: writing missions and judging photos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI:&lt;/strong&gt; Gradio. A difficulty picker, a mission button, a photo box (upload or camera) and a judge button.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missions:&lt;/strong&gt; the app picks a random theme (textures, light and shadow, something tiny, the sky...) and asks Gemma for one mission at a high temperature, so you don't get the same one twice. The prompt rules out anything unsafe, illegal, or involving photographing strangers' faces or private property.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judging:&lt;/strong&gt; the photo is shrunk to 1024px (phone photos are huge and it doesn't change the verdict), sent to Gemma with the mission, and Gemma returns JSON: passed or not, what it sees, and a one-line verdict. Ollama's &lt;code&gt;format: "json"&lt;/code&gt; mode keeps the output parseable, and a low temperature keeps the judge consistent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The judge is told to be fair but not a pushover, so a blurry guess or a photo of a screen doesn't pass. It's a 4B model, so it's a referee, not ground truth: it handles colours, objects and scenes well and can get fiddly missions wrong.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your photos stay yours.&lt;/strong&gt; Photos from a walk show where you live, your street and your routine. With a local model, none of that gets uploaded to a company's server to be stored or trained on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing per photo.&lt;/strong&gt; A scavenger hunt means lots of attempts and retries. With a paid vision API every judged photo costs money; locally, it's free no matter how many times you play.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It runs without internet.&lt;/strong&gt; The model runs on my own laptop with no cloud API behind it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can swap the model.&lt;/strong&gt; If a better small vision model comes out, it's a one-line change (&lt;code&gt;MODEL=...&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a closed model would win: a bigger cloud vision model would judge tricky missions more accurately. For a game where the referee being occasionally wrong is part of the fun, a free, private local model is the better trade.&lt;/p&gt;

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

&lt;p&gt;Best Use of Gemma&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Forward Check - I built Dhroov an offline bouncer for the family WhatsApp group</title>
      <dc:creator>Forenche</dc:creator>
      <pubDate>Sun, 04 Oct 2026 18:26:55 +0000</pubDate>
      <link>https://dev.to/forenche/forward-check-i-built-dhroov-an-offline-bouncer-for-the-family-whatsapp-group-5eod</link>
      <guid>https://dev.to/forenche/forward-check-i-built-dhroov-an-offline-bouncer-for-the-family-whatsapp-group-5eod</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Dhroov is my friend, and like everyone in India, he's in WhatsApp groups that get roughly 3 forwards a week that make you stop and wonder, like "Please forward this file to your company's accountant, new RBI guidelines apply from next week." Nobody wants to be the one who replies "this is fake" and starts a fight, so the forwards keep travelling.&lt;/p&gt;

&lt;p&gt;Forward Check is a small app that sits between "received" and "forwarded". Paste a message in and it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a verdict: likely fake, suspicious, probably harmless, or can't tell&lt;/li&gt;
&lt;li&gt;the specific warning signs it spotted (urgency, "doctors say" with no doctor, KYC links, miracle cures)&lt;/li&gt;
&lt;li&gt;what to do about it&lt;/li&gt;
&lt;li&gt;a short, non-condescending reply in English, Hindi or Marathi that you can post in the group without starting a war&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point isn't to make anyone feel stupid. It's to give a second opinion before hitting forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fns6lm7plx0qth4omq0ka.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%2Fns6lm7plx0qth4omq0ka.png" alt="Forward Check running locally" width="800" height="500"&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%2Fsefhvbdqkn7coihf1ydn.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%2Fsefhvbdqkn7coihf1ydn.png" alt="Forward Check flagging a fake RBI message Dhroov tested" width="793" height="2177"&gt;&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/Forenche" rel="noopener noreferrer"&gt;
        Forenche
      &lt;/a&gt; / &lt;a href="https://github.com/Forenche/forward-check" rel="noopener noreferrer"&gt;
        forward-check
      &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;Forward Check&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A local, offline checker for WhatsApp forwards. Paste a forward, get a verdict, the warning signs it shows, and a polite reply you can drop in the family group. English, Hindi or Marathi.&lt;/p&gt;
&lt;p&gt;Runs an open-weight Gemma model through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. No API keys, no cloud, nothing leaves your machine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Install Ollama from https://ollama.com, then:&lt;/span&gt;
ollama pull gemma3:4b

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Install and start the app&lt;/span&gt;
pip install -r requirements.txt
python app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open the local URL Gradio prints.&lt;/p&gt;
&lt;p&gt;Use a different model with &lt;code&gt;MODEL=gemma3:12b python app.py&lt;/code&gt; (needs more VRAM), or point at another Ollama host with &lt;code&gt;OLLAMA_URL&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Limits&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;It has no internet access, so it cannot verify facts. It spots manipulation patterns: urgency, fake authority, miracle cures, KYC/OTP scams, outrage bait. A well-written lie with no red flags can get through. It says so in every result.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;MIT&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Forenche/forward-check" 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;p&gt;The whole thing is one Python file, around 130 lines.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma (&lt;code&gt;gemma3:4b&lt;/code&gt;), an open-weight model from Google, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. On my laptop's RTX 4060 (8 GB) it answers in a few seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI:&lt;/strong&gt; Gradio, so there's a paste box and a button and nothing else to learn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured output:&lt;/strong&gt; Ollama's &lt;code&gt;format: "json"&lt;/code&gt; mode forces the model to return a fixed shape (verdict, summary, red flags, advice, reply), which the app renders. Low temperature keeps verdicts consistent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important design decision was in the prompt: &lt;strong&gt;the model is told it has no internet and must never claim it verified anything.&lt;/strong&gt; A small local model will happily invent "according to PIB Fact Check..." if you let it, which would make the tool another source of misinformation. So it judges messages on manipulation patterns instead of pretending to know the truth, and every result says it wasn't fact-checked. Health claims always get "check with a doctor"; anything with money or links gets "don't click, don't share OTPs".&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The family group stays in the family.&lt;/strong&gt; Forwards contain names, phone numbers, photos of relatives and people's health worries. Running the model locally means none of that is shipped to a third-party server to be logged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No API bill, no free tier that disappears. Dhroov can use it forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline.&lt;/strong&gt; The model runs entirely on my laptop with no cloud dependency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can swap or tune the model.&lt;/strong&gt; If a bigger Gemma or a model fine-tuned on Indian misinformation datasets comes along, it's a one-line change (&lt;code&gt;MODEL=...&lt;/code&gt;). Nobody can deprecate it out from under me.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a closed API would win: it could be connected to live fact-check sources. That's the honest trade-off, and it's why the tool calls itself a warning-sign spotter, not a fact-checker.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Dhroov Said
&lt;/h2&gt;

&lt;p&gt;"I think it’s a fair assessment of the msg it does not just claim it as scam or safe so I feel it’s better"&lt;/p&gt;

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

&lt;p&gt;Best Use of Gemma&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
