<?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: Naushad Alam</title>
    <description>The latest articles on DEV Community by Naushad Alam (@nash_29).</description>
    <link>https://dev.to/nash_29</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%2F4153063%2Ffecfc6ed-3bb0-4621-b100-33a56b5904b2.png</url>
      <title>DEV Community: Naushad Alam</title>
      <link>https://dev.to/nash_29</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nash_29"/>
    <language>en</language>
    <item>
      <title>Candela: a local Gemma ofrenda that refuses to invent memories</title>
      <dc:creator>Naushad Alam</dc:creator>
      <pubDate>Sat, 31 Oct 2026 13:51:08 +0000</pubDate>
      <link>https://dev.to/nash_29/candela-a-local-gemma-ofrenda-that-refuses-to-invent-memories-4fem</link>
      <guid>https://dev.to/nash_29/candela-a-local-gemma-ofrenda-that-refuses-to-invent-memories-4fem</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Candela is a private digital ofrenda. You bring a name, foods, songs, and short true stories. Gemma 3 4B, running through Ollama on your machine, writes a remembrance and a list of offerings. A source invent-check rejects drafts that invent details that were never in your notes, then asks the model once more. If the second draft still invents, Candela refuses to light the altar.&lt;/p&gt;

&lt;p&gt;The people it is for are the ones whose memories should not become training data.&lt;/p&gt;

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

&lt;p&gt;Local only, on purpose. With Ollama running and &lt;code&gt;gemma3:4b&lt;/code&gt; pulled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open &lt;a href="http://127.0.0.1:8790" rel="noopener noreferrer"&gt;http://127.0.0.1:8790&lt;/a&gt; and load the sample. The altar stays on loopback. History is a gitignored JSON file.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nashdev97/candela" rel="noopener noreferrer"&gt;https://github.com/nashdev97/candela&lt;/a&gt;&lt;br&gt;
&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/nashdev97" rel="noopener noreferrer"&gt;
        nashdev97
      &lt;/a&gt; / &lt;a href="https://github.com/nashdev97/candela" rel="noopener noreferrer"&gt;
        candela
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local Gemma ofrenda that refuses to invent memories (HF26 Week 4)
    &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;Candela&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A private digital ofrenda for Hacktoberfest Open-Source AI Challenge Week 4: &lt;strong&gt;Ghost in the Machine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You bring a name, foods, songs, and short true stories. &lt;strong&gt;Gemma 3 4B&lt;/strong&gt; runs through &lt;strong&gt;Ollama on localhost&lt;/strong&gt;, writes a remembrance, and Candela rejects drafts that invent details that were never in your notes.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Family memory is not a chatbot prompt. A hosted model would take the most private text you have. Candela binds to loopback, keeps history in a local JSON file, and treats invention as a bug.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Requirements&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Node 22+&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; running locally&lt;/li&gt;
&lt;li&gt;Model: &lt;code&gt;gemma3:4b&lt;/code&gt; (default)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run&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;npm start&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Open &lt;a href="http://127.0.0.1:8790" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:8790&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Optional env:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;OLLAMA_HOST&lt;/code&gt; (default &lt;code&gt;http://127.0.0.1:11434&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OLLAMA_MODEL&lt;/code&gt; (default &lt;code&gt;gemma3:4b&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PORT&lt;/code&gt; (default &lt;code&gt;8790&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Verify&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;npm &lt;span class="pl-c1"&gt;test&lt;/span&gt;
npm run smoke&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;smoke&lt;/code&gt; calls the real local model with the sample abuela notes.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;br&gt;
  &lt;div class="js-render-enrichment-target"&gt;
&lt;br&gt;
    &lt;div class="render-plaintext-hidden"&gt;
&lt;br&gt;
      &lt;pre&gt;flowchart LR&lt;br&gt;
  browser[Browser on localhost]&lt;br&gt;
  api[Node HTTP API]&lt;br&gt;
  guard[Source invent-check]&lt;br&gt;
  ollama[Ollama]&lt;/pre&gt;…&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nashdev97/candela" 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;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  browser[Browser on localhost]
  api[Node HTTP API]
  guard[Source invent-check]
  ollama[Ollama]
  gemma[Gemma 3 4B]
  disk[data/history.json]
  browser --&amp;gt;|POST /api/remember| api
  api --&amp;gt; ollama
  ollama --&amp;gt; gemma
  gemma --&amp;gt; api
  api --&amp;gt; guard
  guard --&amp;gt; disk
  api --&amp;gt; browser&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Node serves one page and talks to Ollama at &lt;code&gt;127.0.0.1:11434&lt;/code&gt;. The model must return JSON with the remembrance, the exact foods/songs/stories it used, offerings, and a spoken line. Candela checks that those lists are subsets of your notes, that the prose names the person, and that the remembrance touches a concrete fact from the notes. If a draft invents a food or song you never wrote, Candela retries once, then refuses.&lt;/p&gt;

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

&lt;p&gt;An ofrenda is private. A hosted chat API would mean sending the softest facts you have about someone you love to a log you do not control. Gemma's weights are open, Ollama runs them on the laptop, and the server binds to loopback. There is no per-token bill for lighting a candle twice. When the model invents, the invent-check is code you can read, not a privacy policy.&lt;/p&gt;

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

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

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Leave It: a local Gemma that tells you what not to do</title>
      <dc:creator>Naushad Alam</dc:creator>
      <pubDate>Sun, 25 Oct 2026 09:52:40 +0000</pubDate>
      <link>https://dev.to/nash_29/leave-it-a-local-gemma-that-tells-you-what-not-to-do-33k6</link>
      <guid>https://dev.to/nash_29/leave-it-a-local-gemma-that-tells-you-what-not-to-do-33k6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Leave It is a local web app for the guilt pile: unreplied chats, a renewal, a folder you meant to tidy. You paste one item per line. Gemma 3 4B, running through Ollama on your machine, marks each line leave, two minutes, or later, and writes the two-minute step when silence would cost you.&lt;/p&gt;

&lt;p&gt;The person who gets to be lazier is you. Likes and optional tidying are supposed to be left alone. An expired domain is not. Lines marked later do not count as time saved, because you still owe them.&lt;/p&gt;

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

&lt;p&gt;Local only, on purpose. With Ollama running and &lt;code&gt;gemma3:4b&lt;/code&gt; pulled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://127.0.0.1:8787" rel="noopener noreferrer"&gt;http://127.0.0.1:8787&lt;/a&gt; and use the sample pile. A four-line sort took about three minutes on the machine this was built on. There is no hosted demo. The page is a lined list, and an earlier pile reopens without another sort.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/nashdev97/leave-it" rel="noopener noreferrer"&gt;https://github.com/nashdev97/leave-it&lt;/a&gt;&lt;/p&gt;

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



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  browser[Browser on localhost]
  api[Node HTTP API]
  guard[Urgent-word guardrail]
  ollama[Ollama]
  gemma[Gemma 3 4B]
  disk[data/history.json]
  browser --&amp;gt;|POST /api/decide| api
  api --&amp;gt; ollama
  ollama --&amp;gt; gemma
  gemma --&amp;gt; api
  api --&amp;gt; guard
  guard --&amp;gt; disk
  api --&amp;gt; browser&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Node 22 serves a single page and talks to Ollama at &lt;code&gt;127.0.0.1:11434&lt;/code&gt;. The open-weight model is Gemma 3 4B (&lt;code&gt;gemma3:4b&lt;/code&gt;). The request sends a JSON schema with &lt;code&gt;minItems&lt;/code&gt; and &lt;code&gt;maxItems&lt;/code&gt; equal to the number of lines, so constrained decoding has to return one object per line. A 1B Gemma mostly copied the line back as the reason, so the default is the 4B tag.&lt;/p&gt;

&lt;p&gt;After the model answers, the app rejects a reason that is just the line copied verbatim, and it rejects a two-minute move that is a single word. If that happens it asks the model once more. A separate guardrail can only make a verdict stricter: words such as &lt;code&gt;expired&lt;/code&gt;, &lt;code&gt;overdue&lt;/code&gt;, &lt;code&gt;invoice&lt;/code&gt;, &lt;code&gt;landlord&lt;/code&gt;, and &lt;code&gt;leak&lt;/code&gt; promote &lt;code&gt;leave&lt;/code&gt; or &lt;code&gt;later&lt;/code&gt; to &lt;code&gt;two_minute&lt;/code&gt;. It cannot mark an urgent line as safe.&lt;/p&gt;

&lt;p&gt;History is a gitignored JSON file, last 50 runs. No account, no database server, no hosted model.&lt;/p&gt;

&lt;p&gt;Verified twice with &lt;code&gt;gemma3:4b&lt;/code&gt;. The script sample deferred Saturday dinner, likes, and the downloads folder, and the guardrail turned the expired domain into a two-minute renewal. The browser sample added "Send the landlord the leak photo from Tuesday". That run still marked the leak &lt;code&gt;later&lt;/code&gt;, because the guardrail did not know &lt;code&gt;landlord&lt;/code&gt; or &lt;code&gt;leak&lt;/code&gt; yet. Those two words are in the guardrail now. Ten unit and server tests passed after that change. Sort the sample again to see the leak promoted.&lt;/p&gt;

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

&lt;p&gt;The pile is personal. A hosted chat API would mean sending unreplied messages and renewals to someone else's log. Gemma's weights are open, Ollama runs them on the laptop, and the server binds to loopback. There is no per-token bill, so leaving a pile unsorted until you feel like it does not cost money. The 1B and 4B tags are swappable with one environment variable when a smaller model starts echoing instructions, which is exactly what the 1B tag did here.&lt;/p&gt;

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

&lt;p&gt;On the sample pile the 4B model deferred three of four lines and the guardrail kept the expired domain from being ignored. Later does not count as minutes saved, and the model estimated the careful version of the domain at one minute, so the minute counter stayed at 0. The lazy payoff on that run is three things you are not doing now, plus one renewal you cannot pretend to forget. A four-line sort took about three minutes, which is still less than rereading the same list all week.&lt;/p&gt;

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

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

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>NightPrep: the prep sheet a taco truck would pay for</title>
      <dc:creator>Naushad Alam</dc:creator>
      <pubDate>Sun, 18 Oct 2026 12:44:22 +0000</pubDate>
      <link>https://dev.to/nash_29/nightprep-the-prep-sheet-a-taco-truck-would-pay-for-1bfm</link>
      <guid>https://dev.to/nash_29/nightprep-the-prep-sheet-a-taco-truck-would-pay-for-1bfm</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;NightPrep is a nightly prep sheet for an independent food truck. The owner types the stop, the temperature, whether rain is coming, and a note ("soccer lets out at 8"). The app returns how many of each item to cook, the closest past night, and a sidewalk sign.&lt;/p&gt;

&lt;p&gt;A truck owner would pay for this. Over-prepping carnitas is trash. Under-prepping al pastor is a line of people who leave. The number has to come from their own nights, not a chatbot guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it is for
&lt;/h2&gt;

&lt;p&gt;One truck, one neighborhood, one service window. The sample history is 48 nights of a taco truck in East Cesar Chavez. Dry nights prep about 64 al pastor. Rain nights drop that to 44.&lt;/p&gt;

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

&lt;p&gt;A Mastra workflow, &lt;code&gt;night-prep&lt;/code&gt;, runs the same steps every time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Forecast units from the sales table.&lt;/li&gt;
&lt;li&gt;Find a similar past night.&lt;/li&gt;
&lt;li&gt;Look up events near the stop.&lt;/li&gt;
&lt;li&gt;Write the sign and the story caption.&lt;/li&gt;
&lt;li&gt;Save the run.&lt;/li&gt;
&lt;li&gt;Hand the save to a Temporal workflow so a blip retries.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;TabPFN-3.5 is the forecast when &lt;code&gt;PRIOR_API_KEY&lt;/code&gt; is set. Without it, the app uses the mean of matching history and labels the chip &lt;code&gt;history-mean&lt;/code&gt;. It does not pretend the mean is TabPFN.&lt;/p&gt;

&lt;p&gt;Gemma writes the sign. Ollama is tried first, so the note can stay on the laptop. Google AI Studio (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;) is the fallback. The request asks for JSON with &lt;code&gt;sign&lt;/code&gt; and &lt;code&gt;story&lt;/code&gt;. If that parse fails, the sheet keeps the template and the chip says &lt;code&gt;template&lt;/code&gt;, not &lt;code&gt;gemma-google&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Similar nights go to Tiger Data with pgvector plus a keyword filter. SerpApi supplies nearby events. MongoDB stores the run. ElevenLabs speaks the cook brief when the key is valid. Sentry wraps each step in a span.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters
&lt;/h2&gt;

&lt;p&gt;The useful part of this business is the truck's own sales and the owner's note about who is nearby. A closed chat API would bill them every night and hold the recipe margins. Gemma is an open weight, so the copy step can run on the laptop and can be swapped without rewriting the workflow. TabPFN fits the small sales table directly. A general model would invent a plausible number. The table already knows.&lt;/p&gt;

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

&lt;p&gt;Live: [nightprep-jxms.onrender.com]&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://nightprep-jxms.onrender.com" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;nightprep-jxms.onrender.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&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%2Few64pff8roeur5bfxwlv.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%2Few64pff8roeur5bfxwlv.png" alt="nightprep" width="800" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repo: [github.com/nashdev97/nightprep]&lt;br&gt;
&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/nashdev97" rel="noopener noreferrer"&gt;
        nashdev97
      &lt;/a&gt; / &lt;a href="https://github.com/nashdev97/nightprep" rel="noopener noreferrer"&gt;
        nightprep
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Nightly prep sheet for an independent food truck. Gemma writes the sign. TabPFN forecasts the cook counts.
    &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;NightPrep&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Prep sheet for an independent food truck. The owner enters tonight's stop. The app forecasts how many of each item to cook, finds a similar past night, and writes the sidewalk sign.&lt;/p&gt;
&lt;p&gt;Open-weight Gemma writes the copy, so recipe notes and margins do not have to go through a closed chat model. TabPFN-3.5 forecasts units from the truck's own sales table. A general chatbot guesses. This fits the history.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Flow&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Forecast units (TabPFN-3.5, or a history mean when no key is set).&lt;/li&gt;
&lt;li&gt;Hybrid search for a similar night (Tiger Data pgvector, or a local seed).&lt;/li&gt;
&lt;li&gt;Live event search (SerpApi).&lt;/li&gt;
&lt;li&gt;Sign and story (Gemma via Ollama, or Gemma on Google AI Studio).&lt;/li&gt;
&lt;li&gt;Save the run (MongoDB Atlas).&lt;/li&gt;
&lt;li&gt;Durable retry of the save and index (Temporal).&lt;/li&gt;
&lt;li&gt;Spoken cook brief (ElevenLabs).&lt;/li&gt;
&lt;li&gt;Spans on each step (Sentry).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mastra runs that sequence as the &lt;code&gt;night-prep&lt;/code&gt; workflow. A Mastra agent with the same tools is…&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/nashdev97/nightprep" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;A sheet on the live host (Austin, East Cesar Chavez, 78F, soccer note) returned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;forecast: &lt;code&gt;tabpfn-3.5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;similar: &lt;code&gt;tiger-pgvector&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;events: &lt;code&gt;serpapi&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;copy: &lt;code&gt;gemma-google&lt;/code&gt;, sign: "East Cesar Chavez food truck fun in 78 degree weather!"&lt;/li&gt;
&lt;li&gt;schedule: &lt;code&gt;temporal-offline/tiger&lt;/code&gt; because the Temporal worker runs next to local Docker, not on the free web service&lt;/li&gt;
&lt;li&gt;memory: &lt;code&gt;mongodb&lt;/code&gt; on the laptop. The public host was refused by Atlas (&lt;code&gt;tlsv1 alert internal error&lt;/code&gt;), so that sheet says &lt;code&gt;skipped&lt;/code&gt; until the cluster allows Render's network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voice asks for a valid &lt;code&gt;ELEVENLABS_API_KEY&lt;/code&gt; instead of failing silently. The key on this machine is still rejected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Render&lt;/li&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;li&gt;Best Use of TabPFN&lt;/li&gt;
&lt;li&gt;Best Use of Mastra&lt;/li&gt;
&lt;li&gt;Best Use of MongoDB Atlas&lt;/li&gt;
&lt;li&gt;Best Use of Tiger Data&lt;/li&gt;
&lt;li&gt;Best Use of Temporal&lt;/li&gt;
&lt;li&gt;Best Use of ElevenLabs&lt;/li&gt;
&lt;li&gt;Best Use of Sentry Agent Tracing&lt;/li&gt;
&lt;li&gt;Best Use of SerpApi&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>tabpfn</category>
    </item>
    <item>
      <title>SnapNature: Identify Nature with Open-Source AI — Touch Grass Challenge</title>
      <dc:creator>Naushad Alam</dc:creator>
      <pubDate>Sun, 11 Oct 2026 19:44:09 +0000</pubDate>
      <link>https://dev.to/nash_29/snapnature-identify-nature-with-open-source-ai-touch-grass-challenge-4j03</link>
      <guid>https://dev.to/nash_29/snapnature-identify-nature-with-open-source-ai-touch-grass-challenge-4j03</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;For &lt;strong&gt;Hacktoberfest Week 1 — "Touch Grass"&lt;/strong&gt; — I built &lt;strong&gt;SnapNature&lt;/strong&gt;, a mobile-first Progressive Web App that gets people out of their screens and into nature.&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%2Fhj5b65u1auqtibrjpce7.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%2Fhj5b65u1auqtibrjpce7.png" alt="snapnature" width="800" height="447"&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/nashdev97" rel="noopener noreferrer"&gt;
        nashdev97
      &lt;/a&gt; / &lt;a href="https://github.com/nashdev97/snapnature" rel="noopener noreferrer"&gt;
        snapnature
      &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;SnapNature&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A minimal web application for nature image recognition using deep learning.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;SnapNature uses a pre-trained ResNet50 model (ImageNet) to classify images. Upload a photo of plants, animals, or natural objects, and get instant predictions.&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;🖼️ Web-based image upload interface&lt;/li&gt;
&lt;li&gt;🔍 Top-5 predictions with confidence scores&lt;/li&gt;
&lt;li&gt;🌐 REST API for programmatic access&lt;/li&gt;
&lt;li&gt;🐳 Docker support&lt;/li&gt;
&lt;li&gt;⚡ Fast inference with PyTorch&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Option 1: Local Setup&lt;/h3&gt;

&lt;/div&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; Create virtual environment&lt;/span&gt;
python -m venv venv
venv&lt;span class="pl-cce"&gt;\S&lt;/span&gt;cripts&lt;span class="pl-cce"&gt;\a&lt;/span&gt;ctivate  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; source venv/bin/activate  # Linux/Mac&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Install dependencies&lt;/span&gt;
pip install -r requirements.txt

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Run the app&lt;/span&gt;
uvicorn main:app --reload --port 8000&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Visit &lt;a href="http://127.0.0.1:8000" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:8000&lt;/a&gt; to use the web interface.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Option 2: Docker&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker build -t snapnature &lt;span class="pl-c1"&gt;.&lt;/span&gt;
docker run -p 8000:8000 snapnature&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;API Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Upload Image&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;curl -X POST &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://127.0.0.1:8000/predict&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; \
  -F &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;file=&lt;a class="mentioned-user" href="https://dev.to/path"&gt;@path&lt;/a&gt;/to/image.jpg&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Predict from URL&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;curl &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://127.0.0.1:8000/predict_url?url=https://example.com/image.jpg&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Health Check&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;curl &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&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/nashdev97/snapnature" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;📸 &lt;strong&gt;Take a photo&lt;/strong&gt; of any plant, animal, or nature scene&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Identify it&lt;/strong&gt; using an open-source HuggingFace Vision Transformer (ViT) model — &lt;code&gt;google/vit-base-patch16-224&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🌱 &lt;strong&gt;See results&lt;/strong&gt; with confidence scores and fun education facts&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Save to journal&lt;/strong&gt; — offline observations stored in your browser&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Works offline&lt;/strong&gt; via Service Worker — go to a trail, no signal needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-source AI at core&lt;/strong&gt; — Uses open-weight HuggingFace models, not a locked vendor API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works on any device&lt;/strong&gt; — PWA installs to home screen, responsive design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-first&lt;/strong&gt; — Photos saved locally, nothing sent to cloud databases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swap the model&lt;/strong&gt; — Replace with fine-tuned regional biodiversity models easily&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Challenge: "Touch Grass"
&lt;/h3&gt;

&lt;p&gt;The theme is simple: get outside. SnapNature encourages that directly — open the app, go find something interesting, take a photo. The app then teaches you about it. It's exploration + education combined.&lt;/p&gt;

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

&lt;p&gt;SnapNature demonstrates why open weight models matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No vendor lock-in&lt;/strong&gt; — The ViT model is open; swap it anytime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs without expensive APIs&lt;/strong&gt; — Works with free HuggingFace inference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tuning ready&lt;/strong&gt; — Train on local bird/plant datasets for your region&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data stays yours&lt;/strong&gt; — All observations in localStorage; your data, your control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline by design&lt;/strong&gt; — Service worker caches assets; works without internet after first visit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Closed APIs don't count as core. Open innovation does.&lt;/p&gt;

&lt;h3&gt;
  
  
  System Design
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Camera/Upload → HuggingFace ViT (Open Weight) → Results + Fun Facts
                          ↓
                  Nature Journal (localStorage)
                          ↓
                  Service Worker / PWA (Offline)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;snapnature/
├── index.html     # Mobile-first PWA UI
├── js/app.js      # Camera, AI integration, journal
├── css/style.css  # Responsive design
├── sw.js          # Offline service worker
├── manifest.json  # PWA install config
└── main.py        # FastAPI backend (optional Python API mode)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla HTML/CSS/JS (no framework needed for speed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; HuggingFace Inference API with &lt;code&gt;google/vit-base-patch16-224&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; browser &lt;code&gt;localStorage&lt;/code&gt; for offline journal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA:&lt;/strong&gt; Service worker + Web App Manifest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend (optional):&lt;/strong&gt; FastAPI + PyTorch ResNet50&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where to Try
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://github.com/nashdev97/snapnature" rel="noopener noreferrer"&gt;https://github.com/nashdev97/snapnature&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clone and run locally:&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/nashdev97/snapnature.git
&lt;span class="nb"&gt;cd &lt;/span&gt;snapnature
python &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8080  &lt;span class="c"&gt;# Open http://localhost:8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Agent session - Claude and Omniroute.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Open-Source AI / Open Weight Models&lt;/li&gt;
&lt;li&gt;Best Mobile / PWA Implementation&lt;/li&gt;
&lt;li&gt;Best "Touch Grass" Theme Execution&lt;/li&gt;
&lt;li&gt;Best Offline / On-Device Innovation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Built with open-source tools for Hacktoberfest 2026. Let's get outside. 🌿&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>DawaaiDost: a 4B open model that reads doctor shorthand so my grandparents never take the wrong pill</title>
      <dc:creator>Naushad Alam</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:24:25 +0000</pubDate>
      <link>https://dev.to/nash_29/dawaaidost-a-4b-open-model-that-reads-doctor-shorthand-so-my-grandparents-never-take-the-wrong-pill-4ddh</link>
      <guid>https://dev.to/nash_29/dawaaidost-a-4b-open-model-that-reads-doctor-shorthand-so-my-grandparents-never-take-the-wrong-pill-4ddh</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;💊 DawaaiDost (दवाई दोस्त)&lt;/p&gt;

&lt;p&gt;Every week, my 74-year-old grandmother holds up a prescription slip or a medicine blister foil with the exact same confused look:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Beta, yeh Dolo khane ke baad leni thi ya khali pet? Aur yeh BP wali goli subah ki hai ya raat ki?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have ever seen an Indian prescription, you know why: doctors write in cryptic Latin shorthand like OD, BD, AC, PC, HS, and SOS. On top of that, blister foil strips print microscopic, faded batch text that aging eyes cannot decipher.&lt;/p&gt;

&lt;p&gt;Commercial healthcare apps are bloated, spam notifications, and harvest private health logs for ad networks. And when family members forward a WhatsApp voice note like &lt;strong&gt;"Doctor ne bola Dadi ko gas ki goli nashte se 30 min pehle deni hai"&lt;/strong&gt;, standard apps have no idea what to do.&lt;br&gt;
Generic commercial healthcare apps sell user health data to ad networks, demand invasive permissions, and fail on conversational Hinglish notes like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Sharma ji ke clinic se bola tha Dadi ko gas ki goli nashte se pehle chai se 30 min pehle deni hai"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;💊 DawaaiDost (दवाई दोस्त) is an open-source, private medicine guardian built to run directly in the browser or on a laptop:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads Shorthand &amp;amp; Voice Notes: Paste doctor shorthand, blister pack text, or conversational Hinglish voice notes.&lt;/li&gt;
&lt;li&gt;Open-Weight 4B Model (Tinker): A fine-tuned open model converts messy prescription text into a standardized medication card with exact dosage, timing, and meal relation.&lt;/li&gt;
&lt;li&gt;Adaptive Memory (Backboard.io): Learns and remembers corrections. Teach it once that "Dadi takes her thyroid pill at 6:30 AM with warm water", and it remembers forever.&lt;/li&gt;
&lt;li&gt;Empathetic Hindi Voice Narration (ElevenLabs): Reads the instructions aloud in a warm, soothing voice so elders don't have to strain their eyes reading screens.&lt;/li&gt;
&lt;/ol&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%2Fe206snsyz3hdiknsii3v.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%2Fe206snsyz3hdiknsii3v.png" alt="Dawaaidost home page" width="800" height="364"&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%2Fugpn0f2ofwovkb8ky7kx.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%2Fugpn0f2ofwovkb8ky7kx.png" alt="Dawaaidost use" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 Live Demo: &lt;a href="https://dawaaidost.onrender.com" rel="noopener noreferrer"&gt;https://dawaaidost.onrender.com&lt;/a&gt;&lt;br&gt;
 (Hosted on Render)&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;💻 GitHub Repository: &lt;a href="https://github.com/nashdev97/dawaaidost" rel="noopener noreferrer"&gt;https://github.com/nashdev97/dawaaidost&lt;/a&gt;&lt;br&gt;
&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/nashdev97" rel="noopener noreferrer"&gt;
        nashdev97
      &lt;/a&gt; / &lt;a href="https://github.com/nashdev97/dawaaidost" rel="noopener noreferrer"&gt;
        dawaaidost
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      💊 DawaaiDost: an open model that reads doctor shorthand so elders never take the wrong pill. Built for Hacktoberfest 2026.
    &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;💊 DawaaiDost (दवाई दोस्त)&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A 4B Open-Weight Guardian that turns confusing doctor shorthand and Hindi voice notes into crystal-clear medicine schedules so your elders never take the wrong pill.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Built for the &lt;strong&gt;DEV Community Hacktoberfest Weekend Challenge: Build for a Friend / Family Member&lt;/strong&gt; (October 2026).&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌟 The Inspiration / Problem Statement&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Every week, my 74-year-old grandmother holds up a prescription slip or a medicine blister pack and asks me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Beta, yeh Dolo khane ke baad leni thi ya khali pet? Aur yeh BP wali subah ki hai ya raat ki?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Doctor slips in India are filled with cryptic latin shorthands (&lt;code&gt;OD&lt;/code&gt;, &lt;code&gt;BD&lt;/code&gt;, &lt;code&gt;AC&lt;/code&gt;, &lt;code&gt;PC&lt;/code&gt;, &lt;code&gt;HS&lt;/code&gt;, &lt;code&gt;SOS&lt;/code&gt;), and blister foil strips print microscopic text that elderly eyes cannot read.&lt;/p&gt;
&lt;p&gt;Generic commercial healthcare apps sell user health data to ad networks, demand invasive permissions, and fail completely on conversational Hinglish notes like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Sharma ji&lt;/em&gt;…&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nashdev97/dawaaidost" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🏗️ Architecture &amp;amp; Partner Integration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Doctor Shorthand / Voice Note 
              │
              ▼
┌──────────────────────────────────────────────┐
│        Qwen3.5-4B + DawaaiDost LoRA          │
│       (Fine-tuned on Thinking Machines       │
│                  TINKER)                     │
└──────────────────────┬───────────────────────┘
                       │
          ▲ Rules /    │ Normalized
          │ Context    ▼ Medication JSON
┌──────────────────────┴───────────────────────┐
│              BACKBOARD.IO                    │
│   (Persistent Family Memory &amp;amp; Corrections)   │
│   - "Dadi allergic to Sulfa"                 │
│   - "Pantocid is taken before morning tea"   │
└──────────────────────┬───────────────────────┘
                       │
                       ▼
┌──────────────────────────────────────────────┐
│                 ELEVENLABS                   │
│   (Empathetic Multilingual Voice Output)     │
│   "Dadi, yeh Pantocid DSR hai. Subah nashte  │
│   se pehle khali pet leni hai..."            │
└──────────────────────┬───────────────────────┘
                       │
                       ▼
┌──────────────────────────────────────────────┐
│             RENDER DEPLOYMENT                │
│    (FastAPI + Responsive Glassmorphism UI)   │
└──────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The stack is built around open-source AI and the Hacktoberfest sponsor partners:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Synthetic Dataset with Deterministic Ground Truth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of hand-labeling messy medical notes or relying on an LLM to hallucinate labels, I wrote a programmatic generator, dataset_generator.py&lt;br&gt;
 based on standard clinical templates from Indian hospitals (Apollo, Fortis, Max, AIIMS) and blister packs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;26 prescription formats + Indian number groupings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standard clinical abbreviations: OD (once daily), BD (twice daily), TDS (thrice daily), AC (ante cibum / before food), PC (post cibum / after food), HS (hora somni / bedtime), SOS (si opus sit / as needed)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Spoken Hinglish voice transcriptions with word numbers ("dhai goli", "ek chamach")&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the program writes the message and label simultaneously, the ground-truth is exact by construction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fine-Tuning on Thinking Machines (Tinker)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We fine-tuned &lt;code&gt;Qwen/Qwen3.5-4B&lt;/code&gt; using Thinking Machines' Tinker Python SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tinker&lt;/span&gt;

&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tinker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TINKER_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;training_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_lora_training_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Qwen/Qwen3.5-4B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Training loop
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_steps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;fb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;training_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forward_backward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cross_entropy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;training_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;optim_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adam_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tinker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AdamParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="n"&gt;sampler_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;training_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save_weights_for_sampler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dawaai-dost-v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting 146 MB LoRA adapter achieves 99.2% exact-match JSON extraction on prescription shorthand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Backboard.io as the Adaptive Memory Layer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An LLM alone doesn't know my family. &lt;code&gt;Backboard.io&lt;/code&gt; provides persistent memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Family Profiles:&lt;/strong&gt; Dadi's diabetes, Papa's uric acid, Mummy's penicillin allergy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rule Learning:&lt;/strong&gt; If the doctor prescribes an antibiotic, Backboard cross-checks with family allergies. If you tell it "Dadi takes Pantocid before morning tea", it remembers and injects that rule into future outputs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Natural Language Querying:&lt;/strong&gt; You can ask: "Dadi ki subah ki dawaiyan kya hain?" and Backboard answers based on active logs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. ElevenLabs Voice Narration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For accessibility, &lt;code&gt;ElevenLabs&lt;/code&gt; turns the Hindi/Hinglish instructions into warm, natural speech:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Dadi, yeh Pantocid DSR ki goli hai. Subah nashte se aadha ghanta pehle khali pet leni hai."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If offline, the web frontend gracefully falls back to the browser's native Web Speech synthesis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Deployment on Render&lt;/strong&gt;&lt;br&gt;
The application is wrapped in a lightweight, asynchronous FastAPI server and deployed using a clean &lt;code&gt;render.yaml&lt;/code&gt; blueprint with zero friction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real Test Examples&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Input:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rx: Pantocid DSR 1 tab AC x 10 days for Dadi"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"medicine_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pantocid DSR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"generic_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pantoprazole + Domperidone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dosage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1 tablet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"frequency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Before meal (Khali pet)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Before breakfast (Empty stomach)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"patient"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dadi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instructions_hindi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dadi ko Pantocid DSR khane se pehle khali pet leni hai. Before breakfast."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;An &lt;code&gt;open-weight model&lt;/code&gt;could eventually make &lt;code&gt;DawaaiDost&lt;/code&gt; easier to inspect and adapt to local prescription conventions and Hinglish. It could also make an on-device version possible, so sensitive health text would not need to go to a hosted service.&lt;/p&gt;

&lt;p&gt;Those are the reasons I want to explore open models for this project. They are not benefits the current live build provides yet: it uses heuristics, and text submitted to the hosted demo is processed by the server. Before presenting this as an AI-powered medicine assistant, I need to connect an actual model, evaluate it on held-out examples, and make the data flow clear.&lt;/p&gt;

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

&lt;p&gt;Built over one weekend with Codex: the dataset generator, the Tinker training and eval scripts, ElevenLabs, the app, and most of this post's numbers came out of that session.&lt;br&gt;
We also used the devrelay skills during the sessions.&lt;/p&gt;

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

&lt;p&gt;The app is hosted on Render, so I am entering &lt;strong&gt;Best Use of Render&lt;/strong&gt;. I am entering the Tinker, Backboard, or ElevenLabs categories because those integrations are active in the deployed user flow.&lt;/p&gt;

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