<?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: Phantom842</title>
    <description>The latest articles on DEV Community by Phantom842 (@phantom8420).</description>
    <link>https://dev.to/phantom8420</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%2F4157350%2Fbef752be-2c2d-4f2e-a433-44f1fd64d8a3.png</url>
      <title>DEV Community: Phantom842</title>
      <link>https://dev.to/phantom8420</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/phantom8420"/>
    <language>en</language>
    <item>
      <title>I played static to Whisper. It said it was going to the next room.</title>
      <dc:creator>Phantom842</dc:creator>
      <pubDate>Wed, 28 Oct 2026 21:14:32 +0000</pubDate>
      <link>https://dev.to/phantom8420/i-played-static-to-whisper-it-said-it-was-going-to-the-next-room-4cdb</link>
      <guid>https://dev.to/phantom8420/i-played-static-to-whisper-it-said-it-was-going-to-the-next-room-4cdb</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;&lt;strong&gt;Spirit Box&lt;/strong&gt; turns off every filter that keeps OpenAI's open Whisper quiet, then plays it pure noise. It talks. Silence gets "you", every time. Mains hum gets &lt;em&gt;"I'm going to go to the next room."&lt;/em&gt;, eleven times a clip. It never leaves.&lt;/p&gt;

&lt;p&gt;Those ghosts also turn up in real transcripts with normal settings (&lt;a href="https://arxiv.org/abs/2402.08021" rel="noopener noreferrer"&gt;Koenecke et al., 2024&lt;/a&gt; found them in about 1% of clips), where they look like every other line. So the second half is a &lt;strong&gt;witness&lt;/strong&gt;: Gemma 3 4B, running locally, reads a meeting transcript and points at the lines nobody said.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live: &lt;a href="https://spirit-box-hacktoberfest.vercel.app" rel="noopener noreferrer"&gt;https://spirit-box-hacktoberfest.vercel.app&lt;/a&gt;&lt;/strong&gt;. Pick a noise, press Summon, and Whisper tiny listens in your browser tab. No audio leaves it.&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%2Fv02gr0km0p0dex3qgntz.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%2Fv02gr0km0p0dex3qgntz.png" alt="In mains hum, Whisper tiny heard &amp;quot;(sizzling)&amp;quot;" width="800" height="515"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python -m spiritbox exorcise meeting.wav
      [ 257.4s] Please don't merge anything after 5 today.
GHOST [ 287.4s] Please don't merge anything.  &amp;lt;- echo: repeats a line said earlier
GHOST [ 305.4s] Please don't merge anything.  &amp;lt;- repetition loop: a rule matched
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Nobody spoke after 4:20. The ghost just had strong opinions about merges.&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/Phantom8420" rel="noopener noreferrer"&gt;
        Phantom8420
      &lt;/a&gt; / &lt;a href="https://github.com/Phantom8420/Hacktoberfest" rel="noopener noreferrer"&gt;
        Hacktoberfest
      &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;Hacktoberfest 2026&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;My work for the DEV Hacktoberfest Open-Source AI Challenge, one folder per week.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;week&lt;/th&gt;

&lt;th&gt;theme&lt;/th&gt;

&lt;th&gt;project&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;1&lt;/td&gt;

&lt;td&gt;Touch Grass&lt;/td&gt;

&lt;td&gt;&lt;a href="https://github.com/Phantom8420/Hacktoberfest/Week1/" rel="noopener noreferrer"&gt;Proof of Grass&lt;/a&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;2&lt;/td&gt;

&lt;td&gt;Side Hustle&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;a href="https://github.com/Phantom8420/Hacktoberfest/Week2/" rel="noopener noreferrer"&gt;Déjà&lt;/a&gt; (&lt;a href="https://deja-hacktoberfest.vercel.app" rel="nofollow noopener noreferrer"&gt;demo&lt;/a&gt;)&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;3&lt;/td&gt;

&lt;td&gt;Slow and Steady&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;a href="https://github.com/Phantom8420/Hacktoberfest/Week3/" rel="noopener noreferrer"&gt;Effort Budget&lt;/a&gt; (&lt;a href="https://effort-budget.vercel.app" rel="nofollow noopener noreferrer"&gt;demo&lt;/a&gt;)&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;4&lt;/td&gt;

&lt;td&gt;Ghost in the Machine&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;a href="https://github.com/Phantom8420/Hacktoberfest/Week4/" rel="noopener noreferrer"&gt;Spirit Box&lt;/a&gt; (&lt;a href="https://spirit-box-hacktoberfest.vercel.app" rel="nofollow noopener noreferrer"&gt;demo&lt;/a&gt;)&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Week 1: Touch Grass&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What the challenge asked.&lt;/strong&gt; Build something with open-weight models or open-source AI at its core: running an
open model, building on an open agent framework, running inference locally, or all three. The week's theme was
"Touch Grass": get people off the screen and into the world (hiking, birding, gardening, runs). The post should say
why open innovation matters for the build, and bonus points go to anyone who takes it outside and reports back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I built.&lt;/strong&gt; Proof of Grass: an offline bird-sound model (Google's Perch 2.0, Apache-2.0, run locally through
ONNX) judges whether a recording…&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/Phantom8420/Hacktoberfest" 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 census.&lt;/strong&gt; 7 noises × 5 seeds × 3 Whisper sizes = 105 clips. All 105 said something. The same phrases come back across seeds, so they come from the training data, not the noise. Most noise is detected as Norwegian Nynorsk, which I can't explain beyond Norway being very quiet.&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%2Fu1k5b8es7cdgnwlo3g73.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%2Fu1k5b8es7cdgnwlo3g73.png" alt="What each model size heard in each noise" width="800" height="1108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The meetings.&lt;/strong&gt; Windows voices read 30 meeting lines with long pauses over six noise beds, so I know exactly when someone spoke. Most ghosts weren't "Thanks for watching". They were &lt;strong&gt;echoes&lt;/strong&gt;: an earlier line written again in a later silence. Whisper is the colleague who repeats your point five minutes later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma, three tries.&lt;/strong&gt; Reading every line, it flagged 84 real ones: a paranoid intern. Reading only the lines Whisper doubted, it would write "this is a direct echo" and then answer &lt;strong&gt;real&lt;/strong&gt;. So I stopped asking for a verdict. It now answers two yes/no questions (&lt;em&gt;said earlier?&lt;/em&gt; &lt;em&gt;a video sign-off?&lt;/em&gt;) and the code decides. Gemma is a good witness; it just shouldn't be the judge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Held out.&lt;/strong&gt; Scored once on six new meetings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;judge&lt;/th&gt;
&lt;th&gt;caught (of 19)&lt;/th&gt;
&lt;th&gt;false alarms&lt;/th&gt;
&lt;th&gt;F1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rules&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0.65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;rules, then Gemma&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.83&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They miss different things: rules catch stock phrases, Gemma catches reworded echoes. It runs on a laptop with no GPU, at 10–20 s per doubted line. Limits: 19 ghosts is small, and the meetings are synthetic speech.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;I expected noise to give garbage. Instead every clip gave a calm, grammatical sentence, and the same one came back from different seeds, as if the static had a script. Fifty-six copies of "I'm going to go to the next room" is the closest I've come to a haunting.&lt;/p&gt;

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

&lt;p&gt;No hosted API has a "please hallucinate" checkbox. Turning the filters off only works because the weights and the decoding loop are on my disk, and the witness reads private meetings without them leaving the machine. But the training data isn't open, so nobody outside OpenAI can say why it wants the next room. Open weights let you meet the ghost; open data would tell you where it's buried.&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, local through Ollama, is the witness. It answers in a strict JSON schema, and it's measured against a rules baseline on held-out meetings, failed prompts included.&lt;/p&gt;




&lt;p&gt;AI assistance was used for this project. I did the planning and laid the base foundations; the rest of the coding was done by a team of AI agents led by Claude (Anthropic). I left the debugging for myself so that I am accountable for the code.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>The cure to laziness (almost)</title>
      <dc:creator>Phantom842</dc:creator>
      <pubDate>Thu, 22 Oct 2026 16:36:36 +0000</pubDate>
      <link>https://dev.to/phantom8420/the-cure-to-laziness-almost-99l</link>
      <guid>https://dev.to/phantom8420/the-cure-to-laziness-almost-99l</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/p&gt;

&lt;p&gt;What I Built&lt;br&gt;
Every tidying app I've seen assumes you have energy. Checklists, routines, streaks. On a Sloth Day you don't. You have maybe 30 seconds in you, and the real question is which 30 seconds.&lt;/p&gt;

&lt;p&gt;Effort Budget answers exactly that. Take a photo of your room and slide the energy bar somewhere between "barely alive" (10 seconds) and "suspiciously motivated" (10 minutes). Gemma 3 looks at the photo and lists what's lying around, where each thing goes, how long it takes and how much it would help. A small planner picks the moves worth the most tidiness for exactly your budget, and the page shows you one of them, big, with a timer:&lt;/p&gt;

&lt;p&gt;Plastic bottles, from the floor to the bin, about 30 seconds. Start.&lt;/p&gt;

&lt;p&gt;That's the whole ask. The full plan is there if you want it. Two more things make it more than a prompt:&lt;/p&gt;

&lt;p&gt;It learns your speed. The timer records how long moves really take you, per destination (bin runs are quick, laundry never is), and the next plan uses your seconds instead of Gemma's guesses.&lt;br&gt;
It checks the result. Take an after photo from the same spot and Gemma judges whether the room actually got tidier, asked twice with the photos swapped, because small vision models play favourites with photo order. If it can't decide, it says so and shows you what it counted.&lt;br&gt;
Everything runs on your own computer. Photos stay in memory, get their GPS-carrying EXIF stripped before the model sees them, and are never saved.&lt;/p&gt;

&lt;p&gt;Demo&lt;br&gt;
Try it: &lt;a href="https://effort-budget.vercel.app" rel="noopener noreferrer"&gt;https://effort-budget.vercel.app&lt;/a&gt; (the app itself is at /try.html), with three sample rooms from Wikimedia Commons. A web page can't run Gemma, so the demo replays what Gemma 3 4B saw in each room on my laptop; the planner and the time learning run live in your browser.&lt;/p&gt;

&lt;p&gt;The demo replaying Gemma's real output for the dorm room, sped up: locally the items arrive over about 100 seconds.&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;a href="https://github.com/Phantom8420/Hacktoberfest/tree/main/Week3%5B%5D(url)" rel="noopener noreferrer"&gt;https://github.com/Phantom8420/Hacktoberfest/tree/main/Week3[](url)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is in Week3/: plain Python standard library for the server, Pillow for photos, vanilla JS for the page, 20 tests.&lt;/p&gt;

&lt;p&gt;The photo is usually on your phone, not the laptop running Gemma, so python -m effort --phone puts a QR code on the page. Scan it and the phone becomes the camera and the screen while Gemma stays on the laptop; anything that isn't the laptop needs the random key inside that code.&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%2Fjlw4u94shh1wpli1cd8t.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%2Fjlw4u94shh1wpli1cd8t.png" alt=" " width="800" height="1210"&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%2F5rg15w0t90yqqcuojwae.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%2F5rg15w0t90yqqcuojwae.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How I Built It&lt;br&gt;
Gemma only looks. Gemma 3 4B runs through Ollama and answers in a fixed JSON schema: what, which zone, where it goes (forced into a short list: bin, laundry, wardrobe, shelf, drawer, sink, desk-side, other), seconds, and mess 1-5. Everything it returns is clamped and deduplicated. Then you tap away anything it imagined. Small models invent things, and a plan built on a sock that isn't there is worse than no plan.&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%2F7shehdkigcne2s788f7g.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%2F7shehdkigcne2s788f7g.png" alt=" " width="780" height="1688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code decides. Tidiness isn't additive: clearing the first thing off a desk changes how the room looks more than clearing the fifth. So a zone's value is (its cleared mess)^0.7, summed over zones. That makes the plan a budgeted monotone submodular maximisation, which sounds grand and mostly means "biggest mess first" is wrong more often than you'd think. Rooms of up to 16 items get the exact best plan by trying every subset (0.2 s); above that, cost-benefit greedy with a single-best-item fallback is guaranteed at least (1 - 1/e)/2 of the best.&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%2Fz1a7oxdt3f2qyfpnpf5y.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%2Fz1a7oxdt3f2qyfpnpf5y.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Gemma's real item lists (27 of them, from 9 photos) biggest-mess-first was worse than the exact plan in 35% of cases, 62% of the best at worst. It matters more in bigger rooms; against the exact plan on 1,000 random rooms of 3 to 14 items, at 30 s, 90 s and 5 minutes:&lt;/p&gt;

&lt;p&gt;plans worse than the best   worst case  average&lt;br&gt;
greedy  18% 66% of the best 98.8%&lt;br&gt;
biggest mess first  32% 30% of the best 94.4%&lt;br&gt;
Your seconds, not the model's. Per destination it keeps (sum of actual/guess + 2) / (moves + 2): two imaginary moves at exactly 1.0 are mixed in, so one slow trip to the laundry can't swing the whole plan.&lt;/p&gt;

&lt;p&gt;How well does Gemma see? Shown the same photo three times (slightly cropped or darkened), its item lists overlap by about 61%, and the one move comes out the same in all three for only 2 to 4 of 9 photos. That's why you fix the list before planning. The before/after judge, shown two takes of an unchanged room, said "same" 7 times out of 9 and "unclear" twice; the photo swap caught the one time it leaned toward whichever photo came second. It never claimed a change that wasn't there.&lt;/p&gt;

&lt;p&gt;On a real clean-up, though, the side-by-side comparison failed in an instructive way: Gemma called the right-hand photo tidier every single time, whichever photo was on the right. The swap turned that into "unclear" instead of a confident wrong answer. The recount got it (9 things lying around before, 3 after), but item counts also drift on rooms that didn't change, so when the comparison can't decide the app shows you both counts and lets you call it. A 4B model is a fine pair of eyes and a poor referee.&lt;/p&gt;

&lt;p&gt;Slow, on purpose. On an i5 laptop with no GPU, one photo takes about two minutes. I kept it that way rather than calling a hosted model, because the input is a photo of the inside of someone's home. The theme helped: a sloth app that makes you wait two minutes is on brand. The wait isn't dead time, though: Gemma's reply streams, every finished item appears as a chip straight away, and you untick its inventions and set your energy while it's still looking.&lt;/p&gt;

&lt;p&gt;One thing I didn't expect: the model wouldn't load at all at first, with failed to allocate CPU buffer and 14 GB of RAM free. The laptop has no page file, so Windows ran out of commit memory, not RAM. Memory-mapping the weights and turning off llama.cpp's weight repacking (LLAMA_ARG_REPACK=false) took it from failing to loading in 7 seconds.&lt;/p&gt;

&lt;p&gt;Why Does Open Innovation Matter?&lt;br&gt;
Because the input is a photo of your bedroom. With open weights the model runs where the photo already is, and the photo never has to go anywhere. Open weights also meant I could test the model's failure modes properly: run the same room again and again to see what it invents, and swap the before/after order to catch it favouring the first photo, without paying per call or wondering whether the model behind an API changed overnight.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>What was that hotel? Asking my laptop about yesterday</title>
      <dc:creator>Phantom842</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:34:00 +0000</pubDate>
      <link>https://dev.to/phantom8420/what-was-that-hotel-asking-my-laptop-about-yesterday-3h0i</link>
      <guid>https://dev.to/phantom8420/what-was-that-hotel-asking-my-laptop-about-yesterday-3h0i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfw5uumhrx9vms60ytc1.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%2Fvfw5uumhrx9vms60ytc1.png" alt=" " width="800" height="450"&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%2Fevo94oz0ule3ypk3p5ye.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%2Fevo94oz0ule3ypk3p5ye.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest"&gt;Hacktoberfest Open-Source AI Challenge&lt;/a&gt;, Week 2: Side Hustle.&lt;/p&gt;

&lt;p&gt;Built with: RapidOCR (PP-OCR on ONNX Runtime), faster-whisper, Gemma 3 1B via Ollama, SQLite FTS5, python-mss. All open source, all running locally.&lt;/p&gt;

&lt;p&gt;Yesterday I had a hotel open in a tab. Today I couldn't remember its name. So I built Déjà, a memory of my own screen that I can talk to.&lt;br&gt;
&lt;a href="https://raw.githubusercontent.com/Phantom8420/Hacktoberfest/main/Week2/demo.gif" rel="noopener noreferrer"&gt;Asking Déjà about a hotel: it answers in one line and circles the screenshot it came from&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deja-hacktoberfest.vercel.app" rel="noopener noreferrer"&gt;Try the demo&lt;/a&gt; · &lt;a href="https://github.com/Phantom8420/Hacktoberfest/releases/tag/deja-v0.1.0" rel="noopener noreferrer"&gt;Windows download&lt;/a&gt; · &lt;a href="https://github.com/Phantom8420/Hacktoberfest/tree/main/Week2" rel="noopener noreferrer"&gt;Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt; Yesterday&lt;/u&gt;&lt;br&gt;
Every few seconds Déjà checks whether the screen changed. When the booking page appeared, RapidOCR read it in about 5 seconds on the CPU. Secrets like API keys and card numbers were blacked out first. Password managers, private windows and the lock screen are never read at all. The text and a small screenshot went to disk, encrypted with a key only my Windows account can open.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Today&lt;/u&gt;&lt;br&gt;
I asked out loud. Whisper turned it into text in under a second. Plain search found the matching screens, and only then did Gemma 3 1B read the top five and answer: "That was the Hotel Mirador in Lisbon," with the screenshot circled. If the model ever puts a number in its answer that isn't on those screens, the answer is thrown out and the matching line is quoted instead.&lt;/p&gt;

&lt;p&gt;&lt;u&gt; Why open&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;A cloud API would mean uploading my screen every few seconds, paying for thousands of calls a day, and nothing working offline. Here everything runs on the laptop, for free, and nothing leaves it. Open models also let me test the OCR myself: 99.7% of words on normal screens.&lt;/p&gt;

&lt;p&gt;&lt;u&gt; Who'd pay&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Freelancers, developers, students: anyone who has said "I &lt;em&gt;just&lt;/em&gt; saw that". It runs on an ordinary laptop with no server, so it can be a one-time purchase instead of a subscription.&lt;/p&gt;

&lt;p&gt;AI disclosure: AI assistance was used for this project. I did the planning and laid the base foundations; the rest of the coding was done by a team of AI agents led by Claude (Anthropic). I left the debugging for myself so that I am accountable for the code.*&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>My app accused the rain of being a car.</title>
      <dc:creator>Phantom842</dc:creator>
      <pubDate>Sat, 10 Oct 2026 15:54:55 +0000</pubDate>
      <link>https://dev.to/phantom8420/my-app-accused-the-rain-of-being-a-car-touching-grass-is-a-myth-3i68</link>
      <guid>https://dev.to/phantom8420/my-app-accused-the-rain-of-being-a-car-touching-grass-is-a-myth-3i68</guid>
      <description>&lt;p&gt;How do you prove to someone that you actually touched grass? I guess the bigger question is out of everything going on how is "if i touched grass" still the biggest argument we are having? No more. (Argument, not going outside (well maybe)).&lt;/p&gt;

&lt;p&gt;Proof of Grass listens to a few seconds of audio with Perch 2.0, an open bird-sound model that runs offline on your laptop. If it hears something alive, you get a receipt chained to the last one, so you can’t edit your history later.&lt;/p&gt;

&lt;p&gt;I tested it on 560 clips and it called 85 of 140 weather clips “human-made”. Rain sounds like a vehicle to the model. I added a “nature, but nothing alive” verdict, tuned it on part of the data, and checked it on the rest: 0 of 84 weather clips accused.&lt;/p&gt;

&lt;p&gt;Open mattered because a “I was outside” receipt shouldn’t mean uploading recordings of where you are. It all stays on the laptop, and since the weights are open I could fix the rain bug myself.&lt;/p&gt;

&lt;p&gt;Tried to fool the model making bird noises. It went exactly how you'd expect. That's the neat part, but then came the "incident". &lt;a href="https://dev.tourl"&gt;&lt;/a&gt;I went outside, real grass. A  walk with birds and traffic: it heard both, scored 2.5 against a pass mark of 3, which I'm not too mad about since apparently even the Declaration of Independence was "AI Generated". Models have a lot to learn, but I suppose so do we. Long story short, the app refused to certify me, but along the journey I realized one thing is for sure, the test won't be inconclusive forever.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/Phantom8420/Hacktoberfest/tree/main/Week1" rel="noopener noreferrer"&gt;https://github.com/Phantom8420/Hacktoberfest/tree/main/Week1&lt;/a&gt;&lt;br&gt;
(along with the audio clips)&lt;/p&gt;

&lt;p&gt;PS : Going outside stinks, wouldn't recommend.&lt;/p&gt;

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