<?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: Anushka Gupte</title>
    <description>The latest articles on DEV Community by Anushka Gupte (@anushka_gupte_4816be37a9c).</description>
    <link>https://dev.to/anushka_gupte_4816be37a9c</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%2F4154822%2F7c06c9ef-67ff-4fdd-b6d5-97afa18ead10.png</url>
      <title>DEV Community: Anushka Gupte</title>
      <link>https://dev.to/anushka_gupte_4816be37a9c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anushka_gupte_4816be37a9c"/>
    <language>en</language>
    <item>
      <title>JobTalk: Talk the Job, Get the Quote</title>
      <dc:creator>Anushka Gupte</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:21:55 +0000</pubDate>
      <link>https://dev.to/anushka_gupte_4816be37a9c/jobtalk-talk-the-job-get-the-quote-1mka</link>
      <guid>https://dev.to/anushka_gupte_4816be37a9c/jobtalk-talk-the-job-get-the-quote-1mka</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;JobTalk&lt;/strong&gt; turns a tradesperson’s spoken description of a job into a formatted, itemized quote. It runs entirely on their own laptop, with no cloud and no accounts.&lt;/p&gt;

&lt;p&gt;The buyer I had in mind is a self-employed plumber, electrician, or AC technician in India. They finish a job, then spend an evening typing up a quote, or they send a scribbled WhatsApp message. Items get forgotten and quotes look unprofessional. With JobTalk they say something like “Geyser ka thermostat badla, do ghante ka kaam, paanch sau rupaye labour” and get an itemized quote in rupees, ready to print, save as PDF, or share on WhatsApp.&lt;/p&gt;

&lt;p&gt;Some details came from thinking about who actually uses it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Amounts use Indian digit grouping (₹1,23,456.00), with optional GST and CGST/SGST split and a round-off line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setup is optional. There’s no signup, and many small tradespeople have no business name or logo, so the quote header falls back gracefully.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It’s built for being wrong. The raw transcript stays next to the editable line items, and the app flags anything it isn’t sure about.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;The demo shows: speak a job, watch the transcript appear, watch line items stream in, fix one line, and export.&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/Anushka-Gupte" rel="noopener noreferrer"&gt;
        Anushka-Gupte
      &lt;/a&gt; / &lt;a href="https://github.com/Anushka-Gupte/JobTalk" rel="noopener noreferrer"&gt;
        JobTalk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      JobTalk - Talk the Job, Get the Quote
    &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;JobTalk&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Dictate a job, get a quote.&lt;/strong&gt; A plumber or electrician describes the work out loud on-site
JobTalk turns it into a formatted, itemized quote. It runs fully offline on open models
(Whisper for speech, a small local LLM for extraction).&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open models&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Offline:&lt;/strong&gt; works in basements and rural sites with no signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private:&lt;/strong&gt; customer names, addresses and prices never leave the device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheap:&lt;/strong&gt; no per-quote API fees, so a flat low price stays profitable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customizable:&lt;/strong&gt; your own price list, swappable models, fine-tunable per trade.&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;pip install -e &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;.[web,audio]&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; one-time setup&lt;/span&gt;
python run.py                   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; checks Ollama, starts server, opens browser&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open &lt;strong&gt;&lt;a href="http://localhost:5000" rel="nofollow noopener noreferrer"&gt;http://localhost:5000&lt;/a&gt;&lt;/strong&gt; — or on a phone on the same Wi-Fi, &lt;code&gt;http://&amp;lt;laptop-ip&amp;gt;:5000&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The first run downloads &lt;code&gt;qwen2.5:1.5b&lt;/code&gt; (~1 GB) if it isn't already pulled.
All settings (business name, tax rate, model, port) live in &lt;a href="https://github.com/Anushka-Gupte/JobTalk/config.yaml" rel="noopener noreferrer"&gt;&lt;code&gt;config.yaml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;CLI (no browser needed)&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull qwen2.5:1.5b&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/Anushka-Gupte/JobTalk" 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 pipeline has three parts, all open and all local:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;faster-whisper&lt;/strong&gt; transcribes the audio on CPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;qwen2.5:1.5b&lt;/strong&gt;, served by &lt;strong&gt;Ollama&lt;/strong&gt;, reads the transcript and returns structured JSON (customer, address, line items). Output is constrained with a JSON schema, and the model streams items to the UI as they’re generated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plain Python&lt;/strong&gt; does everything that involves money.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The design rule that mattered most is that &lt;strong&gt;the model extracts and the code calculates&lt;/strong&gt;. Small models are unreliable at arithmetic, so totals, GST, and round-off live in a Decimal-based pricing module, with a randomized test checking that subtotal + tax + round_off == total. The model is also told never to invent prices. A missing price stays empty, is filled only from the user’s own price list, and blocks export until confirmed. A deterministic check also flags any price that doesn’t appear in the transcript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I measured&lt;/strong&gt; (CPU only, no GPU; 26 hand-written transcripts, with an 11-transcript held-out set of about 48 line items):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Prompt changes alone moved item recall from &lt;strong&gt;51% to 87%&lt;/strong&gt; on my first fixtures, with no fine-tuning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the held-out set, the 1.5B model found about &lt;strong&gt;85% of billable items&lt;/strong&gt; (runs ranged from 83% to 87.5%) and scored about 92% overall. The 3B model scored about the same but ran roughly 35% slower. A 7B model took about 150 s per quote on CPU, which is too slow to be useful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A warm quote takes &lt;strong&gt;about 22 seconds&lt;/strong&gt; on a plain laptop CPU, and the first one about 32 s.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I tried putting items first in the output schema. It cut time to the first line from about 20 s to about 5.6 s but dropped accuracy by 4.4 points, so I rejected it. A missed line is lost revenue.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What went wrong, because it’s useful:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It misses roughly 1 in 7 billable items, so I built around that. My automatic “items may be missing” warning is also weak: it caught 9 of 17 real misses and raised 6 false alarms. Because of that, the UI never implies the quote is complete. It highlights number phrases in the transcript that match no line, keeps removed or old items visible (greyed out, with a Restore button) instead of deleting them, and keeps every line editable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My test suite passed while the audio path was broken. A newer PyAV removed an argument that faster-whisper still passes, and every test used text or fake transcription, so nothing caught it until I ran real audio. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My test set is small and I tuned post-processing rules while looking at it. Treat the numbers above as a rough guide, not a benchmark.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Each of these is something a closed API would have made hard for this product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It works where the job is&lt;/strong&gt;. Basements, crawl spaces, and rural sites often have no signal. A cloud API fails exactly there. After the one-time model download, JobTalk needs no connection. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customer data stays on the device&lt;/strong&gt;. Names, addresses, and prices never reach a server, so there are no accounts, no database, and nothing to breach. That’s also why I deliberately skipped signup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The business model works&lt;/strong&gt;. There’s no per-quote API fee, so a flat low price (I’m considering something like ₹299 a month or ₹999 once) leaves a margin. With a metered API, every quote would cost money and the price would have to cover it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I could change what mattered. I swapped models and compared them on my own transcripts, changed the prompt and the output schema, added Indian number words and rupee handling, and put a deterministic price check around the model. Those are the kind of changes you can’t make to a hosted model you don’t control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I could be honest about its limits. Because I ran the model myself, I could measure its misses and design the product around them.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed frontier model would likely be more accurate on messy Hinglish. I didn’t test that comparison and don’t claim it. What the open model gave me was privacy, offline use, and a cost that suits a very low-margin customer. For this buyer, those mattered more.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>EdgeMate: a local AI coding interviewer, built for a friend</title>
      <dc:creator>Anushka Gupte</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:40:23 +0000</pubDate>
      <link>https://dev.to/anushka_gupte_4816be37a9c/edgemate-a-local-ai-coding-interviewer-built-for-a-friend-2ipd</link>
      <guid>https://dev.to/anushka_gupte_4816be37a9c/edgemate-a-local-ai-coding-interviewer-built-for-a-friend-2ipd</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;A few weeks ago my friend spent weeks preparing for a software engineering interview. They worked really hard, and then didn't get it. The thing that hurt most wasn't the "no". It was that nobody told them what went wrong. Interview rejections come with no feedback, so you're left replaying a 45-minute performance in your head.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;EdgeMate&lt;/strong&gt; for them: a private, offline mock interviewer that runs on their laptop. It runs a real interview (understand the problem, discuss an approach, code, debug, discuss complexity, get a debrief) and it never makes them feel stupid for being stuck.&lt;/p&gt;

&lt;p&gt;Three things I cared about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's gentle by default.&lt;/strong&gt; The default "Friendly" persona opens with what you did well, gives hints freely, and never says "wrong".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It never spoils the answer.&lt;/strong&gt; The model is never shown the reference solution, so it can't leak it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It stays on their machine.&lt;/strong&gt; Rejection is a vulnerable moment. The code they write and the things they say while stuck shouldn't sit on someone else's server.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/pWz3XlsvSXk" 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/Anushka-Gupte" rel="noopener noreferrer"&gt;
        Anushka-Gupte
      &lt;/a&gt; / &lt;a href="https://github.com/Anushka-Gupte/EdgeMate" rel="noopener noreferrer"&gt;
        EdgeMate
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local Open-Source AI Coding Interviewer
    &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;EdgeMate&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Local Open-Source AI Coding Interviewer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"The code runner checks whether the solution works. The open-source AI handles the human part of the interview."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Demo&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://youtu.be/pWz3XlsvSXk" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FAnushka-Gupte%2FEdgeMate%2FHEAD%2F.%2FDemo.png" alt="Watch Demo"&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;div class="js-render-enrichment-target"&gt;
    &lt;div class="render-plaintext-hidden"&gt;
      &lt;pre&gt;flowchart TD
    subgraph Frontend["Frontend Layer (Dark-First Developer Theme)"]
        UI["Web SPA / UI (FastAPI &amp;amp; Uvicorn / Gradio)\n• Progressive Stage Panels\n• Live Python Editor &amp;amp; Examples Drawer\n• Problem Catalog &amp;amp; Progress Dashboard"]
    end
    subgraph API["Backend &amp;amp; Orchestration Layer"]
        ROUTER["REST API Routes (/api/sessions/*)"]
        STATE["Session State Machine (InterviewSession)\n• State: UNDERSTANDING ➔ APPROACH ➔ REVIEW ➔ CODING ➔ TESTING ➔ DEBUGGING ➔ COMPLEXITY ➔ DEBRIEF\n• Real-Time Attempt Tracking &amp;amp; Timestamps"]
        AGENT["Interviewer Agent (InterviewerAgent)\n• Context-Bounded Prompt Builder\n• Active Persona Adaptation\n• Socratic Guidance (Zero Solution Leaks)"]
    end
    subgraph LocalAI["Local Open-Source LLM (Ollama)"]
        OLLAMA["Ollama Engine (Local CPU/GPU Inference)\n• Default: qwen2.5-coder:3b (Q4_K_M)\n• Alternatives: llama3.2:3b, mistral:7b\n• 100% Offline &amp;amp; Private"]
    end

    subgraph Execution["Deterministic Execution Engine (Zero LLM Hallucinations)"]
        KB_LOADER["KB Loader (interview-kb/loader.py)\n• 119 Problems • 20 DSA Patterns\n• Pre-Materialized Hidden Tests &amp;amp; Large Generators"]
        RUNNER["Test&lt;/pre&gt;…&lt;/div&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/Anushka-Gupte/EdgeMate" 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;&lt;strong&gt;The one design rule: code checks, the model talks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My first instinct was to ask an LLM "is this code correct?". That's exactly where small models are worst. They can't reliably trace pointer loops, big inputs, or off-by-one bugs, and they love to dump the full solution. So I split the job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Candidate code ──► deterministic subprocess runner ──► pass/fail + a failure tag
                                                              │
Candidate chat ◄── local LLM (Ollama) ◄── pre-written follow-up question for that tag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Correctness is deterministic.&lt;/strong&gt; Code runs in an isolated subprocess with a timeout against hidden tests. The LLM only receives &lt;code&gt;tests_passed&lt;/code&gt;, &lt;code&gt;tests_total&lt;/code&gt; and a &lt;code&gt;failing_tag&lt;/code&gt; such as &lt;code&gt;empty&lt;/code&gt;, &lt;code&gt;duplicates&lt;/code&gt; or &lt;code&gt;large&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model only phrases the question.&lt;/strong&gt; Every problem in my knowledge base has pre-written follow-ups mapped to failure tags, so the model turns "failed on &lt;code&gt;duplicates&lt;/code&gt;" into a kind, Socratic question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A small model is enough.&lt;/strong&gt; Because the model never judges code, a 3B model on an 8GB laptop does the job. I use &lt;strong&gt;Qwen2.5-Coder 3B&lt;/strong&gt; via &lt;strong&gt;Ollama&lt;/strong&gt; by default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The interview itself is a state machine&lt;/strong&gt; with 7 stages: understanding → approach → approach review → coding → Socratic debugging → complexity → 4-pillar debrief. The editor and the optimal Big-O stay hidden until the right stage, like a real interview. There's also a 3-level hint ladder (question → nudge → concrete invariant).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The knowledge base&lt;/strong&gt; is &lt;strong&gt;119 problems across 20 patterns&lt;/strong&gt;, stored as plain JSON. Each has a reference solution, a brute-force solution, tagged tests, hints, and planted "common bug" solutions with the follow-up question for each. I checked it two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The reference solution must agree with an independent brute-force solution on hand-written tests and 300 random inputs per problem.&lt;/li&gt;
&lt;li&gt;In the real sandbox, every planted bug must fail at least one test carrying the tag it claims.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That second check caught my own mistakes: a "bug" that turned out to be a valid alternative algorithm, and bugs my tests couldn't actually catch. I fixed the tests and re-verified. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python, FastAPI, SQLite for session history and progress, Ollama for local inference, plain files for personas and problems. Personas (Friendly / Standard / Silent) are markdown files with word budgets.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1. Privacy where it matters most.&lt;/strong&gt;&lt;br&gt;
Someone processing a rejection is typing "I froze on this question" and their half-working code into a tool. With a hosted API, all of that goes to a server they don't control. With Ollama, nothing leaves the laptop. There's no account, no telemetry, and it works with no internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It runs on the hardware my friend actually has.&lt;/strong&gt;&lt;br&gt;
They have an 8GB laptop, so I couldn't pick a big model. The architecture makes that fine: deterministic tools do the judging and a 3B open model does the talking. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. I can change how the interviewer behaves.&lt;/strong&gt;&lt;br&gt;
The interviewer's personality is a markdown file. I can make it warmer, stricter, or nearly silent for stress practice, by editing a text file. The problem bank is the same: when my friend gets asked something new next time, they add one JSON entry. No retraining, no subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. I could compare models instead of trusting one.&lt;/strong&gt;&lt;br&gt;
EdgeMate has a benchmark endpoint that compares two local models on latency and on whether they respect the tone and word limits. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Zero cost to practise.&lt;/strong&gt;&lt;br&gt;
Fifty practice rounds cost the same as one: nothing. For someone job hunting, that matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where open beat closed, and where it didn't.&lt;/strong&gt; A hosted frontier model would write a smoother conversation. But it would also cost money per session, send a vulnerable person's code and feelings to a third party, and tempt me to let it judge correctness, which is the part models get wrong. Open weights plus deterministic tools gave me something more trustworthy, more private, and cheaper for this one person.&lt;/p&gt;

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