<?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: Sai Sri Madhav K</title>
    <description>The latest articles on DEV Community by Sai Sri Madhav K (@madhav__k).</description>
    <link>https://dev.to/madhav__k</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%2F4161192%2F70e000b6-24b4-4cc4-a75e-8de62ddb9074.png</url>
      <title>DEV Community: Sai Sri Madhav K</title>
      <link>https://dev.to/madhav__k</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/madhav__k"/>
    <language>en</language>
    <item>
      <title>Ofrenda: a offline CLI that helps you remember someone, without inventing a word</title>
      <dc:creator>Sai Sri Madhav K</dc:creator>
      <pubDate>Thu, 29 Oct 2026 10:35:50 +0000</pubDate>
      <link>https://dev.to/madhav__k/ofrenda-a-offline-cli-that-helps-you-remember-someone-without-inventing-a-word-4bom</link>
      <guid>https://dev.to/madhav__k/ofrenda-a-offline-cli-that-helps-you-remember-someone-without-inventing-a-word-4bom</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;Ofrenda is a small command-line tool that helps you remember someone. You run &lt;code&gt;ofrenda new&lt;/code&gt;, and a local model asks you quiet questions, one at a time: what they liked to eat, a song they hummed, something they always said, a place that was theirs. When you finish, it writes two plain Markdown files: a short remembrance, and a checklist of things you might put on an ofrenda.&lt;/p&gt;

&lt;p&gt;I read "Ghost in the Machine" as the person who is no longer in the room, or no longer in your life, but still shows up in small habits and phrases. The idea started with Día de los Muertos, which treats memory as something to celebrate. But the tool isn't only for people who have died. It works just as well for a childhood friend you lost touch with.&lt;/p&gt;

&lt;p&gt;I held myself to one rule: &lt;strong&gt;the model must never invent anything.&lt;/strong&gt; The remembrance can only rearrange what you actually told it. If you give it little, the file is short. I would rather it say too little than make things up.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb98q56lusql4pvo9sut3.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%2Fb98q56lusql4pvo9sut3.png" alt=" " width="800" height="740"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the format, using a fictional friend (I wrote this example by hand to show the output; the person isn't real):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ofrenda new

Who are you remembering: Karthik
How did you know them: my childhood friend

What did Karthik love to eat?
&amp;gt; Mirchi bajji from the cart outside school. He'd buy two plates and always give me the bigger one.

[... more questions ...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The resulting &lt;code&gt;remembrance.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Karthik

Karthik and I played cricket on the ground behind our colony until the
streetlights came on. Before every ball, he tapped his bat on the ground twice.

Outside school there was a cart that sold mirchi bajji. He would buy two plates
and always give me the bigger one. He hummed "Kal Ho Naa Ho" badly on purpose,
just to annoy me. He used to say, "Chill maar, bhai."

The cracked tennis-ball bat with his initials carved into it is still with me.

We lost touch after college. Last year I found out he had moved abroad.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every sentence there traces back to something the user typed.&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/madhav-1204" rel="noopener noreferrer"&gt;
        madhav-1204
      &lt;/a&gt; / &lt;a href="https://github.com/madhav-1204/Ofrenda-CLI" rel="noopener noreferrer"&gt;
        Ofrenda-CLI
      &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;ofrenda&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A small offline command-line tool that helps you remember someone.&lt;/p&gt;

&lt;p&gt;You answer a few quiet questions about a person — what they cooked, a song they hummed, a phrase they always said — and the tool writes two plain Markdown files: a short remembrance and a checklist of things you might put on an ofrenda. Everything runs on a local model through Ollama, so nothing leaves your machine.&lt;/p&gt;

&lt;p&gt;I made this during Hacktoberfest 2026, Week 4: Ghost in the Machine. The theme was about honoring the past, and Día de los Muertos felt like the right frame — a celebration of memory, not loss.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install and run&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;1. Install Ollama&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Download from &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;ollama.com&lt;/a&gt; and make sure it's running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pull a model&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma3:4b&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Any other small model works too. You can change it in the config (see below).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Install ofrenda&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/madhav-1204/Ofrenda-CLI.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; ofrenda-cli
pip&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/madhav-1204/Ofrenda-CLI" 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, running locally through Ollama. The default is &lt;code&gt;gemma3:4b&lt;/code&gt;, and you can change it in &lt;code&gt;~/.ofrenda.toml&lt;/code&gt; or with &lt;code&gt;--model&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Python with a small CLI. Output is plain Markdown and JSON in a local folder. No database, no API keys, no telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts:&lt;/strong&gt; They live in a &lt;code&gt;prompts/&lt;/code&gt; folder as plain text files, so anyone can read and edit them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interview:&lt;/strong&gt; The model sees the conversation so far and asks one follow-up at a time, so each question reacts to your last answer instead of following a fixed script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing step:&lt;/strong&gt; The remembrance and checklist are built from your answers only, not from the interviewer's own comments. I made this change after noticing in an early example that something the model said out loud ended up in the output as if the user had said it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; pytest with a mocked model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What didn't go smoothly: small models sometimes ask two questions at once even when told not to, and I left that in the README as a known limitation. Prompts are written and tested in English only. There's a &lt;code&gt;language&lt;/code&gt; setting in the config, but I haven't verified other languages.&lt;/p&gt;

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

&lt;p&gt;Stories about family and friends are some of the most private things people have: names, how someone died, what they were like at home. I didn't want any of that going to a cloud API.&lt;/p&gt;

&lt;p&gt;An open-weight model made these things possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It runs offline.&lt;/strong&gt; Once the model is downloaded, the tool works with Wi-Fi off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing leaves the machine.&lt;/strong&gt; There's no account, no key, and no server where your memories could be read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can inspect and change it.&lt;/strong&gt; The prompts are plain text, so you can see exactly what the model is told.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can swap the model.&lt;/strong&gt; Use a smaller one on an old laptop or a bigger one if you have the hardware.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It costs nothing to run.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: the whole tool runs on a local Gemma model through Ollama.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>sloth-sort: a lazy file tidier that runs on a local Gemma model</title>
      <dc:creator>Sai Sri Madhav K</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:17:13 +0000</pubDate>
      <link>https://dev.to/madhav__k/sloth-sort-a-lazy-file-tidier-that-runs-on-a-local-gemma-model-3573</link>
      <guid>https://dev.to/madhav__k/sloth-sort-a-lazy-file-tidier-that-runs-on-a-local-gemma-model-3573</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My Downloads folder is a graveyard. Invoices called &lt;code&gt;Document (3) final FINAL.txt&lt;/code&gt;, installers I ran once and forgot, notes named &lt;code&gt;scan0007&lt;/code&gt;. Every weekend I promise myself I'll clean it up, and every weekend I don't.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;sloth-sort&lt;/strong&gt;, a small command-line tool that does the cleaning for me. Point it at a folder and it will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read each file's name and, when possible, the first bit of its content.&lt;/li&gt;
&lt;li&gt;Ask a local AI model for a clean file name and a category folder (Invoices, Study, Photos, Installers, Misc).&lt;/li&gt;
&lt;li&gt;Show me the plan as a table and wait. Nothing moves until I confirm.&lt;/li&gt;
&lt;li&gt;Move the files and save an undo log, so one command puts everything back.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It never deletes anything, never overwrites a file, and never touches anything outside the folder you give it. All of it runs on my own laptop.&lt;/p&gt;

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

&lt;p&gt;A dry run on my test 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%2F0xko29nzvki8b1f83l7l.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%2F0xko29nzvki8b1f83l7l.png" alt=" " width="800" height="450"&gt;&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/madhav-1204" rel="noopener noreferrer"&gt;
        madhav-1204
      &lt;/a&gt; / &lt;a href="https://github.com/madhav-1204/Sloth-Sort" rel="noopener noreferrer"&gt;
        Sloth-Sort
      &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;sloth-sort&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A small command-line tool that tidies a messy folder (like your Downloads directory) using a local open-weight model, so you never have to sort files by hand.&lt;/p&gt;
&lt;p&gt;It reads the first few paragraphs of readable files (or just the file name and extension for binaries and images), asks a local model running on your machine to suggest a clean filename and a folder category, shows you a dry-run plan, and moves the files only when you tell it to.&lt;/p&gt;
&lt;p&gt;Every operation is logged and can be completely reverted with one command.&lt;/p&gt;
&lt;p&gt;Built for the DEV Hacktoberfest Open-Source AI Challenge (Week 3: Slow and Steady).&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why a local model?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Most file organizers either rely on hardcoded extension rules (dumping all PDFs into one folder regardless of whether they are tax returns, research papers, or appliance manuals) or send file names and contents to third-party cloud APIs.&lt;/p&gt;
&lt;p&gt;sloth-sort runs entirely on…&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/madhav-1204/Sloth-Sort" 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;Stack:&lt;/strong&gt; Python, &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; for local inference, and &lt;strong&gt;Gemma 3&lt;/strong&gt; as the model. I tested with &lt;code&gt;gemma3:1b&lt;/code&gt; and &lt;code&gt;gemma3:4b&lt;/code&gt;. The model is just a config value, so anything Ollama can run will work.&lt;/p&gt;

&lt;p&gt;The pipeline is deliberately boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scanner:&lt;/strong&gt; lists files and skips hidden files, partial downloads (&lt;code&gt;.crdownload&lt;/code&gt;, &lt;code&gt;.part&lt;/code&gt;) and anything modified in the last few minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reader:&lt;/strong&gt; takes the first ~1000 characters of text-like files (txt, md, pdf, docx, csv). For binaries and images, the model only sees the name and extension.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model call:&lt;/strong&gt; asks Gemma for strict JSON with &lt;code&gt;new_name&lt;/code&gt; and &lt;code&gt;folder&lt;/code&gt;. The allowed categories are a fixed list, so the model can't invent 40 different folders. Bad JSON gets one retry, then the file is skipped and left alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planner:&lt;/strong&gt; builds the table and saves it to &lt;code&gt;plan.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mover:&lt;/strong&gt; applies the plan, adds a number when a name collides, and writes &lt;code&gt;undo_log.json&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sloth-sort plan &amp;lt;folder&amp;gt;    # dry run, nothing moves
sloth-sort apply            # apply the last plan after confirmation
sloth-sort undo             # put everything back
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I used Antigravity as my coding agent and wrote a detailed spec first: safety rules, exact commands, and a list of things I did &lt;em&gt;not&lt;/em&gt; want (no dashboard, no extra features).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the small model got wrong:&lt;/strong&gt; in my first run, &lt;code&gt;setup_app_installer.exe&lt;/code&gt; was renamed to &lt;code&gt;installer.exe&lt;/code&gt;. For a binary, the model only has the file name to go on, so a rename just throws information away. I changed the rule: binaries and images get a category folder but keep their original name. A small model is good at sorting, but it shouldn't rewrite names it can't verify.&lt;/p&gt;

&lt;p&gt;To measure accuracy instead of eyeballing it, I built a test folder of 40 ugly files and wrote the correct category for each one before running anything.&lt;/p&gt;

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

&lt;p&gt;A file tidier sees everything: invoices, ID scans, personal notes, whatever lands in Downloads. I didn't want to upload any of that to a server I don't control just to rename a file.&lt;/p&gt;

&lt;p&gt;An open-weight model running locally gave me things a closed API wouldn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy by default.&lt;/strong&gt; File contents never leave my machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline.&lt;/strong&gt; After the one-time model download, no network is involved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No running cost.&lt;/strong&gt; Sorting 500 files costs the same as sorting 5: no money at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is swappable.&lt;/strong&gt; Moving from &lt;code&gt;gemma3:1b&lt;/code&gt; to &lt;code&gt;gemma3:4b&lt;/code&gt; was a one-line config change, so I could measure speed against quality on my own hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest tradeoff is quality. The 1B model got confused by installers and receipts without explicit headers, dumping &lt;code&gt;.dmg&lt;/code&gt; files and coffee receipts into Misc, while the 4B model correctly recognized them as Installers and Invoices. Both models struggled with informal household notes: a grocery list and an apple pie recipe went to Misc with the 1B model and to the formal Documents category with the 4B model. I didn't test a large cloud model, but I'd expect one to do better at telling casual notes from business documents, and at reading tabular CSV data to tell bank transactions from general reports.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Reply Desk: Review Replies for Small Businesses, Written Offline by Gemma 3 1B</title>
      <dc:creator>Sai Sri Madhav K</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:04:14 +0000</pubDate>
      <link>https://dev.to/madhav__k/reply-desk-review-replies-for-small-businesses-written-offline-by-gemma-3-1b-b42</link>
      <guid>https://dev.to/madhav__k/reply-desk-review-replies-for-small-businesses-written-offline-by-gemma-3-1b-b42</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;Reply Desk is a small local web app that writes replies to customer reviews. You paste a review, optionally pick a star rating, and get a ready-to-post reply in your own voice, which you can edit and copy.&lt;/p&gt;

&lt;p&gt;The person who would pay for it is a small business owner: a café, a salon, a repair shop, a dental clinic. They get reviews on Google and elsewhere, and they know they should reply, but writing a calm, specific answer to an angry one-star review at the end of a long day is hard. Review management tools exist, but they charge monthly fees that a small shop doesn't want to pay.&lt;/p&gt;

&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detects whether the review is positive, neutral, or negative (you can override it)&lt;/li&gt;
&lt;li&gt;Writes a reply in a tone you choose (friendly, professional, apologetic) at a length you choose (short or medium)&lt;/li&gt;
&lt;li&gt;Uses a saved &lt;strong&gt;Business Profile&lt;/strong&gt;: business name, owner name, sign-off, tone notes, and a &lt;strong&gt;"things to never say"&lt;/strong&gt; list (for example, never promise refunds)&lt;/li&gt;
&lt;li&gt;Keeps a searchable history of past reviews and replies&lt;/li&gt;
&lt;li&gt;Runs fully offline with no accounts, no API keys and no tracking&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;It uses a simple two-pane layout, with the review on the left and the editable reply on the right. I deliberately made it look like ordinary software (flat, quiet, one accent color) because I wanted it to feel like a tool you'd use every day, not a flashy AI demo.&lt;/p&gt;

&lt;p&gt;![landing page of reply desk]tps://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/rtp0rt2a23i3ifd3vbkb.png)&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%2F73d01ya7hj7y6xnsk6uf.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%2F73d01ya7hj7y6xnsk6uf.png" alt="Business Profile Page" width="800" height="420"&gt;&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/madhav-1204" rel="noopener noreferrer"&gt;
        madhav-1204
      &lt;/a&gt; / &lt;a href="https://github.com/madhav-1204/Reply-Desk" rel="noopener noreferrer"&gt;
        Reply-Desk
      &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;Reply Desk&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Paste a customer review. Get a ready-to-post reply in your voice. Runs on your own computer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reply Desk is a privacy-first, local review reply generator designed for small business owners—cafes, hair salons, auto repair shops, dental clinics, and local stores—who dread writing review replies or don't want to pay monthly SaaS fees.&lt;/p&gt;
&lt;p&gt;Built from scratch for the &lt;strong&gt;DEV Hacktoberfest Open-Source AI Challenge Week 2 (Theme: Side Hustle)&lt;/strong&gt;, powered by open-source AI running completely on your local machine using &lt;strong&gt;Ollama&lt;/strong&gt; and &lt;strong&gt;Gemma 3 1B&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/madhav-1204/Reply-Desk/screenshot.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmadhav-1204%2FReply-Desk%2FHEAD%2Fscreenshot.jpg" alt="Reply Desk Interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Key Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Split-Screen Utility Layout&lt;/strong&gt;: Clean two-pane interface—customer review and controls on the left, live generated reply on the right.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Detected Sentiment&lt;/strong&gt;: Automatically classifies review sentiment as &lt;strong&gt;Positive&lt;/strong&gt;, &lt;strong&gt;Neutral&lt;/strong&gt;, or &lt;strong&gt;Negative&lt;/strong&gt;, with full manual override.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Star Rating Aware&lt;/strong&gt;: Select 1 to 5 stars as context hints for tone and sentiment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tone &amp;amp; Length Customization&lt;/strong&gt;: Choose between…&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/madhav-1204/Reply-Desk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;To run it you need Node.js and Ollama:&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:1b
git clone https://github.com/madhav-1204/Reply-Desk.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Reply-Desk
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://localhost:3000&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Gemma 3 1B (open weights) running locally through Ollama. The whole app talks only to &lt;code&gt;localhost:11434&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Node.js and Express on the backend, plain HTML/CSS/JS on the frontend, and a local JSON file for the profile and history. Replies stream into the box as they are generated.&lt;/p&gt;

&lt;p&gt;I picked the 1B model on purpose. It's about 800 MB and runs on an ordinary laptop, which is realistic for a small business owner. The downside is that a model this small is easy to confuse, so most of the work went into the pipeline around it. Each reply goes through three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment classification.&lt;/strong&gt; A very short few-shot prompt at low temperature that returns a single word: positive, neutral or negative. The star rating is used as a hint and as a fallback if the model's output is unclear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constrained reply generation.&lt;/strong&gt; The prompt combines the business profile, tone, length and sentiment with a few matched examples. It also carries hard rules: only mention details that appear in the review, never promise refunds or discounts, never admit legal fault. Negative reviews follow a fixed structure of thanking the customer, apologizing, addressing the specific complaint, and inviting them to continue offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-processing.&lt;/strong&gt; The code removes preambles like "Here is your reply:", strips quotes and markdown, enforces the sentence limit, and adds the owner's sign-off.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What I learned: with a small model, &lt;strong&gt;a good prompt and a clean post-processing step matter more than the raw model.&lt;/strong&gt; &lt;/p&gt;

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

&lt;p&gt;Reviews are not as harmless as they look. They mention customer names, staff, bills and disputes. A closed API would mean sending all of that to someone else's server for every reply. With an open-weight model running locally, none of it leaves the machine.&lt;/p&gt;

&lt;p&gt;It also changes the economics. Tools in this space charge small businesses a monthly fee, and API-based apps charge per request. With a local model, a reply costs nothing, so a one-person shop can use it as much as it likes with no subscription, no quota and no billing surprise. It works with the internet down too.&lt;/p&gt;

&lt;p&gt;Finally, open weights let me control the behavior. I could tune the prompts and rules for exactly this task, and the model name is a single config value, so a shop with a better computer can swap in a larger Gemma by changing one line. A closed API gives you none of that.&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;: the entire app is built around Gemma 3 1B running locally through Ollama.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Sit Spot: a local journal for ten minutes outside</title>
      <dc:creator>Sai Sri Madhav K</dc:creator>
      <pubDate>Sun, 11 Oct 2026 13:30:26 +0000</pubDate>
      <link>https://dev.to/madhav__k/sit-spot-a-local-journal-for-ten-minutes-outside-2og6</link>
      <guid>https://dev.to/madhav__k/sit-spot-a-local-journal-for-ten-minutes-outside-2og6</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;Sit Spot is a small journal for short sit-outside sessions. You pick how long you'll be out (5, 10, 20 minutes, or your own number). The app gives you one short prompt and then gets out of the way: the next screen says "phone away" and has a single button, "I'm back".&lt;/p&gt;

&lt;p&gt;When you return, you type rough notes. A few lines, typos and fragments are fine. A local model tidies them into a short journal entry. Your raw notes and the tidy version sit side by side, and you can edit either one or keep only the raw notes.&lt;/p&gt;

&lt;p&gt;The screen is meant to be the shortest part of the experience, so the app measures it. Every entry shows how long you were outside and roughly how long you spent on screen. That comparison is the number I care about.&lt;/p&gt;

&lt;p&gt;It's for anyone who wants a small, repeatable reason to go outside and pay attention, without an app competing for that attention. There are no accounts, no streaks and no notifications.&lt;/p&gt;

&lt;p&gt;There's also a "What keeps showing up" button. It asks the model to look across recent entries for patterns and to cite the date of every entry it draws on.&lt;/p&gt;

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

&lt;p&gt;The video shows one full session, from picking a length to a saved entry. it's 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/madhav-1204" rel="noopener noreferrer"&gt;
        madhav-1204
      &lt;/a&gt; / &lt;a href="https://github.com/madhav-1204/Sit-Spot" rel="noopener noreferrer"&gt;
        Sit-Spot
      &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;Sit Spot&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A local-first journal for short sit-outside sessions. An open-weight Gemma model running locally through Ollama gives you one brief prompt before you step outside, and tidies your rough notes when you return.&lt;/p&gt;
&lt;p&gt;Built during &lt;strong&gt;Hacktoberfest Week 1 (Oct 5–11, 2026)&lt;/strong&gt; for the &lt;em&gt;"Touch Grass"&lt;/em&gt; challenge. The screen is designed to be the shortest part of the experience.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup in 4 Commands&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;git clone https://github.com/madhav-1204/Sit-Spot.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; sit-spot
pip install -r requirements.txt
python app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then open your browser to &lt;a href="http://127.0.0.1:5000" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:5000&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(To populate sample entries for demonstration, run: &lt;code&gt;python app.py --demo&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Local AI Model Configuration&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Sit Spot uses an open-weight model running entirely on your local machine via &lt;a href="https://ollama.ai" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. No cloud APIs, no tracking, and no internet access required at runtime.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Ollama from &lt;a href="https://ollama.ai" rel="nofollow noopener noreferrer"&gt;ollama.ai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pull the default Gemma model
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma3:1b&lt;/pre&gt;

&lt;/div&gt;
&lt;em&gt;(Or use &lt;code&gt;gemma3:4b&lt;/code&gt; / &lt;code&gt;gemma2:2b&lt;/code&gt; by setting the environment variable &lt;code&gt;SITSPOT_MODEL&lt;/code&gt;)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If…&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/madhav-1204/Sit-Spot" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The app is Python, Flask, SQLite (standard library) and &lt;code&gt;requests&lt;/code&gt;. The pages are server-rendered HTML with one CSS file. There's no JavaScript framework, no CDN and no web fonts. The only network calls go to &lt;code&gt;localhost:11434&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The AI is &lt;strong&gt;Gemma 3 1B&lt;/strong&gt; (&lt;code&gt;gemma3:1b&lt;/code&gt;, about 806 MB) running locally through Ollama. The model name comes from an environment variable, so swapping models is a one-line change.&lt;/p&gt;

&lt;p&gt;The model does three jobs, and each has its own prompt file in &lt;code&gt;prompts/&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Session prompt:&lt;/strong&gt; one instruction, 25 words at most, based on the time of day, the month and the last entry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidy:&lt;/strong&gt; 3 to 4 first-person sentences from the rough notes, plus one follow-up question for next time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look back:&lt;/strong&gt; patterns across recent entries, with dates cited.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If Ollama isn't running, or a call takes longer than 60 seconds, the app saves the raw notes and uses prompts from a fallback file. It's still useful without the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What went wrong.&lt;/strong&gt; My first run of the tidy step used five test entries. The 1B model made up sensory details that nobody had written (it added "felt cool beneath my fingertips" and "lilac flowers"). It also folded the follow-up question into the body paragraph. I fixed this by adding a one-shot example and explicit negative constraints to the prompt, and code that pulls the question out separately.&lt;/p&gt;

&lt;p&gt;The second round was better but still wrong in a funny way. A note that said "Rain stopped about 10 minutes ago" came back as "I stopped the rain about ten minutes ago." I added a rule that natural events must never be attributed to the observer.&lt;/p&gt;

&lt;p&gt;The results improved a lot but are not perfect. That's why the raw notes always appear next to the tidy version, with a line telling you to check one against the other. Every break and fix is in the dated log in &lt;code&gt;NOTES.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I used Antigravity as the coding agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking It Outside
&lt;/h2&gt;

&lt;p&gt;account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;where you sat, and for how many minutes&lt;/li&gt;
&lt;li&gt;the exact prompt the app gave you&lt;/li&gt;
&lt;li&gt;your raw notes, and what the tidy version kept or got wrong&lt;/li&gt;
&lt;li&gt;the outside and screen times the app recorded&lt;/li&gt;
&lt;li&gt;one honest thing you noticed, good or bad]]&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A journal is personal. It records where you sit, what you notice and when you go out, which adds up to a picture of someone's routine. With a local open-weight model, that data never leaves the laptop. I didn't have to choose between a useful tidy-up step and keeping my notes private.&lt;/p&gt;

&lt;p&gt;Cost was the second thing. Rewriting a note costs nothing per call, so I could keep running the same entries through the model while I fixed the prompts, without watching a bill.&lt;/p&gt;

&lt;p&gt;Control was the third. The model is one environment variable, and the prompts are plain text files. When the model wrote "I stopped the rain," the fix was an edit to a text file and a re-run.&lt;/p&gt;

&lt;p&gt;It also needs no internet at all, so the whole thing works with Wi-Fi off.&lt;/p&gt;

&lt;p&gt;The trade-off is real. A larger hosted model would almost certainly have made fewer of the mistakes in my log. I accepted weaker output in exchange for privacy, zero cost and no dependence on a connection, and for a personal journal I think that's the right choice. The raw-notes-first design is what makes it safe to accept.&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 1B, run locally through Ollama, is the only AI in the project. It writes the session prompts, tidies the notes and summarises patterns, with no cloud API involved.&lt;/p&gt;

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