<?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: BARI ANKIT VINOD </title>
    <description>The latest articles on DEV Community by BARI ANKIT VINOD  (@bariankitvinod).</description>
    <link>https://dev.to/bariankitvinod</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%2F1246423%2F4705b57c-532b-4482-a8b9-d8af604e98b8.jpeg</url>
      <title>DEV Community: BARI ANKIT VINOD </title>
      <link>https://dev.to/bariankitvinod</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bariankitvinod"/>
    <language>en</language>
    <item>
      <title>Satbara Saathi: Understand Your 7/12 Land Record in Marathi, Without the Talathi Trip</title>
      <dc:creator>BARI ANKIT VINOD </dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:09:28 +0000</pubDate>
      <link>https://dev.to/bariankitvinod/satbara-saathi-understand-your-712-land-record-in-marathi-without-the-talathi-trip-5999</link>
      <guid>https://dev.to/bariankitvinod/satbara-saathi-understand-your-712-land-record-in-marathi-without-the-talathi-trip-5999</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;Satbara Saathi (सातबारा साथी)&lt;/strong&gt; explains a Maharashtra 7/12 (Satbara) land extract in plain Marathi, Hindi or English.&lt;/p&gt;

&lt;p&gt;A 7/12 is dense, jargon-heavy and often scanned badly. Anyone buying or inheriting farmland ends up waiting at the talathi office or paying a middleman to read it to them. The lazy way is to upload a photo and get the answer back:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Preprocess the image and check its quality&lt;/li&gt;
&lt;li&gt;OCR it and extract structured fields&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;11 deterministic red-flag rules&lt;/strong&gt; (loan/boja, multiple owners, minor owner, tenant, Class 2 land, inheritance mutation, area mismatch, and more)&lt;/li&gt;
&lt;li&gt;Have an LLM explain the findings in simple language&lt;/li&gt;
&lt;li&gt;Read the summary aloud (TTS)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most important design decision is what the AI does &lt;em&gt;not&lt;/em&gt; do. The rules engine contains no AI. The LLM only explains flags it is handed, and it is told never to call land "safe" or "valid". The tool gives no legal advice and says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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/aijadugar" rel="noopener noreferrer"&gt;
        aijadugar
      &lt;/a&gt; / &lt;a href="https://github.com/aijadugar/satbara-saathi" rel="noopener noreferrer"&gt;
        satbara-saathi
      &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;Satbara Saathi (सातबारा साथी)&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Understand Maharashtra 7/12 (Satbara) extracts in plain &lt;strong&gt;Marathi / Hindi / English&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Reads a 7/12 image (scanned or digital)&lt;/li&gt;
&lt;li&gt;Extracts structured data via OCR&lt;/li&gt;
&lt;li&gt;Runs deterministic red-flag rules (no AI in the rules engine)&lt;/li&gt;
&lt;li&gt;Explains findings in plain language via LLM&lt;/li&gt;
&lt;li&gt;Speaks the summary aloud (TTS)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does NOT do&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Give legal advice&lt;/li&gt;
&lt;li&gt;Decide if land is "safe"&lt;/li&gt;
&lt;li&gt;Store your images or personal data&lt;/li&gt;
&lt;li&gt;Process 8A, mutation extracts, or other states (yet)&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="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;cp .env.example .env
pip install -e &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;.[dev]&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
make dev        &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; http://localhost:8000&lt;/span&gt;
make &lt;span class="pl-c1"&gt;test&lt;/span&gt;       &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; run tests with fake providers&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&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;Upload → Preprocess → OCR → Extract → Validate → Rules → Explain → TTS
                                         ↕
                                   Confirm fields
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Privacy&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Images deleted after processing&lt;/li&gt;
&lt;li&gt;No PII in logs&lt;/li&gt;
&lt;li&gt;Anonymous impact counters only&lt;/li&gt;
&lt;li&gt;Consent gate before upload&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Apache-2.0&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aijadugar/satbara-saathi" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI + Pydantic. Providers sit behind small interfaces (OCR, LLM, TTS), so each can be swapped by config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules:&lt;/strong&gt; &lt;code&gt;app/rules/mh_7_12.yaml&lt;/code&gt;, with bilingual (Marathi/English) titles, explanations and "what to do next" steps per rule. They are plain data, so a revenue-law professional can review them without reading Python.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM:&lt;/strong&gt; the explain layer targets &lt;strong&gt;Sarvam-M&lt;/strong&gt;, an open-weight 24B model (post-trained on Mistral Small 3.1) with Marathi and Hindi support. A post-check rejects explanations containing names or long numbers that aren't in the source document, and retries once before failing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; consent gate before upload, jobs held in memory only, and the only thing persisted is an anonymous counter DB (no names, no survey numbers, no images).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; 16 tests pass using fake providers, with CI on GitHub Actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Honest status:&lt;/strong&gt; this is a one-week build. The Sarvam and OCR adapters are written, but the running server currently uses fake providers, and structured extraction from real OCR output is not finished. The rules engine, validation, explanation safeguards, consent flow and UI work end to end on sample data. The rules have &lt;strong&gt;not&lt;/strong&gt; yet been reviewed by a Maharashtra revenue-law professional, which is the first thing needed before any real use.&lt;/p&gt;

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

&lt;p&gt;A land record contains names, family relationships and where someone's livelihood sits. That is exactly the data you don't want flowing through a black box.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-hostable explanations.&lt;/strong&gt; Because Sarvam-M has open weights, a gram panchayat, CSC centre or NGO could run the explain step on its own server with &lt;code&gt;vllm serve&lt;/code&gt; and keep documents off third-party systems. A closed API would not allow that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditable rules.&lt;/strong&gt; The red-flag logic is open YAML, not model behaviour, so lawyers and community members can read, challenge and correct it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for the language.&lt;/strong&gt; A model post-trained on Indic languages is what makes Marathi output realistic. Apache-2.0 means anyone can adapt this for other states.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The OCR and TTS adapters currently call hosted APIs. Replacing them with open models is the clearest next step.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Social Hustle: a done-for-you social media engine that runs entirely on open-source AI</title>
      <dc:creator>BARI ANKIT VINOD </dc:creator>
      <pubDate>Mon, 19 Oct 2026 03:29:33 +0000</pubDate>
      <link>https://dev.to/bariankitvinod/social-hustle-a-done-for-you-social-media-engine-that-runs-entirely-on-open-source-ai-478</link>
      <guid>https://dev.to/bariankitvinod/social-hustle-a-done-for-you-social-media-engine-that-runs-entirely-on-open-source-ai-478</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Social Hustle generates a week's worth of on-brand social posts for small-business clients — research, angle-picking, drafting, and publishing — as a single durable Temporal workflow. You give it a client profile (voice, audience, keywords to avoid) and it comes back with drafts you approve before anything goes out. Nothing publishes without a human saying yes.&lt;/p&gt;

&lt;p&gt;It's built for the operator, not the client: one CLI command starts a run, the Temporal UI shows each activity light up, and a small FastAPI dashboard lets you review and tick the drafts you want published. Posting goes to Bluesky; without creds it dry-runs to a per-client &lt;code&gt;outbox.jsonl&lt;/code&gt; so you can demo it with zero setup.&lt;/p&gt;

&lt;p&gt;Who pays: agencies and freelancers managing social for several small clients. Instead of a weekly hour of "what should we post today," they get drafts in their clients' actual voice, with the human approval still in the loop.&lt;/p&gt;

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

&lt;p&gt;No deployed link yet — it runs locally. To demo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama serve
temporal server start-dev
python social_hustle.py worker
python social_hustle.py run clients/brew-lane/brand.json   &lt;span class="c"&gt;# -&amp;gt; prints a workflow id&lt;/span&gt;
python social_hustle.py show &amp;lt;workflow_id&amp;gt;                &lt;span class="c"&gt;# review drafts&lt;/span&gt;
python social_hustle.py approve &amp;lt;workflow_id&amp;gt; 0 2          &lt;span class="c"&gt;# publish #0 and #2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or start the dashboard instead of the CLI: &lt;code&gt;python web.py&lt;/code&gt; → &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/aijadugar/social-hustle" rel="noopener noreferrer"&gt;https://github.com/aijadugar/social-hustle&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The whole LLM layer runs on &lt;strong&gt;Gemma 3 via Ollama&lt;/strong&gt; — an open-weight model, local inference, $0 per post, and client data never leaves the machine. Every LLM call uses Ollama's structured-output mode (JSON schema), and the response is validated and repaired before it's used: Gemma occasionally truncates mid-string, so a single O(n) scan closes unterminated strings and open containers rather than failing the run.&lt;/p&gt;

&lt;p&gt;Orchestration is &lt;strong&gt;Temporal&lt;/strong&gt; (Python SDK). One durable &lt;code&gt;ContentRun&lt;/code&gt; workflow per client per day: &lt;code&gt;research&lt;/code&gt; (Google News RSS) → &lt;code&gt;learn&lt;/code&gt; (what performed last week) → &lt;code&gt;write&lt;/code&gt; (Gemma picks angles &lt;em&gt;and&lt;/em&gt; writes the posts in one call) → a durable human-approval signal → &lt;code&gt;publish&lt;/code&gt; (Bluesky, idempotent). Temporal means retries, time-skipping approval windows, and no lost state if you approve tomorrow.&lt;/p&gt;

&lt;p&gt;Stack is deliberately tiny — stdlib + &lt;code&gt;temporalio&lt;/code&gt; + &lt;code&gt;fastapi&lt;/code&gt;/&lt;code&gt;uvicorn&lt;/code&gt;, one static HTML file, no build step, no JS framework. Per-client data lives in &lt;code&gt;clients/&amp;lt;slug&amp;gt;/&lt;/code&gt; and is never mixed between clients.&lt;/p&gt;

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

&lt;p&gt;This project only works because the AI is open. Three things a closed API couldn't give it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Data locality.&lt;/strong&gt; Client brand voices, drafts, and posting history are sensitive business data. Running Gemma locally means nothing ever ships to a vendor — a real requirement for an agency handling multiple clients' accounts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero marginal cost.&lt;/strong&gt; At $0 per post, the economics work for small-business clients who can't afford $20/month AI subscriptions. An API bill scales with output; open inference doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can actually inspect and fix it.&lt;/strong&gt; When Gemma 3 truncated its output mid-string and killed the activity with &lt;code&gt;JSONDecodeError&lt;/code&gt;, I could read the model's raw response, write a repair pass, and tune the retry/backoff — rather than file a support ticket against a black box. The failure modes are observable and fixable, which is what makes this a &lt;em&gt;product&lt;/em&gt; and not a demo.&lt;/li&gt;
&lt;/ol&gt;

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

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

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source AI&lt;/strong&gt; — the entire LLM layer is open-weight Gemma 3 via Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Side Hustle&lt;/strong&gt; — it's literally a done-for-you side hustle for social media&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>`/export` slash command to [OpenHack]</title>
      <dc:creator>BARI ANKIT VINOD </dc:creator>
      <pubDate>Mon, 12 Oct 2026 10:22:15 +0000</pubDate>
      <link>https://dev.to/bariankitvinod/export-slash-command-to-openhack-4pjg</link>
      <guid>https://dev.to/bariankitvinod/export-slash-command-to-openhack-4pjg</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;I added a &lt;code&gt;/export&lt;/code&gt; slash command to &lt;a href="https://github.com/aijadugar/OpenHack" rel="noopener noreferrer"&gt;OpenHack&lt;/a&gt;, an open-source AI security scanner that runs in your terminal.&lt;/p&gt;

&lt;p&gt;Before this, OpenHack could only copy one finding at a time (&lt;code&gt;/copy&lt;/code&gt;), and the only report was a raw session JSON file. So the results lived inside the terminal, and the person who ran the scan had to stay there to use them.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/export [sarif|md|json] [path]&lt;/code&gt; writes every finding to a file you can take with you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SARIF 2.1.0&lt;/strong&gt; (default) for GitHub code scanning, GitLab, Azure DevOps and VS Code. Findings are tagged with CWE IDs and severity, and paths are relative to the scanned repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown&lt;/strong&gt; for a readable report you can paste into a PR, ticket or audit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON&lt;/strong&gt; for a full findings dump.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How it gets people off the screen:&lt;/strong&gt; a deep AI scan takes a while, and you shouldn't have to sit and watch it. Start it, step away, and come back to a finished report you can review on your phone, send to a teammate, or have CI pick up automatically. Exports are safe to share: token-like strings are redacted and exploit payloads are left out of SARIF and Markdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; developers and small teams running OpenHack on their own code who want results in their existing workflow, not stuck in a terminal session.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/aijadugar/OpenHack" rel="noopener noreferrer"&gt;https://github.com/aijadugar/OpenHack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Main changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;openhack/export.py&lt;/code&gt;: new, UI-free module with the SARIF/Markdown/JSON builders and an atomic file writer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openhack/tui.py&lt;/code&gt;: thin &lt;code&gt;/export&lt;/code&gt; handler plus command-table and tip entries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tests/test_export.py&lt;/code&gt;: 31 new tests (the full suite is 542 passing)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;README.md&lt;/code&gt;: command table row and a short "Exporting findings" section&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;OpenHack is a Python TUI (prompt-toolkit and rich) that runs a multi-agent scan pipeline against your codebase and works with several LLM providers. &lt;code&gt;/export&lt;/code&gt; doesn't call a model. It's a deterministic transform over the findings the agents already produced.&lt;/p&gt;

&lt;p&gt;Design choices worth mentioning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pure module, thin command.&lt;/strong&gt; All the logic is in &lt;code&gt;export.py&lt;/code&gt; with no TUI imports, so it's unit-tested directly. The TUI handler is about 40 lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follows the repo's CLI contract.&lt;/strong&gt; AGENTS.md says new functionality belongs inside the interactive agent, not as a new subcommand, so this is a slash command and not &lt;code&gt;openhack export&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for sharing.&lt;/strong&gt; It reuses the project's existing &lt;code&gt;redact()&lt;/code&gt; helper, omits PoCs from shared formats, writes atomically (temp file and rename), and creates owner-only files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correct for real consumers.&lt;/strong&gt; GitHub rejects line 0, so unknown lines default to 1. OpenHack's built-in fingerprint is category plus file only, which would merge distinct findings in one file, so the export hashes in the title too.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Security tooling is a place where trust matters, and open source makes that trust checkable. With OpenHack you can read exactly what the scanner does, and I could add a feature to it without asking anyone's permission or waiting on a vendor roadmap.&lt;/p&gt;

&lt;p&gt;The feature itself is also about openness: SARIF is an open standard, so findings aren't locked into one tool's UI. Exporting to a standard format means the same results work in GitHub, GitLab, VS Code or whatever you use next. A closed scanner tends to give you its own dashboard, but here I could make the output portable.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Spotter: a private workout form coach I built for a friend who trains at home</title>
      <dc:creator>BARI ANKIT VINOD </dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:46:55 +0000</pubDate>
      <link>https://dev.to/bariankitvinod/spotter-a-private-workout-form-coach-i-built-for-a-friend-who-trains-at-home-3cll</link>
      <guid>https://dev.to/bariankitvinod/spotter-a-private-workout-form-coach-i-built-for-a-friend-who-trains-at-home-3cll</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;Spotter is a workout form coach for my friend, who trains at home. There's no gym nearby and no budget for a private trainer, so a phone propped on a shelf is the only feedback they get. Every "AI coach" app they tried either wanted a subscription, sent their workout videos to a company's servers, or repeated generic YouTube advice.&lt;/p&gt;

&lt;p&gt;So I built something different. They upload a short clip, add a little training context, and get back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the detected exercise and a confidence score&lt;/li&gt;
&lt;li&gt;a rep-by-rep analysis&lt;/li&gt;
&lt;li&gt;valid variations separated from real form issues&lt;/li&gt;
&lt;li&gt;an annotated video plus short clips of each issue&lt;/li&gt;
&lt;li&gt;a grounded coach summary with fixes and a next-session plan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It currently supports squats, push-ups and shoulder presses. It also says "I can't tell" on purpose: if a clip isn't one of those movements, Spotter rejects it instead of forcing a guess. It is a practice companion, not a medical device. It doesn't diagnose injuries or claim to prevent them.&lt;/p&gt;

&lt;p&gt;My friend said, "I have good shoulder strength but it helps me in squats".&lt;/p&gt;

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

&lt;p&gt;Video link - &lt;a href="https://youtu.be/DImVwhrrkFA" rel="noopener noreferrer"&gt;https://youtu.be/DImVwhrrkFA&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/aijadugar" rel="noopener noreferrer"&gt;
        aijadugar
      &lt;/a&gt; / &lt;a href="https://github.com/aijadugar/spotter" rel="noopener noreferrer"&gt;
        spotter
      &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="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
  &lt;tr&gt;
    &lt;th&gt;title&lt;/th&gt;
    &lt;td&gt;Spotter&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;emoji&lt;/th&gt;
    &lt;td&gt;🏋️&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;colorFrom&lt;/th&gt;
    &lt;td&gt;green&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;colorTo&lt;/th&gt;
    &lt;td&gt;blue&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;sdk&lt;/th&gt;
    &lt;td&gt;gradio&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;sdk_version&lt;/th&gt;
    &lt;td&gt;6.17.3&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;python_version&lt;/th&gt;
    &lt;td&gt;3.10&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;app_file&lt;/th&gt;
    &lt;td&gt;app.py&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;fullWidth&lt;/th&gt;
    &lt;td&gt;true&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;short_description&lt;/th&gt;
    &lt;td&gt;Workout form coach for a friend, built on open-weight small models.&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;tags&lt;/th&gt;
    &lt;td&gt;
&lt;table&gt;
  &lt;tbody&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;div&gt;gradio&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;computer-vision&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;pose-estimation&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;fitness&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;video-analysis&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;llama-cpp&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;open-source&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;local-inference&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;hacktoberfest&lt;/div&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Spotter&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Spotter is a small-model workout form coach I built for a friend.&lt;/p&gt;
&lt;p&gt;My friend trains at home: no gym nearby, no budget for a private trainer, and a phone propped on a
shelf is the only feedback they get. Every "AI coach" app they tried wanted a subscription, shipped
their workout videos to a company's servers, or paraphrased generic YouTube advice. So I built
Spotter for them instead.&lt;/p&gt;
&lt;p&gt;A user uploads a short exercise video, adds basic training context, and gets a structured form-review
report with rep counts, movement notes, annotated video, and a grounded coach summary — produced by
open-weight models that cost nothing to run and never…&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/aijadugar/spotter" 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;Spotter is a pipeline of small, checkable steps rather than one big chatbot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;video + profile
  -&amp;gt; video quality check
  -&amp;gt; pose extraction (MediaPipe Pose Landmarker Lite)
  -&amp;gt; pose cleaning
  -&amp;gt; exercise router (custom PyTorch BiLSTM, 182,796 parameters)
  -&amp;gt; exercise-specific rep counter
  -&amp;gt; per-rep analysis -&amp;gt; variation detection -&amp;gt; issue markers
  -&amp;gt; annotated video + issue clips
  -&amp;gt; coach summary (Nemotron-3-Nano-4B + LoRA)
  -&amp;gt; verifier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The models.&lt;/strong&gt; The router is a tiny BiLSTM over 30-frame windows of pose landmarks. The coach summary comes from &lt;code&gt;nvidia/NVIDIA-Nemotron-3-Nano-4B-BF16&lt;/code&gt;, fine-tuned with a LoRA on task-specific data. Training and publishing run as Modal jobs. For fully local use, the summary can run through &lt;code&gt;llama.cpp&lt;/code&gt; with a GGUF build, so MediaPipe, the router and the coach summary all run on a laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence first, language second.&lt;/strong&gt; The numbers (reps, depth, issue counts) come from deterministic code. The language model only phrases them. A verifier then checks the summary against that evidence and blocks claims it can't ground or that sound like a diagnosis. I'd rather the coach say less than say something it can't back up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional extras, all opt-in.&lt;/strong&gt; Spotter's core promise is that it runs locally with no account, so anything cloud-based is off by default and falls back quietly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Voice coach (ElevenLabs).&lt;/strong&gt; Short spoken cues for the top issues, like "rep 3: knees drifted inward". It only speaks text that already passed the verifier, caches audio on disk so repeat runs cost nothing, and enforces a per-run character budget. Only text is sent, never video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-session memory (Backboard).&lt;/strong&gt; A "vs last session" comparison, so my friend can see whether a fault is fading. SQLite stays the source of truth. Only derived metrics (date, exercise, rep count, issue counts) are synced, never video, frames or landmarks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tuning pipeline (Tinker).&lt;/strong&gt; A LoRA fine-tune of a small Qwen model for the progress-plan step, with a dry-run mode that prints token counts and cost before spending anything. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment (Render).&lt;/strong&gt; A Render Blueprint with a health check and a persistent disk for history. Live require credit card (I don't have).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built this with Claude Code in a long session of small, verified steps.&lt;/p&gt;

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

&lt;p&gt;Three things my friend cares about would have been impossible, or paid for, with a closed API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Their workout videos stay on their machine.&lt;/strong&gt; Videos of someone training at home, often in their living room, are personal. With open weights and local inference, there is no server that has to see them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run and needs no account.&lt;/strong&gt; There is no subscription and no per-request bill. That matters when the whole point is that a trainer is too expensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can change it for them.&lt;/strong&gt; The coach's voice and focus come from a LoRA I trained, so when a better 4B model appears or my friend wants a different style, I retrain the adapter instead of waiting for a vendor. The small router and the verifier mean every claim can be inspected, not just trusted.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>GuWiki: Building a Gujarati AI Wikipedia from Scratch 🇮🇳</title>
      <dc:creator>BARI ANKIT VINOD </dc:creator>
      <pubDate>Fri, 05 Jun 2026 16:31:04 +0000</pubDate>
      <link>https://dev.to/bariankitvinod/guwiki-building-a-gujarati-ai-wikipedia-from-scratch-12c6</link>
      <guid>https://dev.to/bariankitvinod/guwiki-building-a-gujarati-ai-wikipedia-from-scratch-12c6</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;GuWiki is an AI-powered Wikipedia-style platform built specifically for the Gujarati language.&lt;/p&gt;

&lt;p&gt;Gujarati is spoken by more than &lt;strong&gt;60 million people worldwide&lt;/strong&gt;, yet high-quality AI tools, language models, and speech technologies for Gujarati remain limited compared to English and other major languages.&lt;/p&gt;

&lt;p&gt;I wanted to help close that gap.&lt;/p&gt;

&lt;p&gt;Instead of relying on existing foundation models, I built the core AI components from scratch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Gujarati Large Language Model (LLM)&lt;/li&gt;
&lt;li&gt;A Gujarati Automatic Speech Recognition (ASR) model&lt;/li&gt;
&lt;li&gt;A complete data engineering pipeline&lt;/li&gt;
&lt;li&gt;A Wikipedia-style knowledge platform powered by these models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users can search, read, and interact with Gujarati knowledge using AI that understands the language natively.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Models
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Gujarati NanoGPT (LLM)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/aijadugar/gujarati-nanogpt" rel="noopener noreferrer"&gt;https://huggingface.co/aijadugar/gujarati-nanogpt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A language model trained specifically on Gujarati text to understand vocabulary, grammar, and language patterns.&lt;/p&gt;

&lt;h4&gt;
  
  
  Gujarati ASR Model
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/aijadugar/gujarati-asr" rel="noopener noreferrer"&gt;https://huggingface.co/aijadugar/gujarati-asr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A speech-to-text model trained for Gujarati audio, enabling voice-based interaction and accessibility.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Live Application
&lt;/h3&gt;

&lt;p&gt;👉 &lt;a href="https://gu-wiki.vercel.app/" rel="noopener noreferrer"&gt;https://gu-wiki.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Video Walkthrough
&lt;/h3&gt;

&lt;p&gt;🎥 &lt;a href="https://www.loom.com/share/b5e278e624724d8f975e95b0fc3c6297" rel="noopener noreferrer"&gt;https://www.loom.com/share/b5e278e624724d8f975e95b0fc3c6297&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;AI-powered Gujarati knowledge search&lt;/li&gt;
&lt;li&gt;Native Gujarati language understanding&lt;/li&gt;
&lt;li&gt;Speech-to-text capabilities&lt;/li&gt;
&lt;li&gt;Custom-trained Gujarati LLM&lt;/li&gt;
&lt;li&gt;Custom-trained Gujarati ASR&lt;/li&gt;
&lt;li&gt;End-to-end data engineering pipeline&lt;/li&gt;
&lt;li&gt;Fast and responsive web interface&lt;/li&gt;
&lt;li&gt;Open-source repository for community contribution&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;This project started as an ambitious idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can I build AI infrastructure for Gujarati instead of simply consuming models built for English?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer turned out to be much harder than expected.&lt;/p&gt;

&lt;p&gt;The biggest challenge wasn't building the website.&lt;/p&gt;

&lt;p&gt;It was the data.&lt;/p&gt;

&lt;p&gt;Gujarati lacks the abundance of high-quality datasets available for English. I spent significant time collecting, cleaning, validating, and preparing Gujarati text and speech data before any model training could even begin.&lt;/p&gt;

&lt;p&gt;The project went through multiple iterations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rebuilding data pipelines&lt;/li&gt;
&lt;li&gt;Cleaning noisy datasets&lt;/li&gt;
&lt;li&gt;Experimenting with tokenization strategies&lt;/li&gt;
&lt;li&gt;Training and retraining language models&lt;/li&gt;
&lt;li&gt;Improving speech recognition quality&lt;/li&gt;
&lt;li&gt;Optimizing inference performance&lt;/li&gt;
&lt;li&gt;Connecting everything into a single user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the Finish-Up-A-Thon, I focused on turning these individual research efforts into a complete, usable product.&lt;/p&gt;

&lt;p&gt;I improved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model integration&lt;/li&gt;
&lt;li&gt;Frontend experience&lt;/li&gt;
&lt;li&gt;Deployment workflows&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Performance optimizations&lt;/li&gt;
&lt;li&gt;Repository structure&lt;/li&gt;
&lt;li&gt;End-to-end user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is GuWiki: a fully working AI-powered knowledge platform designed around Gujarati language users.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot played a significant role throughout development.&lt;/p&gt;

&lt;p&gt;While building GuWiki, I worked across multiple domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data engineering&lt;/li&gt;
&lt;li&gt;Machine learning&lt;/li&gt;
&lt;li&gt;Deep learning&lt;/li&gt;
&lt;li&gt;Model training&lt;/li&gt;
&lt;li&gt;API development&lt;/li&gt;
&lt;li&gt;Frontend development&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Switching contexts constantly can slow development, and Copilot helped reduce that friction.&lt;/p&gt;

&lt;p&gt;Some of the ways it helped include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generating boilerplate code&lt;/li&gt;
&lt;li&gt;Accelerating API development&lt;/li&gt;
&lt;li&gt;Creating data processing utilities&lt;/li&gt;
&lt;li&gt;Writing training scripts faster&lt;/li&gt;
&lt;li&gt;Refactoring repetitive code&lt;/li&gt;
&lt;li&gt;Generating documentation&lt;/li&gt;
&lt;li&gt;Suggesting fixes during debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I appreciated most was that Copilot allowed me to stay focused on solving the actual AI and language challenges instead of spending time on repetitive implementation details.&lt;/p&gt;

&lt;p&gt;It felt less like autocomplete and more like a development companion that helped maintain momentum throughout the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Project Matters
&lt;/h2&gt;

&lt;p&gt;Most AI innovation today happens in a small number of major languages.&lt;/p&gt;

&lt;p&gt;Millions of people speak Gujarati every day, but the ecosystem of open-source AI tools for the language is still developing.&lt;/p&gt;

&lt;p&gt;GuWiki is my contribution toward making AI more accessible for Gujarati speakers by building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open-source language models&lt;/li&gt;
&lt;li&gt;Open-source speech models&lt;/li&gt;
&lt;li&gt;Public datasets and pipelines&lt;/li&gt;
&lt;li&gt;Real-world applications powered by those models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My goal is not only to build a product but to help strengthen the Gujarati AI ecosystem so future developers and researchers can build on top of it.&lt;/p&gt;

&lt;p&gt;If even a small part of this work helps expand access to knowledge and AI for Gujarati speakers, then the project has already succeeded.&lt;/p&gt;




&lt;h2&gt;
  
  
  Repository &amp;amp; Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/aijadugar/GuWiki" rel="noopener noreferrer"&gt;https://github.com/aijadugar/GuWiki&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live App: &lt;a href="https://gu-wiki.vercel.app/" rel="noopener noreferrer"&gt;https://gu-wiki.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://www.loom.com/share/b5e278e624724d8f975e95b0fc3c6297" rel="noopener noreferrer"&gt;https://www.loom.com/share/b5e278e624724d8f975e95b0fc3c6297&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gujarati LLM: &lt;a href="https://huggingface.co/aijadugar/gujarati-nanogpt" rel="noopener noreferrer"&gt;https://huggingface.co/aijadugar/gujarati-nanogpt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gujarati ASR: &lt;a href="https://huggingface.co/aijadugar/gujarati-asr" rel="noopener noreferrer"&gt;https://huggingface.co/aijadugar/gujarati-asr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⭐ If you find the project interesting, feel free to explore the repository and share feedback.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>githubcopilot</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
