<?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: Maltheshhh</title>
    <description>The latest articles on DEV Community by Maltheshhh (@cloudyyy).</description>
    <link>https://dev.to/cloudyyy</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%2F4155498%2F4a46d45f-ab35-478a-b8e5-09c362652a65.jpg</url>
      <title>DEV Community: Maltheshhh</title>
      <link>https://dev.to/cloudyyy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cloudyyy"/>
    <language>en</language>
    <item>
      <title>Slow Digest: a local open-weight model reads your group chat overnight and leaves you two lines</title>
      <dc:creator>Maltheshhh</dc:creator>
      <pubDate>Sat, 24 Oct 2026 17:48:58 +0000</pubDate>
      <link>https://dev.to/cloudyyy/slow-digest-a-local-open-weight-model-reads-your-group-chat-overnight-and-leaves-you-two-lines-3o5k</link>
      <guid>https://dev.to/cloudyyy/slow-digest-a-local-open-weight-model-reads-your-group-chat-overnight-and-leaves-you-two-lines-3o5k</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;Slow Digest turns a long group chat into two lines. Paste or export the chat, and it returns the most important change (what, when) and the most important thing you must do (who, by when). The sticker packs, match talk and goodnights are skipped.&lt;/p&gt;

&lt;p&gt;It is for anyone who wakes up to 200 unread messages in a class, club or project group and only needs to know what is due. You can run it from the web page, or schedule a script that writes the digest to a file while you sleep.&lt;/p&gt;

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

&lt;p&gt;Live site: &lt;a href="https://slow-digest.onrender.com" rel="noopener noreferrer"&gt;https://slow-digest.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hosted site runs on Render's free plan, which has no Ollama. It uses the rule-based digest there. The open-weight model runs when you start the app on your own machine.&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/maltheshhh" rel="noopener noreferrer"&gt;
        maltheshhh
      &lt;/a&gt; / &lt;a href="https://github.com/maltheshhh/slow-digest" rel="noopener noreferrer"&gt;
        slow-digest
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      a “Sloth Summarizer” that squeezes long chats into two lines using an open-weight model that runs in your browser.
    &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;Slow Digest&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A two-line morning summary of your group chat, written by an open-weight model running on your own machine.&lt;/p&gt;
&lt;p&gt;Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 3: Slow and Steady.&lt;/p&gt;
&lt;p&gt;Paste an exported chat, get two lines: what changed, and what you must do. Jokes, stickers and goodnights are skipped.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chats stay on your machine.&lt;/strong&gt; The server only talks to Ollama on localhost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline.&lt;/strong&gt; If no model is installed, a rule-based digest takes over.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swap the model.&lt;/strong&gt; Set &lt;code&gt;OLLAMA_MODEL&lt;/code&gt; or choose one per request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No cost per run.&lt;/strong&gt; No API key.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Stack&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Node 22 + Express (API and static hosting)&lt;/li&gt;
&lt;li&gt;Ollama (any open-weight model it can serve)&lt;/li&gt;
&lt;li&gt;SQLite via the built-in &lt;code&gt;node:sqlite&lt;/code&gt; for digest history&lt;/li&gt;
&lt;li&gt;Plain HTML, CSS and JS frontend&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&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;ollama pull llama3.2:3b     &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; optional, enables the model engine&lt;/span&gt;
npm install
npm start                   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; http://localhost:3000&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Copy &lt;code&gt;.env.example&lt;/code&gt; to &lt;code&gt;.env&lt;/code&gt; and export…&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/maltheshhh/slow-digest" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; any open-weight model that Ollama can serve. The default is &lt;code&gt;llama3.2:3b&lt;/code&gt;, and you can change it with one environment variable or per request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Node 22 and Express. &lt;code&gt;POST /api/digest&lt;/code&gt; sends the chat to Ollama on localhost and asks for exactly two lines. If Ollama is not running, the same endpoint falls back to a rule-based digest that scores messages by deadlines, days, times and numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;History:&lt;/strong&gt; stored in SQLite through Node's built-in &lt;code&gt;node:sqlite&lt;/code&gt;, so there are no native packages to install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; plain HTML, CSS and JS. A tiny sloth crawls along a branch while you read, at an assumed 4 metres a minute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overnight mode:&lt;/strong&gt; &lt;code&gt;scripts/sloth_digest.py&lt;/code&gt; does the same job from the command line with the Python standard library only. Cron runs it at 3 am and the digest is in a text file by morning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; 5 tests cover chat parsing, the digest rules and the API.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A group chat holds other people's messages, so I did not want to send it to a server I do not control. With a local open-weight model, the chat never leaves the laptop.&lt;/p&gt;

&lt;p&gt;The same choice gave me three other things a closed API would not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It works offline.&lt;/strong&gt; The overnight job needs only a laptop, and the app still works with no model installed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can swap the model.&lt;/strong&gt; A smaller one is faster, a larger one handles nuance better, and I can retune the prompt to how my friends write.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing per run.&lt;/strong&gt; There is no API key and no meter running while I sleep.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I built a receipt sorter that never uploads a receipt</title>
      <dc:creator>Maltheshhh</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:23:19 +0000</pubDate>
      <link>https://dev.to/cloudyyy/i-built-a-receipt-sorter-that-never-uploads-a-receipt-59fp</link>
      <guid>https://dev.to/cloudyyy/i-built-a-receipt-sorter-that-never-uploads-a-receipt-59fp</guid>
      <description>&lt;p&gt;Every freelancer I know has the same monthly chore: a folder of screenshots, PDFs and receipt photos that gets sorted by hand before the accountant asks. I built &lt;strong&gt;receiptsort&lt;/strong&gt; to do that sorting, and I wanted it to run with no cloud at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live site:&lt;/strong&gt; &lt;a href="https://receiptsort.onrender.com/" rel="noopener noreferrer"&gt;https://receiptsort.onrender.com/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/maltheshhh/receiptsort" rel="noopener noreferrer"&gt;https://github.com/maltheshhh/receiptsort&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Point it at a folder of receipts and invoices. A vision model extracts vendor, date, invoice number, currency, subtotal, tax, total and category. Each file is copied to &lt;code&gt;YYYY-MM/Category/&lt;/code&gt; with a searchable name like &lt;code&gt;2026-09-03_Figma_12.00.png&lt;/code&gt;, and &lt;code&gt;ledger.csv&lt;/code&gt; gets one row per receipt.&lt;/p&gt;

&lt;p&gt;Anything uncertain goes to &lt;code&gt;_needs_review/&lt;/code&gt; instead of being filed with a guess:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a missing vendor, date or total&lt;/li&gt;
&lt;li&gt;subtotal + tax that doesn't match the total&lt;/li&gt;
&lt;li&gt;the same vendor, date and total as an earlier receipt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Files are tracked by SHA-256, so re-running on the same folder only processes new ones.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why open models
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Privacy.&lt;/strong&gt; Invoices carry client names, rates and bank details, and many freelancers are under NDAs. The model runs locally through Ollama (default &lt;code&gt;qwen2.5vl:7b&lt;/code&gt;), so nothing is uploaded and it works offline. A hosted API would exclude the exact users this is for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost.&lt;/strong&gt; Hosted vision APIs bill per page. Local inference is free per receipt, so a flat price for the software still makes sense in a busy month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Swappable model.&lt;/strong&gt; Any Ollama vision model works with &lt;code&gt;--model&lt;/code&gt;. I can try a newer one the week it ships or fine-tune for a niche, with no vendor in the way.&lt;/p&gt;
&lt;h2&gt;
  
  
  The interesting part: schema-constrained output
&lt;/h2&gt;

&lt;p&gt;Ollama accepts a JSON schema in the &lt;code&gt;format&lt;/code&gt; field, which constrains the model's reply. That makes a 7B model dependable for extraction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SCHEMA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;# JSON schema with a category enum
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;options&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PROMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;images&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;]}],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The schema limits &lt;code&gt;category&lt;/code&gt; to a fixed list, and a validation step checks dates, parses numbers and cross-checks the totals. Whatever fails validation is routed to review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing without a model
&lt;/h2&gt;

&lt;p&gt;The test starts a stub Ollama server on localhost that returns canned answers, then runs the whole pipeline: filing, flags, ledger and the idempotent re-run. It caught a real bug where duplicates inside a single run weren't flagged, because in-memory rows held floats while rows loaded from the CSV held strings.&lt;/p&gt;

&lt;p&gt;I haven't yet measured accuracy on a large set of real receipts. That's the next step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull qwen2.5vl:7b
pip &lt;span class="nb"&gt;install &lt;/span&gt;pymupdf   &lt;span class="c"&gt;# optional, for PDFs&lt;/span&gt;
python3 receiptsort.py ~/Downloads/receipts &lt;span class="nt"&gt;--out&lt;/span&gt; ~/receipts-sorted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The website is a static page on Render. The sorter itself runs on your own machine, which is the point.&lt;/p&gt;

&lt;p&gt;Feedback welcome, especially on receipts from other countries and languages.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>ollama</category>
    </item>
    <item>
      <title>Touch Grass: An App That Pays You to Go Outside</title>
      <dc:creator>Maltheshhh</dc:creator>
      <pubDate>Sun, 11 Oct 2026 00:22:04 +0000</pubDate>
      <link>https://dev.to/cloudyyy/touch-grass-an-app-that-pays-you-to-go-outside-6on</link>
      <guid>https://dev.to/cloudyyy/touch-grass-an-app-that-pays-you-to-go-outside-6on</guid>
      <description>&lt;p&gt;Why I built it&lt;br&gt;
"Touch grass" is what the internet tells people who spend too much time online. I turned the joke into a game: finish small outdoor quests, prove it with a photo, and earn rewards.&lt;br&gt;
Try it live at &lt;a href="https://touchdegrass.onrender.com" rel="noopener noreferrer"&gt;https://touchdegrass.onrender.com&lt;/a&gt; The source is on GitHub &lt;a href="https://github.com/maltheshhh/TouchdeGrass" rel="noopener noreferrer"&gt;https://github.com/maltheshhh/TouchdeGrass&lt;/a&gt;.&lt;br&gt;
How it plays&lt;br&gt;
A round takes four steps:&lt;/p&gt;

&lt;p&gt;Pick a quest, such as shoes off, tree hug or golden hour.&lt;br&gt;
Upload a photo as proof.&lt;br&gt;
Claude judges the photo and rejects screenshots, photos of screens and indoor shots.&lt;br&gt;
A pass earns blades (the points) and a "Verified" stamp. Enough blades unlock vouchers. Features Touch Grass ships eight quests worth 155 blades in total, plus a progress meter and three vouchers. • AI photo judge: Claude checks each photo against the quest and leaves a one-line note on what it sees. • Photo proof: upload from your camera or gallery. Screenshots and photos of screens fail. • Blades and vouchers: a meter tracks your points, and vouchers unlock at 30, 80 and 140 blades. • Voucher codes: claim a code and copy it in one tap. • Saved progress: completed quests and claimed vouchers are kept in your browser. • Grass you can brush: the hero lawn bends away from your cursor or finger. • Light and dark themes: the lawn turns to night when your device is in dark mode. • Phone friendly: built to work at phone width, with a Start over button for a fresh run. The eight quests: Quest What to photograph Blades Level Shoes off Your bare feet on real grass 20 Easy Palm down One hand flat on a lawn 10 Easy Tree hug You hugging a tree, or both hands on the trunk 20 Medium Look up Open sky, with no ceiling or screen in frame 10 Easy Meet a local A bird, bug, snail or squirrel 25 Medium Leaf trio Three different leaves side by side 20 Medium Golden edge A sunrise or sunset 30 Hard Outdoor break A snack or a book outside 20 Easy Under the hood The whole app is one static HTML file with no build step: markup, styles and script live together in index.html. When you submit a proof, the page shrinks the photo to 1280 pixels on its longest side and sends it to Claude with the quest and a short rulebook. Claude replies with a pass or fail and a one-sentence reason, which the page shows on the quest card. The judge is told to ignore any instructions written inside the photo. One limit to know about: the judge runs on Claude's built-in features, so it works when the app is opened inside Claude. The Render version loads and saves progress, but it cannot verify photos yet. Moving the judge to a small backend that calls the Claude API is the next step. Try it Play it at touchdegrass.onrender.com and read the code on GitHub. Pull requests are welcome, especially new quests and a real backend for the photo judge. Now close the tab and go touch some grass.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>VivaMate: A Local AI Interview Partner I Built for a Friend</title>
      <dc:creator>Maltheshhh</dc:creator>
      <pubDate>Sun, 04 Oct 2026 05:12:39 +0000</pubDate>
      <link>https://dev.to/cloudyyy/vivamate-a-local-ai-interview-partner-i-built-for-a-friend-314p</link>
      <guid>https://dev.to/cloudyyy/vivamate-a-local-ai-interview-partner-i-built-for-a-friend-314p</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;[Friend's name] has campus placements coming up and kept saying the same thing: "I know the answers, I just freeze when someone asks." Reading notes doesn't fix that. Practicing out loud with someone who pushes back does.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;VivaMate&lt;/strong&gt;, an AI interview partner that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs mock, HR, DSA and project deep-dive interviews, one question at a time&lt;/li&gt;
&lt;li&gt;Reads [Friend's name]'s resume PDF and GitHub repos, so the questions are about &lt;em&gt;their&lt;/em&gt; projects&lt;/li&gt;
&lt;li&gt;Scores every answer for correctness and clarity, then tracks weak topics, streaks and a readiness score&lt;/li&gt;
&lt;li&gt;Takes spoken answers through the mic, because freezing happens out loud&lt;/li&gt;
&lt;li&gt;Has a 60-second Pressure Mode that simulates a real interview&lt;/li&gt;
&lt;li&gt;Exports a PDF session report with strengths, weaknesses and revision topics&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🔗 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://vivamate-b7th.onrender.com" rel="noopener noreferrer"&gt;https://vivamate-b7th.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[Add a screenshot or short video of a mock interview with the readiness score visible.]&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/maltheshhh" rel="noopener noreferrer"&gt;
        maltheshhh
      &lt;/a&gt; / &lt;a href="https://github.com/maltheshhh/VivaMate" rel="noopener noreferrer"&gt;
        VivaMate
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Ai based Mate for ideal viva and interviews
    &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;VivaMate&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Your AI-powered companion for viva, interview, and placement preparation.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VivaMate is a local-first AI interview preparation assistant designed to help students practice technical interviews, HR rounds, DSA questions, project discussions, and resume-based interviews.&lt;/p&gt;
&lt;p&gt;It combines conversational AI, voice input, personalized candidate context, performance scoring, readiness tracking, weak-topic detection, and downloadable reports into a single lightweight web application.&lt;/p&gt;
&lt;p&gt;The application can run &lt;strong&gt;entirely locally&lt;/strong&gt; using &lt;a href="https://ollama.com/" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, making it possible to practice without sending your conversations to a cloud AI provider.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;AI Interview Modes&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;VivaMate provides multiple focused preparation modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock Interview&lt;/strong&gt; — Practice realistic interview questions one at a time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explain Mode&lt;/strong&gt; — Learn concepts you struggled with through simple explanations and examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HR Round&lt;/strong&gt; — Practice behavioral and situational questions using STAR-style feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DSA Round&lt;/strong&gt; — Practice data structures and algorithms questions, including approach and complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Deep-Dive&lt;/strong&gt; — Discuss your GitHub projects, design decisions, trade-offs, bugs…&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/maltheshhh/VivaMate" 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 whole stack runs on open pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLM:&lt;/strong&gt; Ollama running &lt;code&gt;qwen2.5:7b&lt;/code&gt;, an open-weight model, with an optional OpenAI-compatible endpoint set through &lt;code&gt;.env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speech-to-text:&lt;/strong&gt; &lt;code&gt;faster-whisper&lt;/code&gt;, running locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI, SQLite and streamed responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; vanilla HTML/CSS/JS with the MediaRecorder and Speech Synthesis APIs, no framework and no CDN&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documents:&lt;/strong&gt; &lt;code&gt;pypdf&lt;/code&gt; to read resumes, ReportLab to write reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation:&lt;/strong&gt; after each answer, the model returns a structured &lt;code&gt;{score, clarity, topic}&lt;/code&gt; JSON. That feeds SQLite and drives weak-topic detection, readiness and the &lt;code&gt;/weak&lt;/code&gt; and &lt;code&gt;/quiz&lt;/code&gt; commands.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A mock interview is personal: your resume, your mistakes, your nervous half-answers. I didn't want a student's practice sessions sitting on a server they don't control.&lt;/p&gt;

&lt;p&gt;Open models gave me what a closed API wouldn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; resume, answers and scores stay on the user's machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline use:&lt;/strong&gt; after the first model download, it works without internet&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero running cost:&lt;/strong&gt; no per-token bill, which matters for a student&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Swappable brain:&lt;/strong&gt; one line in &lt;code&gt;.env&lt;/code&gt; switches the model or provider&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;[Optional: embed or link your DevRelay session.]&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; the live demo is hosted on Render.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My friend Arun has exams starting tomorrow. He knows the material, but reading notes doesn't prepare you for being questioned out loud, where you have to explain, defend and think under pressure.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;VivaMate&lt;/strong&gt;, an AI interview and viva partner for him. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asks questions one at a time and reacts to what he actually says&lt;/li&gt;
&lt;li&gt;Reads his resume PDF and GitHub repos, so project questions are about &lt;em&gt;his&lt;/em&gt; work&lt;/li&gt;
&lt;li&gt;Scores every answer for correctness and clarity, then tracks weak topics, streaks and a readiness score&lt;/li&gt;
&lt;li&gt;Takes spoken answers through the mic&lt;/li&gt;
&lt;li&gt;Has a 60-second Pressure Mode to simulate exam-room stress&lt;/li&gt;
&lt;li&gt;Explains concepts he gets wrong, then exports a PDF report of what to revise&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  devchallenge #weekendchallenge #hf26challenge
&lt;/h1&gt;

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