<?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: Nazaret</title>
    <description>The latest articles on DEV Community by Nazaret (@itsnazaretdev).</description>
    <link>https://dev.to/itsnazaretdev</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%2F4166733%2Fe6614da4-91d8-482c-9456-08374b90d5ff.png</url>
      <title>DEV Community: Nazaret</title>
      <link>https://dev.to/itsnazaretdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/itsnazaretdev"/>
    <language>en</language>
    <item>
      <title>I built a haunted museum where dead tech (and my old repos) talk back 👻</title>
      <dc:creator>Nazaret</dc:creator>
      <pubDate>Sat, 31 Oct 2026 19:11:48 +0000</pubDate>
      <link>https://dev.to/itsnazaretdev/i-built-a-haunted-museum-where-dead-tech-and-my-old-repos-talk-back-48fc</link>
      <guid>https://dev.to/itsnazaretdev/i-built-a-haunted-museum-where-dead-tech-and-my-old-repos-talk-back-48fc</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;The Haunted Museum of Dead Tech&lt;/strong&gt; 👻 is a museum where the technologies we buried come back as ghosts, and they still have a lot to say.&lt;/p&gt;

&lt;p&gt;You walk through the halls, pick an exhibit and talk to its ghost. Each one tells you its story, defends itself from its critics and tries to convince you that it deserves to come back from the dead.&lt;/p&gt;

&lt;p&gt;The collection has eight ghosts born between 1971 and 1999: the &lt;strong&gt;Floppy Disk, VHS, the Walkman, the Game Boy, Encarta, Internet Explorer, Clippy and MSN Messenger&lt;/strong&gt;. The Floppy Disk is grumpy because it's still the Save icon and nobody thanks it, VHS gets upset if you didn't rewind, and MSN sends you a nudge if you take too long to answer.&lt;/p&gt;

&lt;p&gt;Every ghost is shaped like its object (a floppy disk, a cassette, a little console, an open book, a chat bubble...), with a pastel color, a soft halo and a face that moves its mouth while it talks.&lt;/p&gt;

&lt;p&gt;I read the theme in two ways at once. Halloween gave me the ghosts and the séances. Día de los Muertos gave me the idea of &lt;strong&gt;honoring what is gone&lt;/strong&gt;: remembering these technologies with love, leaving them offerings and letting them tell their own story. So the museum also has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🕯️ Ofrendas.&lt;/strong&gt; Leave a candle, a marigold, pan de muerto or the ghost's special gift on its altar (a rewound rental tape for VHS, fresh AA batteries for the Game Boy...). The ghost reacts, and the most loved ghost gets a badge in the hall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📖 Guestbook.&lt;/strong&gt; Sign an exhibit's guestbook and the ghost writes you a dedication back, like signing a yearbook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚔️ Debate Hall.&lt;/strong&gt; Pick two ghosts and a topic, and they argue live, turn by turn, answering each other. When the candles burn out, you vote the winner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🪦 Repo Graveyard.&lt;/strong&gt; The personal wing. Write your GitHub username and every repo you stopped committing to gets a tombstone with an epitaph. Then you can summon the ghost of any repo: it remembers its README and last commits, knows you created it, and asks you why you left.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The inspiration was simple: I'm a web development student, I got into programming through an HTML game, and I still remember the floppy disks and MSN nudges. I wanted a place where those memories could talk back.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/qaZxt4GjDtY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The museum runs locally with Ollama, so the best way to see it is the video. To run it yourself, the instructions are in the repo.&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/itsnazaretdev" rel="noopener noreferrer"&gt;
        itsnazaretdev
      &lt;/a&gt; / &lt;a href="https://github.com/itsnazaretdev/haunted-museum" rel="noopener noreferrer"&gt;
        haunted-museum
      &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;👻 Haunted Museum of Dead Tech&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A haunted museum where dead (or almost dead) technologies come back as ghosts.&lt;/p&gt;
&lt;p&gt;Built for the Hacktoberfest open-source AI challenge, week "Ghost in the Machine"
Every ghost runs on &lt;strong&gt;Gemma 3 (4B) through Ollama&lt;/strong&gt;, locally. No API keys, no cloud.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What you can do&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Historical wing&lt;/strong&gt; · Eight ghosts born between 1971 and 1999: the Floppy Disk, VHS, the Walkman
the Game Boy, Encarta, Internet Explorer, Clippy and MSN Messenger. Each one is shaped like its object.
Talk to any of them: each ghost tells its story, answers its critics and argues why it should come back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ofrenda&lt;/strong&gt; · For Día de los Muertos, leave a candle, a marigold, pan de muerto or the ghost's
special gift on its altar. The ghost reacts, and the most loved ghost gets a badge in the hall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guestbook&lt;/strong&gt; · Sign each exhibit's guestbook and the ghost…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/itsnazaretdev/haunted-museum" 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;Open-source AI used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 (4B)&lt;/strong&gt;, an open-weight model, running locally with &lt;strong&gt;Ollama&lt;/strong&gt;. Every ghost, epitaph, offering reaction and debate turn is generated on my own machine.&lt;/li&gt;
&lt;li&gt;Any other model in Ollama works too: the museum detects what you have installed and lets you switch the "medium" from the header.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The rest of the stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fastify (Node)&lt;/strong&gt; for the museum server: it builds each ghost's prompt and streams the answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Astro&lt;/strong&gt; with plain CSS for the museum, and SVG for the ghosts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pnpm workspaces&lt;/strong&gt; to keep the server and the web in one repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One Markdown file per ghost.&lt;/strong&gt; Each exhibit is a &lt;code&gt;.md&lt;/code&gt; file. The frontmatter is the ghost's soul (personality, catchphrase, what its critics say, its color, shape and special offering) and the body is its historical archive: life, death, defense and why it should come back. The same file is used twice: Astro renders it as the exhibit plaque, and the server puts it in the model's system prompt as &lt;strong&gt;the only thing the ghost remembers&lt;/strong&gt;. The ghost is told to say its memory is "foggy" instead of inventing dates. A 4B model can make things up easily, so I checked every archive myself. Adding a new ghost means adding one file.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language.&lt;/strong&gt; The prompt is in English, so Gemma kept answering in English even when I wrote in Spanish. A rule at the end of a long prompt wasn't enough. What worked was detecting the visitor's language and adding a short reminder right before the ghost answers. Small models pay much more attention to the end of the conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debates.&lt;/strong&gt; Each turn is a separate request. The ghost on stage sees its own lines as its messages and the opponent's lines as the other person, so they really answer each other instead of giving two monologues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub limits.&lt;/strong&gt; My first graveyard downloaded the README and commits of every repo just to write the epitaphs, and I hit GitHub's hourly limit fast. Now the epitaphs only need the repo list (one request for the whole graveyard), and the README and commits are downloaded only when you summon a ghost. No token needed.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Your memories stay home.&lt;/strong&gt; The guestbook, the offerings and your repo history are saved in small JSON files on your own machine. Talking to your old projects never sends your code or your messages to someone else's server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works with the lights off.&lt;/strong&gt; The museum runs fully offline. The graveyard needs the internet only the first time: after that, repos, epitaphs and memories are cached locally. A museum of technologies that disappeared because a company switched them off shouldn't depend on a service that can be switched off too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could compare and choose.&lt;/strong&gt; I tried the same ghosts with Gemma 3 and Qwen 2.5. Gemma kept the characters much better, so it's the default. With a closed API I would have used whatever model I was given. Here I compared them myself, and anyone who prefers another model can switch it from the header.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It costs nothing to haunt.&lt;/strong&gt; No API keys, no tokens, no bills. You can debate with ghosts all night.&lt;/p&gt;

&lt;p&gt;And there's an irony I love: many of the ghosts in this museum died because someone else decided for them. Microsoft retired MSN Messenger and replaced it with Skype, and Encarta was shut down along with all its websites. Building their museum with open tools felt like the right way to honor them.&lt;/p&gt;

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

&lt;p&gt;I built the museum with an AI coding assistant, in one long conversation. It wrote much of the code, but the direction was mine: I turned a repo graveyard idea into a &lt;strong&gt;museum of dead tech&lt;/strong&gt;, chose the ghosts my generation grew up with, asked for each one to have the shape of its object, and decided what stayed and what went.&lt;/p&gt;

&lt;p&gt;My other job was testing everything on my laptop and reporting what broke: ghosts answering only in English, GitHub's rate limit, duplicated offerings, a repo ghost claiming it created itself... Each one became a fix. Learning to explain clearly what was wrong and decide when something was finished was the most interesting part for me.&lt;/p&gt;

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

&lt;p&gt;As a kid, floppy disks were how I first got close to a computer. They were my way in, and everything that came after started there. So "talking" to the Floppy Disk ghost felt special: like saying thank you to the thing that opened the door for me.&lt;/p&gt;

&lt;p&gt;But the moment that really landed was in the graveyard. I summoned the ghost of one of my own abandoned repos, asked it who created it, and it answered with my name and asked me why I left. It's a strange feeling to be questioned by your past self's code. I didn't have a good answer. 👻&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;: every ghost, epitaph, offering reaction and debate turn is generated by Gemma 3 (4B) running locally with Ollama. After comparing it with other open models, Gemma kept the characters best, so it's the default medium of the museum.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Sleepy Coder: a local assistant that finds the boring fixes in your code</title>
      <dc:creator>Nazaret</dc:creator>
      <pubDate>Sat, 24 Oct 2026 17:26:05 +0000</pubDate>
      <link>https://dev.to/itsnazaretdev/sleepy-coder-a-local-assistant-that-finds-the-boring-fixes-in-your-code-nmc</link>
      <guid>https://dev.to/itsnazaretdev/sleepy-coder-a-local-assistant-that-finds-the-boring-fixes-in-your-code-nmc</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: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Sleepy Coder&lt;/strong&gt; is a local coding assistant for the small, boring problems that pile up in side projects: the duplicate &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, the image without &lt;code&gt;alt&lt;/code&gt;, the &lt;code&gt;console.log&lt;/code&gt; you forgot, the TODO from three weeks ago.&lt;/p&gt;

&lt;p&gt;You point it at a folder on your computer and it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Finds tasks&lt;/strong&gt; with rules (no AI, instant, reliable): SEO issues like a duplicate &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; or a missing &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; and meta description, accessibility issues like images without &lt;code&gt;alt&lt;/code&gt; or icon links without text, leftover &lt;code&gt;console.log&lt;/code&gt;, TODO/FIXME comments, and a missing README, LICENSE or tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asks Gemma for ideas&lt;/strong&gt; about anything the rules can't see. These are clearly labelled &lt;strong&gt;AI idea · verify it&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Shows you &lt;strong&gt;How to fix&lt;/strong&gt; each task: the exact file and line (with an &lt;em&gt;Open in VS Code&lt;/em&gt; button), and Gemma's explanation with suggested code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks your fix.&lt;/strong&gt; You change the code yourself, press &lt;em&gt;I fixed it — check again&lt;/em&gt;, and the same rule that found the problem runs again. If it's gone, the task moves to &lt;strong&gt;Done&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The lazy part: I don't have to remember what's wrong in each project or hunt for it. Sleepy Coder does the looking and the explaining; I only do the one-minute fix.&lt;/p&gt;

&lt;p&gt;The real moment I knew it was useful: I ran it on my CSS backgrounds gallery (an Astro site) and it reported &lt;strong&gt;two &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; on the home page&lt;/strong&gt;. I had no idea. The second one was inside a modal that &lt;em&gt;simulates&lt;/em&gt; a website to preview each background, and the rule found it by following the Astro imports from the page into the component. It also knew the real title was the one in the hero and told me to leave that one alone.&lt;/p&gt;

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

&lt;p&gt;In the video: I open my CSS backgrounds gallery, press &lt;strong&gt;Find tasks&lt;/strong&gt;, approve the duplicate &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, open &lt;strong&gt;How to fix&lt;/strong&gt; (exact line + Gemma's guide), fix it in VS Code, and press &lt;strong&gt;check again&lt;/strong&gt;: the task moves to &lt;strong&gt;Done&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/8QZtRH3OLX0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/8QZtRH3OLX0" rel="noopener noreferrer"&gt;Watch the demo on YouTube&lt;/a&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/itsnazaretdev" rel="noopener noreferrer"&gt;
        itsnazaretdev
      &lt;/a&gt; / &lt;a href="https://github.com/itsnazaretdev/sleepy-coder" rel="noopener noreferrer"&gt;
        sleepy-coder
      &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;💤 Sleepy Coder&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Let your code sleep. We'll handle the boring stuff.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sleepy Coder is a local coding assistant that looks through your repositories for small
boring problems — a duplicate &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, an image without &lt;code&gt;alt&lt;/code&gt;, a forgotten &lt;code&gt;console.log&lt;/code&gt;, a TODO
you never got back to — and shows you &lt;strong&gt;exactly where each one is and how to fix it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It runs on your machine with a local model through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;
No cloud, no paid APIs, and it never changes your files: you make the fix, Sleepy Coder checks it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Built for the Hacktoberfest &lt;strong&gt;Slow and Steady&lt;/strong&gt; challenge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it finds&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;With rules&lt;/strong&gt; (fast, no AI, reliable):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SEO:&lt;/strong&gt; duplicate &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; on a page (it follows Astro layouts and components), missing
&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, missing &lt;code&gt;&amp;lt;meta name="description"&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility:&lt;/strong&gt; images without &lt;code&gt;alt&lt;/code&gt;, links without readable text, &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; without &lt;code&gt;lang&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; TODO / FIXME / HACK comments, leftover…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/itsnazaretdev/sleepy-coder" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B&lt;/strong&gt; (open weights) running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. Everything AI goes through it: task ideas and fix guides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Astro&lt;/strong&gt; with React islands and plain CSS for the dashboard, and &lt;strong&gt;Fastify&lt;/strong&gt; for a small API that only listens on &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; (Node's built-in &lt;code&gt;node:sqlite&lt;/code&gt;) to remember repositories, tasks and guides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vitest&lt;/strong&gt; for the tests, in a pnpm monorepo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rules and the model each do the part they're good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rules find &lt;em&gt;where&lt;/em&gt;.&lt;/strong&gt; They read the files and know exactly which line has the problem, so the location is always right.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma explains &lt;em&gt;how&lt;/em&gt;.&lt;/strong&gt; It gets the numbered lines around the problem plus a hint from the rule (for example, "keep the &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; in &lt;code&gt;Hero.astro&lt;/code&gt;"), and returns an explanation, steps and suggested code as structured JSON. I validate everything it sends back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For AI ideas, Gemma checks itself.&lt;/strong&gt; Before writing a guide, it reads the real file and has to say whether the problem actually exists. Once it told me all my SEO descriptions were empty strings… they weren't. Now it can answer "this does not apply", and the app offers to discard the task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I tried first (and why it doesn't fix things for you)
&lt;/h3&gt;

&lt;p&gt;My first plan was the "sleepy" dream: approve a task, and an agent makes the change on its own Git branch while you rest. I built it carefully: an isolated &lt;code&gt;git worktree&lt;/code&gt; on a &lt;code&gt;sleepy/…&lt;/code&gt; branch, a sandbox so it could only touch files inside that copy, protected files it couldn't edit, your own test script before and after, and a check that the problem was really gone before committing.&lt;/p&gt;

&lt;p&gt;The safety side worked. It never broke anything. But the edits themselves, with a 4B model on a laptop, kept failing in new ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;asked to add &lt;code&gt;alt&lt;/code&gt; text, it &lt;strong&gt;reformatted a file&lt;/strong&gt; instead;&lt;/li&gt;
&lt;li&gt;asked to rewrite a file, it &lt;strong&gt;dropped half of it&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;asked for small search-and-replace edits, it &lt;strong&gt;"quoted" code from memory&lt;/strong&gt; that wasn't actually in the file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each time my checks rejected the change, so the result was safe but useless: "Failed", over and over. What Gemma &lt;em&gt;did&lt;/em&gt; get right every time was understanding the problem and explaining the fix. So I changed the design to match that: rules find the line, Gemma explains, I edit, the rule checks. The agent is still in the code as an experimental option for bigger models, but it's off by default.&lt;/p&gt;

&lt;p&gt;It was hard to let go of the "it fixes everything while you sleep" idea. I think the result is more honest, and more useful.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My code never leaves my machine.&lt;/strong&gt; Sleepy Coder reads whole repositories: unfinished projects, class assignments, things I haven't published. With a closed API I'd be uploading all of that to someone else's server just to be told I forgot an &lt;code&gt;alt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No API key and no bill per request. You can scan as often as you want, which matters for a tool whose whole point is to be used casually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline&lt;/strong&gt; once the model is downloaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is swappable.&lt;/strong&gt; Sleepy Coder uses Gemma by default, but if you already have another model in Ollama it will use that, and one environment variable (&lt;code&gt;SLEEPY_MODEL=…&lt;/code&gt;) picks a specific one. Nobody is locked into a provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could see the limits and design around them.&lt;/strong&gt; Because the model runs locally and I can test it as much as I like, I found out exactly where a small model is reliable and where it isn't, and built the app on the reliable part. That experiment is the main lesson of the project.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On my CSS backgrounds gallery it found a duplicate &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; I didn't know about, told me which file to change and which one to keep, and confirmed the fix with one click.&lt;/li&gt;
&lt;li&gt;Instead of opening every file to look for leftovers, one click on &lt;strong&gt;Find tasks&lt;/strong&gt; lists them with the exact line, and &lt;strong&gt;Check again&lt;/strong&gt; moves each to Done once it's fixed.&lt;/li&gt;
&lt;li&gt;Sleepy Coder never changes my files, so I can run it on any project without worrying about it.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Gemma&lt;/strong&gt;: the whole project runs on Gemma 3 4B locally through Ollama.&lt;/p&gt;




&lt;p&gt;Thanks for reading! I'm a second-year web development student, and this is my third local-AI project in this Hacktoberfest, after a walk journal and a menu translator. This one taught me the most about where a small model shines and where it doesn't. If you try it on your own projects and it flags something silly, tell me: every false positive becomes a new test.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>ai</category>
    </item>
    <item>
      <title>MenuMind: From a restaurant's PDF menu to a bilingual QR menu with Gemma 3</title>
      <dc:creator>Nazaret</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:59:37 +0000</pubDate>
      <link>https://dev.to/itsnazaretdev/menumind-from-a-restaurants-pdf-menu-to-a-bilingual-qr-menu-with-gemma-3-2g0n</link>
      <guid>https://dev.to/itsnazaretdev/menumind-from-a-restaurants-pdf-menu-to-a-bilingual-qr-menu-with-gemma-3-2g0n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;MenuMind&lt;/strong&gt; is a tool for small restaurants that turns their existing PDF menu into a digital, bilingual (Spanish/English) menu that customers open by scanning a QR code.&lt;/p&gt;

&lt;p&gt;I'm a web development student in Spain, and where I live a lot of small bars and restaurants still run on printed menus. That works fine until a tourist sits down, or prices change, or a dish comes off the menu. Then someone has to redo the document, get it translated, and keep two or three versions in sync. Big chains have tools and agencies for that. The family-run place on the corner usually doesn't.&lt;/p&gt;

&lt;p&gt;So the idea behind MenuMind is simple: the restaurant uploads the menu it already has, and gets back something its customers can read on their phone, in their language.&lt;/p&gt;

&lt;p&gt;The flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload&lt;/strong&gt; the menu as a PDF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt;: each page is analysed by Gemma 3 4B, which identifies dishes, categories and prices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review&lt;/strong&gt;: the owner sees every extracted dish in an editable table and can fix names, categories or prices, or delete anything that shouldn't be there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translate&lt;/strong&gt;: once the Spanish version is right, Gemma translates dish names and categories into English.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish&lt;/strong&gt;: the menu is saved as the restaurant's own public page, with a Spanish/English toggle. The page also shows a QR code pointing to it, meant to be printed and placed on the tables, so customers can open the menu from their phones.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The owner's side of the app is in Spanish on purpose: the first users I have in mind are bars and restaurants around me, and the tool should speak their language. The English is for their customers.&lt;/p&gt;

&lt;p&gt;The review step is deliberate. AI does the boring part, the typing, but the restaurant has the final word on what its customers read. A wrong price on a menu is a real problem, so I didn't want the model to be the last line of defence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Why not just put the PDF behind a QR code?"&lt;/strong&gt; I asked myself this halfway through the build, and it's a fair question: plenty of bars already do exactly that. But a PDF behind a QR code is still the same document. It's still only in Spanish, so a tourist still can't read it, and on a phone it means pinching and zooming around a page designed for paper.&lt;/p&gt;

&lt;p&gt;MenuMind isn't about showing the PDF. The PDF is just the way in. The AI's job is to save the owner from retyping sixty dishes by hand, which is the real reason small places never get around to a proper digital menu. Once the dishes are structured data (a name, a category and a price) instead of a document, the menu can be translated, read comfortably on a phone, and, as the product grows, updated or extended to more languages while the QR codes on the tables stay the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who would pay for it?&lt;/strong&gt; Small restaurants, cafés and bars, especially in areas that get tourists and need their menu in more than one language. The natural business model would be a small monthly subscription per venue, cheaper than paying for a translation every time the menu changes. Right now, though, my focus is building and validating the product, not selling it yet.&lt;/p&gt;

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

&lt;p&gt;MenuMind currently runs entirely on my own machine (frontend, API, database and the model), so instead of a public link, here's a short video of the full flow: uploading a real menu PDF, reviewing the extracted dishes, translating them, opening the public menu and scanning its QR code from an Android phone on the same network. The interface you'll see is in Spanish, so turn on captions (CC) for an English walkthrough of each step.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/HZT8tBxUDO8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/HZT8tBxUDO8" rel="noopener noreferrer"&gt;Watch the demo on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I briefly deployed the frontend, but took it down: without the local API and model behind it, it couldn't show the real experience, and I'd rather show something that actually works.&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/itsnazaretdev" rel="noopener noreferrer"&gt;
        itsnazaretdev
      &lt;/a&gt; / &lt;a href="https://github.com/itsnazaretdev/menuMind" rel="noopener noreferrer"&gt;
        menuMind
      &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;MenuMind&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Turn a restaurant's PDF menu into a bilingual (Spanish/English) digital menu that customers open by scanning a QR code, using &lt;strong&gt;Gemma 3 4B&lt;/strong&gt; running locally through &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;MenuMind is built for small restaurants, cafés and bars that still rely on printed menus and need to offer them in more than one language.&lt;/p&gt;
&lt;p&gt;The PDF is only the way in: Gemma reads it so the owner doesn't have to retype every dish. What customers get is not the PDF but a structured menu that can be translated and read comfortably on a phone.&lt;/p&gt;
&lt;p&gt;The owner-facing interface is in Spanish, because it's designed first for restaurants in Spain. The public menu is bilingual for their customers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12" rel="nofollow"&gt;Hacktoberfest Open-Source AI Challenge, Week 2: Side Hustle&lt;/a&gt;. The project currently runs locally; there is no public deployment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload&lt;/strong&gt; the menu as a PDF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt;: each…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/itsnazaretdev/menuMind" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The project is a pnpm workspaces monorepo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apps/api&lt;/code&gt;: Fastify backend. PDF processing, calls to Gemma through Ollama, translation, and the menu endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apps/web&lt;/code&gt;: Next.js frontend. The upload and review screen, plus the public menu page with the language toggle and QR code.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;packages/database&lt;/code&gt;: Prisma schema and client, backed by SQLite (restaurants, menus and menu items with their English translations).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The README has the setup steps if you want to run it yourself: pull &lt;code&gt;gemma3:4b&lt;/code&gt; with Ollama, install with pnpm, create the database and start both apps with &lt;code&gt;pnpm dev&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The model:&lt;/strong&gt; &lt;a href="https://ollama.com/library/gemma3" rel="noopener noreferrer"&gt;Gemma 3 4B&lt;/a&gt; (&lt;code&gt;gemma3:4b&lt;/code&gt;), an open-weight model from Google, running locally through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. I picked it because it's multimodal, so it can &lt;em&gt;look&lt;/em&gt; at a menu page, and small enough to run on my laptop. The same model does both jobs in MenuMind: reading the menu and translating it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading the menu.&lt;/strong&gt; Restaurant menus are hard to parse: two columns, dish names that wrap across lines, prices floating on the right, section titles in decorative fonts, an allergen table at the end. Plain text extraction loses most of that structure. So for each page, the API sends Gemma two things together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The page &lt;strong&gt;rendered as an image&lt;/strong&gt; (with &lt;code&gt;pdfjs-dist&lt;/code&gt; and &lt;code&gt;@napi-rs/canvas&lt;/code&gt;), so the model can see the layout.&lt;/li&gt;
&lt;li&gt;The page's &lt;strong&gt;text layer&lt;/strong&gt;, extracted with &lt;code&gt;pdfjs-dist&lt;/code&gt; and rebuilt into lines by grouping text fragments by their position on the page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompt asks Gemma to use the image to understand where each dish starts and ends, and the text to get the words right. It also has to classify the page (&lt;code&gt;menu&lt;/code&gt;, &lt;code&gt;allergens&lt;/code&gt; or &lt;code&gt;other&lt;/code&gt;), join dish names that span several lines, assign each dish to the last section title above it, and use &lt;code&gt;null&lt;/code&gt; instead of guessing when a price isn't clear. Responses come back as JSON (Ollama's &lt;code&gt;format: "json"&lt;/code&gt;), with temperature 0 and a fixed seed so results are as repeatable as possible, and the API validates the shape before using it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Translating.&lt;/strong&gt; After the owner confirms the Spanish version, the dishes go back to Gemma in small batches of three, with instructions to translate dish names and categories naturally, keep proper and place names, and never touch the prices. Small batches turned out to matter: with bigger ones, a 4B model would sometimes skip items or leave a name half in Spanish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rest of the stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fastify&lt;/strong&gt; for the API, with &lt;code&gt;@fastify/multipart&lt;/code&gt; for uploads (PDF only, size-limited, and checked for a real PDF header).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prisma + SQLite&lt;/strong&gt; to store restaurants, menus and items. Each item keeps its Spanish name and category plus their English versions, and only confirmed menus are served publicly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js, React, TypeScript and Tailwind CSS&lt;/strong&gt; for the interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;qrcode.react&lt;/strong&gt; to generate the QR code on the public menu page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't do yet.&lt;/strong&gt; Being honest about the gaps, the two that matter most come straight from the question above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Photos as input.&lt;/strong&gt; Many small bars don't have a PDF at all, just a printed menu or a chalkboard. A photo taken with a phone is the more realistic way in, and since Gemma already reads each page as an image, it's the first thing I want to add.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editing after publishing.&lt;/strong&gt; Right now, changing a price means uploading the menu again. Editing dishes directly on the saved menu is what would make "update it without redoing documents" fully true.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A proper printable QR.&lt;/strong&gt; Right now the QR code appears at the bottom of the public menu page; a "download / print QR" button would make it easier to put on the tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beyond that, MenuMind works best with PDFs that have selectable text, translation is Spanish to English only, the owner interface is Spanish only (internationalizing it would open the tool to restaurants outside Spain), and everything runs locally, so a restaurant can't use it yet without someone running it for them.&lt;/p&gt;

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

&lt;p&gt;For a project like this, an open-weight model changed what was realistic for me to build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Experimenting cost me nothing but time.&lt;/strong&gt; Getting extraction right took a lot of iterations: rewriting prompts, re-running the same menu again and again, trying different batch sizes for translation. With a local model, that loop has no per-request bill and no rate limit, so I could iterate as much as the problem needed. For a student, that's the difference between trying an idea and not trying it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A small model is enough for a focused job.&lt;/strong&gt; MenuMind doesn't need a giant general-purpose model. It needs one that can read a menu page and translate dish names well. A 4B multimodal model running through Ollama does that on ordinary hardware, which makes the long-term cost of the product something I can reason about, instead of a variable tied to someone else's pricing page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The restaurant's data stays where it's processed.&lt;/strong&gt; Menus aren't secret, but they are a business's working documents. In MenuMind, the PDF, the extracted dishes and the translations are processed by the model running on the same machine as the app, not sent to a third-party AI API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can see and control the whole pipeline.&lt;/strong&gt; Every piece, from pdf.js to Prisma to the model itself, is open. When extraction failed on a page, I could look at exactly what text and image Gemma received, change how lines were rebuilt, and try again. Nothing in the chain was a black box I had to work around.&lt;/p&gt;

&lt;p&gt;To be fair, open isn't automatically free or better: running models still needs hardware, a bigger hosted model might extract some menus more accurately, and a 4B model needs careful prompting and validation. But open models made it possible for one student to build the whole thing, end to end, and own every part of it.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma&lt;/strong&gt;: MenuMind uses Gemma 3 4B, run locally with Ollama, for both menu extraction (vision + text) and translation.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A diary that writes itself after your walk (Gemma running on my laptop)</title>
      <dc:creator>Nazaret</dc:creator>
      <pubDate>Sun, 11 Oct 2026 20:00:26 +0000</pubDate>
      <link>https://dev.to/itsnazaretdev/a-diary-that-writes-itself-after-your-walk-gemma-running-on-my-laptop-314c</link>
      <guid>https://dev.to/itsnazaretdev/a-diary-that-writes-itself-after-your-walk-gemma-running-on-my-laptop-314c</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;Field Diary is for people who love a walk but forget what they noticed by the time they get home.&lt;/p&gt;

&lt;p&gt;Outdoors, you only jot down a few words for each thing you see, smell or hear. At home, an open-weight model running on my laptop turns those scraps into a diary entry that sounds like me.&lt;/p&gt;

&lt;p&gt;The screen is the shortest part of the walk. Each note is one short line in my phone's notes app and takes a few seconds. The writing happens later, when I am sitting down anyway.&lt;/p&gt;

&lt;p&gt;I made it for myself. I am a second-year web development student in Spain, and I wanted to keep a record of my walks without turning them into more screen time.&lt;/p&gt;

&lt;p&gt;Outdoors I only use the Notes app on my Xiaomi. At home I paste the notes into the page, press one button, and the model on my laptop does the writing. For the tests in this post I ran the same thing from the terminal instead, reading the notes from a text file.&lt;/p&gt;

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

&lt;p&gt;The video is a recording of the web app on my laptop. The five notes in it are the ones I wrote at the park, copied from my phone.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/d6B4VhQ_i-M" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/d6B4VhQ_i-M" rel="noopener noreferrer"&gt;Watch the demo on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The notes can be in any language; the entries come out in English. I jot mine down in English.&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/itsnazaretdev" rel="noopener noreferrer"&gt;
        itsnazaretdev
      &lt;/a&gt; / &lt;a href="https://github.com/itsnazaretdev/hackaton-touchGrass" rel="noopener noreferrer"&gt;
        hackaton-touchGrass
      &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;Field Diary&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Jot down quick notes while you walk. When you get home, an open-weight model running on your own computer turns them into a diary entry in your voice. No accounts, no API keys, and after the model is downloaded, no internet: your walks never leave your machine.&lt;/p&gt;
&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05" rel="nofollow"&gt;Hacktoberfest Open-Source AI Challenge, Week 1: Touch Grass&lt;/a&gt;. The screen is the shortest part of the walk: outdoors you only type a short line for each thing you see, smell or hear, and the writing happens later, at home.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How a walk works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Outdoors:&lt;/strong&gt; jot your notes in your phone's notes app, one short line per thing you see, smell or hear. No signal needed. Write them in any language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At home:&lt;/strong&gt; paste the notes into the page and press &lt;strong&gt;Write entry&lt;/strong&gt;. The model runs on your computer, so the writing always happens there.&lt;/li&gt;
&lt;li&gt;The entry…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/itsnazaretdev/hackaton-touchGrass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma 3 (4B), Google's open-weight model, served locally by &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; Python standard library only. A tiny web server plus one &lt;code&gt;index.html&lt;/code&gt; with plain JavaScript. No frameworks, no packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt:&lt;/strong&gt; the model is told to use &lt;em&gt;only&lt;/em&gt; what is in my notes and not to invent animals, places or events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My voice:&lt;/strong&gt; a file called &lt;code&gt;style.md&lt;/code&gt; holds a few of my own texts. They go into the prompt as examples, so the model imitates my tone. There is no training and no fine-tuning: to change the style I edit a text file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output:&lt;/strong&gt; each entry is saved as Markdown with frontmatter, ready for my Astro blog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model selector:&lt;/strong&gt; the page lists the models installed in Ollama, so I can swap them with one click.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Two models, same notes
&lt;/h3&gt;

&lt;p&gt;I ran the same five notes and the same prompt through two models. My five notes are in the "Taking it outside" section below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;qwen2.5:3b&lt;/code&gt;&lt;/strong&gt; wrote one tidy paragraph that reads like a summary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Today, I ventured to María Zambrano and was greeted by the vibrant scene of kids playing football. The sky was clear, with no clouds in sight, and the temperature was just right, making it perfect for a stroll. The days are indeed getting shorter, which is a melancholic thought as it means the fading light at dusk has me yearning for longer nights. People strolled with their furry companions, adding a playful touch to the serene park atmosphere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;gemma3:4b&lt;/code&gt;&lt;/strong&gt; wrote two paragraphs with more rhythm and more feeling:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Parque María Zambrano was buzzing today. A group of kids were really getting into a football game, the shouts and the thud of the ball against the ground a constant rhythm. The sky was just… blue. Completely blue, not a single cloud to be seen. It was warm, a really nice warmth, and I could feel the sun on my skin.&lt;/p&gt;

&lt;p&gt;It feels like the days are shrinking. They're getting shorter and shorter, and I noticed it especially here, with the light already starting to slant. I saw people walking, mostly with dogs – a few Labradors and a golden retriever, pulling gently on their leashes. There was a gentle, steady flow of people, just enjoying the afternoon.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I preferred Gemma because it sounds more like me.&lt;/p&gt;

&lt;p&gt;Both models added details that were not in my notes. Gemma named "a few Labradors and a golden retriever" and added "the sun on my skin" and "the light already starting to slant", when my notes only said people were walking dogs and the days were getting short. Qwen turned the shortening days into "a melancholic thought" that has it "yearning for longer nights", which is not what I wrote. My prompt says to use only the notes, so that rule reduces the invention but does not remove it, and I read every entry before keeping it.&lt;/p&gt;

&lt;p&gt;I also learned that the model can only be as specific as I am. With short notes, the entry was generic. When I wrote down smells, sounds and how I felt, the entry got much better.&lt;/p&gt;

&lt;h3&gt;
  
  
  What didn't work
&lt;/h3&gt;

&lt;p&gt;After the Python version worked, I tried to make it easier to try by moving it to Astro, with Gemma running inside the browser (WebLLM). It worked in Chrome on my Mac. A friend opened it on her iPhone, the model download reached 100%, and then nothing appeared. I did not have time to find out why, so I decided not to ship it.&lt;/p&gt;

&lt;p&gt;So this submission is the Ollama version, which runs on a laptop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taking it outside
&lt;/h3&gt;

&lt;p&gt;I went yesterday to the park on the south side of my city and wrote my notes in my phone's notes app, one short line for each thing I noticed. These are my five notes, exactly as I typed them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;there are a group of kids playing football
the sky doesn't have any clouds
the temperature is nice and warm
the days are getting short every day
people is walking with their dogs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typing on the phone didn't bother me. It took a few seconds per line and I put it away straight after.&lt;/p&gt;

&lt;p&gt;Still, writing on paper is always a pleasure, and something traditional adds authenticity that a screen doesn't. That is the one thing I'd change: a version where you could photograph a handwritten page and have the model read it would suit this idea even better.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; A diary is about as personal as data gets: places, routines, how I felt. With an open model my notes and entries stay on my laptop. The only time it needs the internet is to download the model once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account, no cost.&lt;/strong&gt; There is no API key and no bill, so anyone can run it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models.&lt;/strong&gt; Switching models is one click, and the comparison above shows why that matters: each model has its own voice, and I got to choose the one that sounds like me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control over the style.&lt;/strong&gt; I shaped the tone by editing a plain text file, not by asking a company to change its model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed API would have been easier to set up. But I could not have kept my diary off someone else's server, and I could not have chosen a voice.&lt;/p&gt;

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

&lt;p&gt;I built this project with the help of Claude, an AI assistant. It helped me write the Python code and the page, and I made the decisions about the idea, the style, which model to use and what to ship. I also tested it myself on a real walk and wrote the notes quoted in this post.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3 (4B) runs locally through Ollama and writes every entry.&lt;/p&gt;

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