<?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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.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>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;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>
