<?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: Jay Dosi</title>
    <description>The latest articles on DEV Community by Jay Dosi (@jay-dosi).</description>
    <link>https://dev.to/jay-dosi</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%2F4157582%2F7041818a-04cf-48cf-b5ca-1a7f05954503.jpg</url>
      <title>DEV Community: Jay Dosi</title>
      <link>https://dev.to/jay-dosi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jay-dosi"/>
    <language>en</language>
    <item>
      <title>InvoiceFlow: local-first invoice &amp; receipt sorter for freelancers</title>
      <dc:creator>Jay Dosi</dc:creator>
      <pubDate>Tue, 13 Oct 2026 19:50:15 +0000</pubDate>
      <link>https://dev.to/jay-dosi/invoiceflow-local-first-invoice-receipt-sorter-for-freelancers-15jb</link>
      <guid>https://dev.to/jay-dosi/invoiceflow-local-first-invoice-receipt-sorter-for-freelancers-15jb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;InvoiceFlow&lt;/strong&gt; turns a folder of receipts, invoices, and PDFs into a clean&lt;br&gt;
CSV your accountant can actually use — 100% locally, with zero cloud API&lt;br&gt;
costs, zero token bills, and zero data leaving your laptop.&lt;/p&gt;

&lt;p&gt;It is built for the freelancer who keeps a shoebox of receipts, the Etsy&lt;br&gt;
seller who loses track of material spend, and the consultant whose&lt;br&gt;
accountant emails every March asking for "the CSVs."&lt;/p&gt;
&lt;h3&gt;
  
  
  What it does, end-to-end
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drop files&lt;/strong&gt; — PDFs (text layer + OCR fallback), images (local Tesseract
OCR), or plain text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parse&lt;/strong&gt; — hand-tuned regexes extract vendor, date, invoice number,
subtotal, tax, total, currency, and line items in ~50 ms/receipt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classify&lt;/strong&gt; — a local TF-IDF + LinearSVC classifier (trained on a 400+
example seed corpus that ships in the repo) assigns a category
(Software, Travel, Supplies, etc.). No model download, no tokens, no
rate limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deduplicate&lt;/strong&gt; — fuzzy vendor + amount + month matching catches
double-scanned receipts before they inflate your totals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; — CSV (QuickBooks/Gusto/Xero column order via &lt;code&gt;config.yaml&lt;/code&gt;),
JSON, JSONL, or a self-contained printable HTML report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer questions&lt;/strong&gt; — optional local LLM via Ollama on 127.0.0.1 lets
you ask "how much did I spend on software in September?" and get an
answer with an anti-hallucination check against the actual ledger
numbers.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Why someone would pay for this
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$20–$50/month saved&lt;/strong&gt; vs. QuickBooks Online / Expensify / Dext /
Shoeboxed SaaS tiers — no subscription ever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy by architecture&lt;/strong&gt; — your vendor list, amounts, and client
names never hit a server you don't control. A cloud API &lt;em&gt;cannot&lt;/em&gt; make
that claim; it &lt;em&gt;is&lt;/em&gt; the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works on an airplane&lt;/strong&gt; — offline-first means it runs on a laptop in
economy with no Wi-Fi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensible without code&lt;/strong&gt; — add your own categories, tax rules, and
vendor synonyms in &lt;code&gt;config.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Jay-Dosi/DEV-Challenge-3
&lt;span class="nb"&gt;cd &lt;/span&gt;invoice-flow
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python &lt;span class="nt"&gt;-m&lt;/span&gt; invoice_flow.cli parse ./examples/receipts &lt;span class="nt"&gt;--out&lt;/span&gt; ./parsed
python &lt;span class="nt"&gt;-m&lt;/span&gt; invoice_flow.cli report &lt;span class="nt"&gt;--month&lt;/span&gt; 2026-09 &lt;span class="nt"&gt;--format&lt;/span&gt; html
&lt;span class="c"&gt;# open ./parsed/report_2026-09.html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or launch the dashboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; invoice_flow.cli serve
&lt;span class="c"&gt;# open http://127.0.0.1:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Repo: &lt;a href="https://github.com/Jay-Dosi/DEV-Challenge-3" rel="noopener noreferrer"&gt;github.com/Jay-Dosi/DEV-Challenge-3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Key modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;invoice_flow/parser.py&lt;/code&gt; — regex-first parser with EU/US money handling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;invoice_flow/classifier.py&lt;/code&gt; — local TF-IDF + LinearSVC, ships trained&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;invoice_flow/offline_guard.py&lt;/code&gt; — OS-socket-layer proof of no outbound calls&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;invoice_flow/llm.py&lt;/code&gt; — optional local-LLM features with hallucination guard&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;invoice_flow/web.py&lt;/code&gt; — FastAPI dashboard, zero external dependencies&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Open-source AI used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;scikit-learn&lt;/strong&gt; — TF-IDF vectorizer + LinearSVC classifier. The model is
fit from a bundled seed corpus (&lt;code&gt;data/seed_corpus.py&lt;/code&gt;) in ~200 ms on a
laptop CPU, pickled to &lt;code&gt;models/expenses.pkl&lt;/code&gt;, and reused. No download, no
API, no tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tesseract OCR&lt;/strong&gt; (via &lt;code&gt;pytesseract&lt;/code&gt;) — local image-to-text for scanned
receipts. Pure native binary, no cloud vision API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama (optional)&lt;/strong&gt; — loopback HTTP to a local open-weight model
(&lt;code&gt;llama3.2:3b&lt;/code&gt; by default) for the two features where a small LLM genuinely
beats regex: natural-language ledger questions and one-sentence expense
descriptions. The loopback guard enforces 127.0.0.1 only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why open-weight / open-source matters here:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cost structure&lt;/strong&gt; — a cloud API at $0.002/request would cost a freelancer
with 2,000 receipts/year ~$4/month just in token calls. The local
classifier is free forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data never leaves&lt;/strong&gt; — a SaaS receipt parser &lt;em&gt;sends your banking,
vendor, and client data to their servers&lt;/em&gt;. InvoiceFlow's Offline Guard
patches &lt;code&gt;socket.socket.connect&lt;/code&gt; at the OS layer, counts every attempt,
and refuses anything that isn't loopback. You get a verifiable line at the
end of every run: &lt;code&gt;Verified fully on-device: 0 network call(s) blocked.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in&lt;/strong&gt; — the model, the parser, the database (SQLite), and the
config are all plain files you can copy, audit, or fork. If the project
stops, your data and your tool still work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinism for taxes&lt;/strong&gt; — an LLM summarizer is non-deterministic and
hallucinates totals. InvoiceFlow's classifier is deterministic (same
input → same category) and the parser never invents numbers. The optional
LLM answers are &lt;em&gt;validated against the actual parsed totals&lt;/em&gt; and fall back
to the deterministic report if any figure doesn't match.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;A freelance designer friend who files Schedule C every year. They ran it on&lt;br&gt;
their 2025 receipts folder (347 files):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Took 4 minutes. Found 12 duplicates I would have double-counted. The&lt;br&gt;
HTML report printed to PDF and my accountant didn't ask a single follow-up&lt;br&gt;
question. I cancelled my $28/mo Expensify subscription."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They asked for: recurring vendor auto-categorization (added via the label&lt;br&gt;
store), and CSV column reordering (already in &lt;code&gt;config.yaml&lt;/code&gt;).&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open Source AI&lt;/strong&gt; — built entirely on scikit-learn, Tesseract, and
optionally Ollama; no closed APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy / Local-First&lt;/strong&gt; — Offline Guard enforces and proves zero
outbound traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Side Hustle / Small Business&lt;/strong&gt; — targets freelancers, Etsy sellers,
consultants; saves real subscription money.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Open-Source Models&lt;/strong&gt; — the TF-IDF classifier and optional
Ollama hook demonstrate practical local inference.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>TrailEar: identify birds offline, with your phone in your pocket — plainest, most descriptive</title>
      <dc:creator>Jay Dosi</dc:creator>
      <pubDate>Sat, 10 Oct 2026 14:24:21 +0000</pubDate>
      <link>https://dev.to/jay-dosi/trailear-identify-birds-offline-with-your-phone-in-your-pocket-plainest-most-descriptive-2276</link>
      <guid>https://dev.to/jay-dosi/trailear-identify-birds-offline-with-your-phone-in-your-pocket-plainest-most-descriptive-2276</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;TrailEar is an offline, screen-last birding companion. It listens to the sounds of a walk, identifies bird calls entirely on-device with no internet, and at the end writes a short field journal using a local open-weight LLM. You tap "Start Walk," put the phone in your pocket, and just listen — a soft chime tells you when a new species is heard, so you never need to look. The screen only comes back out at the end.&lt;/p&gt;

&lt;p&gt;It's for beginner birders who want to know "what was that sound?" without staring at a phone, hikers and runners in low- or no-signal areas, and privacy-minded people who don't want their recordings and location living on someone else's server.&lt;/p&gt;

&lt;p&gt;The piece that makes it genuinely a get-off-the-screen, stay-private tool is the &lt;strong&gt;Offline Guard&lt;/strong&gt;: while a walk is running, TrailEar hard-blocks every non-loopback network socket at the OS layer and counts any attempt. The local LLM is still reachable over &lt;code&gt;127.0.0.1&lt;/code&gt;; everything else is refused. Each walk ends with a tamper-evident proof line like:&lt;br&gt;
&lt;code&gt;Verified fully on-device: 0 network call(s) blocked. Offline proof: a1b2c3d4e5f6a7b8.&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&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/Jay-Dosi" rel="noopener noreferrer"&gt;
        Jay-Dosi
      &lt;/a&gt; / &lt;a href="https://github.com/Jay-Dosi/DEV-Challenge-2" rel="noopener noreferrer"&gt;
        DEV-Challenge-2
      &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;🐦 TrailEar&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;An offline, screen-last birding companion powered by open-source AI.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Put your phone away, go outside, and let open-source AI keep the field notes.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;TrailEar listens to the sounds of a walk, identifies bird calls &lt;strong&gt;entirely
on-device with no internet&lt;/strong&gt;, and at the end writes a short field journal using
a &lt;strong&gt;local open-weight language model&lt;/strong&gt;. The screen stays in your pocket during
the walk — it's the shortest part of the experience.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05" rel="nofollow"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this is different&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Most nature apps need a signal (trails rarely have one), keep you staring at a
screen, and ship your recordings and location to a server you don't control
TrailEar inverts all three — and proves it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Offline Guard (our signature feature).&lt;/strong&gt; During a walk, TrailEar
&lt;em&gt;hard-blocks every non-loopback network socket at the OS layer&lt;/em&gt; and…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Jay-Dosi/DEV-Challenge-2" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&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/Jay-Dosi" rel="noopener noreferrer"&gt;
        Jay-Dosi
      &lt;/a&gt; / &lt;a href="https://github.com/Jay-Dosi/DEV-Challenge-2" rel="noopener noreferrer"&gt;
        DEV-Challenge-2
      &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;🐦 TrailEar&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;An offline, screen-last birding companion powered by open-source AI.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Put your phone away, go outside, and let open-source AI keep the field notes.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;TrailEar listens to the sounds of a walk, identifies bird calls &lt;strong&gt;entirely
on-device with no internet&lt;/strong&gt;, and at the end writes a short field journal using
a &lt;strong&gt;local open-weight language model&lt;/strong&gt;. The screen stays in your pocket during
the walk — it's the shortest part of the experience.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05" rel="nofollow"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this is different&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Most nature apps need a signal (trails rarely have one), keep you staring at a
screen, and ship your recordings and location to a server you don't control
TrailEar inverts all three — and proves it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Offline Guard (our signature feature).&lt;/strong&gt; During a walk, TrailEar
&lt;em&gt;hard-blocks every non-loopback network socket at the OS layer&lt;/em&gt; and…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Jay-Dosi/DEV-Challenge-2" 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;Bird ID:&lt;/strong&gt; &lt;a href="https://github.com/kahst/BirdNET-Analyzer" rel="noopener noreferrer"&gt;BirdNET&lt;/a&gt; via &lt;code&gt;birdnetlib&lt;/code&gt;, running locally on CPU over 3-second audio chunks. If it isn't installed, TrailEar falls back to a clearly-labelled simulated detector so the whole pipeline runs anywhere with zero downloads.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Journal:&lt;/strong&gt; A local open-weight model (Llama 3.2 1B) served by &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, reached only over loopback. If no LLM is running, a deterministic offline template writer produces the journal instead — so a journal always gets written, fully offline.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Guardrail:&lt;/strong&gt; The model only ever receives the detection list. After generation I post-validate the text and strip any bird it names that wasn't actually detected, with a visible correction note — so it can't hallucinate species.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Offline Guard:&lt;/strong&gt; A context manager monkeypatches the socket layer for the duration of the walk, blocking and counting non-loopback connections, then emits a hashed proof.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Storage:&lt;/strong&gt; SQLite, everything local. Raw audio isn't stored by default — only detections.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Config:&lt;/strong&gt; The bird model, the LLM, thresholds, location filter, and even the journal's tone are all swappable by editing &lt;code&gt;config.yaml&lt;/code&gt; — no code changes.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mic → Chunker → BirdNET (local) → Detections DB → Local LLM → Walk Journal (.md/.html)
                      ▲                                   (loopback only)
              lat/lon + week filter

(whole walk wrapped in the Offline Guard — all non-loopback traffic blocked)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;It works where closed APIs can't:&lt;/strong&gt; A cloud service can't identify a bird in a canyon with no signal. TrailEar runs with the network physically blocked.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Privacy by construction:&lt;/strong&gt; Audio and location never leave the device, and the Offline Guard proves it per walk — a closed API is the thing being blocked.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No cost, no API key, no account.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Control &amp;amp; longevity:&lt;/strong&gt; I can swap the bird model or the LLM and change the journal's tone with a one-line config edit. No vendor can deprecate it or change the terms underneath me.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Recipe Keeper: Turning Nani's Voice Memos into a 100% Local AI Cookbook</title>
      <dc:creator>Jay Dosi</dc:creator>
      <pubDate>Fri, 02 Oct 2026 17:15:56 +0000</pubDate>
      <link>https://dev.to/jay-dosi/recipe-keeper-turning-nanis-voice-memos-into-a-100-local-ai-cookbook-45jf</link>
      <guid>https://dev.to/jay-dosi/recipe-keeper-turning-nanis-voice-memos-into-a-100-local-ai-cookbook-45jf</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;Recipe Keeper is an application that turns rambling voice memos from home cooks into a clean, searchable, and printable family cookbook. &lt;/p&gt;

&lt;p&gt;I built this for my grandmother (Nani). Like many experienced home cooks, her recipes live entirely in her head. She cooks by feel, describing measurements as "a fistful of jeera," "enough water to cover plus two fingers," or "a good dollop of ghee." Asking her to type out recipes is a non-starter, and generic recipe apps demand precise metrics she doesn't use. &lt;/p&gt;

&lt;p&gt;This app solves that by letting her simply talk into her phone while cooking. We upload the audio, and the app transcribes and extracts the recipe while preserving her exact phrasing, highlighting estimated quantities, and saving all her tips and stories.&lt;/p&gt;

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

&lt;p&gt;Since this is a 100% offline, privacy-first desktop application designed to protect family data, there is no hosted live demo. You can test and demo it locally on your own machine by checking out the GitHub repository below!&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/Jay-Dosi" rel="noopener noreferrer"&gt;
        Jay-Dosi
      &lt;/a&gt; / &lt;a href="https://github.com/Jay-Dosi/DEV-Challenge-1" rel="noopener noreferrer"&gt;
        DEV-Challenge-1
      &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;Recipe Keeper&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Turn a loved one's rambling voice memos about their cooking into a clean, searchable, printable family recipe book, entirely on a laptop, with no internet and no cloud.&lt;/p&gt;
&lt;p&gt;Built for Nani, who cooks from memory.&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;
&lt;strong&gt;100% Local&lt;/strong&gt;: Uses open-weight models (&lt;code&gt;faster-whisper&lt;/code&gt;, &lt;code&gt;Ollama&lt;/code&gt;). No cloud APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fidelity First&lt;/strong&gt;: Keeps the cook's original phrasing (e.g. "a fistful of jeera"). Approximations are flagged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exportable&lt;/strong&gt;: Print a beautiful PDF cookbook, or export to Markdown/ZIP.&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;ol&gt;
&lt;li&gt;Install &lt;a href="https://ollama.ai/" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; and Python 3.10+.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;make setup&lt;/code&gt; (or &lt;code&gt;bash scripts/setup.sh&lt;/code&gt;). This installs dependencies and pulls the default LLM model (&lt;code&gt;qwen2.5:7b&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;make run&lt;/code&gt; to start the server.&lt;/li&gt;
&lt;li&gt;Visit &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Hardware &amp;amp; Model Swapping&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;16GB+ RAM&lt;/strong&gt;: The default &lt;code&gt;qwen2.5:7b&lt;/code&gt; is excellent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8GB RAM&lt;/strong&gt;: Change &lt;code&gt;model: "qwen2.5:7b"&lt;/code&gt; to &lt;code&gt;model: "llama3.2:3b"&lt;/code&gt; in &lt;code&gt;config.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Whisper defaults to &lt;code&gt;small&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Personalizing&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Edit &lt;code&gt;config.yaml&lt;/code&gt; to change the…&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/Jay-Dosi/DEV-Challenge-1" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The stack is built entirely around 100% open-source, locally run AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speech-to-Text:&lt;/strong&gt; &lt;code&gt;faster-whisper&lt;/code&gt; (running the open-weight Whisper &lt;code&gt;small&lt;/code&gt; model) to handle multilingual offline transcription (e.g., mixing English and Hindi).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM Extraction:&lt;/strong&gt; &lt;code&gt;Ollama&lt;/code&gt; serving open-weight models (like &lt;code&gt;qwen2.5:7b&lt;/code&gt; or &lt;code&gt;llama3.2:3b&lt;/code&gt; for lower-RAM laptops).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend/Frontend:&lt;/strong&gt; Python 3.10+, FastAPI, SQLite, and vanilla HTML/CSS/JS (no build steps).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core of the project relies on heavily engineered prompts that enforce strict "fidelity rules" on the LLM. The agent is instructed to &lt;strong&gt;never&lt;/strong&gt; invent ingredients, to map vague quantities to an &lt;code&gt;approx_metric&lt;/code&gt; flagged strictly as an &lt;code&gt;is_estimate&lt;/code&gt;, and to pull out exact quotes for an &lt;code&gt;original_phrase&lt;/code&gt; field.&lt;/p&gt;

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

&lt;p&gt;Family voices, stories, and recipes are incredibly personal and intimate. A cloud-based solution would require uploading my grandmother's private voice memos to third-party servers and paying per minute for transcription/extraction. &lt;/p&gt;

&lt;p&gt;Open-weight models make this project possible because they guarantee absolute privacy. The app runs completely offline, binding only to &lt;code&gt;127.0.0.1&lt;/code&gt;. It costs nothing to run, and because the weights are open, the app won't suddenly break when an API gets deprecated. It ensures this cookbook tool will work forever on a standard laptop.&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;Open-Source Innovation&lt;/li&gt;
&lt;li&gt;Best Use of AI / Local Models&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>HacktoberFest 2026</title>
      <dc:creator>Jay Dosi</dc:creator>
      <pubDate>Fri, 02 Oct 2026 16:26:20 +0000</pubDate>
      <link>https://dev.to/jay-dosi/hacktoberfest-2026-5d07</link>
      <guid>https://dev.to/jay-dosi/hacktoberfest-2026-5d07</guid>
      <description>&lt;p&gt;Participating in HacktoberFest 2026, already a open source contributor into multiple orgs.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
