<?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: Aryan Gupta</title>
    <description>The latest articles on DEV Community by Aryan Gupta (@aryan_gupta_1).</description>
    <link>https://dev.to/aryan_gupta_1</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%2F4156330%2Ff091676f-4eb6-43b0-8063-9c3b603442f8.png</url>
      <title>DEV Community: Aryan Gupta</title>
      <link>https://dev.to/aryan_gupta_1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aryan_gupta_1"/>
    <language>en</language>
    <item>
      <title>KhataLens : A shop’s credit notebook never leaves the shop</title>
      <dc:creator>Aryan Gupta</dc:creator>
      <pubDate>Sat, 17 Oct 2026 05:51:55 +0000</pubDate>
      <link>https://dev.to/aryan_gupta_1/khatalens-a-shops-credit-notebook-never-leaves-the-shop-59ih</link>
      <guid>https://dev.to/aryan_gupta_1/khatalens-a-shops-credit-notebook-never-leaves-the-shop-59ih</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;KhataLens turns a photo of a handwritten udhaar notebook page into a clean digital ledger and one-tap WhatsApp payment reminders. It runs entirely on the shopkeeper's own computer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Walk into a neighbourhood kirana, dairy or medical shop and you will find the same thing behind the counter: a ruled notebook where the owner writes who took what on credit (&lt;em&gt;udhaar&lt;/em&gt;) and who paid it back (&lt;em&gt;jama&lt;/em&gt;). It is how a lot of small-shop credit works, and it has three problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nobody can answer "who owes me, and how much?" without adding up pages by hand.&lt;/li&gt;
&lt;li&gt;Money gets forgotten because chasing it is awkward and nothing prompts it.&lt;/li&gt;
&lt;li&gt;The notebook holds your neighbours' names and what they owe. That is not something an owner wants to upload to a cloud service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KhataLens fixes this without changing the owner's habit. They keep writing in the notebook, photograph the page, and the app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Reads the handwriting (Hindi and other Devanagari, mixed date formats, Devanagari digits).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shows every line in an editable table, with suspicious lines highlighted and a reason next to each.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Saves the confirmed lines to a local ledger.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shows &lt;strong&gt;who owes me&lt;/strong&gt;, filterable by how long since the last entry, and a &lt;strong&gt;needs a check&lt;/strong&gt; view for customers who appear to have paid more than they owed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Opens WhatsApp with a ready-written reminder in Hindi, Marathi, Tamil or English. Nothing is sent automatically; the owner reviews and sends it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who would pay, and how it is a side hustle.&lt;/strong&gt; The customer is the small shop owner who has years of notebooks and no time to type them in. The service I would sell is setup and digitization: install it on the shop's existing laptop, scan the backlog of pages, set up reminders, and be on call afterwards. My planned pricing is a one-time setup fee of ₹999 and ₹149 per month for support. These are planned prices that I have not yet validated with a shop owner. Because inference is local, there is no per-scan cloud bill eating the margin, and the shop never needs a subscription to an AI provider.&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%2Fm3vuk9kph10lu6dldu5q.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%2Fm3vuk9kph10lu6dldu5q.png" alt="Khatalens-home" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1907vmhdmvcdnk5uaqqp.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%2F1907vmhdmvcdnk5uaqqp.png" alt="Details" width="800" height="585"&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/aryanguptacsvtu" rel="noopener noreferrer"&gt;
        aryanguptacsvtu
      &lt;/a&gt; / &lt;a href="https://github.com/aryanguptacsvtu/KhataLens" rel="noopener noreferrer"&gt;
        KhataLens
      &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;KhataLens&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Photograph a handwritten udhaar (credit) notebook page. Get a clean ledger and one-tap
WhatsApp payment reminders. &lt;strong&gt;Everything runs on the shopkeeper's own computer&lt;/strong&gt; using an
open-weight vision-language model served by Ollama. No customer data leaves the machine.&lt;/p&gt;
&lt;p&gt;The app is a plain HTML/CSS/JavaScript web page (no build step, no CDN, works offline)
served by a small local Python server that wraps the &lt;code&gt;khatalens&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/aryanguptacsvtu/KhataLens/demo/image1.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%2Faryanguptacsvtu%2FKhataLens%2FHEAD%2Fdemo%2Fimage1.png" width="48%" height="323"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/aryanguptacsvtu/KhataLens/demo/image2.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%2Faryanguptacsvtu%2FKhataLens%2FHEAD%2Fdemo%2Fimage2.png" width="50%" height="255"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/aryanguptacsvtu/KhataLens/demo/image3.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%2Faryanguptacsvtu%2FKhataLens%2FHEAD%2Fdemo%2Fimage3.png" width="62%" height="345"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&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;pip install -r requirements.txt
ollama pull qwen2.5vl:7b          &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or any vision model your hardware can run&lt;/span&gt;
python scripts/synth_ledger.py --n 20 --out data/synth    &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; sample pages for the demo&lt;/span&gt;
python server.py                  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; opens http://127.0.0.1:8000&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Click &lt;strong&gt;Try a sample page&lt;/strong&gt; to test the review -&amp;gt; save -&amp;gt; remind flow with no model, or
upload / photograph a real page and click &lt;strong&gt;Read this page&lt;/strong&gt;. Use another model with
&lt;code&gt;KHATALENS_MODEL=&amp;lt;name&amp;gt;&lt;/code&gt; or in &lt;strong&gt;Settings&lt;/strong&gt; (this is where your fine-tuned model plugs in).&lt;/p&gt;
&lt;p&gt;Server options:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python server.py&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/aryanguptacsvtu/KhataLens" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Quick start (from the README):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
ollama pull gemma3:4b
&lt;span class="nv"&gt;KHATALENS_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gemma3:4b python server.py     &lt;span class="c"&gt;# opens http://127.0.0.1:8000&lt;/span&gt;
&lt;span class="c"&gt;# (Windows PowerShell: $env:KHATALENS_MODEL="gemma3:4b"; python server.py)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;The open-weight AI:&lt;/strong&gt; &lt;strong&gt;Gemma 3 4B&lt;/strong&gt;, Google's multimodal open-weight model, served locally by &lt;strong&gt;Ollama&lt;/strong&gt;. It reads the page image directly and returns the entries as structured JSON. At 4B parameters it is small enough to run on an ordinary laptop, which matters because that is what a shop owner has. I ran it on a Ryzen 5 laptop with 8 GB RAM, about 100-120 seconds per page. The model name is a setting (&lt;code&gt;KHATALENS_MODEL&lt;/code&gt; or the Settings drawer), so any vision model Ollama can serve, including a fine-tuned Gemma, plugs in without code changes.&lt;/p&gt;

&lt;p&gt;The pipeline around it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;photo -&amp;gt; preprocess -&amp;gt; local VLM -&amp;gt; validate -&amp;gt; human review -&amp;gt; SQLite ledger -&amp;gt; WhatsApp link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preprocess (OpenCV):&lt;/strong&gt; resize to a fixed maximum side, even out phone-shadow lighting with CLAHE, and deskew using the notebook's ruled lines. I kept this light on purpose, because heavy binarisation tends to hurt vision models more than it helps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured output:&lt;/strong&gt; the model is asked for JSON that matches a schema, so the output is data, not prose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validation layer:&lt;/strong&gt; converts Devanagari digits, normalises dates (including missing years), and flags suspicious rows, such as an unreadable amount, instead of silently trusting the model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Human review before saving:&lt;/strong&gt; a small 4B model will misread handwriting sometimes, especially smudged amounts and unusual letter shapes. Rather than hide that, the product is built around it: every line is editable, and flagged lines are highlighted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SQLite ledger:&lt;/strong&gt; balance is total udhaar minus total payments. Customers are Pending (owes), Settled (exactly zero) or Needs a check (paid more than recorded). Deleting an entry is only allowed in that last view, and the server enforces it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reminders:&lt;/strong&gt; plain &lt;code&gt;wa.me&lt;/code&gt; links with message text in four languages. There is no WhatsApp API, no account and no cost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; plain HTML, CSS and JavaScript (no build step, no CDN, works offline) served by a small Python standard-library server on &lt;code&gt;127.0.0.1&lt;/code&gt;. Three themes: Clean, Ledger and Midnight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Training and evaluation tooling:&lt;/strong&gt; a synthetic handwritten-page generator that also writes a LLaMA-Factory training file, and an evaluation script that scores field-level accuracy for the base model, a fine-tuned model and a closed API on the same labelled pages.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Results so far.&lt;/strong&gt; On my own handwritten page (Hindi, mixed date formats), the base model got 6 of 10 lines fully right before review. I have not fine-tuned yet; that is the next step (see below).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A real-world bug that tests missed.&lt;/strong&gt; My sample pages worked, but the first real notebook photo crashed the server with a NumPy error. The cause was OpenCV's line detector returning a different array shape on my installed version than the one I had coded against. My sample-page mode skips the model and the image preprocessing entirely, so that code path never ran until I tried a real notebook photo. It is a small thing, but it is why the evaluation set has to be real handwriting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I would do next:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fine-tune a LoRA on synthetic pages plus pages in my own handwriting, and test only on handwriting the model has never seen.&lt;/li&gt;
&lt;li&gt;Compare base, fine-tuned and a closed API on the same test pages.&lt;/li&gt;
&lt;li&gt;Put it in front of a real shop owner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Building it:&lt;/strong&gt; I wrote the code with an AI coding assistant (Claude) in a chat session. The shipped product's AI is only the open-weight model running locally; nothing in the running app calls a hosted API.&lt;/p&gt;

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

&lt;p&gt;Three things would not be possible, or would not make sense, with a closed API.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Privacy is the product, not a feature.&lt;/strong&gt; A udhaar notebook is a list of neighbours and the money they owe. A shop owner will not photograph that and send it to a third party, and I would not want to be the one holding it. With an open-weight model running through Ollama, the photo is never sent anywhere. "Your customers' names and amounts never leave this computer" is a statement I can actually make true.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The economics only work offline.&lt;/strong&gt; A small shop may scan a few pages a week. A per-call API fee, a subscription, or a dependence on a stable internet connection all break that model. Local inference means the cost of the hundredth page is zero, and the app works when the shop's connection does not. A model as small as Gemma 3 4B is what makes that realistic: it runs on hardware the shop already owns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;I can adapt the model to the handwriting.&lt;/strong&gt; Handwritten Devanagari, regional shorthand and every shopkeeper's own style are exactly where a general model is weakest. Open weights mean I can fine-tune on pages like the ones I am trying to read, and measure the gain against a closed baseline. With a closed API I could only rewrite the prompt.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;&lt;strong&gt;Overall winner&lt;/strong&gt;, and &lt;strong&gt;Gemma&lt;/strong&gt; (featured category).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma:&lt;/strong&gt; KhataLens uses Gemma 3 4B, running locally through Ollama, to read handwritten Devanagari ledger pages straight from a photo and return structured entries. Gemma is the only AI in the running app. Its small size is what lets the whole thing run offline on a shop's existing laptop.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>pgaichallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>TrailBuddy: a local-first AI hiking companion that gets you off the screen</title>
      <dc:creator>Aryan Gupta</dc:creator>
      <pubDate>Fri, 09 Oct 2026 13:08:25 +0000</pubDate>
      <link>https://dev.to/aryan_gupta_1/trailbuddy-a-local-first-ai-hiking-companion-that-gets-you-off-the-screen-1n36</link>
      <guid>https://dev.to/aryan_gupta_1/trailbuddy-a-local-first-ai-hiking-companion-that-gets-you-off-the-screen-1n36</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;&lt;strong&gt;TrailBuddy&lt;/strong&gt; is a hiking companion that runs entirely on your own machine. You pick a real trail from your own GPX files, and a local open-weight model gives you a handful of small observation missions and a safety checklist for that trail, such as "listen for three different bird calls" or "find something that is growing on a tree it didn't start on."&lt;/p&gt;

&lt;p&gt;While you walk, you tell it what you spotted and it ticks the missions off for you. You can photograph something and get a short description of it. A Touch Grass Score goes up with missions completed, discoveries and time outside, and goes down with screen time. When you finish, the model writes a short first-person journal of the outing and saves it as Markdown and as a shareable HTML report.&lt;/p&gt;

&lt;p&gt;The idea is simple: &lt;strong&gt;the screen should be the shortest part of the walk.&lt;/strong&gt; TrailBuddy gives you a reason to look up (a mission), asks you to put the phone away, and only needs a few seconds of screen time to log what you found. It is for anyone who wants a reason to go on a walk or a hike, especially people who want an AI helper without sending their location, photos or journal to a server they don't control.&lt;/p&gt;

&lt;p&gt;One design rule I stuck to: &lt;strong&gt;the model never invents routes.&lt;/strong&gt; It only works with real trails you supply as GPX files. The model writes the missions and the journal. The distance, climb and time estimates come from the GPX data.&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%2F2gfh9pq21ii9etw4niqf.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%2F2gfh9pq21ii9etw4niqf.png" alt="TrailBuddy home" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

&lt;p&gt;TrailBuddy is built to run locally, so there is no hosted link. Setup takes a few minutes and is in the README.&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/aryanguptacsvtu" rel="noopener noreferrer"&gt;
        aryanguptacsvtu
      &lt;/a&gt; / &lt;a href="https://github.com/aryanguptacsvtu/Trail-Buddy" rel="noopener noreferrer"&gt;
        Trail-Buddy
      &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;TrailBuddy&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;TrailBuddy is an offline, voice-first hiking companion. It chooses from real GPX trails, suggests short observation missions, answers questions with a local Ollama model, and saves a short journal after the outing.&lt;/p&gt;
&lt;p&gt;You can use it two ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web UI&lt;/strong&gt; (&lt;code&gt;serve.py&lt;/code&gt;): a local browser interface with a trail picker, mission tracker, timers, photo scanner, chat and journal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command line&lt;/strong&gt; (&lt;code&gt;run.py&lt;/code&gt;): the original voice-first, keyboard-driven mode.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything runs on your machine. The browser talks to a small local server, and that server talks to Ollama.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/aryanguptacsvtu/Trail-Buddy/images/image1.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%2Faryanguptacsvtu%2FTrail-Buddy%2FHEAD%2Fimages%2Fimage1.png" width="48%" height="318"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/aryanguptacsvtu/Trail-Buddy/images/image2.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%2Faryanguptacsvtu%2FTrail-Buddy%2FHEAD%2Fimages%2Fimage2.png" width="50%" height="255"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/aryanguptacsvtu/Trail-Buddy/images/image3.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%2Faryanguptacsvtu%2FTrail-Buddy%2FHEAD%2Fimages%2Fimage3.png" width="62%" height="345"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What you need&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10 or newer&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; with a local model&lt;/li&gt;
&lt;li&gt;A microphone and speakers for voice mode (command line only)&lt;/li&gt;
&lt;li&gt;Optional: a Piper voice model for spoken replies (command line only)&lt;/li&gt;
&lt;li&gt;Optional: a vision-capable model such as &lt;code&gt;gemma3:4b&lt;/code&gt; for the web UI photo scanner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TrailBuddy does not create or navigate routes. Add GPX files exported from an online route…&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/aryanguptacsvtu/Trail-Buddy" 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;MIT licensed. Python 3.10+, standard-library web server, no frontend framework.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Open-source pieces:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ai.google.dev/gemma" rel="noopener noreferrer"&gt;Gemma 3 (4B)&lt;/a&gt; through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/strong&gt; This is the model behind everything: it writes missions and safety checklists, answers questions during the walk, works out which mission you've just completed from what you say, describes photos (Gemma 3 is multimodal) and writes the journal. The model name is set by one environment variable, &lt;code&gt;TB_MODEL&lt;/code&gt;, so you can swap it for another model such as &lt;code&gt;qwen3:4b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/SYSTRAN/faster-whisper" rel="noopener noreferrer"&gt;faster-whisper&lt;/a&gt;&lt;/strong&gt; for local speech-to-text and &lt;strong&gt;&lt;a href="https://github.com/rhasspy/piper" rel="noopener noreferrer"&gt;Piper&lt;/a&gt;&lt;/strong&gt; for local text-to-speech in the command-line, voice-first mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How it fits together:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser (HTML + CSS + vanilla JS)
   │  JSON over localhost
   |
Python standard-library server (web.py)
   │            │
router.py     llm.py --&amp;gt; Ollama --&amp;gt; Gemma
(GPX → km, climb, minutes)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;router.py&lt;/code&gt;&lt;/strong&gt; reads the GPX files and works out distance, elevation gain and estimated time. This is plain code, so the trail facts are never made up by the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;llm.py&lt;/code&gt;&lt;/strong&gt; is the only part that talks to the model. It has separate prompts for planning, mission detection, replies and the journal, with a shared safety instruction so the model doesn't give risky advice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;web.py&lt;/code&gt;&lt;/strong&gt; is a small &lt;code&gt;http.server&lt;/code&gt; app that serves the page and a few JSON endpoints. I deliberately used no web framework and no front-end build step, so the whole project installs with a short &lt;code&gt;requirements.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The same core also powers a &lt;strong&gt;command-line mode&lt;/strong&gt; (&lt;code&gt;run.py&lt;/code&gt;) for hands-free use with voice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lessons from building it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't leave hard constraints to the model.&lt;/strong&gt; My first version asked for "what kind of outing" and a time budget, then let the model choose one trail. With a 6-minute budget, no trail fit, so the router quietly fell back to showing all of them, and the model, which was never told the budget, picked a 35-minute loop that matched "moderate fitness." I removed the form. Now every trail is shown as a card, so you choose, and the model only does what it is good at: writing the missions and checklist for the trail you picked. Listing trails needs no model call at all, so it's instant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Let code do the facts.&lt;/strong&gt; Distances, climb and times come from the GPX, and the model gets them as input. Small local models are fine at writing and poor at arithmetic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be honest about the limits.&lt;/strong&gt; The photo scanner can be wrong, so the prompt asks for at most two short sentences and an interesting fact only when it is confident. The README also warns people never to use it to identify mushrooms or foraged food.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Current limitations:&lt;/strong&gt; you need a device that can run Ollama (a laptop for now), trails must come from GPX files you supply, the screen-time meter is manual, and the web UI has no voice input (the command-line mode does). Next steps are a phone-friendly or Raspberry Pi setup and filtering trails by time and fitness.&lt;/p&gt;

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

&lt;p&gt;A hiking app is the kind of tool that should work &lt;strong&gt;where the signal doesn't&lt;/strong&gt;. Open-weight models made three things possible that a closed API wouldn't have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It works offline.&lt;/strong&gt; Once the model, the speech model and your GPX files are downloaded, TrailBuddy needs no internet. A cloud API would turn every question on a remote trail into a failed request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your data stays with you.&lt;/strong&gt; TrailBuddy never sends your location, your photos of whatever you found, or your journal to any server. Everything is processed by a model running on your own machine. For an app that knows where you walk and when, that matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can swap and inspect the model.&lt;/strong&gt; One environment variable changes the model. You can choose a bigger one for better writing or a smaller one for older hardware, and there are no API keys, per-call costs or rate limits to plan around.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also means anyone can read, change and extend the whole stack: the code is MIT licensed and sits on open models and tools.&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;: Gemma 3 (4B), run locally through Ollama, powers every AI feature: mission writing, mission detection from natural language, photo understanding and the journal.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>pgaichallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Promise Keeper: Never Forget What You Promised, Even in Hinglish</title>
      <dc:creator>Aryan Gupta</dc:creator>
      <pubDate>Sat, 03 Oct 2026 07:22:12 +0000</pubDate>
      <link>https://dev.to/aryan_gupta_1/promise-keeper-never-forget-what-you-promised-even-in-hinglish-3pki</link>
      <guid>https://dev.to/aryan_gupta_1/promise-keeper-never-forget-what-you-promised-even-in-hinglish-3pki</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;&lt;strong&gt;Promise Keeper&lt;/strong&gt; is a small app that remembers what you promised people.&lt;/p&gt;

&lt;p&gt;I built it for my friend Amit, who makes a lot of promises in a lot of chats and has forgotten most of them by the end of the day.&lt;/p&gt;

&lt;p&gt;The problem isn't making promises. It's that they get buried in messages. A to-do app doesn't help, because nobody stops mid-conversation to write down "told Rahul I'd call tomorrow."&lt;/p&gt;

&lt;p&gt;So Promise Keeper works from the message itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paste something you said&lt;/strong&gt;, in English or Hinglish ("Kal subah main tumhe call karunga"). It extracts the promise, who it's owed to, and the deadline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import a WhatsApp chat export.&lt;/strong&gt; It reads only &lt;em&gt;your&lt;/em&gt; lines and finds promises you probably forgot. "Tomorrow" is resolved relative to when you &lt;em&gt;said&lt;/em&gt; it, so a promise from last week correctly shows up as overdue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You confirm everything&lt;/strong&gt; with date and time pickers before anything is saved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What am I forgetting?"&lt;/strong&gt; gives an honest list: overdue first, then coming up, then no deadline. You can also group by person ("what do I owe Rahul?").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Draft a nudge&lt;/strong&gt; for an overdue promise: a short, honest "still on it" message you can edit and send.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🎥 &lt;a href="https://github.com/aryanguptacsvtu/Promise-Keeper/blob/main/docs/demo-video.mp4" rel="noopener noreferrer"&gt;Watch the demo video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I didn't deploy a hosted version on purpose. The app reads private chats, so hosting it would defeat the point. It runs on your own machine in about five minutes (setup is in the README).&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/aryanguptacsvtu" rel="noopener noreferrer"&gt;
        aryanguptacsvtu
      &lt;/a&gt; / &lt;a href="https://github.com/aryanguptacsvtu/Promise-Keeper" rel="noopener noreferrer"&gt;
        Promise-Keeper
      &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;📝 Promise Keeper&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Built for a friend for the Hacktoberfest Weekend Challenge: &lt;em&gt;Build for a Friend&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A local-first assistant that remembers what you promised people. Paste a message
("I'll send you the report tonight" or "Kal subah main tumhe call karunga"), confirm what it found
and later ask &lt;strong&gt;"What am I forgetting?"&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/aryanguptacsvtu/Promise-Keeper/docs/image.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%2Faryanguptacsvtu%2FPromise-Keeper%2FHEAD%2Fdocs%2Fimage.png" alt="Promise Keeper"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open-source core:&lt;/strong&gt; an open-weight model (&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;Gemma 3&lt;/a&gt;) running locally through
&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, with storage in SQLite. No API keys, no accounts, works with Wi-Fi off.
Your messages and relationships never leave your machine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Requires &lt;strong&gt;Python 3.10+&lt;/strong&gt; and &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Pull a small open-weight model&lt;/span&gt;
ollama pull gemma3:4b

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Install and configure&lt;/span&gt;
python -m venv .venv &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="pl-c1"&gt;source&lt;/span&gt; .venv/bin/activate      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows: .venv\Scripts\activate&lt;/span&gt;
pip install -r requirements.txt
cp .env.example .env                                   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows: copy .env.example .env&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 3. Start the app&lt;/span&gt;
streamlit run app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Settings live in &lt;code&gt;.env&lt;/code&gt; (git-ignored). No API keys are…&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/aryanguptacsvtu/Promise-Keeper" 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 AI is &lt;strong&gt;Gemma 3 (4B)&lt;/strong&gt;, an open-weight model from Google, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. The app itself is Streamlit and SQLite. There are no API keys, accounts or remote servers.&lt;/p&gt;

&lt;p&gt;A few design decisions matter more than the model choice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model never does date maths.&lt;/strong&gt; Small models are bad at calendars. So the model only copies the phrase ("kal subah", "by Monday"), and plain Python turns it into a real date. That code has 30 test cases, including Hinglish like "5 baje" and "parso shaam".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "what am I forgetting?" list never comes from the model.&lt;/strong&gt; It's a database query. A language model asked "what did I promise?" can invent things, which is the worst thing a reminder app can do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured output.&lt;/strong&gt; The model is constrained to a JSON schema, so I get promises I can parse, not paragraphs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A human confirms everything.&lt;/strong&gt; Low-confidence guesses are dropped, and nothing is saved until you check it. Casual chat like "lol nice", "I won't be able to make it" and "if I get time I'll try" should produce nothing, and I wrote test cases for those.&lt;/p&gt;

&lt;p&gt;I compared models on 20 labelled messages (13 plain, 3 Hinglish, 4 tricky cases like negation and past tense):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Right # of promises&lt;/th&gt;
&lt;th&gt;Deadlines&lt;/th&gt;
&lt;th&gt;core&lt;/th&gt;
&lt;th&gt;edge&lt;/th&gt;
&lt;th&gt;hinglish&lt;/th&gt;
&lt;th&gt;Avg s/msg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma3:4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;17/20&lt;/td&gt;
&lt;td&gt;20/20&lt;/td&gt;
&lt;td&gt;11/13&lt;/td&gt;
&lt;td&gt;3/4&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;td&gt;8.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen2.5:3b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;18/20&lt;/td&gt;
&lt;td&gt;20/20&lt;/td&gt;
&lt;td&gt;11/13&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;td&gt;3.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two models are effectively tied. With 20 cases, a one-case gap isn't evidence that either is better. Both got every deadline and every Hinglish message right. Qwen was about twice as fast, which matters when importing a long chat.&lt;/p&gt;

&lt;p&gt;Both made the &lt;strong&gt;same two mistakes&lt;/strong&gt;: they treated a request ("Can you send me the notes by tonight?") and someone else's action ("Rahul will send the files tomorrow") as my own promises. Gemma also extracted a past-tense statement ("I sent you the report yesterday"). Since both models fail the same way, I read these as prompt weaknesses rather than model weaknesses, and they're the reason every extraction goes through human confirmation. The test set is small and the timings come from one machine, so treat the numbers as rough.&lt;/p&gt;

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

&lt;p&gt;A promise tracker reads your private conversations: who you talk to, what you owe them, what you've been avoiding. That's about as personal as data gets. Amit shouldn't have to send it to a company's servers to get a reminder.&lt;/p&gt;

&lt;p&gt;Open weights made three things possible that a closed API wouldn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nothing leaves the machine.&lt;/strong&gt; The data stays on the device by design, not by a privacy policy I'm asking you to trust. The demo video shows it running with Wi-Fi off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; There's no per-message bill, so scanning a whole year of a chat export is fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models is a one-line change.&lt;/strong&gt; The same app runs Gemma, Qwen or Llama by changing a name in the sidebar. That let me measure the models against each other on my own cases instead of accepting what one vendor offers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a language angle. Hinglish, meaning Hindi written in English letters, is how many people actually text. With open models I can test it directly, and eventually fine-tune for it. That's on my list for next steps.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma:&lt;/strong&gt; Gemma 3 4B is the core extraction model, running locally via Ollama. I benchmarked it against Qwen 2.5 on my own labelled cases, including Hinglish.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>INTRO</title>
      <dc:creator>Aryan Gupta</dc:creator>
      <pubDate>Fri, 02 Oct 2026 05:17:23 +0000</pubDate>
      <link>https://dev.to/aryan_gupta_1/intro-147c</link>
      <guid>https://dev.to/aryan_gupta_1/intro-147c</guid>
      <description>&lt;p&gt;I am new to the community, happy to be part of DEV.&lt;/p&gt;

&lt;p&gt;My Socials :&lt;br&gt;
&lt;a href="https://github.com/aryanguptacsvtu" rel="noopener noreferrer"&gt;https://github.com/aryanguptacsvtu&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/aryan-gupta-27814a306/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/aryan-gupta-27814a306/&lt;/a&gt;&lt;/p&gt;

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