<?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: John Marin Babu</title>
    <description>The latest articles on DEV Community by John Marin Babu (@csu250304).</description>
    <link>https://dev.to/csu250304</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%2F4169537%2F905add8b-be0d-46d0-8aba-4c8965bafdf5.png</url>
      <title>DEV Community: John Marin Babu</title>
      <link>https://dev.to/csu250304</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/csu250304"/>
    <language>en</language>
    <item>
      <title>CodeBoo: Exorcising Your Codebase’s Hidden TODOs and Haunted Bugs</title>
      <dc:creator>John Marin Babu</dc:creator>
      <pubDate>Sun, 01 Nov 2026 06:57:46 +0000</pubDate>
      <link>https://dev.to/csu250304/codeboo-exorcising-your-codebases-hidden-todos-and-haunted-bugs-16op</link>
      <guid>https://dev.to/csu250304/codeboo-exorcising-your-codebases-hidden-todos-and-haunted-bugs-16op</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;We’ve all left a line like // TODO: fix memory leak before launch in a file, closed the editor, and promptly forgotten it ever existed. Over time, repos turn into digital haunted houses—populated by lingering code debt, unindexed security hazards, and ghost functions abandoned three years ago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CodeBoo&lt;/strong&gt; is a lightweight, local tool that brings those code ghosts out into the open.&lt;/p&gt;

&lt;p&gt;Point CodeBoo at any local directory on your machine or paste a public GitHub repository link. It scans the files for six distinct types of technical debt and security issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Leaked Secrets:&lt;/strong&gt; Hard-coded passwords, API tokens, and private keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risky Code:&lt;/strong&gt; Insecure string evaluations, unsafe data loading, or unsanitized commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weak Spots:&lt;/strong&gt; Disabled SSL checks, active debug modes, or outdated hashing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Possible Leaks:&lt;/strong&gt; Unclosed files, dangling timers, or unreleased memory resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiet Failures:&lt;/strong&gt; Empty &lt;code&gt;catch&lt;/code&gt; blocks or silent &lt;code&gt;except:&lt;/code&gt; statements that hide errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgotten Promises:&lt;/strong&gt; &lt;code&gt;TODO&lt;/code&gt;, &lt;code&gt;FIXME&lt;/code&gt;, &lt;code&gt;HACK&lt;/code&gt;, &lt;code&gt;XXX&lt;/code&gt;, and &lt;code&gt;BUG&lt;/code&gt; comments left behind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of dumping a dry terminal log, CodeBoo ranks findings into five visual urgency tiers: &lt;strong&gt;Wisp&lt;/strong&gt;, &lt;strong&gt;Little ghost&lt;/strong&gt;, &lt;strong&gt;Haunting&lt;/strong&gt;, &lt;strong&gt;Specter&lt;/strong&gt;, and &lt;strong&gt;Phantom&lt;/strong&gt;—ranging from "tidy up whenever" to "fix today."&lt;/p&gt;

&lt;p&gt;It turns technical debt triage into something clear, visual, and oddly charming.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/DA_zEEu8jV8" width="710" height="399"&gt;
  &lt;/iframe&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/marinn-3011" rel="noopener noreferrer"&gt;
        marinn-3011
      &lt;/a&gt; / &lt;a href="https://github.com/marinn-3011/codeboo-identify-ghost-todos" rel="noopener noreferrer"&gt;
        codeboo-identify-ghost-todos
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      CodeBoo: A tool that hunts for hidden TODOs in your codebase and visualizes them.
    &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;CodeBoo&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Paste a public GitHub link or a folder on your computer. CodeBoo looks through the code for forgotten promises, risky spots and quiet failures, ranks them by urgency, and shows each one as a ghost. Small problems are cute little wisps. Serious ones are tall, glowing and a bit scary. A model running on your own machine explains the most urgent ones in everyday words.&lt;/p&gt;
&lt;p&gt;Built for the DEV Hacktoberfest 2026 "Ghost in the Machine" challenge, with open-weight models doing the explaining.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it finds&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ghost&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Leaked secret&lt;/td&gt;
&lt;td&gt;Keys or passwords typed into the code&lt;/td&gt;
&lt;td&gt;Private keys, cloud and GitHub tokens, hard-coded passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risky code&lt;/td&gt;
&lt;td&gt;Code that could be tricked into doing something harmful&lt;/td&gt;
&lt;td&gt;Running text as code, shell commands, unsafe loading of saved data, database questions built by gluing text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weak spot&lt;/td&gt;
&lt;td&gt;Settings that make an app easier to attack&lt;/td&gt;
&lt;td&gt;Switched-off certificate checks, old&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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/marinn-3011/codeboo-identify-ghost-todos" 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;CodeBoo was built to run entirely on a mid-range developer machine (designed to consume under 5 GB of system memory, leaving plenty of room within an 8 GB free RAM budget).&lt;/p&gt;

&lt;p&gt;CodeBoo was built with zero third-party Python dependencies—there is literally nothing to &lt;code&gt;pip install&lt;/code&gt;. The entire application runs using Python's standard library and a local open-weight AI model.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Dependency Core (&lt;code&gt;hunt.py&lt;/code&gt;):&lt;/strong&gt; The server and scanner are contained in a single Python file listening on &lt;code&gt;127.0.0.1:8766&lt;/code&gt;. It directly extracts GitHub repository ZIP archives into temporary directories (or reads local folders in place) and runs about 20 pattern-matching rules across up to 800 files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local AI via Ollama:&lt;/strong&gt; Explanations are generated by &lt;strong&gt;Gemma 4&lt;/strong&gt; (&lt;code&gt;gemma4:e4b&lt;/code&gt;), running locally through Ollama (with support for &lt;code&gt;qwen3.5:4b&lt;/code&gt; via environment variables).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Guardrails &amp;amp; Secret Masking:&lt;/strong&gt; The 24 most urgent ghosts are sent to Gemma in small batches for plain-English explanations and recommended fixes. Before any code snippet is sent to the model, all detected secret values are strictly redacted. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constrained Influence:&lt;/strong&gt; To prevent LLM hallucinations from hiding genuine security hazards, the model can only adjust a ghost's urgency by a small margin. If the model deems a finding harmless, it lowers the urgency slightly; otherwise, the deterministic rule remains authoritative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity Ranking Engine:&lt;/strong&gt; The LLM evaluates every discovered issue and assigns it an urgency rating (1 to 5), an issue category (Security, Leak, Refactor, TODO), a plain-English explanation (keeping jargon accessible), and a recommended fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual UI:&lt;/strong&gt; A single-page web dashboard using CSS animations to display issue "cards" inside animated ghost sprites whose expressions and dark glow scale with the severity of the bug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Fallback:&lt;/strong&gt; If Ollama is not running, CodeBoo continues to function entirely offline using built-in static explanations for every issue found.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository Size:&lt;/strong&gt; Extremely large repos (thousands of files) must be scanned module-by-module to keep context window usage within RAM bounds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static Analysis Edge Cases:&lt;/strong&gt; While local open-weight models excel at finding logic flaws and written TODOs, full runtime memory profiling still requires dedicated profilers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope Caps:&lt;/strong&gt; Scans are capped at 800 files (up to 300 KB each), showing up to 60 total ghosts and generating AI explanations for the top 24 to keep local runs fast.&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;Codebase Confidentiality:&lt;/strong&gt; Scanning code for security bugs or unhandled edge cases using a closed cloud API means sending your proprietary context to external servers. Local open-weight models guarantee your code never leaves your device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unrestricted Code Scans:&lt;/strong&gt; You can run CodeBoo against massive personal repos or multiple commits without worrying about token limits, rate caps, or monthly bills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customizable Parsing:&lt;/strong&gt; Because the inference runner and prompts are completely transparent, developers can swap out models or fine-tune prompt constraints for their specific language stack.&lt;/li&gt;
&lt;/ul&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; (Powered by local &lt;code&gt;gemma4:e4b&lt;/code&gt; inference via Ollama for plain-English bug explanations)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Recalling dreams every morning felt like holding water in my hands; so I built Nightloom.</title>
      <dc:creator>John Marin Babu</dc:creator>
      <pubDate>Sun, 25 Oct 2026 20:41:41 +0000</pubDate>
      <link>https://dev.to/csu250304/nightloom-turn-joh</link>
      <guid>https://dev.to/csu250304/nightloom-turn-joh</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;We’ve all been there: you wake up from a vivid, wild dream, scribble down a few hazy keywords like "floating clock, neon fog, library with no doors", and by the time you pour your morning coffee, the rest of the memory has completely evaporated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nightloom&lt;/strong&gt; turns those fading scraps into something lasting.&lt;/p&gt;

&lt;p&gt;You type in your raw, half-remembered fragments—in any order, with zero formatting—and Nightloom weaves them into a structured short story and paints a watercolor scene from it.&lt;/p&gt;

&lt;p&gt;Everything runs 100% locally on your computer, so your beloved dreams stay with you. Because memory efficiency was a core design constraint, it works seamlessly even on modest machines with just 4–6 GB of free RAM.&lt;/p&gt;

&lt;p&gt;To match the "Slow and Steady" theme, the page itself embraces a soothing night-sky aesthetic complete with drifting lanterns, an arched golden loom, and thread-weaving animations.&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%2Ffm99i7hnb75i0oo2zthx.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%2Ffm99i7hnb75i0oo2zthx.png" alt=" " width="800" height="464"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/Xzb9p3I5yZ0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;
(Real-time footage of my 4GB RAM laptop fighting for its life so you don't have to.)



&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/marinn-3011" rel="noopener noreferrer"&gt;
        marinn-3011
      &lt;/a&gt; / &lt;a href="https://github.com/marinn-3011/nightloom-dream-logger" rel="noopener noreferrer"&gt;
        nightloom-dream-logger
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      NightLoom: A Dream-Logging application that visualizes your dreams from fragments (HF26)
    &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;Nightloom&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A local-first dream logger. Type scattered fragments of a dream, in any order, and Gemma weaves them into one dreamlike story. Optionally, a small open image model paints one scene from it in a watercolor style.&lt;/p&gt;
&lt;p&gt;Everything runs on your machine. The page talks to a small Python server on &lt;code&gt;127.0.0.1&lt;/code&gt;, which talks to Ollama on &lt;code&gt;localhost&lt;/code&gt; and, for images, to a local &lt;code&gt;stable-diffusion.cpp&lt;/code&gt; program. Dreams are saved to &lt;code&gt;dreams.jsonl&lt;/code&gt; in this folder.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it (text only)&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. Gemma 4 needs a recent version (0.22 or newer).&lt;/li&gt;
&lt;li&gt;Pull a model: &lt;code&gt;ollama pull gemma4&lt;/code&gt;. On a low-memory laptop, try a smaller tag such as &lt;code&gt;gemma4:e2b&lt;/code&gt; and start the app with &lt;code&gt;DREAM_MODEL=gemma4:e2b python3 dream.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Start the app: &lt;code&gt;python3 dream.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open &lt;a href="http://127.0.0.1:8765" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:8765&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No &lt;code&gt;pip install&lt;/code&gt; needed. The page shows a status line, so you'll see if Ollama or the model is missing.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Add images (optional)&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Images use…&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/marinn-3011/nightloom-dream-logger" 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;Nightloom is powered entirely by open-source components, orchestrated by a single zero-dependency Python server (dream.py) and a lightweight single-file frontend (index.html).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Story Generation:&lt;/strong&gt; Gemma 4 (running locally via Ollama, using the light gemma4:e2b tag). The prompt strictly guides Gemma to retain every user fragment, avoid interpreting psychological meanings, and leave ambiguous parts blurry rather than inventing major plot points. Still, the model may get creative in ways to tie up the fragments into a cohesive story.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Image Generation Engine:&lt;/strong&gt; stable-diffusion.cpp, a lightweight C/C++ runner that runs Stable Diffusion on laptop CPUs without heavy framework overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Speed &amp;amp; Style:&lt;/strong&gt; A standard Stable Diffusion 1.5 checkpoint enhanced with LCM-LoRA (latent-consistency/lcm-lora-sdv1-5) to reduce render times to ~4 steps, and fladdict's watercolor LoRA (trained on public-domain historical paintings) to give every painting a cohesive art style.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Low-RAM Swap Trick:&lt;/strong&gt; To run smoothly on devices with only 4–6 GB of free RAM, dream.py automatically unloads Gemma from RAM before running stable-diffusion.cpp, freeing up system resources for image rendering.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Honest Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CPU Render Speeds:&lt;/strong&gt; CPU painting takes a few moments on standard laptop processors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SD 1.5 Detail:&lt;/strong&gt; As a lightweight model, facial details and fine elements can be painterly and rough.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Minor Filler:&lt;/strong&gt; While the prompt strictly restricts inventing new plotlines, the LLM will occasionally add brief connective phrasing to link fragments together.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Absolute Privacy for Private Thoughts: Dreams are about as personal as text gets. Sending your half-conscious thoughts to a hosted cloud API feels invasive. Local inference guarantees your dreams stay on your device.&lt;/p&gt;

&lt;p&gt;Zero Cost &amp;amp; No Rate Limits: You can weave and paint as many dreams as you want without worrying about API keys, usage limits, or monthly tokens.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Community Composability: Nightloom exists because independent creators shared their work—from stable-diffusion.cpp's lightweight engine to fladdict's public-domain watercolor LoRA. Closed models simply don't allow this level of modular stitching.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;Dream journaling usually takes active effort right when you're least awake. Nightloom turns lazy inputs into a full creative artifact. You type three messy fragments while still half-asleep, hit one button, and get a rendered story and framed watercolor painting back. So the next time your divine muse brings you that flash of inspo, sleep in, and leave the heavy-lifting to Nightloom.&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>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Scribe: A Local Gemma 4 Tool That Turns Paper Piles into Digital Copies</title>
      <dc:creator>John Marin Babu</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:57:36 +0000</pubDate>
      <link>https://dev.to/csu250304/scribe-a-local-gemma-4-tool-that-turns-paper-piles-into-digital-copies-215c</link>
      <guid>https://dev.to/csu250304/scribe-a-local-gemma-4-tool-that-turns-paper-piles-into-digital-copies-215c</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;em&gt;Scribe&lt;/em&gt; turns photos of paperwork into clean formatted JSON. You drop in receipts, invoices or business cards, and it reads them, pulls out the fields you care about, and files everything into tidy folders. And the best part - It all runs on your own computer using Gemma 4.&lt;/p&gt;

&lt;p&gt;It is built for people who are drowning in paper: freelancers and small shop owners at tax time, bookkeepers retyping receipts, anyone with a pile of business cards from the last conference. Cloud OCR tools charge per page and need you to upload sensitive documents. Scribe doesn’t.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/0sjRAA-Srmo" width="710" height="399"&gt;
  &lt;/iframe&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/marinn-3011" rel="noopener noreferrer"&gt;
        marinn-3011
      &lt;/a&gt; / &lt;a href="https://github.com/marinn-3011/scribe-image-to-json" rel="noopener noreferrer"&gt;
        scribe-image-to-json
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Scribe: A tool to convert Photos of Receipts and Invoices into Sorted JSON with Gemma 4
    &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;Scribe&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Turn photos of receipts, invoices and business cards into clean, sorted JSON. Runs locally with &lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;Gemma 4&lt;/a&gt; through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, so your documents never leave your machine.&lt;/p&gt;
&lt;p&gt;Built for the Hacktoberfest 2026 Open-Source AI Challenge (Side Hustle).&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Batch scanning:&lt;/strong&gt; drop in many images and get one combined JSON file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom schemas:&lt;/strong&gt; use a preset (receipt, invoice, business card), write your own &lt;code&gt;name: type&lt;/code&gt; fields, or paste a full JSON Schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-sort:&lt;/strong&gt; Scribe detects each document's type and files it into folders, with the original image next to its JSON. Download everything as a &lt;code&gt;.zip&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto mode:&lt;/strong&gt; no schema needed, the model chooses the fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exports:&lt;/strong&gt; copy the result, or save it as JSON or CSV.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No guessing:&lt;/strong&gt; fields the model can't see come back as &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Requirements&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enough memory for your chosen model (roughly 12 GB free for &lt;code&gt;gemma4:e4b&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup&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.&lt;/span&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/marinn-3011/scribe-image-to-json" 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;The model is Gemma 4, served locally through Ollama. I default to the small gemma4:e4b for speed, and the UI lets you switch to the 26B or 31B models when a document is tricky. Gemma 4 reads images directly, so there’s no separate OCR step. It also natively supports over 140 languages (with out-of-the-box fluency in 35+), enabling it to seamlessly process, understand, and translate documents featuring multiple languages simultaneously.&lt;/p&gt;

&lt;p&gt;For each document, Scribe does three things: it asks Gemma 4 what kind of document it is, extracts the fields using the matching schema, then saves the original and the JSON into a folder for that type.&lt;/p&gt;

&lt;p&gt;The part that made this work was Ollama’s structured outputs. You pass a JSON Schema in the request, and the model’s answer follows it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4:e4b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# your JSON Schema
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;options&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extract the data.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;images&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;]}],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Scribe handles receipts, invoices and contact details, so privacy is the whole point. Gemma 4’s weights are published under Apache 2.0, which means the model runs on the customer’s machine and their documents never leave it. Data Security and Privacy is hard to promise when it comes to closed APIs. &lt;/p&gt;

&lt;p&gt;It also makes the economics work for a side hustle. There are no per-page fees and no rate limits, so scanning a thousand receipts costs a bit of electricity. As it processes files locally, It even works offline.&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>
  </channel>
</rss>
