<?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: Vaidehi Kakad</title>
    <description>The latest articles on DEV Community by Vaidehi Kakad (@vaidehisnk).</description>
    <link>https://dev.to/vaidehisnk</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%2F4169568%2Fb5773be2-8ffd-4a7f-9363-199a1c73312b.jpg</url>
      <title>DEV Community: Vaidehi Kakad</title>
      <link>https://dev.to/vaidehisnk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vaidehisnk"/>
    <language>en</language>
    <item>
      <title>I gave a 4B model all night to think, twice. It lost both times. Temporal never lost its place.</title>
      <dc:creator>Vaidehi Kakad</dc:creator>
      <pubDate>Sun, 25 Oct 2026 21:26:00 +0000</pubDate>
      <link>https://dev.to/vaidehisnk/i-gave-a-4b-model-all-night-to-think-twice-it-lost-both-times-temporal-never-lost-its-place-2dpp</link>
      <guid>https://dev.to/vaidehisnk/i-gave-a-4b-model-all-night-to-think-twice-it-lost-both-times-temporal-never-lost-its-place-2dpp</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/p&gt;

&lt;p&gt;The fable says slow and steady wins the race. I wanted to know if that's true for a language model, so I made one race itself. Same open model, same 4 GB laptop, same fifty questions. One answers immediately. The other gets the whole night.&lt;/p&gt;

&lt;p&gt;The hare won. Then I fixed what I thought was wrong with the tortoise, gave it a second night, and the hare won again.&lt;/p&gt;

&lt;p&gt;TL;DR: 50 two-hop questions, Gemma 3 4B on a 4 GB laptop. One quick call scored 42%. The all-night version (829 calls) scored 34%, then 30% after my fix. The accuracy experiment failed twice. The durable-overnight part worked perfectly: one night ran 17.5 hours, survived 14 hours of downtime and 91 failed model calls, and lost nothing.&lt;/p&gt;

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

&lt;p&gt;Tortoise is that race, built so I can do nothing while it runs. I queue the questions before bed, close the laptop if I want to, and read the result at breakfast.&lt;/p&gt;

&lt;p&gt;The hare reads all ten paragraphs at once and answers in one call. Fifty questions took 14 minutes.&lt;br&gt;
The tortoise reads each paragraph on its own, then re-reads the ones it skipped now that it knows what to look for. It writes three drafts, checks each one against its notes, and plain code votes. Fifty questions took 829 model calls.&lt;/p&gt;

&lt;p&gt;Both are Gemma 3 4B through Ollama on an RTX 2050 with 4 GB of VRAM. The questions are 50 seeded two-hop questions from HotpotQA ("who directed the film that starred…"), where the answer hides across two of ten paragraphs. The answers are known, so every score below is real exact match, not a vibe.&lt;/p&gt;

&lt;p&gt;A night is long and laptops get closed, so every one of the tortoise's 829 steps is a Temporal activity.&lt;/p&gt;

&lt;p&gt;Dashboard&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%2F20cwfwnzjoeve2vy979h.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%2F20cwfwnzjoeve2vy979h.png" alt=" " width="799" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo&lt;/p&gt;

&lt;p&gt;Watch the real night replay: &lt;a href="https://tortoise.vaidehi-k.tech" rel="noopener noreferrer"&gt;https://tortoise.vaidehi-k.tech&lt;/a&gt; Press Replay the night, then click any hexagon to see what the tortoise read, wrote and answered for that question.&lt;/p&gt;

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

&lt;p&gt;Code&lt;/p&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/vaidehi-snk" rel="noopener noreferrer"&gt;
        vaidehi-snk
      &lt;/a&gt; / &lt;a href="https://github.com/vaidehi-snk/tortoise" rel="noopener noreferrer"&gt;
        tortoise
      &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;tortoise&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The same small open model, racing itself on one laptop.&lt;/strong&gt; The hare answers each question in one call. The tortoise takes all night: it reads every paragraph on its own, re-reads the ones it skipped, writes three drafts, checks each against its notes and lets plain code vote. &lt;a href="https://temporal.io" rel="nofollow noopener noreferrer"&gt;Temporal&lt;/a&gt; makes every one of those steps durable, so you can kill the worker, close the lid or stop Ollama and it carries on from the exact step it was on.&lt;/p&gt;
&lt;p&gt;The questions are 50 seeded two-step questions from &lt;a href="https://hotpotqa.github.io" rel="nofollow noopener noreferrer"&gt;HotpotQA&lt;/a&gt; (distractor setting): each answer needs facts from two of ten paragraphs. Answers are known, so the score is real exact match, not vibes.&lt;/p&gt;
&lt;p&gt;Everything runs on your machine. Nothing leaves it.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup (once)&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; and pull the model
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;ollama pull gemma3:4b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Install the Python dependency (Python 3.10+):
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Download the questions:
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;python -m tortoise fetch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run the&lt;/h2&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/vaidehi-snk/tortoise" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;How I Built It&lt;br&gt;
hare      1 call: all 10 paragraphs -&amp;gt; {reasoning, answer}&lt;br&gt;
tortoise  one Temporal workflow per question, every step an activity:&lt;br&gt;
  read     x10  one paragraph at a time       -&amp;gt; {relevant, facts}&lt;br&gt;
  re-read  xN   the skipped ones, with pass-1 facts in hand&lt;br&gt;
  draft    x3   one careful (temp 0), two exploring (temp 0.7)&lt;br&gt;
  check    xM   each distinct answer against the notes&lt;br&gt;
  vote          plain code: +1 per agreeing draft, +2 if the check passed&lt;/p&gt;

&lt;p&gt;Both get the same answer rules and the same "reason, then answer" format. The only difference is time.&lt;/p&gt;

&lt;p&gt;Night one: the hare won&lt;br&gt;
    Exact match F1  Model calls Compute&lt;br&gt;
Hare    42% 0.57    50  14 min&lt;br&gt;
Tortoise    34% 0.43    829 1 h 8 min&lt;/p&gt;

&lt;p&gt;About five times the compute, eight points worse. The tortoise got 5 questions the hare missed, and missed 9 that the hare got.&lt;/p&gt;

&lt;p&gt;So I measured each slow step on its own:&lt;/p&gt;

&lt;p&gt;Step    Exact match&lt;br&gt;
Hare, one call  42%&lt;br&gt;
Tortoise, first draft only  36%&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;majority of 3 drafts  34%&lt;/li&gt;
&lt;li&gt;checked against its notes 34%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The damage was done before any voting. Reading slowly wasn't the problem: the second read found 43 facts the first read had skipped. My hypothesis was that the drafts were written from short extracted notes and never saw the paragraphs again, so for a two-hop question the link between the two facts got lost. The hare, sloppy as it is, has the actual text in front of it.&lt;/p&gt;

&lt;p&gt;Night two: I tested my own explanation, and it was wrong&lt;/p&gt;

&lt;p&gt;I changed exactly one thing. When the tortoise drafts and checks, it now sees the full text of the paragraphs it flagged, not only its notes. Same questions, same model, same hare, same 829 calls.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Night 1 Night 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Hare    42% 42%&lt;br&gt;
Tortoise, first draft   36% 32%&lt;br&gt;
Tortoise, final answer  34% 30%&lt;br&gt;
Tortoise F1 0.43    0.42&lt;br&gt;
Tortoise tokens 335,033 520,480&lt;/p&gt;

&lt;p&gt;More context made it slightly worse, not better. The lossy-notes story, which I believed and wrote down, doesn't explain the gap. If it did, giving the drafts the real text would have closed it.&lt;/p&gt;

&lt;p&gt;What the data does show:&lt;/p&gt;

&lt;p&gt;Long prompts cost it. The tortoise now read 55% more tokens, and 10 of its 150 drafts came back completely empty. In night one that number was 0. I haven't proven the two are linked, but a 4B model on 4 GB of VRAM has little room to spare.&lt;br&gt;
The loss is in multi-hop questions. On bridge questions (40 of the 50) the tortoise dropped from 35% to 28%. On the 10 comparison questions it held at 40% in night two, level with the hare.&lt;br&gt;
Voting still doesn't help. Majority of three drafts lowered the score again (32% → 30%), because the two exploring drafts at temperature 0.7 are mostly worse than the careful one.&lt;/p&gt;

&lt;p&gt;So my honest read: at 4B, more steps don't buy accuracy. Every step is another chance to be confidently wrong, and a vote across drafts from the same model mostly agrees with its own mistakes. Slow and steady only wins when each step is reliable, and I couldn't make them reliable here.&lt;/p&gt;

&lt;p&gt;Making it durable (the part that did work)&lt;/p&gt;

&lt;p&gt;A tortoise that runs all night can't start over every time something goes wrong. Each step is a Temporal activity with a heartbeat every 5 seconds, a 30-second heartbeat timeout, and unlimited retries with backoff. If Ollama goes down, the night waits for it instead of failing.&lt;/p&gt;

&lt;p&gt;Night two is the proof. It took 17 h 31 min of wall clock for 1 h 59 min of actual compute, because the machine spent 14 h 17 min asleep or stopped. During that time Temporal retried 91 real failures (the model was unreachable) and I killed the worker mid-question twice. Not one finished step ran again, and all 50 questions completed with every result intact.&lt;/p&gt;

&lt;p&gt;In night one, one step that had finished in the instant before a kill ran a second time. That's Temporal's at-least-once guarantee working as documented: the result hadn't been recorded yet, so it ran again, and because each step's output depends only on its input, a repeat changes nothing.&lt;/p&gt;

&lt;p&gt;The method is written once, as pure code with no clock and no randomness, and both Temporal and a plain --local loop run that same code.&lt;/p&gt;

&lt;p&gt;What I'd do differently&lt;br&gt;
Exact match is harsh. The tortoise often wrote "Ed Wood film" for "Ed Wood". But F1 (0.42 vs 0.57) and a lenient "contains the gold answer" check (22 vs 31 of 50) agree: the hare really was better, not just tidier.&lt;br&gt;
Fifty questions is a small sample. A few questions either way moves the score by several points, so I'd call night one and two "about the same, both below the hare" rather than trusting the 4-point difference between them.&lt;br&gt;
The next experiment isn't more steps. It's making the single best look better: a better reader prompt, or a bigger context on a bigger GPU.&lt;br&gt;
Why Does Open Innovation Matter?&lt;br&gt;
Being slow is only free when you own the model. The tortoise used 335,033 tokens one night and 520,480 the next. On my GPU that cost nothing. On a paid API, "think all night, twice" is a bill, so most people would never run this experiment, or learn that it doesn't work, which is the useful part.&lt;br&gt;
I could open up every step. JSON schemas, temperature per draft, the exact prompt each step saw, the notes it took. That's how I found the empty drafts and falsified my own explanation. With a closed endpoint I'd only have seen "34%".&lt;br&gt;
It survives the real world. A local model that sleeps with the laptop needs a durable runner. Open-source Temporal made the 14 hours of downtime a non-event.&lt;br&gt;
Open all the way down: open weights, an open benchmark, and an open-source durability engine.&lt;/p&gt;

&lt;p&gt;Where a closed model would win: a frontier model would probably beat both of mine in one call. It just wouldn't run on my laptop, overnight, for free.&lt;/p&gt;

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

&lt;p&gt;Queue your questions, go to sleep, close the lid, wake up to answers. The part I was proudest of is the boring one: nothing I did during those 17 hours mattered, and nothing broke.&lt;/p&gt;

&lt;p&gt;Prize Categories&lt;br&gt;
Best Use of Temporal: every tortoise step is a durable activity with heartbeats and unlimited retries. Night two survived 14 h 17 min of downtime and 91 failed model calls with zero finished steps redone, from a deterministic method shared with a local runner.&lt;br&gt;
Best Use of Gemma: Gemma 3 4B is both contestants, running locally through Ollama with structured JSON output.&lt;br&gt;
Best Use of a .tech Domain: the replay lives at tortoise.vaidehi-k.tech.&lt;br&gt;
Best Use of ElevenLabs: the narration of the demo video is generated with ElevenLabs text-to-speech, timed line by line to the captions, which are themselves written from the real run data.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>The world's corner shops still run on a credit notebook. I gave it Gemma, TabPFN and no internet.</title>
      <dc:creator>Vaidehi Kakad</dc:creator>
      <pubDate>Fri, 16 Oct 2026 09:36:28 +0000</pubDate>
      <link>https://dev.to/vaidehisnk/the-worlds-corner-shops-still-run-on-a-credit-notebook-i-gave-it-gemma-tabpfn-and-no-internet-2m9m</link>
      <guid>https://dev.to/vaidehisnk/the-worlds-corner-shops-still-run-on-a-credit-notebook-i-gave-it-gemma-tabpfn-and-no-internet-2m9m</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;
  
  
  The notebook behind the counter
&lt;/h2&gt;

&lt;p&gt;In Mexico it's called &lt;em&gt;fiado&lt;/em&gt;. In a Philippine sari-sari store it's &lt;em&gt;utang&lt;/em&gt;, written on a &lt;em&gt;listahan&lt;/em&gt;. In an Indonesian warung it's &lt;em&gt;hutang&lt;/em&gt; or &lt;em&gt;bon&lt;/em&gt;. In India it's &lt;em&gt;udhaar&lt;/em&gt;, kept in a &lt;em&gt;khata&lt;/em&gt;. Different words, same notebook: the corner shop lets the neighbourhood take goods now and pay later, and writes it down by hand.&lt;/p&gt;

&lt;p&gt;Every kirana shop in India has one. It's a long, thin notebook, usually red, full of names like &lt;em&gt;Patil Kaku&lt;/em&gt; and &lt;em&gt;Sharma Ji&lt;/em&gt; and numbers that keep growing. That's the &lt;strong&gt;udhaar khata&lt;/strong&gt;, the credit book. Half the neighbourhood buys on it and pays at the end of the month… or the month after… or the month after that.&lt;/p&gt;

&lt;p&gt;At Narmada General Store in Aurangabad, I noticed how they carefully write down each and every order in a diary to keep track of daily transactions. Seeing them maintain these handwritten records made me realise how much shopkeepers rely on manual record-keeping and how easily managing so many entries can become time-consuming.&lt;/p&gt;

&lt;p&gt;Every app that tries to fix this asks the shopkeeper to &lt;em&gt;type&lt;/em&gt; during the evening rush with oil on their fingers. It also asks them to upload their customers' debts to someone else's server. So most of them still use the notebook.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Udhaar is an AI back-office for a corner shop that runs on the shop's own laptop.&lt;/strong&gt; It has one box. You can speak into it or type into it in Marathi, Hindi, English, Spanish, Filipino or Indonesian, or the mix people actually speak at a counter.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Doña Rosa, dos kilos de azúcar y un aceite, apúntalo, 96 pesos"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Aling Nena, isang kilong bigas at dalawang itlog, 85 utang"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Pak Budi ngutang beras 2 kilo dan minyak goreng 1 liter, 48.000"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All three become the same kind of entry in the same ledger. I built it around a real shop in Aurangabad, India, but nothing in it is Indian-only.&lt;/p&gt;

&lt;p&gt;Say something the way you'd write it in the notebook, and it gets written down:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Patil kaku, don kilo sakhar ani ek litre tel, 210 udhaar"&lt;/em&gt; → ₹210 udhaar for Patil Kaku: 2 kg sugar, 1 l oil.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask a question, and it answers from the shop's own records:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Bhosale dada kiti baki?"&lt;/em&gt; → Bhosale Dada owes ₹11,396. Last paid on 9 Sep. Chance of paying late: 99%.&lt;br&gt;
&lt;em&gt;"How much sugar next week?"&lt;/em&gt; → About 43 kg (usually 61). In the two weeks before Diwali: 154 kg, +27%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it answers the question every shopkeeper actually agonises over, which no notebook can:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"How much more udhaar can I give Shinde Mama?"&lt;/em&gt; → Safe to give up to ₹4,750 more. The most he has ever paid back in a month is ₹7,402.&lt;br&gt;
&lt;em&gt;"Bhosale dada ko aur udhaar de sakte?"&lt;/em&gt; → Collect first. He owes ₹11,396 and is 99% likely to pay late.&lt;br&gt;
&lt;em&gt;"What if Gaikwad Sir doesn't pay for 3 weeks?"&lt;/em&gt; → His chance of paying late goes from X% to Y%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every entry also gets a quiet &lt;strong&gt;price check&lt;/strong&gt;. If the mic hears &lt;em&gt;"920"&lt;/em&gt; for two kilos of sugar, Udhaar asks: &lt;em&gt;"₹920 for 2 kg sugar? This shop usually charges about ₹92."&lt;/em&gt; One tap fixes it. In a credit book, a wrong extra zero is someone's neighbour being asked for ₹828 they never borrowed.&lt;/p&gt;

&lt;p&gt;Every morning it hands the owner a three-line &lt;strong&gt;briefing&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who to collect from today, and why;&lt;/li&gt;
&lt;li&gt;what to order before the festival, and how much;&lt;/li&gt;
&lt;li&gt;how yesterday went compared with a usual day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each line comes with a one-tap action: &lt;strong&gt;Gemma drafts a polite WhatsApp reminder&lt;/strong&gt;, or &lt;strong&gt;a wholesaler order list&lt;/strong&gt; built from the forecast.&lt;/p&gt;

&lt;p&gt;Every risk score comes with its reasons in plain words, such as &lt;em&gt;"No payment in 34 days. Usually pays every 43."&lt;/em&gt; A shopkeeper won't trust a number they can't argue with.&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%2Fols7d4orh2c24k8xo5pp.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%2Fols7d4orh2c24k8xo5pp.png" alt=" " width="800" height="500"&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%2F9x271hynnrr5jbgtciwa.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%2F9x271hynnrr5jbgtciwa.png" alt=" " width="800" height="500"&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%2Fdebsqegsu32y0oxjtmh5.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%2Fdebsqegsu32y0oxjtmh5.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Who pays, and why open models are what make it a business
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Who pays:&lt;/strong&gt; the owner of a corner shop with 50–300 customers on credit. I’d price it at ₹149/month, less than one customer’s monthly sugar. The sample shop has ₹37,000 out on udhaar. If the briefing gets one late account collected a week sooner, or stops one extra zero, the month is paid for.&lt;/p&gt;

&lt;p&gt;That price only works if the AI costs me nothing per entry. A busy counter logs 150–300 lines a day, and every line goes through speech-to-text, a language model and a price check. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; Whisper and Gemma 3 4B run on my everyday laptop: an i5 with an RTX 2050 and 4 GB of VRAM. An entry costs electricity. With a per-call API, the AI bill would grow with every customer, and a ₹149 subscription would be underwater at a busy shop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; A khata is a list of which neighbours owe money. It shouldn't live on a server the shopkeeper has never heard of. The ledger is one SQLite file on the shop's laptop, and speech and parsing never leave it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works when the internet doesn't.&lt;/strong&gt; The shop's connection drops every time it rains. Udhaar doesn't notice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where open actually beat closed
&lt;/h3&gt;

&lt;p&gt;The reason I didn't expect: &lt;strong&gt;because Gemma is free to run, I can run it twice.&lt;/strong&gt; Every entry is written instantly by fast rules, then Gemma re-reads the same line in the background and quietly corrects it if it disagrees. With a paid API I'd never design that, because I'd be paying to re-check every entry. With a local model, a second opinion on every line costs nothing, and it's what makes the counter both fast &lt;em&gt;and&lt;/em&gt; accurate.&lt;/p&gt;

&lt;p&gt;The second: &lt;strong&gt;I could measure and swap.&lt;/strong&gt; I ran the same eval on Gemma 3 1B and 4B on my own GPU, saw the 1B was worse than my regex rules, and made the trade-off myself (below). I also constrain Gemma's output with a JSON schema through Ollama, so it can never return anything but a valid entry.&lt;/p&gt;

&lt;p&gt;Where closed would win, honestly: a frontier API would probably parse my held-out Spanish/Filipino/Indonesian lines better, and faster than my laptop does. For the predictions I &lt;em&gt;do&lt;/em&gt; use Prior Labs' hosted &lt;strong&gt;TabPFN-3.5&lt;/strong&gt;, because it's more accurate. It only ever sees anonymous numbers like &lt;em&gt;due amount, days since last payment, day-of-week, days to festival&lt;/em&gt;: no names, no items. A shop that wants zero network can switch to TabPFN's &lt;strong&gt;open weights running locally&lt;/strong&gt; with the same code.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; speak / type ─► faster-whisper ─► entry or question?
                                      │                         │
                        entry: rules now, Gemma re-reads    question: plan (rules, or Gemma
                        in the background (JSON schema)     for compound ones) → 1–3 tools
                                      │                         │
                        TabPFN price check ("₹920?")        tools: SQL ledger · TabPFN risk ·
                                      ▼                     credit limit · what-if · forecast
                                 SQLite khata ◄─────────────────┘   (every number comes from here)

        Gemma → WhatsApp reminder in the customer's language · morning briefing · wholesaler order
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The model routes, the database answers.&lt;/strong&gt; For questions, Gemma only decides &lt;em&gt;what&lt;/em&gt; is being asked: an intent such as "how much does X owe" or "forecast for item Y", plus the customer, item and period. The number in the answer always comes from a SQL query or a TabPFN prediction. Gemma can misunderstand a question, but it cannot invent a balance. For a tool that handles people's debts, I think that's the only acceptable design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speech → entry.&lt;/strong&gt; Gemma gets a short system prompt that explains how a kirana counter talks: &lt;em&gt;udhaar/khata&lt;/em&gt; = credit, &lt;em&gt;jama/dile&lt;/em&gt; = paid back, &lt;em&gt;sakhar&lt;/em&gt; = sugar, &lt;em&gt;tup&lt;/em&gt; = ghee. It also gets three examples. Ollama's &lt;code&gt;format&lt;/code&gt; parameter constrains it to a JSON schema, so I never have to regex the model's output. A small rule-based parser sits behind it, so the counter keeps working even if the model is still loading.&lt;/p&gt;

&lt;p&gt;I wrote 18 real-sounding counter lines, including Devanagari, half-payments and three items in one breath, and scored both parsers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parser&lt;/th&gt;
&lt;th&gt;Fully correct entries&lt;/th&gt;
&lt;th&gt;Median latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rules only&lt;/td&gt;
&lt;td&gt;12 / 18&lt;/td&gt;
&lt;td&gt;&amp;lt;1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 3 4B (local)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15 / 18&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 3 1B (local, fits the GPU)&lt;/td&gt;
&lt;td&gt;9 / 18&lt;/td&gt;
&lt;td&gt;~3.5 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gemma got the type of entry, the customer and the amount right on all 18 lines; the rules managed 15, 14 and 16. Gemma's three misses were all in the item list, which is the least costly mistake: the money is still right and the shopkeeper can fix an item with one tap.&lt;/p&gt;

&lt;p&gt;That left me with a real problem: my laptop's GPU has 4 GB, Gemma 3 4B needs about 3.5 GB plus room to think, so half of it spills onto the CPU and every entry takes ~6 seconds. Nobody waits 6 seconds per line in the evening rush. The 1B model fits the GPU completely, but it was &lt;em&gt;worse&lt;/em&gt; than my regex rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outside India.&lt;/strong&gt; I wrote 15 counter lines each in the style of a Mexican tiendita, a sari-sari store and a warung, and tuned the rule parser on them until it got all 15. That number is meaningless on its own, so I then wrote 9 &lt;em&gt;new&lt;/em&gt; lines I never tuned against:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lines&lt;/th&gt;
&lt;th&gt;Rules&lt;/th&gt;
&lt;th&gt;Gemma 3 4B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;India (Marathi / Hindi / English), 18&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spanish / Filipino / Indonesian, held out, 9&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Getting the rules to work in four languages taught me how many collisions there are: &lt;em&gt;don&lt;/em&gt; is "two" in Marathi but a title in Spanish ("Don Pepe"), and &lt;em&gt;andi&lt;/em&gt; is "eggs" in Marathi but a common Indonesian name ("Mas Andi"). Thousands are written "48.000" in Indonesia and spoken as "50 ribu". Those are exactly the cases the held-out lines catch, and where a language model earns its place.&lt;/p&gt;

&lt;p&gt;So Udhaar uses both. &lt;strong&gt;The rules write the entry instantly&lt;/strong&gt; (under a millisecond), and the shopkeeper can move on to the next customer. &lt;strong&gt;Gemma re-reads the same line in the background&lt;/strong&gt; and, if it understood it differently, quietly corrects the entry a few seconds later, with a small "Corrected by gemma3:4b" note. The counter gets the speed of the rules and the accuracy of the model. Questions work the same way: the rules answer the common phrasings instantly, and Gemma is only called for the long tail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who will pay late (TabPFN classifier).&lt;/strong&gt; There's no labelled dataset for "my neighbours' repayment habits", and a corner shop will never have enough data to train a model. That's exactly where TabPFN shines: it makes predictions from a few hundred rows with &lt;strong&gt;no training step&lt;/strong&gt;. I replay the khata and take a snapshot of every open account each week. Each snapshot gets labelled by whether that person repaid at least half their dues within 30 days. TabPFN learns from roughly 700 of these snapshots in seconds and scores today's accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to stock (TabPFN regressor).&lt;/strong&gt; Kirana demand is all calendar: weekends, the first week of the month when salaries land, and the build-up to festivals. Each row is &lt;em&gt;(item, day-of-week, salary week, days-to-festival, recent 7- and 28-day averages, horizon)&lt;/em&gt;. I predict every item × every day until Diwali in &lt;strong&gt;one batched call&lt;/strong&gt; instead of looping. With the API, refreshing every item’s forecast takes about 30 seconds, so it runs in the background and the counter never waits for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  TabPFN inside a small prediction agent
&lt;/h3&gt;

&lt;p&gt;Questions go through a tiny agent loop: &lt;strong&gt;plan, then call tools.&lt;/strong&gt; The planner is the instant rules for one-line questions, and Gemma for compound or advice-style ones (&lt;em&gt;"Shinde mama wants more for Diwali, should I? what does he owe?"&lt;/em&gt; → &lt;code&gt;customer_due&lt;/code&gt; + &lt;code&gt;credit_limit&lt;/code&gt;). Gemma only picks the tools; it never writes a number. &lt;br&gt;
The tools are SQL and TabPFN:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;credit_limit&lt;/code&gt;&lt;/strong&gt;: the fitted risk model re-scores the customer on a ladder of &lt;em&gt;"what if I give ₹X more"&lt;/em&gt;, all rungs in &lt;strong&gt;one batched TabPFN call&lt;/strong&gt;. The limit is the tighter of two things: the last rung before their late-payment risk crosses 35%, and the most they have ever repaid within 30 days. A small prior keeps the ladder honest: giving someone &lt;em&gt;more&lt;/em&gt; credit never makes them &lt;em&gt;safer&lt;/em&gt;, so the curve is not allowed to dip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;what_if&lt;/code&gt;&lt;/strong&gt;: the same model on a shifted snapshot: &lt;em&gt;21 more days with no payment&lt;/em&gt;, or &lt;em&gt;₹2,000 more on udhaar&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;price_check&lt;/code&gt;&lt;/strong&gt;: a TabPFN regressor learns price-per-unit from the shop's own last 2,000 entries (item, quantity, unit) and flags an amount that's more than 2.2× or under 0.45× what it expects. This is TabPFN as an anomaly detector, on the anomaly that matters most at a counter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every answer has a “How it got this” trace under it, showing each step, which engine ran it and how long it took. A shopkeeper won’t trust a number they can’t argue with, and neither would I.&lt;/p&gt;
&lt;h3&gt;
  
  
  Does it actually beat a guess?
&lt;/h3&gt;

&lt;p&gt;I hid the future and made each model predict it. For restocking, the "shopkeeper guess" is the usual 4-week average, which is how most owners order today. For late payments, the baseline is the rule every owner already uses: &lt;em&gt;worry once someone hasn't paid for a month&lt;/em&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Window&lt;/th&gt;
&lt;th&gt;Usual average&lt;/th&gt;
&lt;th&gt;Gradient boosting&lt;/th&gt;
&lt;th&gt;TabPFN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ordinary fortnight&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;23%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ganesh Chaturthi build-up&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Navratri build-up&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Forecast error (WAPE), lower is better.&lt;/em&gt; TabPFN wins exactly where it matters: the festival build-ups, when guessing from the usual average is most wrong. In an ordinary fortnight it's a tie.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Late-payment model&lt;/th&gt;
&lt;th&gt;AUC&lt;/th&gt;
&lt;th&gt;Hit rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Not paid in a month" rule&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradient boosting&lt;/td&gt;
&lt;td&gt;0.81&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.82&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These numbers come from 13 months of &lt;strong&gt;synthetic&lt;/strong&gt; shop history that I generated to mirror a real kirana: weekends, salary week, festival build-ups, and customers with different repayment habits. I say that plainly because a real shop's khata is exactly the data nobody should publish. &lt;/p&gt;

&lt;p&gt;The result is a card that says &lt;strong&gt;"Diwali in 25 days"&lt;/strong&gt; with ghee, maida, besan and sugar at the top. That’s the list any kirana owner will tell you runs out first.&lt;/p&gt;
&lt;h2&gt;
  
  
  My first user
&lt;/h2&gt;

&lt;p&gt;I haven’t put it in a shopkeeper’s hands yet. At Narmada General Store I watched every order go into a diary during the evening rush, and I built Udhaar for exactly that moment. The first real test is this week, on his counter, and I’ll post what breaks.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://udhaar.vaidehi-k.tech" rel="noopener noreferrer"&gt;https://udhaar.vaidehi-k.tech&lt;/a&gt;. The home page explains it in one screen; &lt;strong&gt;Try the sample shop&lt;/strong&gt; opens the app with typed entries. The microphone version runs on the shop's own laptop, by design.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/vaidehi-snk/udhaar &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;udhaar
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ollama pull gemma3:4b
python scripts/make_demo_data.py &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; uvicorn app.main:app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;scripts/serve_https.py&lt;/code&gt; puts it on the shop's Wi-Fi so the owner can use their phone as the mic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Automatic reminders on the 1st and 5th of the month, when salaries land&lt;/li&gt;
&lt;li&gt;A monthly bill per customer, sent on WhatsApp.&lt;/li&gt;
&lt;li&gt;An Android version with a small on-device model, for shops without a laptop.&lt;/li&gt;
&lt;li&gt;A one-click thermal receipt option for older aunties who still want a paper chit in hand.&lt;/li&gt;
&lt;li&gt;Fine-tuning a small Whisper on real counter audio, because Marathi grocery words are where it still stumbles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Built with
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B&lt;/strong&gt; (Ollama, local): entry parsing, the agent's planner, reminders in six languages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TabPFN-3.5&lt;/strong&gt; (Prior Labs): late-payment risk, credit limits, what-ifs, price checks, festival forecast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;faster-whisper&lt;/strong&gt; (local) · FastAPI · SQLite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; hosts the live demo's agent front end, deployed from &lt;code&gt;render.yaml&lt;/code&gt;, live on &lt;strong&gt;udhaar.vaidehi-k.tech&lt;/strong&gt;, a .tech domain claimed through Hacktoberfest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; runs the tests and re-scores the parser on every push, posting the table to the run summary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/vaidehi-snk/udhaar" rel="noopener noreferrer"&gt;github.com/vaidehi-snk/udhaar&lt;/a&gt; (MIT licensed)&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>SmritiPath: Turning Family Memories of a Place into a Walk, with Local AI</title>
      <dc:creator>Vaidehi Kakad</dc:creator>
      <pubDate>Sat, 10 Oct 2026 21:51:37 +0000</pubDate>
      <link>https://dev.to/vaidehisnk/smritipath-turning-family-memories-of-a-place-into-a-walk-with-local-ai-5acf</link>
      <guid>https://dev.to/vaidehisnk/smritipath-turning-family-memories-of-a-place-into-a-walk-with-local-ai-5acf</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;My neighbourhood in my hometown has changed a lot in ten years. The lane outside our society used to look huge, and now it is full of cars. There are far fewer green playgrounds, and the hospital near the one where children played cricket every evening has closed. But the small shops at the corner are still exactly where they were.&lt;/p&gt;

&lt;p&gt;SmritiPath turns a memory like this into a walking route. You describe a place the way you remember it, a local model picks out each place you mention, and you pin them on a map. The result is a Walk Pack: one page with a sketch map, what each stop was like then, questions to ask the person walking with you, and a blank "Now" line to fill in by pen. The AI does its work before the walk. Then the screen goes away and the walk is just you and someone who remembers.&lt;/p&gt;

&lt;p&gt;It is for anyone who has a person in their life who remembers how a place used to be: a parent, a grandparent, a neighbour. The goal is to get the two of you outside, standing where the memory happened.&lt;/p&gt;

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

&lt;p&gt;A short screen recording of the full flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste a memory of a place (or upload a recording) and click Find the stops.&lt;/li&gt;
&lt;li&gt;Each stop shows a quote from the text, checked by code.&lt;/li&gt;
&lt;li&gt;Pin each stop on the map and reorder the route.&lt;/li&gt;
&lt;li&gt;Download the Walk Pack, which works offline.&lt;/li&gt;
&lt;/ol&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%2Fh8uaj0w9l9rlliv9iqpz.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%2Fh8uaj0w9l9rlliv9iqpz.png" alt=" " width="800" height="361"&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%2F61pbmr4q0mvlmor93q8t.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%2F61pbmr4q0mvlmor93q8t.png" alt=" " width="800" height="361"&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%2Fvi4xrvfjz78zo072u2e7.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%2Fvi4xrvfjz78zo072u2e7.png" alt=" " width="800" height="363"&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%2Fnm9kdefcxe5wpm1yk2uk.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%2Fnm9kdefcxe5wpm1yk2uk.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/GyT9jgzB_PM" 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/vaidehi-snk" rel="noopener noreferrer"&gt;
        vaidehi-snk
      &lt;/a&gt; / &lt;a href="https://github.com/vaidehi-snk/smriti-path" rel="noopener noreferrer"&gt;
        smriti-path
      &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;SmritiPath&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Turn a spoken or written memory of a place into a walking route you take together.
Speech-to-text and stop-finding run locally with open-source models. Nothing is sent to any AI service.&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;ol&gt;
&lt;li&gt;Add a recording (faster-whisper) or paste a memory as text.&lt;/li&gt;
&lt;li&gt;A local model (gemma3:4b via Ollama) finds each place mentioned, with a quote from the speaker.
Code checks every quote really appears in the transcript.&lt;/li&gt;
&lt;li&gt;Pin the stops on a map (Leaflet + OpenStreetMap).&lt;/li&gt;
&lt;li&gt;Download the Walk Pack: one offline page with a sketch map, "then" stories,
questions to ask, and blank "Now" lines to fill in by pen on the walk.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&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;pip install -r requirements.txt
ollama pull gemma3:4b
uvicorn server:app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Open &lt;a href="http://127.0.0.1:8000" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:8000&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Audio and transcripts are git-ignored and never leave your machine. Map tiles and place search need internet while building; the Walk Pack itself works offline.&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/vaidehi-snk/smriti-path" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;ul&gt;
&lt;li&gt;Speech to text: faster-whisper (small model, CPU)&lt;/li&gt;
&lt;li&gt;Finding the stops: gemma3:4b through Ollama, with JSON-schema output&lt;/li&gt;
&lt;li&gt;Server and page: FastAPI, Leaflet and OpenStreetMap&lt;/li&gt;
&lt;li&gt;Walk Pack: a single HTML file with an SVG sketch map and no network requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first version had problems. It named stops "tree" and "cart", added a stray "quote:" label to quotes, and merged two places into one sentence the speaker never said. I fixed it with a stricter prompt and a worked example, and by adding a check in code that confirms every quote really appears in the transcript. Anything unverified is flagged on the page. A 4B model is not perfect, so every stop is editable before the Walk Pack is built.&lt;/p&gt;

&lt;p&gt;Limits: I have tested speech-to-text in English so far, and Hindi and Marathi are next. The map and place search need internet while building, but the Walk Pack itself works offline.&lt;/p&gt;

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

&lt;p&gt;Family memories are personal. With a closed cloud API I would have to upload my family's stories and voices to someone else's server. Here they never leave my laptop, it costs nothing to run, and the model is one line in the code, so swapping it for another is easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Test speech-to-text properly in Hindi and Marathi, since many family memories are told in those languages.&lt;/li&gt;
&lt;li&gt;Compare a few different open models for finding stops and see which handles messy, spoken memories best.&lt;/li&gt;
&lt;li&gt;Add an audio version of the Walk Pack, so the questions can be listened to instead of read on a screen.&lt;/li&gt;
&lt;/ul&gt;

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