<?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: Anush Deotare</title>
    <description>The latest articles on DEV Community by Anush Deotare (@anushdeotare11).</description>
    <link>https://dev.to/anushdeotare11</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%2F3959029%2F82d1010b-47bd-4f40-b9ca-9b792dda2a9f.png</url>
      <title>DEV Community: Anush Deotare</title>
      <link>https://dev.to/anushdeotare11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anushdeotare11"/>
    <language>en</language>
    <item>
      <title>I Built a Graveyard for My Abandoned Git Repos (Gemma Writes the Epitaphs, Offline)</title>
      <dc:creator>Anush Deotare</dc:creator>
      <pubDate>Fri, 30 Oct 2026 20:39:19 +0000</pubDate>
      <link>https://dev.to/anushdeotare11/i-built-a-graveyard-for-my-abandoned-git-repos-gemma-writes-the-epitaphs-offline-47kf</link>
      <guid>https://dev.to/anushdeotare11/i-built-a-graveyard-for-my-abandoned-git-repos-gemma-writes-the-epitaphs-offline-47kf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every developer has a graveyard. Mine is a folder of projects that started with a burst of commits and a confident README, then stopped. Nobody announced it. The last commit just sat there, and the project quietly died.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo Graveyard&lt;/strong&gt; points at a folder of git repositories and turns the abandoned ones into a night-time graveyard. Each dead project gets a tombstone with its birth and death years, a cause of death, an epitaph, and a short ghost story told in the project's own voice. It scans, it mourns, and it can try to bring something back.&lt;/p&gt;

&lt;p&gt;For the theme, I read "Ghost in the Machine" literally. Every abandoned repo is a ghost: code that still exists, still has a history, and has no one left to talk to. The git log is the only thing left of it, so the log is what the ghost speaks from.&lt;/p&gt;

&lt;p&gt;A few things it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Finds your dead.&lt;/strong&gt; Repos are sorted by days since the last commit: Alive (under 30), Sleeping (30–180), Dead (180–365), Ancient (over 365).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assigns a cause of death.&lt;/strong&gt; "Abandoned mid-sentence" for a last commit like &lt;code&gt;wip&lt;/code&gt; or &lt;code&gt;fix later&lt;/code&gt;. "Died young" for under 10 commits. "Death by TODO" for repos buried in unfinished notes. "Sudden death" for heavy activity followed by silence. "Fizzled out" for everything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writes epitaphs and ghost stories&lt;/strong&gt; with a local model, based only on facts from git.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resurrects.&lt;/strong&gt; A rule-based revival score picks the dead project most worth saving, and a séance animation streams a concrete 3-step plan to bring it back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exports&lt;/strong&gt; the whole graveyard as a single self-contained HTML file, with an option to redact repo names so you can share it without exposing private projects.&lt;/li&gt;
&lt;/ul&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/anushdeotare11" rel="noopener noreferrer"&gt;
        anushdeotare11
      &lt;/a&gt; / &lt;a href="https://github.com/anushdeotare11/repo-graveyard" rel="noopener noreferrer"&gt;
        repo-graveyard
      &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;🪦 Repo Graveyard&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Ghost in the Machine" Hackathon Project&lt;/strong&gt;&lt;br&gt;
A 100% local, air-gapped forensic inspection tool that scans your folders for abandoned Git repositories and resurrects them into an atmospheric, dark-humored virtual graveyard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📸 Preview&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;+-----------------------------------------------------------------------------------+
|  🕯️  REPO GRAVEYARD                 [100% Local &amp;amp; Private] [🟢 Gemma 3:4b Ready]  |
|  Where dead code rests, unresolved TODOs haunt, and local spirits speak.          |
+-----------------------------------------------------------------------------------+
|  [ C:\Projects                            ]  [ Scan Projects ]  [ 🔮 Séance ]    |
+-----------------------------------------------------------------------------------+
|  🌱 Still Among the Living (Recent commits detected)                             |
|  [● spectral-cli  4d ago]  [● pixel-roguelike-core  75d ago]                      |
+-----------------------------------------------------------------------------------+
|  ⚰️ The Cemetery Grounds                                                          |
|                                                                                   |
|    +-------------------+    +-------------------+    +-------------------+        |
|   /       R.I.P.        \   |      R.I.P.       |   ✝       R.I.P.        |       |
|  |   neural-toaster      |  | crypto-tamagotchi |  | vim-exit-simulator   |       |
|  |    2021 — 2022        |  |    2022 — 2023    |  |    2023 — 2023        |       |&lt;/code&gt;&lt;/pre&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/anushdeotare11/repo-graveyard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Run it with Python and Ollama. The README has the setup steps: install Ollama, &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, then &lt;code&gt;python run.py&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The model:&lt;/strong&gt; Gemma 3 4B (&lt;code&gt;gemma3:4b&lt;/code&gt;), running locally through Ollama. I built this on a laptop with an RTX 3050 and 4 GB of VRAM, so a small model that runs without a datacenter was the point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stack:&lt;/strong&gt; Python and FastAPI on the backend, and a vanilla HTML/CSS/JS frontend with no frameworks, no CDN and no external fonts. The only network call in the whole app is to &lt;code&gt;localhost:11434&lt;/code&gt;, where Ollama lives. Scan results and generated text are cached as JSON, so the graveyard loads instantly the second time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The main design decision: the model doesn't know anything. Git does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn't want an LLM guessing what happened to my projects, so I split the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rules decide the facts.&lt;/strong&gt; Dates, commit counts, the status (alive, dead, ancient), the cause of death and the revival score are all computed deterministically from git history. There's nothing for the model to make up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model only gives those facts a voice.&lt;/strong&gt; Gemma gets a short list of allowed facts (name, lifespan, commit count, cause of death, last commit message, TODO count, first line of the README) and writes a two-line epitaph or an ~80-word ghost story from them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A grounding check catches invention.&lt;/strong&gt; If the output names a technology that isn't in the facts it was given, the app regenerates once with a stricter prompt, then falls back to a plain account built from the git data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest fallbacks.&lt;/strong&gt; If Ollama isn't running, the app doesn't pretend. Stories fall back to a deterministic version, and the UI labels it "written without the model."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Epitaphs are generated in a background queue after each scan, while ghost stories and Resurrect plans stream token by token over server-sent events. On my machine the first token of a warm ghost story shows up in about 1.3 seconds.&lt;/p&gt;

&lt;p&gt;The Resurrect plan only sees three inputs: the README's first lines, the TODO lines, and the last five commit messages. It never sees the source code.&lt;/p&gt;

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

&lt;p&gt;A tool that reads your commit history is reading something private. Commit messages, TODOs, the names of side projects you never told anyone about, the half-finished idea from 2 a.m.: it's a fairly intimate record of what you worked on and what you gave up on.&lt;/p&gt;

&lt;p&gt;That's why this had to be open and local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your history never leaves your machine.&lt;/strong&gt; Gemma runs through Ollama on localhost. There are no API keys, no accounts and no telemetry. A closed API would mean sending the names of my abandoned projects and their last commit messages to a server I don't control, just to get a joke about them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works with the internet off.&lt;/strong&gt; I ran the whole thing with Wi-Fi turned off: scan, epitaphs, ghost stories and Resurrect. A graveyard that needs a server to stay online felt like the wrong kind of ghost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No per-token bill, no quota. It can write an epitaph for every dead repo you have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is one line of config.&lt;/strong&gt; If a better small model comes out, you change one value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The output can't be locked in.&lt;/strong&gt; The export is a plain HTML file. It will still open in ten years, whether or not any service survives.&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;: the whole project runs on &lt;code&gt;gemma3:4b&lt;/code&gt; locally through Ollama, as the voice that gives each abandoned repo its epitaph, ghost story and revival plan, while git supplies every fact.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>ai</category>
    </item>
    <item>
      <title>Sloth Sorter: A Local AI That Organizes Your Messy Folders, Slowly (Gemma 3 + Ollama)</title>
      <dc:creator>Anush Deotare</dc:creator>
      <pubDate>Wed, 21 Oct 2026 20:07:29 +0000</pubDate>
      <link>https://dev.to/anushdeotare11/sloth-sorter-a-local-ai-that-organizes-your-messy-folders-slowly-gemma-3-ollama-9n5</link>
      <guid>https://dev.to/anushdeotare11/sloth-sorter-a-local-ai-that-organizes-your-messy-folders-slowly-gemma-3-ollama-9n5</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;Everyone has that folder. Mine is full of &lt;code&gt;Screenshot 2026-10-21 at 3.12.png&lt;/code&gt;, &lt;code&gt;final_final_v2.docx&lt;/code&gt; and &lt;code&gt;IMG_4821.jpg&lt;/code&gt;, and I have been "going to sort it" for months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sloth Sorter&lt;/strong&gt; is a local web app that does the sorting for me. I point it at a messy folder, and a local AI model looks at each file and works out what it actually is. It then proposes a clean name and a category folder, so &lt;code&gt;final_final_v2.docx&lt;/code&gt; becomes &lt;code&gt;nexus-labs-design-agreement&lt;/code&gt; in &lt;code&gt;Documents&lt;/code&gt;, and that Slack screenshot goes to &lt;code&gt;Screenshots&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It works at a sloth's pace on purpose. Files are processed &lt;strong&gt;one at a time&lt;/strong&gt; with a small pause between them, so it never hogs my laptop's GPU, and nothing moves until I review the preview and click Apply. Every run is logged, so one click undoes it.&lt;/p&gt;

&lt;p&gt;It saves the chore I keep avoiding, and the people it suits are anyone whose Downloads folder has become a lifestyle.&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://drive.google.com/file/d/1DkfyO7n5GyZqHTTssxp-fOPdA14g9zpz/view?usp=sharing" rel="noopener noreferrer" class="c-link"&gt;
            Recording 2026-10-22 013402.mp4 - Google Drive
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fssl.gstatic.com%2Fdocs%2Fdoclist%2Fimages%2Fdrive_favicon_2026_32dp.png" width="32" height="32"&gt;
          drive.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&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/anushdeotare11" rel="noopener noreferrer"&gt;
        anushdeotare11
      &lt;/a&gt; / &lt;a href="https://github.com/anushdeotare11/sloth-sorter" rel="noopener noreferrer"&gt;
        sloth-sorter
      &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;🦥 Sloth Sorter&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Does the chore so you don't have to. Slowly."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sloth Sorter is an offline desktop web application that organizes messy folders using local multimodal AI (&lt;strong&gt;Gemma 3:4B&lt;/strong&gt; running via &lt;strong&gt;Ollama&lt;/strong&gt;). By processing files &lt;strong&gt;sequentially, one by one, with a gentle pacing delay&lt;/strong&gt;, it brings order to chaotic downloads, desktops, and project dumps without bogging down your machine—designed specifically to run comfortably on everyday laptops with zero data ever leaving your device.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/anushdeotare11/sloth-sorter/docs/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fanushdeotare11%2Fsloth-sorter%2FHEAD%2Fdocs%2Fdemo.gif" alt="Sloth Sorter Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💻 Tested On&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware&lt;/strong&gt;: NVIDIA GeForce RTX 3050 Laptop GPU (4GB VRAM), 16GB RAM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating System&lt;/strong&gt;: Windows 11&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt;: &lt;code&gt;gemma3:4b&lt;/code&gt; running locally via Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python Requirement&lt;/strong&gt;: Python 3.9+&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📊 Measured Benchmark Results&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;These numbers are taken directly from actual benchmark runs on the repository's 26-file test set (&lt;code&gt;sample_mess&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dataset&lt;/strong&gt;: 26 files (PDFs, DOCX documents, code scripts, screenshots, receipts, notes, and photos)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallbacks&lt;/strong&gt;: &lt;strong&gt;0 fallbacks (0.0%)&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/anushdeotare11/sloth-sorter" 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;&lt;strong&gt;The open-source pieces&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B&lt;/strong&gt; (open-weight, multimodal) runs locally through &lt;strong&gt;Ollama&lt;/strong&gt;. It reads screenshots and photos directly and reads the text of PDFs, DOCX and code files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; backend streams progress to a vanilla JS front end over Server-Sent Events, so file cards appear one by one as the model finishes each file.&lt;/li&gt;
&lt;li&gt;Pillow, pypdf and python-docx handle extraction. Images are shrunk to 640px and documents are trimmed to about 800 characters, which keeps the model fast and inside the 4GB of VRAM on my RTX 3050 laptop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Making a small model behave&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A 4B model won't give you clean output on its own, so the model proposes and the code checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ollama's &lt;strong&gt;JSON-schema output&lt;/strong&gt; constrains the reply (the category must be one of my nine, confidence must be low, med or high), so it can't ramble or break the format.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;date verifier&lt;/strong&gt; strips any date from a proposed name that doesn't appear in the file's content or original filename.&lt;/li&gt;
&lt;li&gt;A few &lt;strong&gt;deterministic category rules&lt;/strong&gt; apply, such as &lt;code&gt;.sql&lt;/code&gt;, &lt;code&gt;.py&lt;/code&gt; and &lt;code&gt;.js&lt;/code&gt; always going to &lt;code&gt;Code&lt;/code&gt;, and screenshots going to &lt;code&gt;Screenshots&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence is calibrated&lt;/strong&gt;, so memes, avatars and corrected results show up as low or medium and get an amber highlight in the UI for a second look.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it went wrong first&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My first benchmark on 26 messy sample files had &lt;strong&gt;10 fallbacks&lt;/strong&gt;. Five were a plain environment bug: the server ran on a different Python than the one I'd installed packages into, so PDFs and DOCX files never reached the model. I added a dependency check to the health endpoint so a missing library can't fail silently again. Constraining the output and trimming the prompt cleared the rest.&lt;/p&gt;

&lt;p&gt;Next, I read the actual model outputs and found five unrelated files named with &lt;code&gt;2024-10-27&lt;/code&gt;. The date from one of my prompt examples was leaking into the answers. The fix was removing the dates from the examples, telling the model never to guess a date, and adding the verifier above.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;First pass&lt;/th&gt;
&lt;th&gt;After fixes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fallbacks (26 files)&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg time per file&lt;/td&gt;
&lt;td&gt;11.7 s&lt;/td&gt;
&lt;td&gt;under 5 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Category agreement&lt;/td&gt;
&lt;td&gt;69.2%&lt;/td&gt;
&lt;td&gt;96.2% (25/26)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invented dates&lt;/td&gt;
&lt;td&gt;5 files&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Be careful with that 96.2%. I labeled the 26 test files myself and tuned the rules against them, so it describes my test set and isn't a general accuracy claim. The one miss was a quarterly financial report that Gemma filed under &lt;code&gt;Receipts-Bills&lt;/code&gt;. The first file also takes about 23 seconds while the model loads, and after that it settles at about 4 to 5 seconds each. The repo has a tiny eval script so you can rerun all of this yourself.&lt;/p&gt;

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

&lt;p&gt;Look at what ends up in a Downloads folder: bank statements, tax PDFs, ID scans, one-time codes, private chats. A tool that sorts those files has to read all of them, and I don't want that going to someone else's server.&lt;/p&gt;

&lt;p&gt;With an open-weight model, the files never leave the machine. That also made a few other things possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It works with no internet.&lt;/strong&gt; It sorts files on a train just as well as at home.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing after setup.&lt;/strong&gt; There's no per-token bill for a chore that runs on every file, and no rate limit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is swappable.&lt;/strong&gt; Set one environment variable (&lt;code&gt;SLOTH_MODEL&lt;/code&gt;) and it runs a different Ollama model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could control the output.&lt;/strong&gt; Running the model myself let me use schema-constrained decoding and tune the context window and keep-alive for a 4GB GPU.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't benchmark a cloud model, so I won't claim it would be less accurate. The win here is what a local, open model makes possible: private, offline, and free to run forever.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Sloth Sorter runs &lt;code&gt;gemma3:4b&lt;/code&gt; locally through Ollama and uses its multimodal side to read screenshots and photos, all on a 4GB laptop GPU.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Parchi: Turning a Night of WhatsApp Orders into a Prep Sheet with Gemma 4, Offline</title>
      <dc:creator>Anush Deotare</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:56:21 +0000</pubDate>
      <link>https://dev.to/anushdeotare11/parchi-turning-a-night-of-whatsapp-orders-into-a-prep-sheet-with-gemma-4-offline-72</link>
      <guid>https://dev.to/anushdeotare11/parchi-turning-a-night-of-whatsapp-orders-into-a-prep-sheet-with-gemma-4-offline-72</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;&lt;strong&gt;Parchi&lt;/strong&gt; turns a day of messy WhatsApp food orders into a prep sheet, per-customer bills and ready-to-send replies, running entirely on the seller's own laptop.&lt;/p&gt;

&lt;p&gt;The person it's for is a solo food seller, such as a home baker or tiffin seller, who takes orders as chat messages. Messages like &lt;em&gt;"ek choco cake dedh kilo ka"&lt;/em&gt; and &lt;em&gt;"wait actually make it 1 kilo"&lt;/em&gt; pile up all day. Every night the seller re-reads them and works out what to make, how many, and who owes what. That's slow, easy to get wrong, and the chats contain customers' names and addresses.&lt;/p&gt;

&lt;p&gt;With Parchi, the seller pastes the day's chat (or uploads a WhatsApp export) and gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;prep sheet&lt;/strong&gt; with the total quantity of each item to make,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;bill for each customer&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;confirmation reply&lt;/strong&gt; to copy straight into WhatsApp,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;CSV export&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anything the AI can't match to the menu, such as an off-menu "pineapple cake", is highlighted as &lt;strong&gt;Needs review&lt;/strong&gt; so the seller fixes it with one click instead of silently losing an order.&lt;/p&gt;

&lt;p&gt;Would someone pay for it? I think a free tier plus a small monthly fee is plausible for sellers who handle many chats a day, but that's a hypothesis. &lt;strong&gt;No real seller has tested it yet, and I haven't validated a price.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://app.notion.com/p/The-Video-Link-for-Week-2-Hacktoberfest-3fe27b53d9f3802aa9d6fd32e75bcdd5?source=copy_link" rel="noopener noreferrer"&gt;https://app.notion.com/p/The-Video-Link-for-Week-2-Hacktoberfest-3fe27b53d9f3802aa9d6fd32e75bcdd5?source=copy_link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It runs locally, so the demo is a short screen recording: load the menu, paste the chat, click Process orders, fix a "Needs review" item, then show the prep sheet, a bill and a copied reply.&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/anushdeotare11" rel="noopener noreferrer"&gt;
        anushdeotare11
      &lt;/a&gt; / &lt;a href="https://github.com/anushdeotare11/parchi" rel="noopener noreferrer"&gt;
        parchi
      &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;Parchi&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Parchi turns a day of messy WhatsApp food orders into a prep sheet, per-customer bills and ready-to-send replies, running fully on your own laptop with an open-weight model.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Project status&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Working prototype. Evaluated on synthetic data only. Real-seller validation pending.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma4:e2b
pip install &lt;span class="pl-k"&gt;-&lt;/span&gt;r requirements.txt
.\start.ps1&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;then open &lt;a href="http://localhost:8000" rel="nofollow noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;A home baker or tiffin seller gets orders as chat messages like &lt;em&gt;"ek choco cake dedh kilo ka"&lt;/em&gt; and re-reads and totals them by hand every night. This manual process is time-consuming, repetitive, and prone to costly calculation and counting mistakes.&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;
&lt;strong&gt;Parse (regex)&lt;/strong&gt;: WhatsApp export text is parsed into structured messages, skipping system lines and normalizing directional control marks, non-standard spaces, and newlines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group by Customer&lt;/strong&gt;: Messages are grouped chronologically by sender.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract with Gemma 4&lt;/strong&gt;: Each customer's message history and the seller's menu are sent to…&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/anushdeotare11/parchi" 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;&lt;strong&gt;Model:&lt;/strong&gt; Gemma 4 E2B, run locally through Ollama. I also tested Gemma 4 E4B.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipeline:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WhatsApp export -&amp;gt; regex parser -&amp;gt; group by customer
  -&amp;gt; Gemma extracts items + quantities as JSON (checked against the seller's menu)
  -&amp;gt; code validates + post-processes -&amp;gt; code computes every total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The design rule that makes it dependable:&lt;/strong&gt; the model only &lt;em&gt;extracts&lt;/em&gt;, and code does all the maths. Totals, prep sheets and bills are never generated by the AI. Each extracted item has to map to a menu ID, otherwise it is flagged "Needs review".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python, FastAPI, Ollama's local API (JSON-schema output, temperature 0, one retry on invalid JSON), and a single HTML page. There are 17 automated tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I measured&lt;/strong&gt; (10 synthetic customers, 23 expected items; the sample chat and labels are in the repo):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Precision&lt;/th&gt;
&lt;th&gt;Recall&lt;/th&gt;
&lt;th&gt;Qty accuracy&lt;/th&gt;
&lt;th&gt;Avg s/customer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E2B, original prompt&lt;/td&gt;
&lt;td&gt;90.9%&lt;/td&gt;
&lt;td&gt;87.0%&lt;/td&gt;
&lt;td&gt;95.2%&lt;/td&gt;
&lt;td&gt;cold start, not comparable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E2B, revised prompt&lt;/td&gt;
&lt;td&gt;95.5%&lt;/td&gt;
&lt;td&gt;91.3%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;6.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E2B, revised prompt + code post-processing&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;91.3%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;7.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E4B, original prompt&lt;/td&gt;
&lt;td&gt;90.9%&lt;/td&gt;
&lt;td&gt;87.0%&lt;/td&gt;
&lt;td&gt;95.2%&lt;/td&gt;
&lt;td&gt;13.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E4B, revised prompt&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;78.3%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;15.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What I learned, including what failed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The bigger E4B model gave &lt;strong&gt;no accuracy gain&lt;/strong&gt; and was about twice as slow, so &lt;strong&gt;E2B is the default&lt;/strong&gt;. E4B got more precise by dropping items, which is the worse failure for a seller because a dropped item is a lost order.&lt;/li&gt;
&lt;li&gt;The model kept ignoring two prompt rules: "paav kilo = 0.25" and "when a customer corrects a quantity, keep only the final one". Fixing them in code worked better than rewording the prompt. A correction-merge bug that sometimes gave 6.5 kg of chocolate cake instead of 6.0 kg is now stable in 5 of 5 repeated runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Still failing:&lt;/strong&gt; requests phrased as questions for off-menu items, such as &lt;em&gt;"ek pasta bhi banana hai kya?"&lt;/em&gt;, are not reliably extracted by E2B. The seller catches them when reviewing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caveat:&lt;/strong&gt; I wrote the prompt rules and post-processing while looking at this same synthetic chat, so these scores are optimistic and say nothing certain about real-world accuracy. Ten customers is also a small sample.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;For this customer, three things matter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; Order chats contain names, phone numbers and addresses. With a local open-weight model, none of it leaves the seller's laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; Because inference runs locally, there are no per-message API fees; the only cost is the seller's own laptop and electricity. For a tiny-margin business with hundreds of messages a week, that matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control.&lt;/strong&gt; I could swap between E2B and E4B, measure them on my own test set, and choose the smaller one. A closed API wouldn't have let me do that.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To be honest about the trade-off, a large closed model would probably understand messy Hinglish better. Parchi trades some accuracy for privacy and zero running cost, and the review step is there to catch the mistakes.&lt;/p&gt;

&lt;p&gt;Model license: Google released Gemma 4 under Apache 2.0, and the code is MIT. Check the official model card for the exact variant you use.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; the whole product runs on Gemma 4 locally through Ollama, with E2B and E4B compared on a labelled test set.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>ai</category>
    </item>
    <item>
      <title>Dawn Chorus: An Offline Bird-Call Bingo Built on BirdNET and Gemma (hacktoberfest week 1 dev challenge)</title>
      <dc:creator>Anush Deotare</dc:creator>
      <pubDate>Sat, 10 Oct 2026 21:09:08 +0000</pubDate>
      <link>https://dev.to/anushdeotare11/dawn-chorus-an-offline-bird-call-bingo-built-on-birdnet-and-gemma-hacktoberfest-week-1-dev-4jjo</link>
      <guid>https://dev.to/anushdeotare11/dawn-chorus-an-offline-bird-call-bingo-built-on-birdnet-and-gemma-hacktoberfest-week-1-dev-4jjo</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;&lt;strong&gt;Dawn Chorus is a listening-walk bird bingo that runs entirely on my laptop.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The app shows a bingo card of the 12 birds most likely near me this week.&lt;/li&gt;
&lt;li&gt;I put my phone in my pocket, in airplane mode with the screen off, and record the walk with the normal voice recorder.&lt;/li&gt;
&lt;li&gt;Afterwards I upload the recording. An open-source model identifies the birds by their calls, and a local model writes a short field-journal page.&lt;/li&gt;
&lt;li&gt;The journal ends with the birds I missed, which is the reason to go out again tomorrow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The screen is the shortest part of the experience. A "Grass Ratio" card compares the minutes I spent outside with the seconds I spent on screen. It's for anyone curious about the sounds around them, including places with no signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real test:&lt;/strong&gt; I walked 30 minutes on DATE. BirdNET found 10 species, including 5 of the 12 bingo birds, and I confirmed Myna, House Crow, Rock Pigeon myself. Screen time: 2 minutes.&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://drive.google.com/file/d/1XLtsqh7feIgi8ejf-uN9auIWegdudc3x/view?usp=sharing" rel="noopener noreferrer" class="c-link"&gt;
            hacktoberfest.mov - Google Drive
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fssl.gstatic.com%2Fdocs%2Fdoclist%2Fimages%2Fdrive_favicon_2026_32dp.png" width="32" height="32"&gt;
          drive.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;A short captioned walkthrough: the bingo card, airplane mode, the walk with the screen dark, then the results.&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/anushdeotare11" rel="noopener noreferrer"&gt;
        anushdeotare11
      &lt;/a&gt; / &lt;a href="https://github.com/anushdeotare11/dawn-chorus" rel="noopener noreferrer"&gt;
        dawn-chorus
      &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;Dawn Chorus&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Put your phone away. Listen to the morning.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dawn Chorus is a listening-walk bird bingo that runs entirely on your own laptop. You get a checklist of the birds likely to be near you this week, you go for a walk with your phone recording in your pocket and the screen off, and when you get back an open-source model tells you who was singing. A local language model then writes you a short field-journal page about the walk.&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;. The idea: &lt;strong&gt;the screen should be the shortest part of the experience.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7fd8c5cfae00f902144ae873b08692d953b5295bfe0d7fc2a6b166542869b927/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e392d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/7fd8c5cfae00f902144ae873b08692d953b5295bfe0d7fc2a6b166542869b927/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e392d626c7565" alt="Python 3.9"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d8c3924b5b3fe9b96c1357920973e707584a1d774da044ffbf1880174f18d04e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652d4d49542d677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/d8c3924b5b3fe9b96c1357920973e707584a1d774da044ffbf1880174f18d04e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652d4d49542d677265656e" alt="License MIT"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b15652df0052d1e3391e6d47328bf4d1e3cdf4f0e0cdb2c20dbe8f750393a738/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f72756e732d6f66666c696e652d73756363657373"&gt;&lt;img src="https://camo.githubusercontent.com/b15652df0052d1e3391e6d47328bf4d1e3cdf4f0e0cdb2c20dbe8f750393a738/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f72756e732d6f66666c696e652d73756363657373" alt="Offline first"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The story, real walk results and demo video are in the DEV post: &lt;a href="https://dev.to/" rel="nofollow"&gt;Dawn Chorus on DEV&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#taking-a-walk" rel="noopener noreferrer"&gt;Taking a walk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#upload-straight-from-your-phone" rel="noopener noreferrer"&gt;Upload straight from your phone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#running-fully-offline" rel="noopener noreferrer"&gt;Running fully offline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#why-open-source-ai" rel="noopener noreferrer"&gt;Why open-source AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#limitations-please-read" rel="noopener noreferrer"&gt;Limitations (please read)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anushdeotare11/dawn-chorus#project-structure" rel="noopener noreferrer"&gt;Project structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/anushdeotare11/dawn-chorus#testing-and-preflight" rel="noopener noreferrer"&gt;Testing and&lt;/a&gt;…&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/anushdeotare11/dawn-chorus" 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;BirdNET&lt;/strong&gt; identifies birds from audio. Its location and week model also builds the bingo card and filters out birds that don't live nearby.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 (4B)&lt;/strong&gt;, served locally by Ollama, writes the field journal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamlit&lt;/strong&gt; and &lt;strong&gt;ffmpeg&lt;/strong&gt; handle the interface and audio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two lessons shaped the design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Filtering by location matters.&lt;/strong&gt; Without it, the detector reported dozens of species from a short clip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language models invent things.&lt;/strong&gt; With an empty detection list, Gemma wrote about a Robin and a Cardinal that don't live here. Now the card is checked against the detections, and a plain template replaces it if it mentions a bird that wasn't heard.&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 works with no signal.&lt;/strong&gt; BirdNET runs on the laptop, so a forest trail is no problem. A hosted audio API wouldn't work there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recordings stay private.&lt;/strong&gt; A walk recording holds a location and other people's voices. Nothing is uploaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No per-request cost.&lt;/strong&gt; Analyzing a long walk every day is free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A specialist model fits better.&lt;/strong&gt; BirdNET is trained for exactly this task, and I could inspect and fix its over-reporting myself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caveat: Gemma is replaceable by almost any small local model. BirdNET is the part a general closed API couldn't replace offline. Its weights are also non-commercial.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I planned the project with Claude and built it with Antigravity, testing each round myself and sending back what failed. [[OPTIONAL: paste your DevRelay session link, or delete this section]]&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3 (4B) runs locally through Ollama and writes the field journal, fully offline, with a check that keeps its output honest.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>hacktoberfest</category>
    </item>
  </channel>
</rss>
