<?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: Shaurya Srivastava</title>
    <description>The latest articles on DEV Community by Shaurya Srivastava (@shaurya_srivastava_027f4e).</description>
    <link>https://dev.to/shaurya_srivastava_027f4e</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%2F4161394%2F69feeaf5-95b8-4677-81b6-595adfd34c5b.jpg</url>
      <title>DEV Community: Shaurya Srivastava</title>
      <link>https://dev.to/shaurya_srivastava_027f4e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shaurya_srivastava_027f4e"/>
    <language>en</language>
    <item>
      <title>I Built a Private, Offline Lecture-to-Notes Tool with Whisper and Gemma 3</title>
      <dc:creator>Shaurya Srivastava</dc:creator>
      <pubDate>Sun, 25 Oct 2026 13:00:07 +0000</pubDate>
      <link>https://dev.to/shaurya_srivastava_027f4e/i-built-a-private-offline-lecture-to-notes-tool-with-whisper-and-gemma-3-4e1k</link>
      <guid>https://dev.to/shaurya_srivastava_027f4e/i-built-a-private-offline-lecture-to-notes-tool-with-whisper-and-gemma-3-4e1k</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;&lt;strong&gt;Lecture2Notes&lt;/strong&gt; is a local-first command-line tool that turns a lecture recording into study material. Give it an MP3, M4A or MP4 and it produces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structured &lt;strong&gt;study notes&lt;/strong&gt; (overview, definitions, formulas, algorithms, examples, common mistakes, quick-revision summary and &lt;strong&gt;revision questions&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;a timestamped &lt;strong&gt;transcript&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a validated list of &lt;strong&gt;assignments, quizzes, exams and deadlines&lt;/strong&gt;, each with the timestamp and the evidence from the recording&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It saves the hour of re-listening and note-taking that usually follows a lecture, and it helps anyone who has ever missed an announcement like "the lab report is due next Friday" because they were writing something else down.&lt;/p&gt;

&lt;p&gt;The part I care most about is trust. An AI note-taker that makes up a deadline is worse than none, so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the lecturer's wording is kept as-is (&lt;code&gt;"next Friday"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;calendar dates stay &lt;code&gt;null&lt;/code&gt; unless you supply the real lecture date&lt;/li&gt;
&lt;li&gt;every action item needs evidence from the transcript or it is dropped&lt;/li&gt;
&lt;li&gt;if any step fails, the notes carry a visible &lt;strong&gt;INCOMPLETE&lt;/strong&gt; banner instead of pretending everything worked&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs on your own machine: no cloud transcription, no API key, no uploading private recordings.&lt;/p&gt;

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

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

&lt;p&gt;Example of what the action-item output looks like:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assignment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Submit the lab report on binary search trees"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deadline_text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next Friday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deadline_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00:01:20"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The lecturer says the lab report must be submitted next Friday."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"needs_verification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;
  
  
  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/shauryasri14" rel="noopener noreferrer"&gt;
        shauryasri14
      &lt;/a&gt; / &lt;a href="https://github.com/shauryasri14/Lecture2notes" rel="noopener noreferrer"&gt;
        Lecture2notes
      &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;Lecture2Notes&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Turn a lecture recording into study notes, revision questions and a list of assignments/deadlines, entirely on your own computer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lecture2Notes transcribes a recording with &lt;a href="https://github.com/SYSTRAN/faster-whisper" rel="noopener noreferrer"&gt;faster-whisper&lt;/a&gt;, then uses a local LLM served by &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; (default: &lt;code&gt;gemma3:4b&lt;/code&gt;) to write structured notes. No cloud service, no API key, no upload of your recordings.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#what-it-does" rel="noopener noreferrer"&gt;What it does&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#requirements" rel="noopener noreferrer"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#setup" rel="noopener noreferrer"&gt;Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#command-line-options" rel="noopener noreferrer"&gt;Command-line options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#output-files" rel="noopener noreferrer"&gt;Output files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#trying-it-without-audio" rel="noopener noreferrer"&gt;Trying it without audio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#demo-guide" rel="noopener noreferrer"&gt;Demo guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#configuration-env" rel="noopener noreferrer"&gt;Configuration (.env)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#performance-expectations" rel="noopener noreferrer"&gt;Performance expectations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#privacy" rel="noopener noreferrer"&gt;Privacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#project-structure-and-tests" rel="noopener noreferrer"&gt;Project structure and tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shauryasri14/Lecture2notes#known-limitations" rel="noopener noreferrer"&gt;Known limitations&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Transcribes MP3, WAV, M4A, MP4 and other audio/video files, keeping real segment timestamps.&lt;/li&gt;
&lt;li&gt;Splits the transcript into overlapping chunks and summarizes each one.&lt;/li&gt;
&lt;li&gt;Merges the summaries into one study document: overview, definitions, formulas, algorithms, examples, common mistakes, quick-revision summary and revision questions.&lt;/li&gt;
&lt;li&gt;Finds &lt;strong&gt;assignments, quizzes, exams and deadlines&lt;/strong&gt; in the transcript and saves them as validated JSON with the timestamp 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/shauryasri14/Lecture2notes" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/shauryasri14/Lecture2Notes
&lt;span class="nb"&gt;cd &lt;/span&gt;Lecture2Notes
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate   &lt;span class="c"&gt;# Windows: .\.venv\Scripts\Activate.ps1&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
ollama pull gemma3:4b
python lecture2notes.py lecture.mp3 &lt;span class="nt"&gt;--whisper-model&lt;/span&gt; base &lt;span class="nt"&gt;--language&lt;/span&gt; en
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The README covers setup for Windows, Linux and macOS, plus a troubleshooting table.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Open-source stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;faster-whisper&lt;/strong&gt; (Whisper speech recognition) for local transcription with real segment timestamps, running on CPU by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B&lt;/strong&gt; (an open-weight model) served by &lt;strong&gt;Ollama&lt;/strong&gt; for summaries, merging and extraction&lt;/li&gt;
&lt;li&gt;Plain &lt;strong&gt;Python&lt;/strong&gt;, &lt;code&gt;requests&lt;/code&gt;, &lt;strong&gt;watchdog&lt;/strong&gt; for optional folder watching, and &lt;strong&gt;pytest&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pipeline&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;recording → faster-whisper → timestamped segments → chunker (1200 words, 100 overlap)
  → per-chunk summaries → hierarchical merge → notes.md
  → per-chunk action-item extraction (JSON, validated, de-duplicated) → action_items.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Design decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chunking is deterministic and tested separately&lt;/strong&gt; from the models, so overlap and forward progress are guaranteed even when one segment is huge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical merging&lt;/strong&gt; keeps very long lectures from overflowing the model's context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action items come from the transcript chunks, not from the summary&lt;/strong&gt;, and the model's JSON is validated before use. Malformed JSON gets a bounded retry, then fails safely instead of producing made-up items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounded retries and timeouts&lt;/strong&gt; for every Ollama request, and a failed chunk is recorded rather than hidden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience on real machines:&lt;/strong&gt; while testing on a Windows laptop I hit a PyAV version mismatch and a missing CUDA library. The tool now falls back to FFmpeg decoding and to CPU automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test suite (53 tests) mocks Whisper and Ollama, so it needs no models. I also ran the real HTTP client and CLI against a fake local Ollama server. Those tests check the logic and wiring, not the quality of notes from real audio. [Add your own honest result from running it on a real lecture clip, and what you'd improve.]&lt;/p&gt;

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

&lt;p&gt;Lecture recordings are private: they can contain classmates' voices, a professor's unpublished material and personal details. With open models, all of it stays on the laptop. Whisper and Gemma run locally through Ollama, so there is no per-minute fee, no usage limit and no data leaving the machine. That matters especially for students on limited budgets and unreliable internet. A closed API would have meant uploading recordings and paying per hour of audio.&lt;/p&gt;

&lt;p&gt;Open components also let me inspect and control behavior. I could set the temperature, choose the model size to match the hardware, and swap in a different Ollama model with one flag. And when the tool broke, the open libraries let me find the actual cause (a &lt;code&gt;metadata_errors&lt;/code&gt; argument PyAV didn't accept) and work around it instead of waiting on a vendor.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Lecture2Notes runs Gemma 3 4B locally through Ollama for every language-model step: per-chunk lecture summaries, hierarchical merging into one study document, and structured extraction of assignments and deadlines. Everything runs on a CPU-only laptop with no cloud API, and the model is switchable with one flag (&lt;code&gt;--model&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Gemma 3 4B?&lt;/strong&gt; I wanted something a student could actually run: it fits on an ordinary laptop with no GPU, through Ollama, with one &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;. A small model needs guardrails, so the pipeline works around it. Transcripts are split into ~1,200-word chunks so each request stays small, prompts tell the model to use only what is in the transcript, and the deadline extraction returns JSON that is validated before anything is used. Items without evidence are dropped, and malformed JSON gets a limited number of retries and then fails safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest limits.&lt;/strong&gt; A 4B model can miss or misread an announcement, especially in a noisy recording or a long lecture, and speech-recognition mistakes pass straight through to its output. That is why every action item carries a timestamp and evidence quote, and why calendar dates stay &lt;code&gt;null&lt;/code&gt; unless you supply the real lecture date. If you have more RAM or a GPU, &lt;code&gt;--model&lt;/code&gt; lets you swap in a larger Gemma through Ollama with no code changes.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I built a GST invoice sorter that runs 100% offline with open-source AI</title>
      <dc:creator>Shaurya Srivastava</dc:creator>
      <pubDate>Sun, 18 Oct 2026 15:26:20 +0000</pubDate>
      <link>https://dev.to/shaurya_srivastava_027f4e/i-built-a-gst-invoice-sorter-that-runs-100-offline-with-open-source-ai-5flc</link>
      <guid>https://dev.to/shaurya_srivastava_027f4e/i-built-a-gst-invoice-sorter-that-runs-100-offline-with-open-source-ai-5flc</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;GST Invoice &amp;amp; Receipt Sorter&lt;/strong&gt;: a local app that turns a messy folder of invoice photos and PDFs into one clean, validated Excel sheet.&lt;/p&gt;

&lt;p&gt;In India, freelancers, small shops and small CA (accountant) offices collect dozens of invoices a month, and someone types them into a spreadsheet by hand to file GST returns. It is slow, and one wrong digit in a 15-character tax ID (GSTIN) or a total can cause problems later. Those people also don't want to upload client financial documents to a cloud service, and per-page cloud OCR/LLM pricing adds up.&lt;/p&gt;

&lt;p&gt;You drop in files like &lt;code&gt;IMG_2031.jpg&lt;/code&gt; or &lt;code&gt;bill_final.pdf&lt;/code&gt; and get one row per invoice: vendor, GSTIN, invoice number, date, taxable amount, CGST/SGST/IGST and total. Every row carries its source file, a review status and the exact reason for any warning.&lt;/p&gt;

&lt;p&gt;The key design rule: &lt;strong&gt;the model only copies what is printed. It never decides whether an invoice is correct.&lt;/strong&gt; Plain Python checks do that (GSTIN checksum, tax arithmetic, state codes, dates, duplicates), and nothing is "verified" until a person marks it Reviewed.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/MhGvgkirwWs" 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/shauryasri14" rel="noopener noreferrer"&gt;
        shauryasri14
      &lt;/a&gt; / &lt;a href="https://github.com/shauryasri14/gst-sorter" rel="noopener noreferrer"&gt;
        gst-sorter
      &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;GST Invoice &amp;amp; Receipt Sorter&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Turns a folder of Indian GST invoices (PDF, JPG, PNG) into one validated spreadsheet. &lt;strong&gt;Everything runs on your
computer&lt;/strong&gt;: OCR, the language model, validation, storage and export. No cloud AI, no paid API, no telemetry.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;Files → ingest → render PDF pages → preprocess → OCR → local LLM (Ollama) → deterministic GST checks
      → human review &amp;amp; correction → Excel / CSV
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The model only &lt;em&gt;copies&lt;/em&gt; what is printed. All GST checks (GSTIN checksum, tax arithmetic, state codes, dates
duplicates) are plain Python in &lt;code&gt;pipeline/validate.py&lt;/code&gt;. Extraction success is never shown as "verified": only a person
can mark an invoice &lt;strong&gt;Reviewed&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;1. Prerequisites&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python 3.11 or 3.12&lt;/td&gt;
&lt;td&gt;Recommended: PaddleOCR/PaddlePaddle wheels lag behind the newest Python. The code and tests also ran on 3.13 with Tesseract.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Local model server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 GB RAM minimum&lt;/td&gt;
&lt;td&gt;The default 7B model needs roughly 5-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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/shauryasri14/gst-sorter" 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;Pipeline: &lt;code&gt;files -&amp;gt; render PDF pages -&amp;gt; OpenCV preprocessing -&amp;gt; OCR -&amp;gt; local LLM -&amp;gt; deterministic GST validation -&amp;gt; human review -&amp;gt; Excel/CSV&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight model:&lt;/strong&gt; Qwen2.5 Instruct (7B by default, configurable) served locally by &lt;strong&gt;Ollama&lt;/strong&gt;. It returns strict JSON that is parsed with Pydantic, with one repair retry at most. Missing values stay &lt;code&gt;null&lt;/code&gt;, never &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OCR:&lt;/strong&gt; &lt;strong&gt;PaddleOCR&lt;/strong&gt; as the primary engine, &lt;strong&gt;Tesseract&lt;/strong&gt; as fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; Streamlit review screen (original page beside editable fields), SQLite for saved corrections, pandas/openpyxl for export.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation (no LLM involved):&lt;/strong&gt; GSTIN format and mod-36 checksum, total = taxable + taxes within a configurable tolerance, CGST/SGST consistency, state-code vs tax-type warnings, date parsing, duplicate detection, and a check that every extracted value actually appears in the OCR text (to catch hallucinations).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety:&lt;/strong&gt; spreadsheet formula-injection protection, localhost-only Ollama (non-loopback hosts are refused), logs that never contain invoice contents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I measured (20 fictitious invoices, 5 degradation types, Tesseract, CPU only):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Found in OCR text&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Names, invoice no., date, total, CGST, SGST&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor GSTIN / Buyer GSTIN&lt;/td&gt;
&lt;td&gt;70% / 55%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GSTINs are where OCR struggles (letter O for digit 0, and so on). Of 40 GSTINs copied from OCR text, 17 were misread and the checksum caught 15 of them; the other 2 were a role mix-up in my test script, not a checksum failure. That is the point of the validation layer.&lt;/p&gt;

&lt;p&gt;I also found a real bug through testing: Tesseract's default mode dropped the large vendor-name heading (4/10 found); a different page-segmentation mode fixed it (10/10).&lt;/p&gt;

&lt;p&gt;300 automated tests cover validation, malformed LLM output, Ollama being down, failed OCR, multi-page PDFs, persistence of manual corrections and export safety.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy is the product.&lt;/strong&gt; Invoices contain tax IDs and client amounts. With open weights and local inference, nothing leaves the laptop, and a small CA office can say that to its clients and mean it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost stays near zero.&lt;/strong&gt; No per-page fee, so the business works even at a few rupees of margin per document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could inspect and control every layer.&lt;/strong&gt; Swapping the model for a smaller one on an 8 GB laptop is one setting. I could pin the output schema, tune OCR settings, and test failures with test doubles, none of which depends on someone else's API changing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest limits:&lt;/strong&gt; a small local model makes more mistakes than a large closed one, which is exactly why I built the deterministic checks and review screen around it instead of trusting it.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;My first user was a friend who runs a small electronics business and regularly handles supplier invoices and purchase receipts. Before trying the tool, he managed invoice details manually in spreadsheets, which was repetitive and took time away from other business tasks.&lt;/p&gt;

&lt;p&gt;I tested the workflow using 10 sample invoices. The tool extracted the key fields into a structured spreadsheet and flagged entries that needed manual review. The biggest challenge was GSTIN recognition, where similar-looking characters could be misread by OCR. This reinforced why automated validation and human review are essential rather than blindly trusting extracted data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would he pay?&lt;/strong&gt; He found the tool useful, particularly because it could reduce manual data entry while keeping financial documents on his computer. We haven't established a price or confirmed his willingness to pay yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What he asked for next:&lt;/strong&gt; Better GSTIN recognition and easier export into accounting software such as Tally. These would make the tool more practical for businesses that already have an established accounting workflow.&lt;/p&gt;

&lt;p&gt;This initial feedback helped reinforce the project's core goal: making invoice processing faster without compromising privacy or treating automated extraction as infallible.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built StrideWise: Describe a Walk in One Sentence, and a Local AI Plans the Route</title>
      <dc:creator>Shaurya Srivastava</dc:creator>
      <pubDate>Sat, 10 Oct 2026 19:16:02 +0000</pubDate>
      <link>https://dev.to/shaurya_srivastava_027f4e/i-built-stridewise-describe-a-walk-in-one-sentence-and-a-local-ai-plans-the-route-1n6o</link>
      <guid>https://dev.to/shaurya_srivastava_027f4e/i-built-stridewise-describe-a-walk-in-one-sentence-and-a-local-ai-plans-the-route-1n6o</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;StrideWise is a route planner for walkers and runners. You describe the walk you want in plain English, such as "5 km, shaded, low traffic, finishing near a park," and it generates real routes you can compare on a map.&lt;/p&gt;

&lt;p&gt;I wanted to make route planning simpler. Instead of manually checking roads and adjusting filters, you describe what matters to you and let the app find possible routes.&lt;/p&gt;

&lt;p&gt;The goal is simple: spend less time planning your walk and more time actually taking it.&lt;/p&gt;

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

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

&lt;p&gt;The demo shows how a natural-language request is converted into constraints and used to generate alternative walking or running routes.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&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/shauryasri14" rel="noopener noreferrer"&gt;
        shauryasri14
      &lt;/a&gt; / &lt;a href="https://github.com/shauryasri14/StrideWise" rel="noopener noreferrer"&gt;
        StrideWise
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Privacy-first, local-first route planner that uses Ollama, Valhalla, and OpenStreetMap to generate and score walking/running routes based on distance, traffic, shade, surface, elevation, and air quality.
    &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;StrideWise&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Describe a walk or run in plain English and get a real route you can follow.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"5 km, shaded, low traffic, finishing near a park"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A small language model running on your own machine turns that sentence into structured constraints. A real routing engine builds several candidate routes. OpenStreetMap data is used to estimate traffic, shade and surface. Optional air-quality data is added. The routes are scored with transparent weights, and the top three are shown on a map. Then you close the laptop and go outside.&lt;/p&gt;
&lt;p&gt;Built for the Hacktoberfest "Touch Grass" challenge: open-source AI that gets people off the screen.&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;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;Your sentence
   -&amp;gt; Ollama (local LLM)  -&amp;gt; structured JSON constraints (distance, shade, traffic, ...)
   -&amp;gt; Valhalla (routing)  -&amp;gt; about 8 real candidate routes (loops, out-and-back, point-to-point)
   -&amp;gt; OpenStreetMap       -&amp;gt; traffic / shade / surface estimates along each route
   -&amp;gt; Open-Meteo (opt.)   -&amp;gt; air-quality along&lt;/code&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/shauryasri14/StrideWise" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;StrideWise is a local-first route planner built with Ollama, Valhalla, and OpenStreetMap. It generates and ranks routes based on distance, traffic, shade, surface, elevation, and air quality.&lt;/p&gt;

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

&lt;p&gt;The pipeline is straightforward: understand the request, generate routes, analyse them, score them, and display the best options.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama with Qwen2.5 3B:&lt;/strong&gt; A local language model converts the user's request into structured JSON constraints, such as distance, shade, traffic preferences, and destination. It does not generate the route itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valhalla:&lt;/strong&gt; Generates candidate routes using real map data, including loops, out-and-back routes, and point-to-point routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenStreetMap:&lt;/strong&gt; Provides geographic data used to estimate traffic levels, shade, and surface conditions. These are estimates, not live traffic measurements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Meteo:&lt;/strong&gt; Supplies optional model-based air-quality data for route evaluation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scoring system:&lt;/strong&gt; Ranks the candidate routes using configurable weights and returns three alternatives: Best match, Lowest pollution, and Quietest. Each route includes its metrics and an explanation of why it was ranked that way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application stack:&lt;/strong&gt; FastAPI, React, TypeScript, Leaflet, and Docker Compose.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One design decision was to keep the language model's job narrow. It converts the request into constraints, while the routing engine handles the actual geography. This makes the results easier to test and prevents the model from inventing roads or coordinates.&lt;/p&gt;

&lt;p&gt;If Ollama is unavailable, the app can fall back to a built-in keyword parser and indicates that fallback in the interface.&lt;/p&gt;

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

&lt;p&gt;Open-source tools made it possible to build the entire routing pipeline without depending on a paid AI or hosted routing API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local inference:&lt;/strong&gt; Ollama runs the language model on the user's machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real routing:&lt;/strong&gt; Valhalla generates routes from map data rather than relying on an LLM to invent directions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customisable ranking:&lt;/strong&gt; The scoring weights are ordinary code, so the route preferences can be changed without retraining a model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replaceable components:&lt;/strong&gt; The language model, routing engine, and scoring logic are separated, making it easier to experiment with alternatives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are trade-offs. The user must download a map region, and some geographic data requests still go to external services such as Overpass and Open-Meteo. Traffic and shade depend on available map data, while air-quality estimates have limited street-level resolution.&lt;/p&gt;

&lt;p&gt;These limitations are documented in the repository rather than hidden behind a general claim of privacy.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built My Friend a Free, Offline Chess Coach with Stockfish and a Local LLM</title>
      <dc:creator>Shaurya Srivastava</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:42:03 +0000</pubDate>
      <link>https://dev.to/shaurya_srivastava_027f4e/i-built-my-friend-a-free-offline-chess-coach-with-stockfish-and-a-local-llm-5a3h</link>
      <guid>https://dev.to/shaurya_srivastava_027f4e/i-built-my-friend-a-free-offline-chess-coach-with-stockfish-and-a-local-llm-5a3h</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;I built a chess game analyzer for my friend. He loves chess, but he doesn't play often enough to pay for a subscription just to find out what he did wrong after a game or a puzzle.&lt;/p&gt;

&lt;p&gt;His request was simple: &lt;em&gt;"I want software that analyzes my moves and tells me what I did wrong."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I built that. You upload a game (a PGN file from Lichess or Chess.com), and the app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;marks every move as best, excellent, good, inaccuracy, mistake, or blunder&lt;/li&gt;
&lt;li&gt;shows the position with arrows for your move and the engine's better move&lt;/li&gt;
&lt;li&gt;explains each mistake in one or two plain sentences&lt;/li&gt;
&lt;li&gt;lets you ask a coach questions about the move you are looking at&lt;/li&gt;
&lt;li&gt;counts your &lt;strong&gt;recurring problems&lt;/strong&gt; across the game (for example "7 hung pieces")&lt;/li&gt;
&lt;li&gt;checks single puzzle positions: enter a position and your move, and it tells you how good the move was&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lichess already offers free engine analysis, so I'm not claiming nobody can analyze games for free. What this adds is plain-language reasons, a summary of repeated mistakes, and a tool that runs locally and keeps the analysis on your machine.&lt;/p&gt;

&lt;p&gt;My goal wasn't to build another chess engine. It was to build something that explains mistakes in a way a casual player can learn from.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/bOCa-Sw1icE" 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/shauryasri14" rel="noopener noreferrer"&gt;
        shauryasri14
      &lt;/a&gt; / &lt;a href="https://github.com/shauryasri14/Chess-Move-Analyzer" rel="noopener noreferrer"&gt;
        Chess-Move-Analyzer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A free, offline chess analyzer built for a friend who can't justify paying for game review. Stockfish judges every move, code tags the cause (hung piece, missed capture, missed mate), and a local LLM via Ollama explains it in simple words. Your games never leave your machine.
    &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;♟ Chess Move Analyzer&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Free, offline chess game review that tells you what you did wrong, in plain language.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Stockfish judges every move, code tags the cause, and a small local LLM (via Ollama) explains it. No account, no subscription, no game limit, and your games never leave your machine.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Built for a friend who loves chess but doesn't play often enough to justify paying for game analysis
&lt;em&gt;Submission for the Hacktoberfest Weekend Challenge: Build for a Friend.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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;Casual players finish a game or a puzzle and want one thing: &lt;em&gt;what did I do wrong?&lt;/em&gt; Many tools lock full analysis behind a paid plan, which doesn't make sense for someone who plays a few games a month.&lt;/p&gt;
&lt;p&gt;This project gives that analysis for free, on your own computer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stockfish&lt;/strong&gt; (open-source engine) decides which moves were mistakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt; finds the likely cause: a hung piece, a missed capture…&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/shauryasri14/Chess-Move-Analyzer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;To run it yourself: &lt;code&gt;docker compose up --build&lt;/code&gt;, then open &lt;code&gt;http://localhost:8501&lt;/code&gt;. Setup without Docker is in the README.&lt;/p&gt;

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

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://stockfishchess.org/" rel="noopener noreferrer"&gt;Stockfish&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Evaluates each position; the change in evaluation is used to classify the move. One of the strongest open-source chess engines.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/niklasf/python-chess" rel="noopener noreferrer"&gt;python-chess&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Reads PGN, builds boards, and communicates with Stockfish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; with &lt;code&gt;gemma3:4b&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Runs the language model locally to explain mistakes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://streamlit.io" rel="noopener noreferrer"&gt;Streamlit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The web interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Compose&lt;/td&gt;
&lt;td&gt;One command starts the app and Ollama&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The pipeline&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PGN → Stockfish evaluates each position → code classifies and tags mistakes → local LLM explains → summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The most important design rule: the model never judges the chess.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Small language models are bad at evaluating chess positions, so the work is split:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stockfish&lt;/strong&gt; evaluates each position once. The evaluation after one move is reused as the evaluation before the next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt; turns the evaluation drop into a label (for example, 300+ centipawns lost is a blunder) and finds the likely cause: a &lt;strong&gt;hung piece&lt;/strong&gt;, a &lt;strong&gt;missed capture&lt;/strong&gt;, or a &lt;strong&gt;missed mate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The LLM&lt;/strong&gt; receives only these facts and explains them in one or two sentences. It is told not to invent moves.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The "Ask the coach" chat works the same way: every question carries the current position, the evaluations, the engine's line, and the neighbouring moves. A &lt;strong&gt;"What the coach sees"&lt;/strong&gt; panel shows exactly what the model is given, so you can check its input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Details that mattered&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluations are clamped to ±15 pawns, so trimming a huge lead isn't called a blunder.&lt;/li&gt;
&lt;li&gt;Thresholds are editable in the sidebar and re-label instantly, with no engine rerun.&lt;/li&gt;
&lt;li&gt;If Ollama isn't running, the app falls back to template explanations instead of breaking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Honest limitations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The cause tags are simple heuristics and can miss exchange sequences or pins.&lt;/li&gt;
&lt;li&gt;A 4B model can still phrase things badly sometimes.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The best engine is open source.&lt;/strong&gt; Stockfish gives strong analysis for free, and paying for analysis was exactly my friend's problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account, subscription, or game limit.&lt;/strong&gt; He can analyze one game a month or fifty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;His games stay on his machine.&lt;/strong&gt; The model runs locally and the app works offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could control the coach.&lt;/strong&gt; With a local model I wrote the system prompt, limited it to engine facts, showed its input, and could swap models freely. A closed API would make that harder and add a cost per question.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Friend's Reaction
&lt;/h2&gt;

&lt;p&gt;When I first showed my friend the project, his first reaction was, “Bro, this would be way better if it worked directly on Chess.com.” I was like, “Yeah, I know, but at least appreciate what I made!” 😭&lt;/p&gt;

&lt;p&gt;A little later, he actually played a game, exported it from Chess.com, and uploaded the PGN to my app. He went through the analysis himself, and once he saw everything actually working, he was genuinely impressed. He liked that he could go through the game move by move and see not just that a move was bad, but what he did wrong and what he could have played instead.&lt;/p&gt;

&lt;p&gt;He uses Chess.com quite regularly and usually ends up using his free analysis/trial features pretty early in the month. So being able to just run this locally and analyze his games whenever he wants was something he actually found useful.&lt;/p&gt;

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