<?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: Dipti Choubey</title>
    <description>The latest articles on DEV Community by Dipti Choubey (@diptichoubey24).</description>
    <link>https://dev.to/diptichoubey24</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%2F4181506%2F993e62e3-84b9-4978-8d64-ff9b20ab5e83.png</url>
      <title>DEV Community: Dipti Choubey</title>
      <link>https://dev.to/diptichoubey24</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diptichoubey24"/>
    <language>en</language>
    <item>
      <title>Ofrenda: keeping a family story in their own voice, offline</title>
      <dc:creator>Dipti Choubey</dc:creator>
      <pubDate>Sat, 31 Oct 2026 15:50:17 +0000</pubDate>
      <link>https://dev.to/diptichoubey24/ofrenda-keeping-a-family-story-in-their-own-voice-offline-5ao8</link>
      <guid>https://dev.to/diptichoubey24/ofrenda-keeping-a-family-story-in-their-own-voice-offline-5ao8</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;An ofrenda is a place where you keep the people you remember. I took that idea and built a small tool for something most families never write down: the stories that only exist in one person's voice. &lt;/p&gt;

&lt;p&gt;With Ofrenda, I record someone telling a story, or add a voice memo. It writes down what was said, then makes a short remembrance card: a title, a paragraph about the person, a list of things they loved (foods, songs, places), and one line in their own words. I read it, fix anything that isn't true, and save it. The card goes on a shelf, and the recording sits next to it, so I can press play and hear them again.&lt;/p&gt;

&lt;p&gt;That is how I read the theme. The ghost in the machine is a voice that outlasts the moment it was spoken.&lt;/p&gt;

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

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

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Dipti-Choubey-101" rel="noopener noreferrer"&gt;
        Dipti-Choubey-101
      &lt;/a&gt; / &lt;a href="https://github.com/Dipti-Choubey-101/ofrenda" rel="noopener noreferrer"&gt;
        ofrenda
      &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;Keep a family story before it fades. Record someone telling it (or add a voice memo), and
Ofrenda writes it down, then turns it into a short remembrance card using only what was said
Everything runs on your laptop: Whisper (speech to text) and an open-weight model through
Ollama. No account, no API key, no cloud. Stories are saved as plain files (text, JSON and the
original audio) in a &lt;code&gt;memories/&lt;/code&gt; folder, so they never depend on a service that might disappear.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run (Windows)&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://python.org" rel="nofollow noopener noreferrer"&gt;Python 3.11+&lt;/a&gt; (tick &lt;strong&gt;Add python.exe to PATH&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, then in PowerShell: &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Double-click &lt;code&gt;run.bat&lt;/code&gt;. Your browser opens at &lt;a href="http://localhost:5003" rel="nofollow noopener noreferrer"&gt;http://localhost:5003&lt;/a&gt;.
The first start downloads the voice model (a few hundred MB, needs internet once).&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Good to know&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Ask permission before recording someone.&lt;/li&gt;
&lt;li&gt;The card may only use words from the story. A quoted line is checked against the…&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/Dipti-Choubey-101/ofrenda" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;To run it on Windows: install Python and &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, run &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, then double-click &lt;code&gt;run.bat&lt;/code&gt;. The first start downloads the speech model, so it needs internet once.&lt;/p&gt;

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

&lt;p&gt;I wrote the first version with an AI coding assistant (Claude). It is a small Flask server with one page, and two open models that both run on my laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whisper does the listening.&lt;/strong&gt; The browser records audio (or I upload a voice memo) and sends it to Flask. &lt;a href="https://github.com/SYSTRAN/faster-whisper" rel="noopener noreferrer"&gt;faster-whisper&lt;/a&gt; runs the &lt;code&gt;small&lt;/code&gt; model on the CPU and writes down the speech. I choose the language first (English, Hindi, Bengali or Spanish), or let it work it out. The recording waits aside until I press Save.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 3 (4B) does the writing&lt;/strong&gt;, through Ollama. I send the transcript and ask for a JSON answer with four fields: title, remembrance, loved and quote. The temperature is low (0.3) so it stays close to the text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The part I worried about most is the model making things up.&lt;/strong&gt; For a memorial, an invented detail is worse than a boring one. I used three guardrails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The prompt says to use only what is in the transcript, and never to invent names, dates, places, relatives or feelings.&lt;/li&gt;
&lt;li&gt;The quote is checked by code. After removing punctuation and capital letters, it has to appear in the transcript. If it doesn't, it is thrown away.&lt;/li&gt;
&lt;li&gt;Nothing is saved until I have read the card. The title, the paragraph and the list are all editable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What this doesn't cover: the paragraph and the list of things they loved are not checked by code. They rely on the prompt and on me reading them. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plain files, not an app database.&lt;/strong&gt; Each saved story is a folder in &lt;code&gt;memories/&lt;/code&gt;, with a &lt;code&gt;story.json&lt;/code&gt; (transcript and card) and the original audio. That folder is in &lt;code&gt;.gitignore&lt;/code&gt;, so family stories can't be uploaded to GitHub by accident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One thing broke.&lt;/strong&gt; On a fresh install, transcription failed with &lt;code&gt;open() got an unexpected keyword argument 'metadata_errors'&lt;/code&gt;. A new version of PyAV, the library faster-whisper uses to open audio, removed an argument that faster-whisper still passes. Pinning &lt;code&gt;av&amp;lt;19&lt;/code&gt; in &lt;code&gt;requirements.txt&lt;/code&gt; fixed it. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits I know about:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speech recognition mishears names and places, especially in Hindi and Bengali. That is why the transcript is an editable text box before the card is made.&lt;/li&gt;
&lt;li&gt;The card is written in English. The quote stays in the original language.&lt;/li&gt;
&lt;li&gt;For a long story, the model reads only the first 7,000 characters, and the page tells you when that happens.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A family's voices and stories are about as private as data gets. Because Whisper and Gemma run on my own laptop, the audio and the transcript never go to anyone's server. &lt;/p&gt;

&lt;p&gt;The theme asks about making sure what you build isn't locked inside a service that might disappear. That was the main reason I chose plain files. Everything Ofrenda saves is a JSON file and an audio file that any program can open. If Ofrenda disappeared tomorrow, the stories would still be there, and the models I downloaded would still run.&lt;/p&gt;

&lt;p&gt;It also costs nothing to run. I could test a recording again and again without a bill or a limit. The Whisper size, the model and the writing instructions are each one line or paragraph I can change.&lt;/p&gt;

&lt;p&gt;A bigger hosted model would probably write a smoother remembrance, and recognise Hindi and Bengali better. For a story like this, I would still choose privacy and plain files.&lt;/p&gt;

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

&lt;p&gt;I recorded my aunt telling the story of her first job, for about three&lt;br&gt;
minutes. She didn't want to be recorded at first, so I told her it was&lt;br&gt;
just a test.&lt;/p&gt;

&lt;p&gt;When I played it back she was quiet for a moment, then said: "I sound&lt;br&gt;
exactly like my mother."&lt;/p&gt;

&lt;p&gt;What surprised me: she corrected the transcript herself, and fixed a&lt;br&gt;
street name I never would have known was wrong.&lt;/p&gt;

&lt;p&gt;What the card got wrong: it said she "loved the city", which she never&lt;br&gt;
said. I deleted that line before saving.&lt;/p&gt;

&lt;p&gt;I haven't shown the card to anyone yet. But her voice is in a folder&lt;br&gt;
now, and that's the part I'm keeping.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>SlothSort demo: open-source AI file tidier (Gemma + Ollama)</title>
      <dc:creator>Dipti Choubey</dc:creator>
      <pubDate>Sat, 24 Oct 2026 07:20:30 +0000</pubDate>
      <link>https://dev.to/diptichoubey24/slothsort-demo-open-source-ai-file-tidier-gemma-ollama-3m66</link>
      <guid>https://dev.to/diptichoubey24/slothsort-demo-open-source-ai-file-tidier-gemma-ollama-3m66</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 has 13 files in it. Half of them are called things like &lt;code&gt;document (3).pdf&lt;/code&gt; or &lt;code&gt;scan_0042.pdf&lt;/code&gt;, and I have no idea what is inside without opening them. I have been meaning to sort it for [HOW LONG], and I never do.&lt;/p&gt;

&lt;p&gt;SlothSort does the sorting for me. I point it at a folder and press one button. It reads my documents one by one and suggests a clear name and a folder for each. For example, &lt;code&gt;scan_0042.pdf&lt;/code&gt; turned into "Hackathon Meeting Notes". Then it shows me the whole plan, and nothing moves until I press Tidy.&lt;/p&gt;

&lt;p&gt;I made it careful on purpose. Files are never deleted or overwritten, they move into a &lt;code&gt;Tidied&lt;/code&gt; folder inside the folder I picked, and &lt;strong&gt;Undo last tidy&lt;/strong&gt; puts everything back.&lt;/p&gt;

&lt;p&gt;It is for anyone with a folder they are scared to open.&lt;/p&gt;

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

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

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Dipti-Choubey-101" rel="noopener noreferrer"&gt;
        Dipti-Choubey-101
      &lt;/a&gt; / &lt;a href="https://github.com/Dipti-Choubey-101/slothsort" rel="noopener noreferrer"&gt;
        slothsort
      &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;SlothSort&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Point it at a messy folder (like Downloads). A local open-weight model reads the start of your
documents, suggests a clear name and a folder for each file, and you approve the plan. Files
move only after you press &lt;strong&gt;Tidy selected&lt;/strong&gt;, they go into a &lt;code&gt;Tidied&lt;/code&gt; folder inside the folder you
picked, nothing is ever deleted, and &lt;strong&gt;Undo last tidy&lt;/strong&gt; puts everything back. Your files are
read on your laptop through Ollama: no account, no API key, no internet needed after setup.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run (Windows)&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://python.org" rel="nofollow noopener noreferrer"&gt;Python 3.11+&lt;/a&gt; (tick &lt;strong&gt;Add python.exe to PATH&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, then in PowerShell: &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Double-click &lt;code&gt;run.bat&lt;/code&gt;. Your browser opens at &lt;a href="http://localhost:5002" rel="nofollow noopener noreferrer"&gt;http://localhost:5002&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it sorts&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;PDFs, Word files, &lt;code&gt;.txt&lt;/code&gt; and &lt;code&gt;.md&lt;/code&gt;: the AI reads the first part and picks a folder and a name.&lt;/li&gt;
&lt;li&gt;Images, videos, installers, archives, spreadsheets, slides: sorted by file type, names unchanged.&lt;/li&gt;
&lt;li&gt;Skipped: sub-folders…&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/Dipti-Choubey-101/slothsort" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;To run it on Windows: install Python and &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, run &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, then double-click &lt;code&gt;run.bat&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;The app is a small Flask server with one page. The interesting part is how little the AI is asked to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI makes one small decision per file.&lt;/strong&gt; For PDFs, Word files, &lt;code&gt;.txt&lt;/code&gt; and &lt;code&gt;.md&lt;/code&gt;, plain Python reads the first 1,500 characters. A &lt;code&gt;.docx&lt;/code&gt; is just a zip file, so I read the text out of its XML without any extra library, and PDFs go through &lt;code&gt;pypdf&lt;/code&gt;. That text goes to &lt;code&gt;gemma3:4b&lt;/code&gt; through Ollama, with the original filename and one instruction: pick a folder and write a short clear name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The answer has a fixed shape.&lt;/strong&gt; Ollama accepts a JSON schema, so I pass one where the folder must be one of five names (Study, Receipts, Work, Personal, Other documents). The model cannot invent a folder. I also set the temperature low (0.2) so it stops getting creative with names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most files never reach the AI.&lt;/strong&gt; Images, videos, installers, archives, spreadsheets and slides are sorted by file extension with a lookup table. It is faster, and a 4B model has nothing useful to say about a &lt;code&gt;.zip&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The risky part is ordinary code.&lt;/strong&gt; The AI only returns text. Moving files is plain Python, and only after I press Tidy. File names are stripped of characters Windows doesn't allow, a name that already exists gets &lt;code&gt;(2)&lt;/code&gt; added, and every move is written to an &lt;code&gt;undo.json&lt;/code&gt; file so it can be reversed. Files changed in the last two minutes are skipped, in case they are still downloading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It shows progress.&lt;/strong&gt; A scan of 40 files takes a while on a laptop, so the server sends each result as soon as it is ready and the page adds rows one at a time. On my laptop it took about [N MINUTES] for [N] files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't do:&lt;/strong&gt; it does not look inside images, scanned PDFs have no text to read, and a small model sometimes picks a strange name or the wrong folder. That is why you always see the plan first.&lt;/p&gt;

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

&lt;p&gt;The files in a Downloads folder are bills, assignments and CVs. This is exactly what I don't want to upload to a server, just to get a better file name. Because the model runs through Ollama on my own laptop, the text it reads never leaves it.&lt;/p&gt;

&lt;p&gt;It is also free to run. A tidier like this is only worth it if I can run it again and again, on every folder, without thinking about a bill.&lt;br&gt;
And it was easy to bend to my own needs. The model is one line in &lt;code&gt;app.py&lt;/code&gt;. The folder names and the instructions the AI gets are plain text I can change.&lt;/p&gt;

&lt;p&gt;A bigger hosted model would probably write better names, and it could look inside images, which mine can't. For this project, privacy and zero cost mattered more.&lt;/p&gt;

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

&lt;p&gt;I sorted the same 13-file test folder two ways.&lt;/p&gt;

&lt;p&gt;By hand: 20 minutes 13 seconds, opening every file to work out what it was.&lt;/p&gt;

&lt;p&gt;With SlothSort: 4 minutes 3 seconds in total. The scan took [2:2], and I did nothing during that time. My own work was [2:1]: reading the plan, clicking or untick on boxes, and pressing Tidy.&lt;/p&gt;

&lt;p&gt;I start the scan, go and do something else, and come back to a plan I only have to check.I’d point it at a folder I’ve been avoiding, let it read in the background, and only fix the two or three names I don’t like.The AI does the boring part, which is opening every file to see what it is. I do the only part that needs judgment, which is saying yes or no.I wouldn’t trust it blindly, but checking a plan is much easier than making one from scratch.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>SlothSort demo: open-source AI file tidier (Gemma + Ollama)</title>
      <dc:creator>Dipti Choubey</dc:creator>
      <pubDate>Sat, 24 Oct 2026 07:11:59 +0000</pubDate>
      <link>https://dev.to/diptichoubey24/slothsort-demo-open-source-ai-file-tidier-gemma-ollama-4a37</link>
      <guid>https://dev.to/diptichoubey24/slothsort-demo-open-source-ai-file-tidier-gemma-ollama-4a37</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 has 13 files in it. Half of them are called things like &lt;code&gt;document (3).pdf&lt;/code&gt; or &lt;code&gt;scan_0042.pdf&lt;/code&gt;, and I have no idea what is inside without opening them. I have been meaning to sort it for [HOW LONG], and I never do.&lt;/p&gt;

&lt;p&gt;SlothSort does the sorting for me. I point it at a folder and press one button. It reads my documents one by one and suggests a clear name and a folder for each. For example, &lt;code&gt;scan_0042.pdf&lt;/code&gt; turned into "Hackathon Meeting Notes". Then it shows me the whole plan, and nothing moves until I press Tidy.&lt;/p&gt;

&lt;p&gt;I made it careful on purpose. Files are never deleted or overwritten, they move into a &lt;code&gt;Tidied&lt;/code&gt; folder inside the folder I picked, and &lt;strong&gt;Undo last tidy&lt;/strong&gt; puts everything back.&lt;/p&gt;

&lt;p&gt;It is for anyone with a folder they are scared to open.&lt;/p&gt;

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

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

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Dipti-Choubey-101" rel="noopener noreferrer"&gt;
        Dipti-Choubey-101
      &lt;/a&gt; / &lt;a href="https://github.com/Dipti-Choubey-101/slothsort" rel="noopener noreferrer"&gt;
        slothsort
      &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;SlothSort&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Point it at a messy folder (like Downloads). A local open-weight model reads the start of your
documents, suggests a clear name and a folder for each file, and you approve the plan. Files
move only after you press &lt;strong&gt;Tidy selected&lt;/strong&gt;, they go into a &lt;code&gt;Tidied&lt;/code&gt; folder inside the folder you
picked, nothing is ever deleted, and &lt;strong&gt;Undo last tidy&lt;/strong&gt; puts everything back. Your files are
read on your laptop through Ollama: no account, no API key, no internet needed after setup.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run (Windows)&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://python.org" rel="nofollow noopener noreferrer"&gt;Python 3.11+&lt;/a&gt; (tick &lt;strong&gt;Add python.exe to PATH&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, then in PowerShell: &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Double-click &lt;code&gt;run.bat&lt;/code&gt;. Your browser opens at &lt;a href="http://localhost:5002" rel="nofollow noopener noreferrer"&gt;http://localhost:5002&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it sorts&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;PDFs, Word files, &lt;code&gt;.txt&lt;/code&gt; and &lt;code&gt;.md&lt;/code&gt;: the AI reads the first part and picks a folder and a name.&lt;/li&gt;
&lt;li&gt;Images, videos, installers, archives, spreadsheets, slides: sorted by file type, names unchanged.&lt;/li&gt;
&lt;li&gt;Skipped: sub-folders…&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/Dipti-Choubey-101/slothsort" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;To run it on Windows: install Python and &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, run &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, then double-click &lt;code&gt;run.bat&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;The app is a small Flask server with one page. The interesting part is how little the AI is asked to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI makes one small decision per file.&lt;/strong&gt; For PDFs, Word files, &lt;code&gt;.txt&lt;/code&gt; and &lt;code&gt;.md&lt;/code&gt;, plain Python reads the first 1,500 characters. A &lt;code&gt;.docx&lt;/code&gt; is just a zip file, so I read the text out of its XML without any extra library, and PDFs go through &lt;code&gt;pypdf&lt;/code&gt;. That text goes to &lt;code&gt;gemma3:4b&lt;/code&gt; through Ollama, with the original filename and one instruction: pick a folder and write a short clear name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The answer has a fixed shape.&lt;/strong&gt; Ollama accepts a JSON schema, so I pass one where the folder must be one of five names (Study, Receipts, Work, Personal, Other documents). The model cannot invent a folder. I also set the temperature low (0.2) so it stops getting creative with names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most files never reach the AI.&lt;/strong&gt; Images, videos, installers, archives, spreadsheets and slides are sorted by file extension with a lookup table. It is faster, and a 4B model has nothing useful to say about a &lt;code&gt;.zip&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The risky part is ordinary code.&lt;/strong&gt; The AI only returns text. Moving files is plain Python, and only after I press Tidy. File names are stripped of characters Windows doesn't allow, a name that already exists gets &lt;code&gt;(2)&lt;/code&gt; added, and every move is written to an &lt;code&gt;undo.json&lt;/code&gt; file so it can be reversed. Files changed in the last two minutes are skipped, in case they are still downloading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It shows progress.&lt;/strong&gt; A scan of 40 files takes a while on a laptop, so the server sends each result as soon as it is ready and the page adds rows one at a time. On my laptop it took about [N MINUTES] for [N] files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't do:&lt;/strong&gt; it does not look inside images, scanned PDFs have no text to read, and a small model sometimes picks a strange name or the wrong folder. That is why you always see the plan first.&lt;/p&gt;

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

&lt;p&gt;The files in a Downloads folder are bills, assignments and CVs. This is exactly what I don't want to upload to a server, just to get a better file name. Because the model runs through Ollama on my own laptop, the text it reads never leaves it.&lt;/p&gt;

&lt;p&gt;It is also free to run. A tidier like this is only worth it if I can run it again and again, on every folder, without thinking about a bill.&lt;br&gt;
And it was easy to bend to my own needs. The model is one line in &lt;code&gt;app.py&lt;/code&gt;. The folder names and the instructions the AI gets are plain text I can change.&lt;/p&gt;

&lt;p&gt;A bigger hosted model would probably write better names, and it could look inside images, which mine can't. For this project, privacy and zero cost mattered more.&lt;/p&gt;

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

&lt;p&gt;I sorted the same 13-file test folder two ways.&lt;/p&gt;

&lt;p&gt;By hand: 20 minutes 13 seconds, opening every file to work out what it was.&lt;/p&gt;

&lt;p&gt;With SlothSort: 4 minutes 3 seconds in total. The scan took [2:2], and I did nothing during that time. My own work was [2:1]: reading the plan, clicking or untick on boxes, and pressing Tidy.&lt;/p&gt;

&lt;p&gt;I start the scan, go and do something else, and come back to a plan I only have to check.I’d point it at a folder I’ve been avoiding, let it read in the background, and only fix the two or three names I don’t like.The AI does the boring part, which is opening every file to see what it is. I do the only part that needs judgment, which is saying yes or no.I wouldn’t trust it blindly, but checking a plan is much easier than making one from scratch.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Field Card: a printed page that gets me off the screen</title>
      <dc:creator>Dipti Choubey</dc:creator>
      <pubDate>Sat, 17 Oct 2026 08:42:04 +0000</pubDate>
      <link>https://dev.to/diptichoubey24/field-card-a-printed-page-that-gets-me-off-the-screen-5677</link>
      <guid>https://dev.to/diptichoubey24/field-card-a-printed-page-that-gets-me-off-the-screen-5677</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;Going for a walk sounds simple until you are standing outside with no plan and a phone in your hand.&lt;/p&gt;

&lt;p&gt;Field Card is a small web app that does the planning part. I type where I am (a city or area), what kind of place it is, how much time I have, and who is coming. A model running on my laptop writes a one-page card: a few things to bring, a checklist of things to find, one rule for the phone, and a question to think about on the way home. Then I print it and close the laptop.&lt;/p&gt;

&lt;p&gt;The checklist is the part I like. The items sound like "something that rustles when the wind moves it". They describe color, shape, sound or behavior, never a name, so you don't need to know any plants or birds.&lt;/p&gt;

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

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

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Dipti-Choubey-101" rel="noopener noreferrer"&gt;
        Dipti-Choubey-101
      &lt;/a&gt; / &lt;a href="https://github.com/Dipti-Choubey-101/fieldcard" rel="noopener noreferrer"&gt;
        fieldcard
      &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 Card&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Tell it where you are and how long you have. A local open-weight model writes a one-page,
printable outing: what to bring, things to find, and a rule for the phone. Print it, put the
screen away, go. Everything runs on your laptop through Ollama: no account, no API key, no
internet needed after setup.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run (Windows)&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://python.org" rel="nofollow noopener noreferrer"&gt;Python 3.11+&lt;/a&gt; (tick &lt;strong&gt;Add python.exe to PATH&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, then in PowerShell: &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Double-click &lt;code&gt;run.bat&lt;/code&gt;. Your browser opens at &lt;a href="http://localhost:5001" rel="nofollow noopener noreferrer"&gt;http://localhost:5001&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Change it&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;MODEL&lt;/code&gt; at the top of &lt;code&gt;app.py&lt;/code&gt;: any model you have pulled with Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build_prompt()&lt;/code&gt; in &lt;code&gt;app.py&lt;/code&gt;: how the card is written.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CARD_SCHEMA&lt;/code&gt; in &lt;code&gt;app.py&lt;/code&gt;: the sections on the card.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Dipti-Choubey-101/fieldcard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;To run it on Windows: install Python and &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, run &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, then double-click &lt;code&gt;run.bat&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;I wrote the first version with an AI coding assistant (Claude).&lt;/p&gt;

&lt;p&gt;The app is a small Flask server with one page. The page collects the form and sends it to the server, which builds a prompt and calls Ollama's chat endpoint with &lt;code&gt;gemma3:4b&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A few decisions mattered more than the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The answer has a fixed shape.&lt;/strong&gt; Ollama accepts a JSON schema, so I pass one with six fields: title, intro, bring, notice, phone_rule and on_the_way_back. The page draws the card from those fields, so I never have to parse free text. If the model ever returns something unusable, the page says so and you press the button again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No species names.&lt;/strong&gt; The prompt tells the model to describe things by color, sound or behavior. A small model will name a bird or a tree with total confidence and get it wrong. The cards are less impressive this way, and a lot more honest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The time you pick sets the length.&lt;/strong&gt; 15 minutes gets 5 things to find and 2 hours gets 10. I also cut the list in code, because the model does not always count correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The date goes in the prompt.&lt;/strong&gt; The browser sends today's date and the region you typed, so the model has to work out the season on its own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Printing is just CSS.&lt;/strong&gt; A print stylesheet hides the form and buttons, switches to black on white, and draws the checkboxes as empty squares. The button opens the normal Windows print window, so you can also save a PDF for your phone. On my laptop, writing a card took about 10 SECONDS.&lt;/p&gt;

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

&lt;p&gt;The point of this app is that you use it right before you leave the house. With a hosted API, that moment would depend on a connection. With a local model, I only need the internet once, to download the model. After that it works with no connection at all.&lt;/p&gt;

&lt;p&gt;It is also free to run. Since there is no bill, you can press the button again until the card sounds right.&lt;/p&gt;

&lt;p&gt;The location stays on the laptop too. The app only asks for a city, the day and the kind of place. That is not much, but it is where I go for walks, and I would rather not send it to a server for a checklist.&lt;/p&gt;

&lt;p&gt;And I could change things a closed API would not have let me. The model is one line in &lt;code&gt;app.py&lt;/code&gt;, and the card's sections are a schema I wrote myself.&lt;/p&gt;

&lt;p&gt;A bigger hosted model would write better. The cards from a 4B model are fine, but plain.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Walk Went
&lt;/h2&gt;

&lt;p&gt;I printed a card for a 30-minute walk, put the phone in my bag, and&lt;br&gt;
went to the park near my house. The card had six things to find.&lt;/p&gt;

&lt;p&gt;I ticked four. "Something that rustles when the wind moves it" was&lt;br&gt;
easy, because there was a whole row of trees doing it. "A sound that&lt;br&gt;
repeats" took me a while, and I ended up ticking it for a bird I never&lt;br&gt;
saw. I skipped "something smaller than your thumbnail that is moving"&lt;br&gt;
because I got tired of staring at the ground. The "on the way back"&lt;br&gt;
question was "What did you walk past today without noticing?" and I&lt;br&gt;
thought about it for most of the way home.&lt;/p&gt;

&lt;p&gt;What was wrong: the card told me to bring a warm layer, and it was&lt;br&gt;
warm out. It also had no idea the path was crowded, so one item was&lt;br&gt;
basically "find a quiet spot". That is a limit of a card written&lt;br&gt;
without seeing the place.&lt;/p&gt;

&lt;p&gt;I did take my phone out once, to take a photo of the card with my&lt;br&gt;
pen ticks on it. That is the photo at the top of this post.&lt;/p&gt;

&lt;p&gt;The screen part took about 2 minutes. The walk took 40.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>SlowTalk: a patient language tutor that never leaves my friend's laptop</title>
      <dc:creator>Dipti Choubey</dc:creator>
      <pubDate>Sat, 17 Oct 2026 08:30:11 +0000</pubDate>
      <link>https://dev.to/diptichoubey24/slowtalk-a-patient-language-tutor-that-never-leaves-my-friends-laptop-4e4</link>
      <guid>https://dev.to/diptichoubey24/slowtalk-a-patient-language-tutor-that-never-leaves-my-friends-laptop-4e4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My friend [FRIEND] is learning [LANGUAGE] because [REASON]. When I asked what is hardest, the answer was speaking. [ONE SENTENCE IN THEIR WORDS, e.g. "I know the words, but I freeze when someone is waiting for me to answer."]&lt;/p&gt;

&lt;p&gt;Most apps move too fast for that. People can make it feel risky. And every sentence you type into an online tutor is sent to someone else's server.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;SlowTalk&lt;/strong&gt;, a practice partner for exactly one person. It does four things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Talks at their level.&lt;/strong&gt; Replies are one to three short sentences in simple [LANGUAGE], and always end with an easy question about things [FRIEND] likes ([INTERESTS]).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corrects without shaming.&lt;/strong&gt; If [FRIEND] makes a mistake, the tutor answers what they meant first. Then a small pink tip shows the corrected phrase and a one-line reason in English.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listens.&lt;/strong&gt; Press &lt;strong&gt;Speak&lt;/strong&gt;, say a sentence, and it becomes text they can fix before sending.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Talks back slowly.&lt;/strong&gt; Answers can be read aloud a little slower than normal speech.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything about [FRIEND] lives in one small file, &lt;code&gt;friend.json&lt;/code&gt;: name, language, level, hobbies and goal. Change that file and you have a tutor for someone else.&lt;/p&gt;

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

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

&lt;p&gt;[ONE LINE ABOUT WHAT THE VIDEO SHOWS, e.g. "A sentence with a small mistake, and the pink tip that follows."]&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/Dipti-Choubey-101" rel="noopener noreferrer"&gt;
        Dipti-Choubey-101
      &lt;/a&gt; / &lt;a href="https://github.com/Dipti-Choubey-101/slowtalk" rel="noopener noreferrer"&gt;
        slowtalk
      &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;SlowTalk&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A patient practice partner for one friend learning a language. It runs an open-weight model
locally through Ollama, so there is no account, no API key, no cost, and no internet needed after setup.
Nothing the friend types ever leaves the laptop.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run (Windows)&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://python.org" rel="nofollow noopener noreferrer"&gt;Python 3.11+&lt;/a&gt; (tick &lt;strong&gt;Add python.exe to PATH&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, then in PowerShell: &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Edit &lt;code&gt;friend.json&lt;/code&gt; (name, language, level, interests).&lt;/li&gt;
&lt;li&gt;Double-click &lt;code&gt;run.bat&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Make it theirs&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Everything personal lives in &lt;code&gt;friend.json&lt;/code&gt;. Change &lt;code&gt;model&lt;/code&gt; to try any model you have pulled with Ollama.
The tutor's behaviour is the prompt in &lt;code&gt;build_prompt()&lt;/code&gt; in &lt;code&gt;app.py&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Dipti-Choubey-101/slowtalk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;To run it on Windows: install Python and &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, run &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, then double-click &lt;code&gt;run.bat&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The brain: Gemma 3 (4B) through Ollama.&lt;/strong&gt; A small Flask server sends the conversation to Ollama's chat endpoint and streams the answer back to the browser word by word.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tutor is just a prompt.&lt;/strong&gt; On startup, &lt;code&gt;build_prompt()&lt;/code&gt; reads &lt;code&gt;friend.json&lt;/code&gt; and writes the tutor's rules: reply in the target language, keep it short, end with a question, never shame. The corrections use a simple trick. The model is told to put any correction on a final line that starts with &lt;code&gt;TIP:&lt;/code&gt;. The page splits the text on that marker and draws the pink callout. I chose this over JSON output because it keeps streaming smooth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice in: Whisper, running locally.&lt;/strong&gt; The browser records a clip and sends it to Flask. &lt;a href="https://github.com/SYSTRAN/faster-whisper" rel="noopener noreferrer"&gt;faster-whisper&lt;/a&gt; (the &lt;code&gt;base&lt;/code&gt; model, on CPU) turns it into text. I force it to listen for the target language so an accent isn't mistaken for English. The text lands in the input box instead of being sent automatically, so [FRIEND] can fix a misheard word.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice out:&lt;/strong&gt; the browser's built-in speech synthesis at 0.85 speed, using the voices already installed on the laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rest:&lt;/strong&gt; plain HTML, CSS and JavaScript with no build step. The conversation is saved in the browser's local storage, and &lt;code&gt;run.bat&lt;/code&gt; sets up everything on Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits I know about:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 4B model can miss a mistake, or "correct" something that was fine. The tip is a suggestion, not a teacher's verdict.&lt;/li&gt;
&lt;li&gt;Whisper listens only for the target language, so English requests like "translate that" have to be typed.&lt;/li&gt;
&lt;li&gt;The first start downloads the models, so it needs internet once.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Privacy is the point.&lt;/strong&gt; [FRIEND] is nervous about speaking. A tutor that sends their voice to a company is a bad fit for that. With open models, the text and the audio never leave the laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing to sign up for.&lt;/strong&gt; There is no account, no API key and no bill. I could hand over a folder and it just worked. It also keeps working when the Wi-Fi doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could shape it.&lt;/strong&gt; Swapping the model is one line. The Whisper size is one setting. The tutor's personality is a paragraph I can rewrite. A closed API would have given me none of that control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where closed would win:&lt;/strong&gt; a bigger hosted model would probably give better corrections. For this project, privacy and zero cost mattered more than the last bit of accuracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What [FRIEND] Said
&lt;/h2&gt;

&lt;p&gt;I handed Priya the laptop and kept quiet. She practiced for about 12 minutes,&lt;br&gt;
and her first message was just "Hola, me llamo Priya", to see what would happen.&lt;/p&gt;

&lt;p&gt;When I asked what she thought, she said: "It's the first time I didn't&lt;br&gt;
feel stupid for getting the verb wrong."&lt;/p&gt;

&lt;p&gt;What surprised me: she turned on &lt;strong&gt;Read aloud&lt;/strong&gt; within a minute and kept&lt;br&gt;
repeating the tutor's sentences back to herself. I never told her to do that.&lt;/p&gt;

&lt;p&gt;What didn't work: twice, the tutor missed a mistake I could see on the&lt;br&gt;
screen. Once, my Spanish-speaking cousin said a "corrected" phrase sounded&lt;br&gt;
unnatural. The speech-to-text also turned "tengo" into "tenso" when she&lt;br&gt;
spoke fast.&lt;/p&gt;

&lt;p&gt;What I changed after: I set &lt;code&gt;whisper_model&lt;/code&gt; to &lt;code&gt;small&lt;/code&gt;, which fixed the&lt;br&gt;
"tengo" problem. I haven't fixed the missed mistakes. That is the limit of&lt;br&gt;
a 4B model.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Tallyroll: A Restaurant Bill Sorter That Works Offline (Gemma + Ollama)</title>
      <dc:creator>Dipti Choubey</dc:creator>
      <pubDate>Fri, 16 Oct 2026 09:32:45 +0000</pubDate>
      <link>https://dev.to/diptichoubey24/tallyroll-a-restaurant-bill-sorter-that-works-offline-gemma-ollama-17c2</link>
      <guid>https://dev.to/diptichoubey24/tallyroll-a-restaurant-bill-sorter-that-works-offline-gemma-ollama-17c2</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;Tallyroll turns a pile of paper bills into one clean spreadsheet. You drop in photos of a restaurant's supplier bills and receipts, and it reads each one, sorts it into a kitchen category (vegetables, meat, dairy, gas, rent and so on), and flags anything it is unsure about.&lt;/p&gt;

&lt;p&gt;Restaurant owners spend hours at month end sorting a shoebox of bills for the accountant. Cloud tools mean uploading who they buy from and what they pay. With Tallyroll, the owner drops in the photos and gets a spreadsheet with date, vendor, category, total and tax, ready for the accountant.&lt;/p&gt;

&lt;p&gt;Who would pay: small restaurants and cafes, [your pricing idea, e.g. a one-time setup fee].&lt;/p&gt;

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

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

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Dipti-Choubey-101" rel="noopener noreferrer"&gt;
        Dipti-Choubey-101
      &lt;/a&gt; / &lt;a href="https://github.com/Dipti-Choubey-101/tallyroll" rel="noopener noreferrer"&gt;
        tallyroll
      &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;Tallyroll&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A private bill sorter for small restaurants.&lt;/strong&gt; Drop in photos of supplier bills and receipts. &lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;Gemma&lt;/a&gt;, an open-weight model running on your own computer through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, reads each one, sorts it into a kitchen category, flags anything doubtful, and exports one spreadsheet for your accountant.&lt;/p&gt;
&lt;p&gt;No cloud. No per-bill fee. No account. Works offline.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Dipti-Choubey-101/tallyroll/docs/screenshot.png"&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%2FDipti-Choubey-101%2Ftallyroll%2FHEAD%2Fdocs%2Fscreenshot.png" alt="Tallyroll"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it (Windows)&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Full beginner guide: &lt;strong&gt;&lt;a href="https://github.com/Dipti-Choubey-101/tallyroll/WINDOWS-GUIDE.txt" rel="noopener noreferrer"&gt;WINDOWS-GUIDE.txt&lt;/a&gt;&lt;/strong&gt;. The short version:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://www.python.org/downloads/" rel="nofollow noopener noreferrer"&gt;Python&lt;/a&gt; (tick "Add python.exe to PATH") and &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Double-click &lt;code&gt;setup-model.bat&lt;/code&gt; (downloads Gemma once).&lt;/li&gt;
&lt;li&gt;Double-click &lt;code&gt;start.bat&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;macOS / Linux: &lt;code&gt;ollama pull gemma3:4b &amp;amp;&amp;amp; python3 server.py&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;No packages to install. The server uses only the Python standard library; Pillow is used if present (straightens and shrinks phone photos).&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;browser (static/)  --raw image--&amp;gt;  server.py  --/api/chat + JSON schema--&amp;gt;  Ollama (Gemma, local)
                                      |
                                      +--&amp;gt; normalise: numbers, dates, currency, category, sanity checks
                                      +--&amp;gt; data/receipts.json + data/images/   (your computer only)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured output.&lt;/strong&gt;…&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/Dipti-Choubey-101/tallyroll" 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 (open-weight, vision-capable), running locally through Ollama. It reads the bill photo directly, so there is no separate OCR step. I used &lt;code&gt;[gemma3:4b or gemma4:e4b]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; a small Python server with no packages to install. It sends the photo and a strict prompt to Gemma with a JSON schema, so the answer comes back in a fixed shape (vendor, date, total, tax, category, line items, confidence).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean-up layer:&lt;/strong&gt; it fixes number and date formats and marks a bill "Check" when the date or total is missing, the items don't add up, the photo is blurry, or it looks like a duplicate. Unit tests for this run in GitHub Actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; one web page with a receipt-printer animation, a ledger with a side panel to correct any bill next to its photo, a category breakdown, and CSV export for Excel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo mode:&lt;/strong&gt; a built-in mode replays 8 made-up sample bills without a model, and tags them "demo".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built this with AI assistance (Claude) and tested it on real bills on my own laptop.&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 restaurant's bills show who they buy from and what they pay. They never leave the owner's computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; there's no per-bill fee, so a small business pays only for electricity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline:&lt;/strong&gt; it works with no internet, and my demo is recorded with Wi-Fi off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in:&lt;/strong&gt; the model is one setting, so the owner can switch to a better Gemma later by changing one line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room to grow:&lt;/strong&gt; because the weights are open, the model could later be fine-tuned on local suppliers' bills. I haven't done that yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;I sat with Meena, who runs a 12-table family restaurant, and ran 14 of last month's real supplier bills through Tallyroll on my laptop while she watched.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; 11 bills were read correctly. 2 were flagged "Check" (one with a smudged date, one that looked like a duplicate). 1 had a wrong total that was not flagged. It took about 40 seconds per bill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What she said:&lt;/strong&gt; "I usually lose a whole Sunday on this. If I only have to fix three bills instead of typing fourteen, that's worth something."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What went wrong:&lt;/strong&gt; the wrong total was on a crumpled butcher bill, where Gemma read an 8 as a 3. She spotted it only because the photo was right beside the numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What she asked for next:&lt;/strong&gt; a Hindi version of the screen, and a way to send the month's sheet straight to her accountant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Would she pay?&lt;/strong&gt; "Maybe, if it never mixes up numbers." She said ₹500 a month felt fair, but she'd want to try it for a month first.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

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