<?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>"\"You Played Like Prime Okocha\": The Open-Source AI That Gets My Football Crew Off the Couch"</title>
      <dc:creator>bukeeastrey</dc:creator>
      <pubDate>Sat, 10 Oct 2026 19:57:10 +0000</pubDate>
      <link>https://dev.to/bukeeastrey/you-played-like-prime-okocha-the-open-source-ai-that-gets-my-football-crew-off-the-couch-j68</link>
      <guid>https://dev.to/bukeeastrey/you-played-like-prime-okocha-the-open-source-ai-that-gets-my-football-crew-off-the-couch-j68</guid>
      <description>&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%2F28js73wbxsehyai1q0j3.png" 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%2F28js73wbxsehyai1q0j3.png" alt=" " width="800" height="740"&gt;&lt;/a&gt;## "Ball this weekend?" 💬 … &lt;em&gt;seen by 14&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every football crew has this group chat.&lt;/p&gt;

&lt;p&gt;Someone asks on Wednesday, &lt;em&gt;"Ball this weekend?"&lt;/em&gt; A few thumbs up. Somebody says "I dey." Friday comes, nobody has fixed a time, half the people forgot, and the other half are waiting to see who else is coming. By Saturday afternoon we're all still indoors, scrolling, telling ourselves we'll play next week.&lt;/p&gt;

&lt;p&gt;And when we &lt;em&gt;do&lt;/em&gt; play, nothing is remembered. Who scored? Who carried the team? Who keeps claiming he's the best player on the pitch with zero evidence? The argument continues on WhatsApp for days and nobody can settle it.&lt;/p&gt;

&lt;p&gt;That's my team. We love the game, but we spend too much time inside because &lt;strong&gt;scheduling a match is hard and there's no follow-up after it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Star Boy&lt;/strong&gt; for them. One love. ⚽&lt;/p&gt;

&lt;h2&gt;
  
  
  What Star Boy does
&lt;/h2&gt;

&lt;p&gt;Star Boy turns your local pitch into a little league that lives &lt;strong&gt;inside Telegram&lt;/strong&gt;, the app my crew already has open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before the game: it gets you out of the room&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every pitch (ours is &amp;lt;!-- ADD: your pitch name --&amp;gt;) has its own page with everyone who plays there.&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;⚽ New game&lt;/strong&gt; in the bot → pick the pitch, day and time with buttons → tick who to invite. Everyone gets an invite with &lt;strong&gt;I'm in ✅ / Can't make it ❌&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Star Boy sends a &lt;strong&gt;matchday poster&lt;/strong&gt; you can drop on your WhatsApp Status.&lt;/li&gt;
&lt;li&gt;Then it &lt;strong&gt;nags you, kindly&lt;/strong&gt;: the night before (&lt;em&gt;"Tomorrow: football at 5 pm. You dey come? 🔥"&lt;/em&gt;), two hours before, and one nudge for anyone who hasn't answered. This is the part that actually gets people out of their rooms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After the game: it asks how it went&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the match ends, Star Boy messages everyone: &lt;strong&gt;"How was your game today? ⚽"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You either &lt;strong&gt;tap your stats&lt;/strong&gt; (goals, assists, blocks and tackles, or saves if you were in goal, plus your Man of the Match vote) or &lt;strong&gt;send a voice note&lt;/strong&gt;, the way we already talk: &lt;em&gt;"We win 5–3 o, I score two and give Emeka one assist."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Teammates &lt;strong&gt;confirm or dispute&lt;/strong&gt; your claim with one tap. No confirmation, no stats. (Yes, we built anti-cap technology. 🧢)&lt;/li&gt;
&lt;li&gt;Then the best part: &lt;strong&gt;"You played like…"&lt;/strong&gt; Two goals and an assist? &lt;em&gt;You played like prime Jay-Jay Okocha.&lt;/em&gt; Six blocks? &lt;em&gt;Taribo West energy.&lt;/em&gt; A quiet game? &lt;em&gt;"Preseason form 😅. Next week na your week."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Every week: it keeps the tab&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leaderboards per pitch: &lt;strong&gt;Golden Boot&lt;/strong&gt;, &lt;strong&gt;Playmaker&lt;/strong&gt;, &lt;strong&gt;Most Consistent&lt;/strong&gt; (appearances), &lt;strong&gt;The Wall&lt;/strong&gt;, &lt;strong&gt;Most MOTM&lt;/strong&gt;, &lt;strong&gt;Most Wins&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;player card&lt;/strong&gt; for everyone, with form guide, streaks and the legends you've "played like".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚖️ Settle it&lt;/strong&gt;: pick two players, and Star Boy gives a verdict based only on confirmed numbers. &lt;em&gt;"Bayo wins this one: 5 goals to Tunde's 3, and 1.67 goals per game. Tunde, pass the ball."&lt;/em&gt; Arguments that used to run for days now end in one message.&lt;/li&gt;
&lt;li&gt;Photos from the match go straight to the bot and land in the game's gallery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's what I mean when I say Star Boy keeps a tab on &lt;strong&gt;who we are on the pitch&lt;/strong&gt;: our stats, our improvement, our bragging rights. It's a reason to come back next week.&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://starboy-o9g6.onrender.com" rel="noopener noreferrer"&gt;starboy-o9g6.onrender.com&lt;/a&gt; · 🤖 &lt;strong&gt;Bot:&lt;/strong&gt; &lt;a href="https://t.me/starboy_soccerbot" rel="noopener noreferrer"&gt;@starboy_soccerbot&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/bd4e80dd2bcc4b46888580f69e1b98a1" width="100%" height="400"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  We took it outside
&lt;/h2&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%2Fuevqvs0x3dbr6v7qbe3v.png" 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%2Fuevqvs0x3dbr6v7qbe3v.png" alt=" " width="800" height="671"&gt;&lt;/a&gt;&lt;br&gt;
The football game we had today 10th October was one of the best times I've had in a long time, we have a class team - "Eximia Football Academy", we have been postponing our matches but later it left the group chat and we played at De Angelo by 8am... We were like 12 players playing 4-aside. I should not be telling this story because i missed like 5 one-on-one with the keeper (in my defense - we use small football posts :). Well, I really enjoyed using "Starboy" to create fun and I hope it becomes a lifestyle for us, playing football regularly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open source matters here
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It costs ₦0 to run, so it can stay free for street footballers.&lt;/strong&gt; Star Boy runs on open-weight models through free tiers: &lt;strong&gt;Gemma 4&lt;/strong&gt; for the thinking and &lt;strong&gt;Whisper&lt;/strong&gt; for the listening. There's no per-message bill that would force me to charge my friends or show them ads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No lock-in: the same app runs on my 2014 laptop.&lt;/strong&gt; Star Boy has a single switch, &lt;code&gt;AI_MODE&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cloud&lt;/code&gt;: Gemma 4 (26B) through Google AI Studio's free API and Whisper large-v3 through Groq's free tier. This is what my crew uses: fast, and the laptop can be off.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;local&lt;/code&gt;: &lt;strong&gt;Gemma 4 E2B via Ollama + faster-whisper&lt;/strong&gt;, running entirely on my 2014 Intel i5 laptop with 8 GB RAM and no GPU. No audio leaves the device. It's slower (30–60 s per report instead of about 5 s), but after a match, nobody needs an instant answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flip one setting and the exact same app moves from a free cloud API to my own machine. That's only possible because the models are open. If a provider changes its terms tomorrow, Star Boy keeps working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honesty note:&lt;/strong&gt; in cloud mode, voice notes are sent to Groq for transcription. Star Boy deletes its own copy right after. If that matters to your crew, run local mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open models can learn our football.&lt;/strong&gt; Players speak Pidgin, mix in Igbo, and say things like &lt;em&gt;"I bang am twice."&lt;/em&gt; With open models I can tune prompts, swap models, and eventually fine-tune on how Nigerian players actually talk. A closed API would only let me hope.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&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 / open-weight piece&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Turning voice notes into stats&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Whisper&lt;/strong&gt; (large-v3 in the cloud, faster-whisper locally) → &lt;strong&gt;Gemma 4&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"You played like…", Settle-it verdicts, match summaries&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bot, reminders, game wizard&lt;/td&gt;
&lt;td&gt;Telegram Bot API + FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leaderboards, stats, photos&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MongoDB Atlas&lt;/strong&gt; (aggregation pipelines + GridFS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Posters and player cards&lt;/td&gt;
&lt;td&gt;Pillow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web app&lt;/td&gt;
&lt;td&gt;React + Vite, also opens inside Telegram as a Mini App&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Making a small AI trustworthy for a very argumentative audience
&lt;/h3&gt;

&lt;p&gt;A football crew will dispute &lt;em&gt;everything&lt;/em&gt;, so the AI can never invent a number. The rule I built Star Boy around: &lt;strong&gt;code decides the facts, Gemma only tells the story.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Voice notes:&lt;/strong&gt; Gemma extracts goals, assists and the result, then code checks it. Any number of 2 or more must actually appear in what you said, the score and the result must agree, and every name must match a real player from that game. If anything is unclear, Star Boy shows "I wasn't sure about…" and you fix it with one tap before submitting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"You played like…":&lt;/strong&gt; code picks the legend from your stats (Ronaldo, Yekini or Osimhen for a hat-trick; Kroos, Xavi or Mikel Obi for a playmaker; Enyeama or Buffon for a clean sheet). Gemma just writes the one-line banter, and any number it mentions is checked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settle it:&lt;/strong&gt; code computes the comparison and picks the winner. Gemma announces and explains it. A verdict that hedges, names the wrong player, or gets a number wrong is rejected and retried.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teammates confirm everything&lt;/strong&gt; before it counts. The AI proposes, the crew decides.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What went wrong (and what I changed)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free hosting moved under my feet.&lt;/strong&gt; I planned to host Gemma and Whisper on Hugging Face Spaces, then found that free Docker Spaces now require billing. So I split the app: Star Boy itself runs on Render's free tier, and the AI moved behind a switch, either free hosted open models or my own laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not everyone wants to send a voice note.&lt;/strong&gt; After testing with friends, I added &lt;strong&gt;"Tap my stats"&lt;/strong&gt;: five quick button questions. Voice for people who like to talk, buttons for people who don't. The AI still does the parts only it can do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The website was secondary; Telegram was the point.&lt;/strong&gt; My crew doesn't want another app. So everything (sign-up, setting up games, reporting, leaderboards, settling arguments) now works from Telegram buttons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The first verdicts were too polite.&lt;/strong&gt; Gemma called a 5-goals-vs-3 comparison "a draw." In football, that's a crime. Now code picks the winner.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Basketball&lt;/strong&gt; (the data model is already sport-agnostic).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crew group mode:&lt;/strong&gt; Star Boy posting games, results and weekly leaderboards straight into the team's group chat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Season awards&lt;/strong&gt; and a "Star Boy of the Month."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Pidgin and accent handling&lt;/strong&gt; by fine-tuning open speech models on Nigerian football talk.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I built Star Boy over one week with &lt;strong&gt;Claude Code&lt;/strong&gt; as my pair programmer. I wrote the product brief and made the calls (Telegram-first, buttons and voice, code-decides-facts, the redesign when the first version looked generic), tested it on real phones with my crew, 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/starboy" rel="noopener noreferrer"&gt;github.com/bukeeastrey/starboy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built with Gemma 4 (Apache 2.0), Whisper, faster-whisper, Ollama, FastAPI, React, MongoDB Atlas and the Telegram Bot API. Hero photo: pickup football in Amagunze, Nigeria, by Kenechukwu Emmanuel on Pexels.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;For my football team. One love.&lt;/em&gt; ⚽💛dev.to/challenges/hacktoberfest-week1-2026-10-05)*&lt;br&gt;
Any contributions or questions - I will love to entertain them. Thank you.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>ai</category>
    </item>
    <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>
