<?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: Kaushani Koner</title>
    <description>The latest articles on DEV Community by Kaushani Koner (@kaushanikoner20).</description>
    <link>https://dev.to/kaushanikoner20</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%2F4158397%2F56e501ee-63f8-43c9-85e1-94c142ee82ff.jpeg</url>
      <title>DEV Community: Kaushani Koner</title>
      <link>https://dev.to/kaushanikoner20</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kaushanikoner20"/>
    <language>en</language>
    <item>
      <title>ssorg.dev: I Built a Local AI Librarian for All Those Screenshots I Keep Forgetting About 🦥</title>
      <dc:creator>Kaushani Koner</dc:creator>
      <pubDate>Sat, 24 Oct 2026 15:25:46 +0000</pubDate>
      <link>https://dev.to/kaushanikoner20/ssorgdev-i-built-a-local-ai-librarian-for-all-those-screenshots-i-keep-forgetting-about-2bhd</link>
      <guid>https://dev.to/kaushanikoner20/ssorgdev-i-built-a-local-ai-librarian-for-all-those-screenshots-i-keep-forgetting-about-2bhd</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;We all have that one folder: hundreds of screenshots, useful information buried somewhere, and absolutely no idea where to find a particular image when we need it.&lt;/p&gt;

&lt;p&gt;A screenshot of a coding error. A tutorial I wanted to try. An important reference. A piece of information I saved because I thought, “I'll need this later.”&lt;/p&gt;

&lt;p&gt;And then I never find it again.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;ssorg.dev&lt;/strong&gt; — a local-first, AI-powered screenshot organizer that helps turn a messy screenshot collection into a searchable personal knowledge library.&lt;/p&gt;

&lt;p&gt;Instead of manually opening images one by one, ssorg.dev helps you find the information inside them.&lt;/p&gt;

&lt;p&gt;Here's what it can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extract text with OCR:&lt;/strong&gt; Reads text from screenshots using Tesseract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organize with local AI:&lt;/strong&gt; Uses Gemma 3 4B through Ollama to help generate summaries and structured metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build a searchable library:&lt;/strong&gt; Stores screenshot records and metadata in SQLite for future searches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find screenshots by keywords:&lt;/strong&gt; Search extracted text and browse matching results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask ssorg:&lt;/strong&gt; Ask questions about matching screenshots and receive answers grounded in retrieved records, with source references.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detect exact duplicates:&lt;/strong&gt; Uses SHA-256 hashing to identify identical image files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to add more work to my workflow. It's to make the information I've already saved easier to find.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Watch the ssorg.dev demo video:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;▶️ &lt;a href="https://github.com/kaushanikoner20-hub/ssorg.dev/blob/main/docs/videos/ssorg-dev-demo.mp4" rel="noopener noreferrer"&gt;Watch the ssorg.dev Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The video demonstrates the project in action, including its screenshot organization and search workflow.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/kaushanikoner20-hub/ssorg.dev" rel="noopener noreferrer"&gt;https://github.com/kaushanikoner20-hub/ssorg.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is open source and licensed under the MIT License.&lt;/p&gt;

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

&lt;p&gt;I wanted to build something practical using open-source AI while keeping my screenshots and their contents on my own machine.&lt;/p&gt;

&lt;p&gt;My stack includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; — application logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamlit&lt;/strong&gt; — user interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tesseract OCR and pytesseract&lt;/strong&gt; — text extraction from screenshots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B&lt;/strong&gt; — local AI-assisted classification, summaries, and metadata generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; — running the model locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; — persistent storage for screenshot records and metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pillow&lt;/strong&gt; — image handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SHA-256&lt;/strong&gt; — exact duplicate detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workflow is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload screenshots.&lt;/li&gt;
&lt;li&gt;Extract their text using OCR.&lt;/li&gt;
&lt;li&gt;Use the local Gemma model to help interpret and organize the extracted information.&lt;/li&gt;
&lt;li&gt;Save the results in a local SQLite database and screenshot library.&lt;/li&gt;
&lt;li&gt;Search the collection or ask a question about relevant screenshots.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For question answering, ssorg.dev retrieves matching records and uses their content as evidence. It also validates source references so answers can be connected to the records they came from.&lt;/p&gt;

&lt;p&gt;I designed the project around local processing rather than a cloud AI API. This makes privacy a core design choice, not an afterthought.&lt;/p&gt;

&lt;p&gt;Building it also meant thinking beyond the happy path: handling processing errors, validating uploads, confirming deletions, detecting duplicates, and avoiding unsupported answers when relevant evidence cannot be found.&lt;/p&gt;

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

&lt;p&gt;Open innovation matters because useful AI tools shouldn't have to depend on expensive services, closed platforms, or sending personal information to external providers.&lt;/p&gt;

&lt;p&gt;With ssorg.dev, I wanted to explore how an open-weight model like Gemma can support a small but meaningful everyday workflow.&lt;/p&gt;

&lt;p&gt;Screenshots can contain code, personal notes, account details, study materials, and other sensitive information. Keeping the AI workflow local gives users more control over where that information is processed.&lt;/p&gt;

&lt;p&gt;The project also brings together accessible technologies that developers can inspect, learn from, and extend.&lt;/p&gt;

&lt;p&gt;For me, open-source AI is not only about making a model available. It's about giving people the ability to build useful tools around it and adapt those tools to their own needs.&lt;/p&gt;

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

&lt;p&gt;The idea behind &lt;em&gt;Slow and Steady&lt;/em&gt; fits this project perfectly.&lt;/p&gt;

&lt;p&gt;I don't want to spend time naming every screenshot, sorting every image into folders, or scrolling endlessly to rediscover something I saved weeks ago.&lt;/p&gt;

&lt;p&gt;I'd rather let the computer handle the repetitive parts and spend my time doing something more useful.&lt;/p&gt;

&lt;p&gt;ssorg.dev is my attempt to make that possible: extract the text, organize the information, and make it searchable when I need it.&lt;/p&gt;

&lt;p&gt;I haven't quantified time saved in a formal benchmark, so I won't claim a specific productivity improvement. The benefit I'm aiming for is simple: less manual searching and a better chance of finding information I've already captured.&lt;/p&gt;

&lt;p&gt;It's a small tool for a familiar problem, built with local AI and open-source technology.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ssorg.dev uses Gemma 3 4B through Ollama for local AI-assisted screenshot organization and metadata generation. This is the category that best matches the project's actual implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;This project started with a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if saving a screenshot meant I could actually find it again?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building ssorg.dev has been an opportunity to explore local AI, OCR, retrieval-grounded question answering, and privacy-conscious application design in one practical project.&lt;/p&gt;

&lt;p&gt;I'd love to hear from you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you manage the screenshots, notes, and bits of information you keep saving for later?&lt;/strong&gt; Would you use a local AI librarian for them?&lt;/p&gt;

&lt;p&gt;If you're interested, check out the demo and explore the code on GitHub. Contributions, feedback, and ideas are welcome!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>BillBuddy AI: Private Expense Tracking for Freelancers, Powered by Gemma and Ollama</title>
      <dc:creator>Kaushani Koner</dc:creator>
      <pubDate>Sun, 18 Oct 2026 15:56:03 +0000</pubDate>
      <link>https://dev.to/kaushanikoner20/billbuddy-ai-private-expense-tracking-for-freelancers-powered-by-gemma-and-ollama-6gc</link>
      <guid>https://dev.to/kaushanikoner20/billbuddy-ai-private-expense-tracking-for-freelancers-powered-by-gemma-and-ollama-6gc</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;p&gt;Every freelancer knows the pile: photos of receipts, PDF invoices, and a spreadsheet that never gets updated until tax time. I built &lt;strong&gt;BillBuddy AI&lt;/strong&gt; to turn that pile into organized expenses, without uploading a single receipt to someone else's server.&lt;/p&gt;

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

&lt;p&gt;BillBuddy AI is a receipt and invoice organizer that runs entirely on your own computer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You drop in a receipt (JPG, PNG, or PDF).&lt;/li&gt;
&lt;li&gt;OCR reads the text.&lt;/li&gt;
&lt;li&gt;An open-weight model, Gemma, suggests the vendor, date, and total.&lt;/li&gt;
&lt;li&gt;You check and correct the fields, then save them.&lt;/li&gt;
&lt;li&gt;The app keeps a searchable expense list with totals per currency, a category breakdown, and a CSV export.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who would pay, and why.&lt;/strong&gt; Freelancers and small shop owners spend hours each month typing receipts into spreadsheets. Many of them are also uneasy about sending financial documents to a cloud AI service, because those documents hold client names, addresses, and purchase history. A tool that does the typing locally removes both problems. The side hustle angle I'm exploring is offering receipt and expense organizing to small local businesses: use BillBuddy to cut the data entry, and charge per batch or per month.&lt;/p&gt;

&lt;p&gt;I want to be upfront: this is a working prototype. Nobody has paid for it yet, and I haven't tested whether people would.&lt;/p&gt;

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

&lt;p&gt;BillBuddy runs on your own computer (that is the whole point), so there is no hosted link. Here is a 2-minute walkthrough of the full flow, from reading a receipt to saving, searching, and deleting expenses:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/kaushanikoner20-hub/BillBuddyAI/blob/main/docs/demo.mp4" rel="noopener noreferrer"&gt;▶ Watch the 2-minute demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[Drag your screenshots into the DEV editor here: the receipt-style OCR text panel, the AI-suggested fields with a warning visible, and the saved expenses with totals in two currencies. Fake receipts only.]&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/kaushanikoner20-hub" rel="noopener noreferrer"&gt;
        kaushanikoner20-hub
      &lt;/a&gt; / &lt;a href="https://github.com/kaushanikoner20-hub/BillBuddyAI" rel="noopener noreferrer"&gt;
        BillBuddyAI
      &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;BillBuddy AI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/kaushanikoner20-hub/BillBuddyAI/actions/workflows/ci.yml/badge.svg"&gt;&lt;img src="https://github.com/kaushanikoner20-hub/BillBuddyAI/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An open-source, &lt;strong&gt;local-first&lt;/strong&gt; receipt and invoice organizer for freelancers and small businesses
Read a receipt with OCR, let an open-weight AI model (Gemma, running on your own computer through Ollama) suggest the expense details, correct them, and save them to a local SQLite database.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/kaushanikoner20-hub/BillBuddyAI/docs/screenshots/Screenshot%202026-10-18%20171457.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%2Fkaushanikoner20-hub%2FBillBuddyAI%2FHEAD%2Fdocs%2Fscreenshots%2FScreenshot%25202026-10-18%2520171457.png" alt="Screenshot 2026-10-18 171457"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/kaushanikoner20-hub/BillBuddyAI/docs/screenshots/Screenshot%202026-10-18%20171512.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%2Fkaushanikoner20-hub%2FBillBuddyAI%2FHEAD%2Fdocs%2Fscreenshots%2FScreenshot%25202026-10-18%2520171512.png" alt="Screenshot 2026-10-18 171512"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/kaushanikoner20-hub/BillBuddyAI/docs/screenshots/Screenshot%202026-10-18%20171527.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%2Fkaushanikoner20-hub%2FBillBuddyAI%2FHEAD%2Fdocs%2Fscreenshots%2FScreenshot%25202026-10-18%2520171527.png" alt="Screenshot 2026-10-18 171527"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/kaushanikoner20-hub/BillBuddyAI/docs/screenshots/Screenshot%202026-10-18%20172157.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%2Fkaushanikoner20-hub%2FBillBuddyAI%2FHEAD%2Fdocs%2Fscreenshots%2FScreenshot%25202026-10-18%2520172157.png" alt="Screenshot 2026-10-18 172157"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/kaushanikoner20-hub/BillBuddyAI/docs/screenshots/Screenshot%202026-10-18%20172822.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%2Fkaushanikoner20-hub%2FBillBuddyAI%2FHEAD%2Fdocs%2Fscreenshots%2FScreenshot%25202026-10-18%2520172822.png" alt="Screenshot 2026-10-18 172822"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/kaushanikoner20-hub/BillBuddyAI/docs/demo.mp4" rel="noopener noreferrer"&gt;Watch the 2-minute demo&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Upload JPG, JPEG, PNG, or PDF receipts (10 MB limit, first 5 PDF pages are read)&lt;/li&gt;
&lt;li&gt;Read the text with Tesseract OCR, including scanned PDFs&lt;/li&gt;
&lt;li&gt;Gemma suggests the vendor, date, and total. The currency is detected from the receipt text itself.&lt;/li&gt;
&lt;li&gt;Warnings when a suggested value does not appear in the receipt text&lt;/li&gt;
&lt;li&gt;Review and correct every field, or fill in the form manually&lt;/li&gt;
&lt;li&gt;Save expenses (vendor, date, total, currency, category, description) in SQLite&lt;/li&gt;
&lt;li&gt;Search by vendor or description, filter by category and date, edit, and delete with confirmation&lt;/li&gt;
&lt;li&gt;Dashboard: number of receipts, totals &lt;strong&gt;per currency&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/kaushanikoner20-hub/BillBuddyAI" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository has Windows setup instructions, a &lt;code&gt;.env.example&lt;/code&gt;, automated tests, a GitHub Actions workflow, and an MIT license.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Receipt (JPG / PNG / PDF)
   -&amp;gt; Tesseract OCR (PDF pages rendered with PyMuPDF first)
   -&amp;gt; Gemma through Ollama, running locally, suggests fields
   -&amp;gt; validation and warnings
   -&amp;gt; you review and correct
   -&amp;gt; saved in SQLite (reviewed fields only)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight model:&lt;/strong&gt; Gemma 3 (&lt;code&gt;gemma3:4b&lt;/code&gt;) served locally by &lt;strong&gt;Ollama&lt;/strong&gt;. The backend calls Ollama's local API with temperature 0 and JSON output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OCR:&lt;/strong&gt; Tesseract with Pillow. Scanned PDFs work too, because each page is rendered to an image first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python and FastAPI. &lt;strong&gt;Storage:&lt;/strong&gt; SQLite, with only the fields you reviewed, not the receipt file or the full OCR text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React and Vite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built it in stages with help from an AI coding assistant, testing each stage on my own machine before moving on.&lt;/p&gt;

&lt;h3&gt;
  
  
  The lesson: a small model fills in blanks
&lt;/h3&gt;

&lt;p&gt;The part that taught me the most was the currency field. I tested an Indian bill, and the app labeled the amount in &lt;strong&gt;USD&lt;/strong&gt;. Nothing on the bill said dollars. The 4B model simply guessed, because a blank is uncomfortable for a language model. Tesseract's default settings can also misread the ₹ sign, so the model often never saw it.&lt;/p&gt;

&lt;p&gt;So I stopped asking the model about currency. BillBuddy now detects it from the receipt text itself: a currency code, &lt;code&gt;₹&lt;/code&gt;, &lt;code&gt;Rs&lt;/code&gt;, or Indian tax terms like GSTIN and CGST. When the text doesn't say, the field stays empty. A plain &lt;code&gt;$&lt;/code&gt; isn't enough either, because it doesn't tell you the country. An empty field you fill in yourself is better than a confident wrong one.&lt;/p&gt;

&lt;p&gt;That one bug shaped how the whole app treats the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never trust the output.&lt;/strong&gt; Dates must be real dates, amounts must be non-negative numbers, and anything else becomes empty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warn when the numbers don't appear in the receipt.&lt;/strong&gt; If the model suggests a total that isn't in the OCR text, the app says so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat receipt text as untrusted.&lt;/strong&gt; A receipt can contain instructions meant to steer the model, so the prompt tells it to ignore them, and the answer is validated anyway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never mix currencies.&lt;/strong&gt; Totals are grouped by currency, so rupees and dollars are never added together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export safely.&lt;/strong&gt; CSV cells that start like a spreadsheet formula are neutralized.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because everything is local, testing was easy too: the tests replace the model with a stand-in, so the suite runs without Ollama, and a GitHub Actions workflow runs the tests and the frontend build on every push.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limits
&lt;/h3&gt;

&lt;p&gt;The AI can be wrong, so a person reviews every field before saving. I haven't measured extraction accuracy on real receipts, so I won't claim a number. There is no login or database encryption, so it is meant for one local user, and I developed and tested it on Windows.&lt;/p&gt;

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

&lt;p&gt;A receipt is exactly the kind of document you don't want to hand to a third party: it has names, addresses, and what you bought and where. With an open-weight model running locally, the receipt text never leaves the computer. A closed cloud API can promise to be careful with it, but it still has to receive it.&lt;/p&gt;

&lt;p&gt;Open also changed the economics. There are no API keys and no per-receipt fee, so it costs nothing extra whether a shop processes ten receipts or ten thousand. For a business that might run this every day, that is the difference between a tool that works and one that eats the margin. After the one-time downloads, the pipeline doesn't need the internet.&lt;/p&gt;

&lt;p&gt;And the model is one setting. If a larger Gemma, or a different model, reads receipts better, I change a single line instead of rewriting the app or being locked into someone's pricing.&lt;/p&gt;

&lt;p&gt;I'll be honest about the trade-off: a 4B model on a laptop is less accurate than a large hosted model, and that is why the review step and the validation exist. For this use case, I think a reviewed, private, free-to-run answer beats a faster one that needs your documents uploaded.&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; BillBuddy runs Gemma 3 (4B) locally through Ollama to read OCR text and suggest expense fields, with validation and warnings built around its answers.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>TrailBuddy: The AI That Disappears—Powered by Gemma, Built to Get You Outside</title>
      <dc:creator>Kaushani Koner</dc:creator>
      <pubDate>Fri, 09 Oct 2026 19:21:39 +0000</pubDate>
      <link>https://dev.to/kaushanikoner20/trailbuddy-the-ai-that-disappears-powered-by-gemma-built-to-get-you-outside-27j3</link>
      <guid>https://dev.to/kaushanikoner20/trailbuddy-the-ai-that-disappears-powered-by-gemma-built-to-get-you-outside-27j3</guid>
      <description>&lt;h2&gt;
  
  
  TrailBuddy: The AI That Disappears
&lt;/h2&gt;

&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;TrailBuddy turns a few choices—your mood, available time, activity, and preferred difficulty—into a personalized outdoor adventure.&lt;/p&gt;

&lt;p&gt;It isn’t meant to be an AI companion you keep checking while you’re outside. Gemma designs a short sequence of sensory missions: listen for a sound you usually miss, notice a pattern, or explore your surroundings with curiosity. TrailBuddy then asks whether you’re going out, shows a closing scene where a bird takes off, and invites you to put your phone away.&lt;/p&gt;

&lt;p&gt;The idea behind it is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What if the best thing an AI could do for you was make you stop looking at it?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After generating and preparing an adventure, you can continue through its missions offline. Progress and an optional reflection are saved in your browser. Generating a &lt;em&gt;new&lt;/em&gt; adventure still requires the configured backend and Ollama/Gemma to be available.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/kaushanikoner20-hub/TrailBuddy/blob/codex/stage-4-offline-first/assests/Screen%20Recording%202026-10-09%20204549.mp4" rel="noopener noreferrer"&gt;Watch the TrailBuddy screen recording&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/kaushanikoner20-hub/TrailBuddy" rel="noopener noreferrer"&gt;TrailBuddy on GitHub&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;TrailBuddy uses &lt;strong&gt;Gemma 3 (&lt;code&gt;gemma3:4b&lt;/code&gt;)&lt;/strong&gt; through &lt;strong&gt;Ollama&lt;/strong&gt; for local adventure generation. The React and Vite frontend sends the selected preferences to a Node.js and Express backend, which requests a structured adventure from the model and validates the response before showing it.&lt;/p&gt;

&lt;p&gt;The frontend presents the generated missions one at a time in Phone Away Mode. The closing scene uses Three.js, and the production app includes a service worker that caches the application shell and assets for a prepared offline adventure. Local progress and reflections are stored in browser storage.&lt;/p&gt;

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

&lt;p&gt;The open-weight Gemma model and local Ollama setup let me build around a model I can run and experiment with on my own machine. I could shape the prompt for a specific purpose—an outdoor experience designer—and validate the result as structured missions instead of building another general-purpose chat interface.&lt;/p&gt;

&lt;p&gt;Local inference also means the default setup doesn’t need a cloud LLM API to generate an adventure. The offline flow goes further: once an adventure is prepared, the user can leave the AI and backend behind and continue with the saved missions. That distinction matters: a &lt;em&gt;new&lt;/em&gt; adventure still needs the configured model and backend.&lt;/p&gt;

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


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Codex"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;TrailBuddy Hacktoberfest Submission&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Curate and save an Agent Session for my TrailBuddy Hacktoberfest submission. Remove secrets, credentials, and private machine paths. Save the session only—don’t create or publish my DEV article. Return the session ID or slug and the exact {% agent_session ... %} tag.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Saved this curated Agent Session for the TrailBuddy Hacktoberfest submission. No secrets, credentials, or private machine paths are included.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        2 of 2 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&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;

&lt;h1&gt;
  
  
  devchallenge #hf26challenge
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>New to community!</title>
      <dc:creator>Kaushani Koner</dc:creator>
      <pubDate>Fri, 02 Oct 2026 19:30:03 +0000</pubDate>
      <link>https://dev.to/kaushanikoner20/new-to-community-1fjp</link>
      <guid>https://dev.to/kaushanikoner20/new-to-community-1fjp</guid>
      <description>&lt;p&gt;hello everyone&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
