<?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: bukeeastrey</title>
    <description>The latest articles on DEV Community by bukeeastrey (@bukeeastrey).</description>
    <link>https://dev.to/bukeeastrey</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%2F4027047%2Fe894ebc8-0dff-42a3-ba9b-ecd087fe3bd3.png</url>
      <title>DEV Community: bukeeastrey</title>
      <link>https://dev.to/bukeeastrey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bukeeastrey"/>
    <language>en</language>
    <item>
      <title>"Nkuzi: an offline study partner that remembers the slides, so my friends don't have to"</title>
      <dc:creator>bukeeastrey</dc:creator>
      <pubDate>Sun, 04 Oct 2026 12:35:33 +0000</pubDate>
      <link>https://dev.to/bukeeastrey/nkuzi-an-offline-study-partner-that-remembers-the-slides-so-my-friends-dont-have-to-3007</link>
      <guid>https://dev.to/bukeeastrey/nkuzi-an-offline-study-partner-that-remembers-the-slides-so-my-friends-dont-have-to-3007</guid>
      <description>&lt;h2&gt;
  
  
  The friends I built it for
&lt;/h2&gt;

&lt;p&gt;I'm a medical student in Nigeria. Here's something nobody tells you before you start: in medicine and surgery, a difficult slide is not the problem. You can always understand a slide eventually. &lt;strong&gt;The problem is what you can remember&lt;/strong&gt; when the slides are closed, during a ward round, in an exam hall, or when someone asks you to explain it to the group.&lt;/p&gt;

&lt;p&gt;So we study by explaining. My friend &lt;strong&gt;Nnia&lt;/strong&gt; studies alone with active recall: close the slides, explain the topic out loud from memory, then open the slides to see what was missed. That last step is the painful one. You flip through 35 slides trying to work out which points you skipped, and you usually miss the ones you forgot.&lt;/p&gt;

&lt;p&gt;The rest of my friends study in &lt;strong&gt;group discussions&lt;/strong&gt;, some in person and some on WhatsApp or Google Meet calls. One person takes a topic and teaches it to everyone else. The explainer forgets points, sometimes says something the slides contradict, and when the call ends nobody has a clean record of what was covered.&lt;/p&gt;

&lt;p&gt;I can't share my love with all of them one by one, so I built them &lt;strong&gt;Nkuzi&lt;/strong&gt;. It means &lt;em&gt;teaching&lt;/em&gt; in Igbo.&lt;/p&gt;

&lt;p&gt;It's a simple app built from love, for people who are tired of forgetting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Nkuzi does
&lt;/h2&gt;

&lt;p&gt;You give Nkuzi your lecture slides (&lt;strong&gt;PowerPoint, PDF or Word&lt;/strong&gt;, the way our lecturers actually send them). Then you start talking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📋 &lt;strong&gt;It builds a checklist from your slides.&lt;/strong&gt; It skips the "Outline", "Introduction" and "Thank you" slides and keeps the points that matter, including the management slides at the end that everyone rushes.&lt;/li&gt;
&lt;li&gt;🎙️ &lt;strong&gt;It listens while you explain&lt;/strong&gt; and &lt;strong&gt;ticks off points as you cover them&lt;/strong&gt;, live. It hears only your mic, so on a group call it hears the explainer, not the whole room.&lt;/li&gt;
&lt;li&gt;❓ &lt;strong&gt;"What did I miss?"&lt;/strong&gt; instantly shows every point you haven't covered yet. For Nnia doing active recall, this is the whole app.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;"Check me"&lt;/strong&gt; compares what you just said with your slides and flags contradictions. &lt;strong&gt;Every correction quotes the exact slide line it's based on&lt;/strong&gt;, next to what Nkuzi heard you say, so you can tell a real mistake from a mishearing.&lt;/li&gt;
&lt;li&gt;📲 &lt;strong&gt;A recap you can paste into WhatsApp&lt;/strong&gt; at the end: points covered, points missed, corrections with slide numbers. Our study groups live on WhatsApp, so that's where the recap goes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And all of it runs &lt;strong&gt;on my 2014 laptop, with no GPU and no internet.&lt;/strong&gt;&lt;/p&gt;

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


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/4879f62c32fa4e1689e9a4bea9883a0b" width="100%" height="400"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;br&gt;
(the demo shown is different from the one handed over because we could not screen record Nnia's use of Nkuzi)

&lt;h2&gt;
  
  
  Handing it over
&lt;/h2&gt;

&lt;p&gt;My friend Nnia tested it on his phone. My laptop ran all the AI, his phone connected to it over Wi-Fi, and he explained COAD (chronic obstructive airway diseases) while Nkuzi listened. Afterwards he sent me this on WhatsApp:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Bro I just tried it out it’s quite nice you might need to work on it more for a bit to perfect it but it’s nice especially for someone like me who love to study alone. That’s why I was still surprised you are saying it would be used  for a group discussions this is a great tool for active recall"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why open source is the whole point
&lt;/h2&gt;

&lt;p&gt;This isn't a "we used an open model because the challenge said so" project. Nkuzi &lt;strong&gt;could not exist&lt;/strong&gt; as a cloud app for the people I built it for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data costs money here.&lt;/strong&gt; Streaming a one-hour group discussion to a cloud speech API would eat a student's monthly data. With Nkuzi, the only download is the models, once. After that, every study session costs ₦0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The network and the power are unreliable.&lt;/strong&gt; When the network drops mid-discussion, Nkuzi doesn't notice. It never needed the internet. My friend even used it from his phone, connected to my laptop over a hotspot, with no internet anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our voices and our material stay with us.&lt;/strong&gt; Students' recordings and lecture slides never leave the laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It runs on hardware students actually have.&lt;/strong&gt; Everything runs on an Intel Core i5-4310U from 2014, with 8 GB of RAM and integrated graphics. No GPU, no subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could swap the brain in one line.&lt;/strong&gt; When the first model wasn't good enough (more on that below), I changed one setting and moved to a better one. No API key, no pricing page, no waiting for a vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the next fix is only possible because it's open.&lt;/strong&gt; The speech model struggles with Nigerian-accented English and medical terms (see below). With a closed API, I'd just have to live with that. With an open model like Whisper, the fix is fine-tuning on African-accented speech, and public datasets of African-accented clinical English such as &lt;strong&gt;AfriSpeech-200&lt;/strong&gt; already exist. That's the next step.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Everything runs locally:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Open-source piece&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reading slides and judging corrections&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 4 (E2B, quantized)&lt;/strong&gt; via &lt;strong&gt;Ollama&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speech to text&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Whisper&lt;/strong&gt; (&lt;code&gt;base.en&lt;/code&gt;) via &lt;strong&gt;faster-whisper&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ticking points by meaning&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;bge-small&lt;/strong&gt; embeddings via &lt;strong&gt;fastembed&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App&lt;/td&gt;
&lt;td&gt;FastAPI backend + React frontend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key design decision came from my laptop's limits. A small model on an old CPU can't think in real time, so I split the work into a &lt;strong&gt;fast path&lt;/strong&gt; and a &lt;strong&gt;slow path&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast path (every 8 seconds, while you talk):&lt;/strong&gt; Whisper transcribes the chunk (about 3–5 s), and the embedding model compares it with every checklist point (about 0.3 s). No LLM involved, so it keeps up with the speaker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow path (only when asked):&lt;/strong&gt; Gemma builds the checklist before the session, and runs "Check me" only when you press the button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few tricks that made a real difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slide vocabulary as a hint to Whisper.&lt;/strong&gt; Nkuzi pulls the most distinctive terms from your slides (&lt;em&gt;emphysema&lt;/em&gt;, &lt;em&gt;α1-antitrypsin&lt;/em&gt;, &lt;em&gt;centriacinar&lt;/em&gt;) and passes them to Whisper as a prompt, so it expects those words instead of guessing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tuned on reality.&lt;/strong&gt; The embedding model scores unrelated chatter up to 0.68 against a checklist point, so the tick threshold sits at 0.80. Otherwise everything ticks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hallucination filters.&lt;/strong&gt; Small Whisper models sometimes loop on noise. One of my test chunks came back as "see, see, see…" over 100 times. Nkuzi now drops low-confidence segments and collapses repeated words, so silence produces nothing instead of nonsense.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Making a small model safe for medical students
&lt;/h3&gt;

&lt;p&gt;This is the part I care about most. &lt;strong&gt;A false correction is worse than no correction&lt;/strong&gt;, especially when you're telling a medical student they're wrong.&lt;/p&gt;

&lt;p&gt;I started with the smallest Gemma (&lt;code&gt;gemma3:1b&lt;/code&gt;) because it's under 1 GB to download. It failed in two instructive ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I let it write checklist points freely, it wrote things that were &lt;strong&gt;medically wrong&lt;/strong&gt;, such as &lt;em&gt;"Bradycardia is contraindicated in asthma."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;In a contradiction test, it answered "contradicts" to &lt;strong&gt;every&lt;/strong&gt; sentence, right or wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I put guardrails in code and moved up a size:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The checklist stays grounded.&lt;/strong&gt; Gemma chooses and shortens slide lines, and code checks that every content word in a point comes from a single slide line. If it doesn't, the slide's own wording is used instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every correction must quote the slide.&lt;/strong&gt; "Check me" asks Gemma for issues plus the exact slide words they're based on. Code verifies the quote really exists on that slide (fuzzy matching), and &lt;strong&gt;discards any correction that doesn't.&lt;/strong&gt; A second, yes/no pass double-checks each one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It admits when it couldn't hear.&lt;/strong&gt; If the transcript is too short or garbled, "Check me" says &lt;em&gt;"I couldn't hear you clearly enough to check"&lt;/em&gt; instead of a falsely reassuring "no contradictions".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The explainer has the last word.&lt;/strong&gt; Each correction has a "That's not what I said" button, and manual ticks always override automatic ones.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With &lt;strong&gt;Gemma 4 E2B&lt;/strong&gt;, the same contradiction test went &lt;strong&gt;4 out of 4&lt;/strong&gt;, each with the correct slide line quoted. One small gotcha: Gemma 4 returned empty answers until I turned off its thinking mode for these short JSON tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What doesn't work yet (honestly)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transcription of my own voice is the weak spot.&lt;/strong&gt; Whisper is trained mostly on American and British English. On my Nigerian-accented explanations of a COPD lecture, a lot of chunks came out garbled, and the filters now drop them. Clear speech comes through well (&lt;em&gt;"The severe early onset disease likely represents a distinct genotype"&lt;/em&gt; was word-perfect), and earphones with a mic help. Ticking still works surprisingly well on rough transcripts, because it matches by &lt;em&gt;meaning&lt;/em&gt;, not exact words. But this is where fine-tuning would matter most.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Check me" is slow.&lt;/strong&gt; It takes one to two minutes on this laptop, and longer if Gemma has to load first. In practice you press it at a natural pause, after finishing a slide, not mid-sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ticking follows the topic, not correctness.&lt;/strong&gt; Saying something wrong about atenolol still ticks the atenolol point. That's what "Check me" is for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One explainer at a time&lt;/strong&gt;, since one laptop does all the work.&lt;/li&gt;
&lt;li&gt;Old &lt;code&gt;.ppt&lt;/code&gt; files and scanned PDFs need to be re-saved as &lt;code&gt;.pptx&lt;/code&gt; or text PDFs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tune Whisper on African-accented clinical speech&lt;/strong&gt; (e.g. AfriSpeech-200). This is the single biggest improvement, and only possible because the model is open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduling and topic history&lt;/strong&gt; for study groups: who taught what, and what the group keeps forgetting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explaining in Pidgin or Igbo&lt;/strong&gt;, leaning on Gemma's multilingual support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A one-click installer&lt;/strong&gt;, so friends can run it on their own laptops without Python and Node.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;I built Nkuzi over the weekend with &lt;strong&gt;Claude Code&lt;/strong&gt; as my pair programmer in VS Code. I wrote the brief, made the product calls (accept PowerPoint, merge the screens into one, cut the health dashboard, keep corrections grounded in the slides), tested on my real lecture decks and my real voice, and Claude Code wrote the code milestone by milestone.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/bukeeastrey/nkuzi" rel="noopener noreferrer"&gt;github.com/bukeeastrey/nkuzi&lt;/a&gt;, MIT licensed.&lt;/p&gt;

&lt;p&gt;Built with Gemma 4 (Apache 2.0), Ollama, faster-whisper, fastembed, FastAPI and React.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nkuzi is for Nnia, for my study group, and for every student who understood the slide but couldn't remember it when it mattered.&lt;/em&gt; 💚&lt;/p&gt;

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