<?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: Tejas Nalawade</title>
    <description>The latest articles on DEV Community by Tejas Nalawade (@tejassantoshnalawade).</description>
    <link>https://dev.to/tejassantoshnalawade</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%2F4139834%2F2a930148-2ac1-412e-9565-80624142684a.png</url>
      <title>DEV Community: Tejas Nalawade</title>
      <link>https://dev.to/tejassantoshnalawade</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tejassantoshnalawade"/>
    <language>en</language>
    <item>
      <title>Recap Buddy: An Open-Source Study Buddy Where Gemma 4 Checks What You Teach</title>
      <dc:creator>Tejas Nalawade</dc:creator>
      <pubDate>Sun, 18 Oct 2026 14:53:09 +0000</pubDate>
      <link>https://dev.to/tejassantoshnalawade/recap-buddy-teach-it-out-loud-an-open-weight-gemma-4-checks-your-concepts-5ggd</link>
      <guid>https://dev.to/tejassantoshnalawade/recap-buddy-teach-it-out-loud-an-open-weight-gemma-4-checks-your-concepts-5ggd</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;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feqajsn25plpijpw0xu62.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feqajsn25plpijpw0xu62.jpg" alt="Recap Buddy home screen"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Recap Buddy&lt;/strong&gt; is a free, open-source study companion built around the Feynman technique: if you can explain something simply, you understand it.&lt;/p&gt;

&lt;p&gt;A student picks a topic and explains it out loud, the way they would teach a friend. The browser transcribes them live. An open-weight &lt;strong&gt;Gemma 4&lt;/strong&gt; model then reviews the explanation, judging &lt;strong&gt;concepts only&lt;/strong&gt; (never grammar, accent or filler words), and sorts every idea into four categories:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;What the student gets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Got it right&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Concepts explained correctly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Almost there&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The right idea, stated imprecisely, with the fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Needs fixing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What they said, struck through, with the correct version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;You skipped&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Important concepts they never mentioned, and why each matters&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each review comes with a score out of 100 and one concrete thing to revise next. Students can upload their own notes (PDF, DOCX or TXT), and Recap Buddy grades them &lt;strong&gt;against those notes&lt;/strong&gt; instead of general textbook knowledge.&lt;/p&gt;

&lt;p&gt;At the end of the day, one click turns every topic into a first-person &lt;strong&gt;Learning Diary&lt;/strong&gt;: a score table, what went well, what was mixed up, and the top three priorities for tomorrow, downloadable as Markdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;Teaching a topic back is one of the most effective ways to learn, but students run into two obstacles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;There is nobody to explain it to.&lt;/strong&gt; Friends and family rarely have the time or the subject knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Even a willing listener cannot grade it.&lt;/strong&gt; They cannot say what was correct, what was wrong, and, most importantly, what was skipped entirely. Those blind spots are exactly what cost marks in an exam.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Recap Buddy is a patient listener that can grade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who it is for
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;School and university students&lt;/strong&gt; revising several topics a day for boards, entrance exams or semester finals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-learners and job seekers&lt;/strong&gt; practising how to explain "how a TCP handshake works" or "what a B-tree is" before an interview.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teachers, study groups and student clubs&lt;/strong&gt; who want a teach-back tool they can run themselves, point at their own notes, and adapt to their syllabus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because everything is open source and can run on open-weight models locally, any student with a laptop can use it, and any school or club can host its own copy.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Video walkthrough
&lt;/h3&gt;

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

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://recapbuddy.vercel.app/" rel="noopener noreferrer"&gt;recapbuddy.vercel.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;MLH project page:&lt;/strong&gt; &lt;a href="https://www.mlh.com/events/hacktoberfest-hack-day-pune-x-aces-association-of-computer-engineering-students/submissions/01a14e7a-72b0-e022-c701-dc40230ebfe0" rel="noopener noreferrer"&gt;Recap Buddy at Hacktoberfest Hack Day Pune x ACES&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Full walkthrough: teaching "Open Source"
&lt;/h3&gt;

&lt;p&gt;This recording is from the live site. I chose the topic &lt;strong&gt;Open Source&lt;/strong&gt; and planted two common misconceptions in my explanation: that open-source code "has no copyright" and that it "can never be sold commercially".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fultal5oh0oslog3umxl8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fultal5oh0oslog3umxl8.gif" alt="Recording of the full flow: choosing the topic Open Source, typing the explanation, getting the review, and generating the learning diary"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What Gemma 4 returned:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;45 / 100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Got it right&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The definition of open source, the role of licences like MIT and GPL, and the fork-and-pull-request workflow on GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Needs fixing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"No copyright": open-source code is still protected by copyright, and the licence is what grants permission. "Can never be sold": open-source software can be sold, and many companies build commercial products on it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;You skipped&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Copyleft, and the difference between permissive and copyleft licences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Revise next&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The difference between permissive and copyleft licences&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both planted mistakes were caught, nothing correct was marked wrong, and the gaps it found are the ones a teacher would point out. The diary then summarised the day across every topic, with a score table and three priorities for tomorrow.&lt;/p&gt;
&lt;h3&gt;
  
  
  A second example: Photosynthesis
&lt;/h3&gt;

&lt;p&gt;Here I reversed the gas exchange ("plants take in oxygen and release carbon dioxide") and never mentioned the Calvin cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The score, summary, and what was right or nearly right:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fok5080840ildzg5c4f7e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fok5080840ildzg5c4f7e.jpg" alt="Review card with a score, a summary, and the Got it right and Almost there categories"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The corrections:&lt;/strong&gt; the reversed gas exchange is struck through in red pen with the correct version written underneath, and the missed concepts appear as sticky notes, followed by a "Revise next" action that Buddy can read aloud.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhe5e023loij6tz3mhzod.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhe5e023loij6tz3mhzod.jpg" alt="Wrong answer corrected in red pen, missed concepts as sticky notes, and a Revise next panel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The interface is designed like a school notebook: graph paper, ballpoint ink, green ticks, highlighter for "almost there", red pen for mistakes and sticky notes for gaps. A mascot, Buddy, nods while the student talks, moves its mouth with the real microphone level, and reacts to the score.&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/Tejas-Santosh-Nalawade" rel="noopener noreferrer"&gt;
        Tejas-Santosh-Nalawade
      &lt;/a&gt; / &lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES" rel="noopener noreferrer"&gt;
        Hacktoberfest-Hack-Day-ACES
      &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&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES/docs/logo.svg"&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%2FTejas-Santosh-Nalawade%2FHacktoberfest-Hack-Day-ACES%2FHEAD%2Fdocs%2Flogo.svg" alt="Recap Buddy" width="120" height="124"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Recap Buddy&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Teach it out loud. Buddy checks it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An open-source study companion that listens while you explain a topic, then uses an open-weight AI model to show what you got right, what was close, what was wrong and what you missed. At the end of the day it writes up everything you learned as a diary page.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a954b9501657b64b4be5aa4e1cef31329606e89ade7fefc987176179bed44b84/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d3246354246462e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://docs.digitalocean.com/products/inference/details/models/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8d3cf8a91a8a7d689356c247fb3f9108952e5cdb757fd9222ff195d4143917c7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d47656d6d61253230342532303331422d4646443433422e737667" alt="Gemma 4"&gt;&lt;/a&gt;
&lt;a href="https://www.digitalocean.com/products/app-platform" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/71181506043bbdd95af8c6e93417048dffc8f933f3f58162f53a6481fbb486fb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f686f737465642532306f6e2d4469676974616c4f6365616e2d3030383046462e7376673f6c6f676f3d6469676974616c6f6365616e266c6f676f436f6c6f723d7768697465" alt="DigitalOcean"&gt;&lt;/a&gt;
&lt;a href="https://react.dev" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7244b9d38f3e2c0c78e13b643e397a3b553b29dbef9d1ee5307d3143148260c8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31392d3631444146422e7376673f6c6f676f3d7265616374266c6f676f436f6c6f723d626c61636b" alt="React"&gt;&lt;/a&gt;
&lt;a href="https://fastapi.tiangolo.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/de6333d4c442a82c3ca1ee0fb6e7be4afc44dec56d58ee520a479c3582d2858a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d507974686f6e253230332e31322d3030393638382e7376673f6c6f676f3d66617374617069266c6f676f436f6c6f723d7768697465" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://hacktoberfest.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/700554f6f64c4c957156f77bf80dcc8972e28d0e907204a7b370ead1b4feed81/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d4535343834442e737667" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt; · &lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#" rel="noopener noreferrer"&gt;Demo video&lt;/a&gt; · &lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES/skills/recap-review/SKILL.md" rel="noopener noreferrer"&gt;Agent Skill&lt;/a&gt; · &lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES/issues" rel="noopener noreferrer"&gt;Report a bug&lt;/a&gt;&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES/docs/screenshots/home.jpg"&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%2FTejas-Santosh-Nalawade%2FHacktoberfest-Hack-Day-ACES%2FHEAD%2Fdocs%2Fscreenshots%2Fhome.jpg" alt="Recap Buddy home screen: Buddy the mascot asks what you learned today, next to a topic picker and today's notebook sidebar" width="860"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#why-recap-buddy" rel="noopener noreferrer"&gt;Why Recap Buddy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#screenshots" rel="noopener noreferrer"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#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/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#open-source-ai" rel="noopener noreferrer"&gt;Open-source AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#configuration" rel="noopener noreferrer"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#api-reference" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#project-structure" rel="noopener noreferrer"&gt;Project structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#deploying-to-digitalocean" rel="noopener noreferrer"&gt;Deploying to DigitalOcean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#agent-skill" rel="noopener noreferrer"&gt;Agent Skill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#privacy" rel="noopener noreferrer"&gt;Privacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#browser-support" rel="noopener noreferrer"&gt;Browser support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#acknowledgements" rel="noopener noreferrer"&gt;Acknowledgements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Recap Buddy&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Many students learn best by &lt;strong&gt;teaching&lt;/strong&gt; a concept out loud (the &lt;a href="https://en.wikipedia.org/wiki/Learning_by_teaching" rel="nofollow noopener noreferrer"&gt;Feynman technique&lt;/a&gt;). Others revise four or five topics a day and struggle to recap them by evening. Both run into the same problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There's nobody to explain the topic to.&lt;/li&gt;
&lt;li&gt;Even when someone listens, they…&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/Tejas-Santosh-Nalawade/Hacktoberfest-Hack-Day-ACES" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The project is MIT licensed and runs locally with two commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Backend (FastAPI)&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 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
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt; 8000

&lt;span class="c"&gt;# Frontend (React + Vite)&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev   &lt;span class="c"&gt;# http://localhost:5173&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser (React + Vite)               FastAPI backend               Open-weight models
--------------------------           -------------------           ----------------------------
Web Speech API transcript  -------&amp;gt;  POST /api/review   -------&amp;gt;   Gemma 4 (primary)
PDF / DOCX / TXT notes     -------&amp;gt;  POST /api/extract               | on error or invalid JSON
Sessions in localStorage             POST /api/report   -------&amp;gt;   Fallback open-weight model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Frontend.&lt;/strong&gt; React and Vite, Tailwind CSS, Motion for animation and &lt;code&gt;react-markdown&lt;/code&gt; for the diary. Speech recognition uses the browser's Web Speech API in continuous mode with interim results, restarting automatically after pauses until the student presses Stop. Typing is always available as a fallback. There are no accounts and no database: the day's sessions live in &lt;code&gt;localStorage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend.&lt;/strong&gt; FastAPI and Pydantic, with &lt;code&gt;pypdf&lt;/code&gt; and &lt;code&gt;python-docx&lt;/code&gt; for extracting notes. Every model provider exposes an OpenAI-compatible API, so a single client covers cloud and local inference:&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;PROVIDERS&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;digitalocean&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;base_url&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;https://inference.do-ai.run/v1/&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;model&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;gemma-4-31B-it&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;fallback_model&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;openai-gpt-oss-120b&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;gemini&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;base_url&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;https://generativelanguage.googleapis.com/v1beta/openai/&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;model&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;gemma-4-26b-a4b-it&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;fallback_model&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;gemma-4-31b-it&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;lmstudio&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;model&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;google/gemma-4-e4b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;   &lt;span class="c1"&gt;# runs fully offline
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&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;model&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;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;               &lt;span class="c1"&gt;# runs fully offline
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switching between cloud inference and a laptop with no internet connection is a single environment variable, &lt;code&gt;LLM_PROVIDER&lt;/code&gt;. The recordings above were made with &lt;strong&gt;Gemma 4 e4b running locally in LM Studio&lt;/strong&gt;: a small open-weight model on ordinary hardware, doing the grading on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turning an LLM into a fair grader
&lt;/h3&gt;

&lt;p&gt;Calling the model was the easy part. The real work was making it grade like a fair teacher. The system prompt enforces a small set of rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Concepts only.&lt;/strong&gt; The input is speech-to-text, so grammar, filler words and transcription errors are ignored. If a word is garbled but the intended concept is clear, the intended concept is judged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The student's notes are the source of truth&lt;/strong&gt; when provided; otherwise, standard textbook knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never invent mistakes&lt;/strong&gt; the student did not make, and list at most five missed concepts so the feedback stays actionable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score = roughly 60% accuracy + 40% coverage&lt;/strong&gt;, with partially correct ideas counted as half.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict JSON output&lt;/strong&gt; at temperature 0.2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The backend then validates everything rather than trusting the model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gemma 4 reasons before answering, so &lt;code&gt;&amp;lt;thought&amp;gt;&lt;/code&gt; blocks are stripped first.&lt;/li&gt;
&lt;li&gt;Code fences are removed, the outermost JSON object is extracted and validated with Pydantic, missing categories default to empty lists, and the score is clamped to 0 to 100.&lt;/li&gt;
&lt;li&gt;If anything fails (a network error or malformed JSON), the request is retried once on a &lt;strong&gt;second open-weight model&lt;/strong&gt;. The user never sees a blank screen; errors appear as a banner with a Retry button.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The rubric as a reusable Agent Skill
&lt;/h3&gt;

&lt;p&gt;The grading rubric is published as an &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;Agent Skill&lt;/a&gt; in &lt;code&gt;skills/recap-review/&lt;/code&gt;: a &lt;code&gt;SKILL.md&lt;/code&gt; with step-by-step instructions, plus &lt;code&gt;references/schema.md&lt;/code&gt; (the review JSON contract) and &lt;code&gt;references/rubric.md&lt;/code&gt; (what counts as correct, partial, wrong and missed). Any skills-compatible agent can grade a learner's explanation the same way Recap Buddy does.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1. It keeps learning free and accessible.&lt;/strong&gt; A student who runs Recap Buddy with Ollama or LM Studio needs no API key, no account and no internet connection. The open-weight Gemma 4 model runs on their own laptop. That puts a patient, grading study partner in reach of every student, not just those who can pay for a subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Student data stays with the student.&lt;/strong&gt; A teach-back transcript is a record of what someone does not yet understand, which is sensitive, especially for minors. Run locally, the entire loop (notes, transcript, review and diary) never leaves the device. A school can run it on a single classroom machine and nothing leaves the building. A closed API cannot offer that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Nobody is locked in.&lt;/strong&gt; The model is an environment variable, not a hard dependency. The same Gemma weights run on DigitalOcean, Google AI Studio or local hardware, and if the primary model fails, the backend falls back to a different open-weight model automatically. Because the weights are open, the next step, fine-tuning a small Gemma on our own rubric, is possible too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The grading is transparent and editable.&lt;/strong&gt; The rubric is published as an open Agent Skill and the prompts are in the repository. Teachers can read exactly how students are evaluated, adapt it to their syllabus, and contribute improvements back. There is no black-box grading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Anyone can build on it.&lt;/strong&gt; The project is MIT licensed. Ideas on our roadmap that the community can pick up include in-browser Whisper for browsers without speech recognition, follow-up questions on the weakest area, and streaks across days.&lt;/p&gt;

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

&lt;p&gt;Recap Buddy was built in a single afternoon at &lt;strong&gt;Hacktoberfest Hack Day Pune x ACES&lt;/strong&gt;. We started with a product requirements document, converted it into a &lt;code&gt;CLAUDE.md&lt;/code&gt; and a set of task-specific skills (backend, voice, frontend, deployment), and built the backend and frontend in parallel against a fixed JSON contract. Those planning files are in the repository for anyone who wants to see the process.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma 4 is the core of the product: it grades every explanation and writes every diary. It runs as Gemma 4 31B on DigitalOcean, Gemma 4 26B-A4B on Google AI Studio, and Gemma 4 e4b fully offline through Ollama or LM Studio, which powers the demo recordings above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of DigitalOcean.&lt;/strong&gt; Gemma 4 and gpt-oss-120b are served through DigitalOcean Serverless Inference, and the repository includes an App Platform spec (&lt;code&gt;.do/app.yaml&lt;/code&gt;) for a one-app, two-component deployment.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Team:&lt;/strong&gt; Tejas Nalawade (&lt;a href="https://dev.to/tejassantoshnalawade"&gt;@tejassantoshnalawade&lt;/a&gt;) and Mohit Aher (&lt;a href="https://github.com/mohitbaher" rel="noopener noreferrer"&gt;GitHub: mohitbaher&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
