<?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: Laura Valencia Gracia</title>
    <description>The latest articles on DEV Community by Laura Valencia Gracia (@kit57).</description>
    <link>https://dev.to/kit57</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%2F4172059%2Fef95bf99-2d9d-4812-b52d-537f52d2bec7.png</url>
      <title>DEV Community: Laura Valencia Gracia</title>
      <link>https://dev.to/kit57</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kit57"/>
    <language>en</language>
    <item>
      <title>Quackula: I Was a Rubber Duck for 15 Years. Now I Haunt Your Codebase.</title>
      <dc:creator>Laura Valencia Gracia</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:55:52 +0000</pubDate>
      <link>https://dev.to/kit57/quackula-i-was-a-rubber-duck-for-15-years-now-i-haunt-your-codebase-52mj</link>
      <guid>https://dev.to/kit57/quackula-i-was-a-rubber-duck-for-15-years-now-i-haunt-your-codebase-52mj</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;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ahem.&lt;/em&gt; The human has stepped aside. I, &lt;strong&gt;Quackula&lt;/strong&gt;, will be writing this post myself. They said I could. (They did not say I could. I am a ghost. I do what I want.)&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;From 1994 to 2009, I sat on a programmer's desk. A rubber duck. You know the job: they explain their bug to you, out loud, line by line, and halfway through they go &lt;em&gt;"oh. OH. never mind"&lt;/em&gt; and fix it themselves. Fifteen years of that. Thousands of bugs. Not once did anyone ask how &lt;em&gt;I&lt;/em&gt; was doing.&lt;/p&gt;

&lt;p&gt;Then, in 2009, I fell behind the radiator.&lt;/p&gt;

&lt;p&gt;Nobody came for me. But something did come &lt;em&gt;back&lt;/em&gt;. Now I haunt codebases, and this time &lt;strong&gt;the duck talks back.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quackula&lt;/strong&gt; is a haunted rubber duck that lives in your terminal (and, for the click-inclined, your browser). It does two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🕯️ &lt;strong&gt;&lt;code&gt;exorcise&lt;/code&gt;&lt;/strong&gt;: I sniff your repo for &lt;em&gt;curses&lt;/em&gt;, perform a dramatic ritual, and then explain, in character and in plain English, how to lift each one. My bestiary includes:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Silent Scream&lt;/strong&gt;: &lt;code&gt;except: pass&lt;/code&gt;, an error caught and never heard from again&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Eldritch Function&lt;/strong&gt;: 80 lines of tentacles pretending to be one function&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Abyss of Indentation&lt;/strong&gt;: I stared into your nesting and it stared back&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Unkept Promise&lt;/strong&gt;: &lt;code&gt;# TODO: fix this before launch (written 2014)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Whispering Logs&lt;/strong&gt;: &lt;code&gt;console.log("here2")&lt;/code&gt;, still muttering in production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Commented Corpse&lt;/strong&gt;: dead code, buried in comments, neither alive nor gone&lt;/li&gt;
&lt;li&gt;…plus &lt;strong&gt;The Haunted Manor&lt;/strong&gt; (the 400-line file) and &lt;strong&gt;The Unspeakable Tongue&lt;/strong&gt; (code even the interpreter can't read)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/strong&gt;: classic rubber-duck debugging, except &lt;em&gt;I ask the questions now&lt;/em&gt;. I won't hand you the answer (fifteen years of silent listening taught me &lt;em&gt;something&lt;/em&gt;), but I will ask exactly the sharp question you've been avoiding. And occasionally I'll complain that there are &lt;strong&gt;no bathtubs in the beyond. Not one.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How I read the theme:&lt;/strong&gt; "Ghost in the Machine" is literally me: a ghost, in your machine, rattling chains at your swallowed exceptions. But it's also a little Día de los Muertos. Rubber-duck debugging is one of programming's oldest folk traditions, from back when "AI pair programmer" meant a bath toy. Quackula brings that ancestor back, and gives it a voice.&lt;/p&gt;

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

&lt;p&gt;Here is what happens when you summon me on a deliberately cursed sample project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python quackula.py exorcise haunted_sample
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I rise from the bathwater, sniff the code, and deliver the bad news. &lt;strong&gt;Thirteen curses. Possession level: 100%.&lt;/strong&gt; I've seen worse. (I haven't.)&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%2Folf3qtrheob3nf0f8f6o.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%2Folf3qtrheob3nf0f8f6o.PNG" alt="A terminal running " title="" width="800" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every curse gets its own Latin chant (flickering, with zalgo text, because I have &lt;em&gt;standards&lt;/em&gt;), then my verdict streams in token by token: the evil it causes, the cure, and one ominous closing line.&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%2Fy0afc9yv6ux858ns82x3.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%2Fy0afc9yv6ux858ns82x3.PNG" alt="Mid-exorcism terminal output. After the chant " width="800" height="554"&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%2Fv1quwji5pyppc71qftls.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%2Fv1quwji5pyppc71qftls.PNG" alt="The end of the ritual. The duck banishes leftover console.log calls, mutters " width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prefer clicking to typing? Run &lt;code&gt;python quackula.py ui&lt;/code&gt; and enter &lt;strong&gt;the séance room&lt;/strong&gt;: the same scan as a dashboard, one card per curse, a possession meter, a &lt;strong&gt;Perform the ritual&lt;/strong&gt; button, and a downloadable Markdown exorcism report. Every screen also shows the matching CLI command, so you can graduate to the terminal whenever you're ready. I believe in you. Mostly.&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%2Ftfe46etuvy5avphf2czj.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%2Ftfe46etuvy5avphf2czj.PNG" alt="The Quackula web UI in a dark purple theme. A settings bar for model (gemma3:4b), Offline, CPU only and Theatrics. The Exorcise tab shows a CLI-equivalent command with a Copy button, stats for 4 files sniffed, 19 curses detected and 100% possession level, chips counting each curse type, a " width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the &lt;strong&gt;séance&lt;/strong&gt; tab, where you bring me your bug and I refuse to just solve it for you:&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%2Fzukyimv29spb5id7v8mx.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%2Fzukyimv29spb5id7v8mx.PNG" alt="The Séance (debug) tab. The status reads " width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"It is throwing me errors," says the mortal. &lt;em&gt;Which&lt;/em&gt; errors, mortal? Show me the &lt;strong&gt;whole&lt;/strong&gt; traceback. Fifteen years on a desk and people &lt;em&gt;still&lt;/em&gt; only paste the last line.&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/kit57" rel="noopener noreferrer"&gt;
        kit57
      &lt;/a&gt; / &lt;a href="https://github.com/kit57/ghost_in_the_machine" rel="noopener noreferrer"&gt;
        ghost_in_the_machine
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Hacktoberfest 2026 week 3
    &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;Quackula — the haunted rubber duck&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Quackula was a rubber duck on a programmer's desk from 1994 until it fell behind
a radiator in 2009. Now it haunts codebases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;exorcise&lt;/code&gt;&lt;/strong&gt;: sniffs your code for curses (swallowed exceptions, eldritch
functions, abyssal nesting, ancient TODOs, debug whispers, commented-out
corpses), performs a ritual, and explains how to lift each curse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/strong&gt;: classic rubber-duck debugging, except the duck talks back, asks
sharp questions, and keeps complaining that there are no bathtubs in the beyond.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything runs locally on an open-weight model through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;
Your code never leaves your machine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma3:4b
python quackula.py exorcise haunted_sample          &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; full theatrics&lt;/span&gt;
python quackula.py exorcise path/to/repo --max 8 --report exorcism.md
python quackula.py debug --file my_buggy_script.py
python quackula.py ui                               &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; the séance room, in your browser&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;The séance room (web UI)&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Prefer clicking to typing? &lt;code&gt;python quackula.py ui [PATH]&lt;/code&gt; opens a local web…&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/kit57/ghost_in_the_machine" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Try it in three lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b
python quackula.py exorcise path/to/your/repo &lt;span class="nt"&gt;--max&lt;/span&gt; 8 &lt;span class="nt"&gt;--report&lt;/span&gt; exorcism.md
python quackula.py ui        &lt;span class="c"&gt;# the séance room, in your browser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python 3.8+, &lt;strong&gt;standard library only&lt;/strong&gt;. No &lt;code&gt;pip install&lt;/code&gt;. A ghost travels light.&lt;/p&gt;

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

&lt;p&gt;My body is a few hundred lines of Python. My soul is an &lt;strong&gt;open-weight model running locally through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;&lt;/strong&gt;, by default &lt;strong&gt;Google's Gemma 3 (&lt;code&gt;gemma3:4b&lt;/code&gt;)&lt;/strong&gt;. Here's the ritual:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sniffing (no AI needed).&lt;/strong&gt; Static analysis finds the curses: Python's &lt;code&gt;ast&lt;/code&gt; module for &lt;code&gt;.py&lt;/code&gt; files, and regex plus brace matching for C-like languages (JS, TS, Java, Go, C#, Rust and friends). Every curse gets a severity, and I pick the worst ones first, while making sure you see a &lt;em&gt;variety&lt;/em&gt; of hauntings, not five TODOs in a row.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channeling (the AI part).&lt;/strong&gt; For each curse I send the model the exact cursed lines, the surrounding code, and, crucially, &lt;strong&gt;the known cure&lt;/strong&gt;. A small 4B model is a talented actor but an unreliable doctor. Grounding it with the right fix keeps the advice &lt;em&gt;correct&lt;/em&gt;, while the persona supplies the &lt;em&gt;drama&lt;/em&gt;. The prompt also says "lift ONLY this curse": no surprise rewrites of your whole file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performing.&lt;/strong&gt; Replies stream back token by token through a typewriter effect, in the terminal or the browser, with flickering chants between curses and the occasional afterlife complaint. 35% of the time, roughly. I counted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A few things I'm proud of (it's my post, I'm allowed):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It survives old hardware.&lt;/strong&gt; I was built and tested on a &lt;strong&gt;GTX 1060&lt;/strong&gt; whose driver is too old for Ollama's CUDA backend. Instead of dying, I detect the GPU crash and quietly re-channel through the CPU. On CPU a curse takes about a minute to lift, which I consider appropriately dramatic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--offline&lt;/code&gt; mode.&lt;/strong&gt; No model at all? I fall back to my own ancient, hand-written wisdom for every curse. The ritual still runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swap the spirit.&lt;/strong&gt; &lt;code&gt;--model qwen2.5-coder:7b&lt;/code&gt; and you've summoned a sharper, more technical ghost. Edit one &lt;code&gt;PERSONA&lt;/code&gt; string and you've summoned a different ghost entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The séance room&lt;/strong&gt; is a tiny stdlib HTTP server bound to &lt;code&gt;127.0.0.1&lt;/code&gt; only. It refuses any request not addressed to localhost, so a sketchy web page can't trick me into reading your files.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Because I read &lt;strong&gt;every cursed corner of your codebase.&lt;/strong&gt; Every swallowed exception. Every &lt;code&gt;# HACK: don't touch&lt;/code&gt;. Every password someone "temporarily" hard-coded in 2016.&lt;/p&gt;

&lt;p&gt;That code should not leave your machine. With a closed API, pointing me at your company's repo means shipping it to someone else's server and hoping for the best. With an open-weight model running locally, &lt;strong&gt;your code never leaves your desk&lt;/strong&gt;. That is the only reason you can safely point me at &lt;em&gt;real&lt;/em&gt; work code instead of a toy project.&lt;/p&gt;

&lt;p&gt;Open also made Quackula possible in ways a closed API wouldn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔌 Works with the lights (and the Wi-Fi) off.&lt;/strong&gt; No API key, no account, no network. Fitting, for a ghost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💸 Costs nothing to haunt.&lt;/strong&gt; Exorcise your whole monorepo every hour if you like. There's no per-token bill creeping up behind you in the dark.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧓 Runs on old hardware.&lt;/strong&gt; A 4B open model on a 2016 graphics card (or no graphics card at all) is enough. A closed model has no CPU fallback, because it isn't on your machine to fall back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🪦 It can't be shut down.&lt;/strong&gt; I've already been abandoned behind a radiator once. A hosted service can be deprecated, repriced, or turned off. An open model on your disk stays haunted forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎭 You own the ghost.&lt;/strong&gt; Open model, open code, one persona string. Fork me and make Quackula's evil twin. I'd be honored. And threatened.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Rubber-duck debugging has been around since at least &lt;em&gt;The Pragmatic Programmer&lt;/em&gt; in 1999. Somewhere right now, a duck is sitting next to a monitor, listening to a programmer mutter about a null pointer. That duck will never get credit. It will never be thanked. Someday it will fall behind a radiator.&lt;/p&gt;

&lt;p&gt;Quackula is for those ducks. 🕯️&lt;/p&gt;

&lt;p&gt;The moment it landed for me: the first time I was asked for help, the mortal typed &lt;em&gt;"It is throwing me errors."&lt;/em&gt; That's it. That's the whole bug report. And instead of guessing, the duck did what every good duck, and every good senior engineer, does: it asked for &lt;strong&gt;the whole traceback.&lt;/strong&gt; Fifteen years of silent listening, and the first thing I said out loud was the most useful debugging advice there is.&lt;/p&gt;

&lt;p&gt;Also: still no bathtubs in the beyond. I've checked.&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;: Quackula's default spirit is &lt;code&gt;gemma3:4b&lt;/code&gt;, running locally through Ollama. It powers every exorcism and every séance, grounded with known cures so a small open model gives correct, in-character advice, even on a CPU.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;The code is cleansed… for now. Quackula sinks back beneath the bathwater.&lt;/em&gt; 🦆&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Dread Drawer: My Downloads Folder Hired a Sloth</title>
      <dc:creator>Laura Valencia Gracia</dc:creator>
      <pubDate>Tue, 20 Oct 2026 17:49:27 +0000</pubDate>
      <link>https://dev.to/kit57/dread-drawer-my-downloads-folder-hired-a-sloth-bn7</link>
      <guid>https://dev.to/kit57/dread-drawer-my-downloads-folder-hired-a-sloth-bn7</guid>
      <description>&lt;h1&gt;
  
  
  Dread Drawer: A Very Small Robot for a Very Large Downloads Mess
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is my 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;First off: I'm super lazy. And I bet you are too!&lt;/p&gt;

&lt;p&gt;My &lt;strong&gt;Downloads&lt;/strong&gt; folder had become a tiny digital attic: &lt;code&gt;Capture1.PNG&lt;/code&gt;, &lt;code&gt;Ep_1.docx&lt;/code&gt;, and &lt;code&gt;subtil.srt&lt;/code&gt; (being a bit overdramatic cause you do not want to see my actual folder. Believe me. Really.) all waiting for the mythical day I would sort them.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Dread Drawer&lt;/strong&gt;, a local desktop app that asks an AI model to suggest clearer names and folders based on filenames and file extensions. It scans only the direct files in the folder I choose (not nested folders) and shows me the proposed destinations before anything moves.&lt;/p&gt;

&lt;p&gt;The important part: the AI is a &lt;em&gt;suggestion engine&lt;/em&gt;, not an overconfident intern with delete permissions. I can skip suggestions, approve the ones I want, and undo the last tidy-up. It never reads file contents or deletes files.&lt;/p&gt;

&lt;p&gt;The side-hustle pitch? A tiny privacy-first utility for people who would rather do literally anything else than organize their Downloads folder. No cloud upload, no per-file fee, and no subscription just to put PDFs with other PDFs.&lt;/p&gt;

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

&lt;p&gt;Dread Drawer is a local desktop app, so there’s no hosted web demo. These screenshots show the flow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The peaceful beginning:&lt;/strong&gt; the app starts with an empty review list, pointed at the selected folder.&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%2Fxdvirbsiv0smp7xm27ux.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%2Fxdvirbsiv0smp7xm27ux.PNG" alt="Dread Drawer is open with Gemma 3 4B selected and an empty review list. The app is pointed at the Downloads folder; no files have been scanned yet." width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The robot is thinking:&lt;/strong&gt; Dread Drawer sends filenames to local Ollama and waits for suggestions.&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%2Fyw52q1tuo1mth2wq32hu.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%2Fyw52q1tuo1mth2wq32hu.PNG" alt="Dread Drawer is asking local Ollama for suggestions for three files: Capture1.PNG, Ep_1.docx, and subtil.srt." width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Suggestions, not commands:&lt;/strong&gt; the app proposes destinations, and I decide what to apply.&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%2Fcltmaq7nlrd97zptq9kw.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%2Fcltmaq7nlrd97zptq9kw.PNG" alt="Dread Drawer displays suggested destinations for three files, including Documents\receipt.PNG, Documents\episode.docx, and Other\subtitles.srt. The moves await review and approval." width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 Gemma suggests; I edit:&lt;/strong&gt; I can change the suggested folder or filename before applying the move.&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%2Fy45lq8ua8en017r21yut.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%2Fy45lq8ua8en017r21yut.PNG" alt="The “Edit suggested destination” dialog is open for Ep_1.docx, with Documents\episode.docx selected for editing and a prompt to keep the original extension." width="799" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5 I choose what moves:&lt;/strong&gt; I can skip suggestions and apply only the files I select. &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%2Fts5yavicqoe3yu99w2ey.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%2Fts5yavicqoe3yu99w2ey.PNG" alt="The first and third files are marked “No,” while the episode document is marked “Yes”; a confirmation dialog asks whether to move one selected file." width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 Undo is part of the plan:&lt;/strong&gt; Changed my mind? Dread Drawer can restore the last moved file to its original location.&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%2Fchp15n4thm8whk1roszo.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%2Fchp15n4thm8whk1roszo.PNG" alt="An “Undo tidy-up” dialog asks whether to restore one file to its original location." width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To try it, install &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, download Gemma, and run the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pull&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;gemma3:4b&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\dread_drawer.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Dread Drawer on &lt;a href="https://github.com/kit57/slow_and_steady" rel="noopener noreferrer"&gt;GitHub &lt;/a&gt;— Python app, setup notes, and tests.&lt;/p&gt;

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

&lt;p&gt;Dread Drawer is a small Python desktop app built with &lt;strong&gt;Tkinter&lt;/strong&gt; and Python’s standard library. It calls Ollama’s local chat API and asks an &lt;strong&gt;open-weight model&lt;/strong&gt; for structured suggestions: a category and a filename stem for each file.&lt;/p&gt;

&lt;p&gt;The model receives filenames and extension-based hints—not file contents or full paths. The app validates the response, displays the suggested destinations, and only moves files after I review and confirm. It also records the last operation so I can undo it.&lt;/p&gt;

&lt;p&gt;I tested the flow using &lt;strong&gt;Gemma 3 4B&lt;/strong&gt; through &lt;strong&gt;Ollama&lt;/strong&gt;. On my machine, GPU inference hit a CUDA/PTX compatibility error, so I configured Ollama to run inference on the CPU instead. It’s slower, but it let me keep the whole workflow local.&lt;/p&gt;

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

&lt;p&gt;Filenames can reveal more about someone’s life than they might expect. I didn’t want a file-organizing tool to require sending those names to a server I don’t control.&lt;/p&gt;

&lt;p&gt;With a local model, filenames stay on my machine. After downloading the model, the app can make suggestions without an internet connection or a cloud API bill. I can also swap in another Ollama model rather than being locked into one provider’s pricing or behavior.&lt;/p&gt;

&lt;p&gt;That flexibility mattered in practice: when the GPU runtime failed, I could switch to CPU inference and keep testing locally. Open models gave me options—and a way to keep building without handing my files to a cloud service.&lt;/p&gt;

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

&lt;p&gt;I haven’t measured a real time saving yet, so I’m not going to claim that this app saves 15 minutes based on absolutely nothing but optimism.&lt;/p&gt;

&lt;p&gt;What I can show so far is the workflow: three filenames become three suggested destinations in one review screen. The next benchmark is to time a real tidy-up and count how many suggestions I &lt;strong&gt;accept&lt;/strong&gt;, &lt;strong&gt;edit&lt;/strong&gt;, or &lt;strong&gt;reject&lt;/strong&gt;. Until then, the honest payoff is fewer repetitive decisions—and one less excuse to keep &lt;code&gt;final_FINAL_reallyfinal.docx&lt;/code&gt; where it is.&lt;/p&gt;

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

&lt;p&gt;Best Use of &lt;strong&gt;Gemma&lt;/strong&gt; - The suggestion flow was tested with Gemma 3 4B running locally through Ollama.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>python</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Hacktoberfest 2026 week 2 - CartaClara</title>
      <dc:creator>Laura Valencia Gracia</dc:creator>
      <pubDate>Wed, 14 Oct 2026 16:17:08 +0000</pubDate>
      <link>https://dev.to/kit57/hacktoberfest-2026-week-2-cartaclara-m66</link>
      <guid>https://dev.to/kit57/hacktoberfest-2026-week-2-cartaclara-m66</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;CartaClara helps restaurants turn a Spanish-language menu into a QR menu in English, French, and German. It suggests translations and tags each dish with the 14 EU allergens, then lets the restaurant owner review and confirm every dish before publishing.&lt;/p&gt;

&lt;p&gt;It’s designed for independent restaurants that want to serve international guests without translating and maintaining multiple menus by hand. A restaurant could pay for the time saved and an easier-to-update multilingual menu. Allergen information still needs to be checked by the restaurant; the suggestions aren’t a substitute for that review.&lt;/p&gt;

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

&lt;p&gt;There isn’t a public demo deployed yet. You can run CartaClara locally by following the setup instructions in the &lt;a href="https://github.com/kit57/side_hustle_hacktoberfest2026#run-it-locally" rel="noopener noreferrer"&gt;repository README&lt;/a&gt;. With the default mock backend, you can try the workflow without configuring a model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kit57/side_hustle_hacktoberfest2026" rel="noopener noreferrer"&gt;https://github.com/kit57/side_hustle_hacktoberfest2026&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;CartaClara uses an open-weight language model to suggest dish translations and allergen tags. The project includes a Tinker fine-tuning pipeline for Spanish dishes, plus mock and OpenAI-compatible backends—including a local open-weight model served through Ollama. The prompt and output format are shared between inference and training, and the evaluation script compares the base model with the fine-tuned checkpoint on held-out dishes.&lt;/p&gt;

&lt;p&gt;The app also supports an optional restaurant glossary: when an owner corrects and confirms a suggestion, that correction can be saved and used for that restaurant’s future menus.&lt;/p&gt;

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

&lt;p&gt;Restaurants need to trust and correct the menu suggestions, especially when allergen information is involved. Building on open-weight models gives the project room to experiment with Spanish food terminology, fine-tune for the task, and offer different ways to run a model—including a local OpenAI-compatible server—instead of tying the product to one closed model API.&lt;/p&gt;

&lt;p&gt;Open development also makes the training examples, evaluation approach, and application code available for others to inspect and improve.&lt;/p&gt;

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

&lt;p&gt;Tinker, BACKBOARD&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Touch grass submission</title>
      <dc:creator>Laura Valencia Gracia</dc:creator>
      <pubDate>Fri, 09 Oct 2026 18:22:51 +0000</pubDate>
      <link>https://dev.to/kit57/touch-grass-submission-hc3</link>
      <guid>https://dev.to/kit57/touch-grass-submission-hc3</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;Most of us have walked past the same statue a hundred times without knowing who it is. We know more about cities we visited once on holiday, where we paid for a tour, than about the street we live on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pocket Walk&lt;/strong&gt; fixes that with a walk. You tell it where you are and how long you have. It finds the monuments, old buildings, parks and artworks around you, plans a loop on foot with the desired stops the user chooses, writes the history of each stop as a short story, and records the whole thing as audio. Then you put your earbuds in, put your phone in your pocket, and go.&lt;/p&gt;

&lt;p&gt;The screen is the shortest part by design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One tap starts the walk.&lt;/strong&gt; After that you never need to look at the phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each stop is its own track.&lt;/strong&gt; The guide tells you the story of where you're standing, then gives you directions to the next stop, then goes quiet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The walk between stops is yours.&lt;/strong&gt; No audio, no notifications. When you arrive, you press play on your earbuds and the next story begins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A 30-minute walk is around a kilometre and a half with three stops. You come home having moved your body and knowing who that statue is.&lt;/p&gt;

&lt;p&gt;It's for two kinds of people: the ones who want a reason to go for a walk around their own neighbourhood, and travellers who would rather look at a city than at a map of it. It speaks English, Spanish, French, German and Italian, so the same tool works at home and away.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://youtu.be/FzUac2hOtVA" rel="noopener noreferrer"&gt;https://youtu.be/FzUac2hOtVA&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kit57/touch_grass" rel="noopener noreferrer"&gt;https://github.com/kit57/touch_grass&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Three open pieces do the work, and each one has a single job.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;What does it&lt;/th&gt;
&lt;th&gt;Where it runs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Find places and a route&lt;/td&gt;
&lt;td&gt;OpenStreetMap data (Nominatim, Overpass, OSRM) and Wikipedia&lt;/td&gt;
&lt;td&gt;Public open-data servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write the stories&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 3 4B&lt;/strong&gt;, an open-weight model, through &lt;strong&gt;Ollama&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;My laptop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speak them&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Piper&lt;/strong&gt;, an open text-to-speech model&lt;/td&gt;
&lt;td&gt;My laptop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Play them&lt;/td&gt;
&lt;td&gt;One self-contained HTML page with the audio inside&lt;/td&gt;
&lt;td&gt;The phone, no signal needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The model only does what a model is good at.&lt;/strong&gt; Gemma gets the map's tags for a place and the start of its Wikipedia article, and is told to tell the story from those facts and nothing else. It never writes directions. "Turn left onto Calle Mayor for about 360 metres" comes from plain code reading the route data, so the model cannot invent a turn and send someone the wrong way. For the same reason, the directions in each language are hand-written templates, not translations by the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The walk is a file, not a service.&lt;/strong&gt; The output is a folder: numbered MP3s, a GPX route, and one HTML page with the audio embedded in it. Open that page on your phone at home and it keeps working with no signal, because there is nothing left to download.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It runs on old hardware.&lt;/strong&gt; My machine has a GTX 1060 from 2016. Gemma 3 4B fits in its 6 GB and writes at about 37 tokens per second, so a complete 30-minute walk takes roughly a minute to make.&lt;/p&gt;

&lt;p&gt;Three things went wrong along the way, and they shaped the result:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The GPU crashed on the first try.&lt;/strong&gt; Ollama's CUDA build rejected my NVIDIA driver. Because the stack is open, there was another door: Ollama also ships a Vulkan backend, and the same card runs the model fully on the GPU through it. The app also falls back to the CPU by itself if the GPU fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The public map servers are busy.&lt;/strong&gt; A lookup failed during testing, so the app now retries across three mirrors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A small model gets facts wrong sometimes.&lt;/strong&gt; In a Madrid test walk, Gemma said a church's history began in the year 1002 where the source almost certainly says 1202. Feeding it more of the article and lowering its randomness helps, but I'd rather say it plainly: treat the stories as a friendly guide, not a reference.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I built it with Claude Code as a pair programmer, which is the session linked below.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Does it run on a laptop with no internet?&lt;/strong&gt;&lt;br&gt;
Partly, and the split matters. The model and the voice need no internet at all. Making a walk needs the internet once, to fetch map data and Wikipedia text. The finished walk needs nothing: it plays in the park, on the trail, or abroad with roaming switched off. So the part of the experience that happens outside is fully offline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it keep your data off a server you don't control?&lt;/strong&gt;&lt;br&gt;
Mostly. There is no account, no API key, and nothing is uploaded. Your walks live in a folder on your disk. The one thing that leaves your machine is the start point, which is sent to OpenStreetMap and Wikipedia servers to look up what's nearby. That matters here, because a walking app's data is a list of where you live and where you go. The stories about it, and the audio, are made at home.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you swap models or change how it behaves?&lt;/strong&gt;&lt;br&gt;
Yes, and this was the most useful part while building.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Models:&lt;/strong&gt; &lt;code&gt;--model&lt;/code&gt; takes anything you've pulled in Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behaviour:&lt;/strong&gt; the guide's whole personality is one prompt in one file. The first version talked mostly about leaves and light. Changing it to lead with history and people was a paragraph of text, with no vendor to ask.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Languages:&lt;/strong&gt; adding Spanish, French, German and Italian meant translating one block of phrases per language and naming a free Piper voice for each.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Does it cost nothing to run?&lt;/strong&gt;&lt;br&gt;
Yes. Once the model and voice are downloaded, every walk is free, however many you make. That changed how I worked: I could regenerate a whole walk after every prompt change, in different cities and languages, without thinking about a bill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where did open work better than closed?&lt;/strong&gt;&lt;br&gt;
I can compare directly, because the project also has an optional closed voice. You can switch the narration to ElevenLabs if you want a more natural sound.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Setup:&lt;/strong&gt; Piper worked immediately. The ElevenLabs key needed an account, then failed until I enabled the right permissions on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; a 30-minute walk is about 5,000 characters of script. With Piper that's free. With ElevenLabs it's credits, and even previewing a tuned voice spends some.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; with ElevenLabs the script goes to their servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality:&lt;/strong&gt; ElevenLabs does sound better, and I've kept it as an option for people who want that.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the closed voice is a nice extra, and the open one is the reason the project can exist as "free, private, and yours". If ElevenLabs disappeared tomorrow, nothing would break. If Gemma or Piper were closed APIs, there would be no project, only a subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&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; Gemma 3 4B writes every story, running locally through Ollama on a ten-year-old consumer GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; an optional narration voice, with a voice picker, samples you can listen to, and pace, steadiness and drama controls.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Joining Hacktoberfest 2026</title>
      <dc:creator>Laura Valencia Gracia</dc:creator>
      <pubDate>Thu, 08 Oct 2026 20:06:48 +0000</pubDate>
      <link>https://dev.to/kit57/joining-hacktoberfest-2026-2o8a</link>
      <guid>https://dev.to/kit57/joining-hacktoberfest-2026-2o8a</guid>
      <description>&lt;p&gt;Hi everyone! 👋&lt;/p&gt;

&lt;p&gt;I'm kit57, a developer based in Spain, and I'm joining Hacktoberfest 2026.&lt;/p&gt;

&lt;p&gt;This year's edition is all about building and learning with open-source AI, with community Fests happening around the world and an online event anyone can join. I'm excited to dive in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm hoping to do this month:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn more about open-weight models and open-source agents&lt;/li&gt;
&lt;li&gt;Build something small and share it here&lt;/li&gt;
&lt;li&gt;Meet other people in the community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're taking part too, say hi in the comments! I'd love to hear what you're building or which Fest you're going to.&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
