<?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: Thilakasiri H.A.B.D</title>
    <description>The latest articles on DEV Community by Thilakasiri H.A.B.D (@bin4yi).</description>
    <link>https://dev.to/bin4yi</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%2F3956221%2F83385100-0ced-4d7a-a632-92ed7bd64128.jpg</url>
      <title>DEV Community: Thilakasiri H.A.B.D</title>
      <link>https://dev.to/bin4yi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bin4yi"/>
    <language>en</language>
    <item>
      <title>I Couldn't Remember the Last Time I Did Nothing, So I Built a Sloth to Do It With Me. You just have to do nothing. 🦥</title>
      <dc:creator>Thilakasiri H.A.B.D</dc:creator>
      <pubDate>Thu, 22 Oct 2026 11:57:28 +0000</pubDate>
      <link>https://dev.to/bin4yi/i-built-an-app-where-you-cant-fail-you-just-have-to-do-nothing-32g7</link>
      <guid>https://dev.to/bin4yi/i-built-an-app-where-you-cant-fail-you-just-have-to-do-nothing-32g7</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;Be honest with yourself for a second. Can you actually remember the last time you sat back in your chair and did &lt;em&gt;nothing&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;I don't mean watching a video while eating lunch. I don't mean listening to a podcast on a walk, or scrolling through your phone on the couch. I mean genuinely sitting back, looking at the ceiling or out a window, with no screen in your hand and no noise in your ears.&lt;/p&gt;

&lt;p&gt;If you can't remember, neither could I.&lt;/p&gt;

&lt;p&gt;Lately, every tiny two-minute gap in my day gets eaten by my phone. Waiting for a project to build? I grab my phone. Waiting for water to boil? Phone. Lying in bed exhausted at midnight? Still scrolling. We tell ourselves that picking up our phone is "taking a break," but it really isn't. It's just feeding more noise to an already tired brain.&lt;/p&gt;

&lt;p&gt;The funny thing is, when we finally try to rest using a meditation or wellness app, those apps make us work too. They give you strict breathing counts (inhale for 4, hold for 7, exhale for 8), tell you how to sit, and track your "mindfulness streak." If you miss a day, the app turns red and makes you feel guilty. If your mind wanders, you feel like you're failing at relaxing.&lt;/p&gt;

&lt;p&gt;While thinking about the &lt;strong&gt;Slow and Steady&lt;/strong&gt; theme this week, I started looking into why "doing nothing" feels so hard for us, and why it's so important for our health. &lt;/p&gt;

&lt;p&gt;It comes down to one simple truth: &lt;strong&gt;rest isn't something you can force. It's something you stop getting in the way of.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most of us treat relaxation like a transaction: &lt;em&gt;"Okay, I did this breathing exercise for five minutes, why am I not calm yet?!"&lt;/em&gt; It's just like trying to force yourself to sleep when you have insomnia. The harder you try and the more you check the clock, the more awake you stay. &lt;/p&gt;

&lt;p&gt;Your brain and body already know how to settle down if you just give them space. When you finally put the phone down and stop taking in new information, your brain's natural resting state kicks in. In the background, it starts sorting through your day, letting stress fade out, and connecting random ideas. You don't need another productivity technique. You just need permission to sit back and let your thoughts float by like leaves on a river.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;SlothMode&lt;/strong&gt;, a calm, 100% local laptop app where &lt;strong&gt;you cannot fail&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You put your phone down, lean back, and do nothing. While you rest, a sleepy little three-toed sloth named &lt;strong&gt;Momo&lt;/strong&gt; (our own character, though definitely a friendly distant cousin of DEV's sloth mascot, Sloan!) hangs out with you.&lt;/p&gt;

&lt;p&gt;Here is how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No techniques or rules.&lt;/strong&gt; You don't have to close your eyes, sit still, or count your breaths. Fidgeting, stretching, or staring at the wall are all completely fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only your phone matters.&lt;/strong&gt; Your laptop webcam checks once per second for one thing only: &lt;em&gt;are you holding your phone?&lt;/em&gt; Leaving your phone face-down on the desk is totally fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No guilt, ever.&lt;/strong&gt; If you do pick up your phone, nothing turns red. No alarm goes off and you don't lose a streak. The timer just pauses quietly. Momo opens one sleepy eye, lets out a slow yawn, rolls over, and waits for you: &lt;em&gt;"No rush. Momo will wait."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Moss Meter.&lt;/strong&gt; Real sloths move so slowly that green algae grows on their fur. In SlothMode, you rest so slowly that soft green moss grows in patches on Momo. After 20 minutes of rest in a day, a tiny pink flower pops up on his head.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rest Moments and Scenes.&lt;/strong&gt; You don't always have 15 minutes free. On the home screen, you can tap quick buttons for real moments in your day, like &lt;em&gt;"Before a meeting" (2 min)&lt;/em&gt;, &lt;em&gt;"Want to scroll?" (3 min)&lt;/em&gt;, &lt;em&gt;"After a hard talk" (5 min)&lt;/em&gt;, or &lt;em&gt;"Before sleep" (15 min)&lt;/em&gt;, while Momo rests in a &lt;em&gt;Forest Morning&lt;/em&gt;, &lt;em&gt;Rainy Day&lt;/em&gt;, &lt;em&gt;Seaside&lt;/em&gt;, or &lt;em&gt;Starry Night&lt;/em&gt; window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Momo's Leaf Book.&lt;/strong&gt; Have you ever noticed that the second you sit down to rest, your brain suddenly remembers three chores you forgot to do, or comes up with a random project idea? Usually, you grab your phone to write it down and accidentally spend 30 minutes scrolling. In SlothMode, &lt;strong&gt;after&lt;/strong&gt; your rest ends, Momo softly asks: &lt;em&gt;"Did anything float by?"&lt;/em&gt; Local &lt;strong&gt;Gemma&lt;/strong&gt; tidies your rough notes into leaves in your Leaf Book (&lt;em&gt;Idea&lt;/em&gt;, &lt;em&gt;To-do&lt;/em&gt;, or &lt;em&gt;Thought&lt;/em&gt;), or lets you click &lt;strong&gt;"Let go"&lt;/strong&gt; because &lt;em&gt;"Some ideas are just nice to have had."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(Note: SlothMode is a rest tool, not medical help.)&lt;/em&gt;&lt;/p&gt;




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

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

&lt;p&gt;🎥 &lt;strong&gt;Direct link:&lt;/strong&gt; &lt;a href="https://youtu.be/UIJLS8OKp6E" rel="noopener noreferrer"&gt;Slothmode - Its ok to do nothing (YouTube)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A couple of small details I loved building (and that you can spot in the walkthrough above):&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/Bin4yi" rel="noopener noreferrer"&gt;
        Bin4yi
      &lt;/a&gt; / &lt;a href="https://github.com/Bin4yi/slothMode" rel="noopener noreferrer"&gt;
        slothMode
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;SlothMode&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A laptop app for doing nothing, where you can't fail.&lt;/strong&gt; Rest with Momo the sloth. The webcam checks one thing only: is a phone in your hand?&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Bin4yi/slothMode/docs/momo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FBin4yi%2FslothMode%2FHEAD%2Fdocs%2Fmomo.gif" width="280" alt="Momo the sloth waving hello"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built for DEV Hacktoberfest Week 3, "Slow and Steady". The AI at the core is open: MediaPipe for the camera check and Gemma (open weights, via Ollama) for Momo's few words. Both run on your laptop.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it feels like&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Press &lt;strong&gt;Do nothing&lt;/strong&gt;, or tap a rest moment ("Before a meeting", "Want to scroll?", "Before sleep" and so on). No menus before resting.&lt;/li&gt;
&lt;li&gt;Momo meditates, then sleeps, in a scene with a soft looping sound. Momo picks the scene himself: forest morning, rainy day, seaside sunset or starry night, by time of day and the rest moment. Before sleep always rests under the stars, slightly dimmed.&lt;/li&gt;
&lt;li&gt;Pick up your phone and the timer pauses quietly. Momo yawns and waits: &lt;em&gt;"No rush.&lt;/em&gt;…&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/Bin4yi/slothMode" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;🔗 &lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Bin4yi/slothMode" rel="noopener noreferrer"&gt;https://github.com/Bin4yi/slothMode&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Licensed under the **MIT License&lt;/em&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;I built SlothMode with &lt;strong&gt;Vite, React, and TypeScript&lt;/strong&gt;. I wanted the whole app to feel like a quiet forest at golden hour, so I used soft greens and warm sand colors (&lt;code&gt;#F4EFE3&lt;/code&gt;, &lt;code&gt;#6E9A5B&lt;/code&gt;, &lt;code&gt;#2F4A3A&lt;/code&gt;, &lt;code&gt;#E7D3B0&lt;/code&gt;), rounded &lt;strong&gt;Nunito&lt;/strong&gt; type, and slow &lt;code&gt;600–1200ms&lt;/code&gt; transitions so nothing on screen ever jumps or rushes.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A webcam check that moves like a sloth (MediaPipe)
&lt;/h3&gt;

&lt;p&gt;An app about resting shouldn't make your laptop fan spin like a jet engine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I used &lt;strong&gt;MediaPipe Tasks Vision&lt;/strong&gt; (&lt;code&gt;EfficientDet-Lite&lt;/code&gt; Object Detector and &lt;code&gt;Pose Landmarker&lt;/code&gt;) in the browser, slowed down to just &lt;strong&gt;1 frame per second&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Just detecting a &lt;code&gt;"cell phone"&lt;/code&gt; wasn't enough because my phone sits on my desk while I work. So I combined the phone box with the wrist coordinates from the Pose model. It only counts as &lt;code&gt;"phone in hand"&lt;/code&gt; if the phone is near your wrist for 3 checks in a row.&lt;/li&gt;
&lt;li&gt;If you get up from your chair to stretch or look out a real window, the app notices nobody is in the frame after 10 seconds and switches to &lt;code&gt;away&lt;/code&gt;. The timer keeps running and Momo snacks on a leaf. And if you don't want to turn on your camera at all, there is a &lt;em&gt;"No camera, just a timer"&lt;/em&gt; option right on the setup screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Momo's sleepy voice (Gemma on Ollama)
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;Gemma&lt;/strong&gt; running locally through &lt;strong&gt;Ollama&lt;/strong&gt; on &lt;code&gt;localhost&lt;/code&gt; for four small jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Sloth Guide:&lt;/strong&gt; Most guided sessions talk way too much. In a 15-minute SlothMode session, one Gemma call at the very beginning pre-generates just 2 or 3 short lines (max 12 words each, like &lt;em&gt;"Nothing to fix right now. Your mind can wander. Momo's does too."&lt;/em&gt;). Making them at the start means nothing loads during the quiet part of your break. The browser's &lt;code&gt;speechSynthesis&lt;/code&gt; reads them softly at a slow pace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sloth Thought of the Day:&lt;/strong&gt; One short line generated once a day on the home screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sorting the Leaf Book:&lt;/strong&gt; When you jot down a thought after resting, Gemma turns it into clean JSON (&lt;code&gt;{ title, type, first_step }&lt;/code&gt;) and saves it in &lt;strong&gt;IndexedDB&lt;/strong&gt;. For ideas, it adds one tiny, low-pressure first step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekly Look-Back:&lt;/strong&gt; Once a week, Gemma looks over your leaf titles and points out a simple pattern (like &lt;em&gt;"The week's notes include a thought, a todo list, and an idea for a balcony garden"&lt;/em&gt;). It only states facts from your notes and never tries to give life advice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If someone opens the app without Ollama running, it quietly falls back to 30 pre-written offline lines without throwing any errors.&lt;/p&gt;




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

&lt;p&gt;To put it simply: &lt;strong&gt;nobody wants an app watching them through their webcam if that video goes to the cloud.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're leaning back with your eyes closed, or writing down private thoughts that floated into your head while resting, you shouldn't have to wonder if your camera frames or journal entries are sitting on someone else's server.&lt;/p&gt;

&lt;p&gt;Running &lt;strong&gt;MediaPipe&lt;/strong&gt; and &lt;strong&gt;Gemma&lt;/strong&gt; on your own laptop solves that completely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frames never leave your computer.&lt;/strong&gt; The camera check happens in browser memory once a second and the frame is thrown away right after. Nothing is saved or uploaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No subscriptions or paywalls.&lt;/strong&gt; Many wellness apps ruin the mood by locking sounds or sessions behind a paywall. Because open models run locally on your own hardware, SlothMode costs nothing to run and stays free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline.&lt;/strong&gt; Turning off Wi-Fi is honestly the best way to take a real break. Since Gemma runs on &lt;code&gt;localhost&lt;/code&gt;, the whole app works offline.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;I was juggling two big deadlines this week, which meant I badly needed this app myself. Here is what I noticed from using it and checking the logs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quiet fans:&lt;/strong&gt; Running MediaPipe at &lt;strong&gt;1 FPS&lt;/strong&gt; instead of 30 FPS cut the vision CPU load by over &lt;strong&gt;90%&lt;/strong&gt;, so my laptop stayed completely silent during sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real Gemma timings:&lt;/strong&gt; In my console logs, pre-generating a session's lines with local Gemma took around &lt;strong&gt;&lt;code&gt;1.4s&lt;/code&gt;&lt;/strong&gt; at the start of a break, and tidying a rough note into a Leaf Book entry took about &lt;strong&gt;&lt;code&gt;0.9s&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real breaks:&lt;/strong&gt; Over four days of building and testing, I ended up taking &lt;strong&gt;65+ minutes of actual phone-free rest&lt;/strong&gt;. Even better, whenever a random "don't forget to fix that bug" thought popped into my head, I knew I could drop it in the Leaf Book after the timer ended, so I didn't reach for my phone once.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overall Winner ("Slow and Steady"):&lt;/strong&gt; Instead of automating chores just so we can cram more work into our day, SlothMode rewards actual laziness and protects the quiet downtime our brains need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Local Gemma gives Momo his sleepy voice during sessions, writes the daily thought on the home screen, turns messy post-rest notes into clean JSON leaves, and finds weekly patterns in the Leaf Book, all on &lt;code&gt;localhost&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading. Now close this tab, put your phone face-down, lean back, and go do nothing for 5 minutes. Momo will wait.&lt;/em&gt; 🌿🦥&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>RepCheck: An AI Helper That Watches Workout Videos for Online Coaches (MediaPipe + Gemma)</title>
      <dc:creator>Thilakasiri H.A.B.D</dc:creator>
      <pubDate>Sun, 18 Oct 2026 16:11:14 +0000</pubDate>
      <link>https://dev.to/bin4yi/repcheck-an-ai-helper-that-watches-workout-videos-for-online-coaches-mediapipe-gemma-35k</link>
      <guid>https://dev.to/bin4yi/repcheck-an-ai-helper-that-watches-workout-videos-for-online-coaches-mediapipe-gemma-35k</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;RepCheck&lt;/strong&gt; is a helper for online personal trainers.&lt;/p&gt;

&lt;p&gt;Online coaches get workout videos from their clients every day. Watching each one closely takes hours, so feedback often ends up as just "looks good 👍". The client doesn't improve, and the coach burns out.&lt;/p&gt;

&lt;p&gt;RepCheck fixes that in four simple steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Film it.&lt;/strong&gt; The client films one set on their phone and uploads it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We measure it.&lt;/strong&gt; MediaPipe finds the body in every frame. Python code counts each rep and measures depth, speed, tempo and left/right balance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We check it.&lt;/strong&gt; Clear, fixed rules turn those numbers into a 0–100 form score and one or two simple tips. The rules use the client's profile: a beginner gets fewer cues, and pain, age 65+ or an injury switches on a careful mode with no load increases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The AI explains it.&lt;/strong&gt; An open model (built for &lt;strong&gt;Gemma&lt;/strong&gt;, running locally with Ollama) reads &lt;strong&gt;only the numbers&lt;/strong&gt;, never the video, and drafts friendly feedback, a progress note and next week's plan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then the most important part: &lt;strong&gt;the coach decides.&lt;/strong&gt; Nothing reaches the client until the coach reads the draft, edits it and clicks Approve. The client can also get it as a voice note.&lt;/p&gt;

&lt;p&gt;Clients also get a GitHub-style training page: a contribution heatmap where every workout adds a square, plus streaks and badges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who pays?&lt;/strong&gt; Online coaches with 20–100 remote clients. They already spend their evenings watching videos. My price idea is about &lt;strong&gt;$10 per month per coach for up to 20 clients&lt;/strong&gt;. That only works because the AI runs locally and costs almost nothing per video (more on that below).&lt;/p&gt;

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

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

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Bin4yi" rel="noopener noreferrer"&gt;
        Bin4yi
      &lt;/a&gt; / &lt;a href="https://github.com/Bin4yi/repCoach" rel="noopener noreferrer"&gt;
        repCoach
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;RepCheck&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Bin4yi/repCoach/media/banner.png"&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%2FBin4yi%2FrepCoach%2FHEAD%2Fmedia%2Fbanner.png" alt="RepCheck: every rep measured, your coach still decides"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;▶️ &lt;strong&gt;&lt;a href="https://youtu.be/XPwhwYeGhm8" rel="nofollow noopener noreferrer"&gt;Watch the 2-minute demo on YouTube&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI helper for online personal trainers. Clients film a set; &lt;strong&gt;MediaPipe&lt;/strong&gt; finds body points, &lt;strong&gt;Python code&lt;/strong&gt; measures and judges form, and &lt;strong&gt;Gemma&lt;/strong&gt; (open-weight, run locally with &lt;strong&gt;Ollama&lt;/strong&gt;) turns only the numbers into feedback, a progress summary and a next-week plan. The &lt;strong&gt;coach&lt;/strong&gt; reviews, edits and approves everything. The AI only drafts.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Code: &lt;a href="https://github.com/Bin4yi/repCoach" rel="noopener noreferrer"&gt;https://github.com/Bin4yi/repCoach&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/Bin4yi/repCoach.git &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="pl-c1"&gt;cd&lt;/span&gt; repCoach
cp .env.example .env                         &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; set COACH_PASSWORD&lt;/span&gt;
docker compose up --build                    &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; backend, frontend, mongo, ollama (pulls Gemma)&lt;/span&gt;
docker compose &lt;span class="pl-c1"&gt;exec&lt;/span&gt; backend python -m scripts.seed_demo_data   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 3 demo clients, ~1 year of data&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; open http://localhost:3000/login  (coach)   and   http://localhost:3000/c/demo-kasun  (client)&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;No Docker? Quick local demo with an in-memory DB (no Ollama needed, template messages are used):&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; backend &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python -m venv .venv &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; .venv/Scripts/pip install -r requirements-dev.txt   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Linux/Mac: .venv/bin/pip&lt;/span&gt;
python scripts/download_model.py
MONGODB_URI=mongomock:// DEMO_SEED_ON_START=true COACH_PASSWORD=demo uvicorn app.main:app --port 8000
&lt;span class="pl-c1"&gt;cd&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Bin4yi/repCoach" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python, FastAPI, MediaPipe Tasks (PoseLandmarker), OpenCV, NumPy/SciPy, MongoDB (Motor).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js, TypeScript, Tailwind, Recharts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; 128 backend tests (pose maths, rep counting, judgement rules, the LLM layer with a mocked Ollama, API tests, heatmap and streak logic), plus a frontend type-check, build and tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run it:&lt;/strong&gt; &lt;code&gt;docker compose up&lt;/code&gt; starts the backend, frontend, MongoDB and Ollama, then pulls Gemma.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The big idea: &lt;strong&gt;MediaPipe measures. Code judges. Gemma explains.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I split the work so that each tool does only what it is good at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Measuring (open-source vision).&lt;/strong&gt; MediaPipe PoseLandmarker finds 33 body points in every frame. My code smooths the jitter, fills short gaps, and checks the video quality. Is the whole body in view? Is the camera angle the one the client chose? Is there only one person in the shot? If not, the client gets a friendly "please film again from the side" message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Counting and scoring (plain code, no AI).&lt;/strong&gt; Reps are found as valleys in the knee angle (squat) or elbow angle (push-up, curl). Each rep gets its depth, its down time and up time, and its speed. The form score comes from simple weighted rules that I documented, so the same video always gets the same score.&lt;/p&gt;

&lt;p&gt;I tested it on &lt;strong&gt;real, openly licensed footage&lt;/strong&gt;, not just synthetic data, and real footage found real bugs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A tracking glitch at the bottom of a squat split one rep into two. Fixed: two valleys now count as separate reps only if the signal climbs back up between them.&lt;/li&gt;
&lt;li&gt;Setting up and re-racking the weight looked like extra reps. Fixed: shallow dips at the start or end of a set are dropped.&lt;/li&gt;
&lt;li&gt;My "knees caving in" check gave false alarms in deep squats. Fixed: it now uses the knee-width to ankle-width ratio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After these fixes, a real side-view squat set counts &lt;strong&gt;6 of 6 reps&lt;/strong&gt; and a real push-up set counts &lt;strong&gt;6 of 6&lt;/strong&gt;, with no false knee-cave flag on a front-view goblet squat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Explaining (open-weight LLM).&lt;/strong&gt; Gemma runs locally through &lt;strong&gt;Ollama&lt;/strong&gt; and uses structured JSON output. It never sees the video, the images, or even the client's name, only the numbers. Then my code checks every answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No invented numbers.&lt;/strong&gt; Every number in the AI's text must exist in the input data. If not, it regenerates once, then falls back to a plain template.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No diet or calorie talk,&lt;/strong&gt; and client messages stay under 120 words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pain means pain.&lt;/strong&gt; If the client reported pain, the message must tell them to stop and talk to their coach, and it may not suggest more weight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weight increases are capped in code&lt;/strong&gt; at +5% per week (0% in careful mode), even if the AI suggests more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Storing and sharing.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB&lt;/strong&gt; stores only numbers and text. The raw video is deleted right after processing, and the skeleton overlay video is deleted when the coach approves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs&lt;/strong&gt; turns the approved message into an optional voice note.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;render.yaml&lt;/code&gt;&lt;/strong&gt; deploys the backend and frontend to &lt;strong&gt;Render&lt;/strong&gt;. Ollama runs on the coach's own machine or a GPU box.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;For this product, open models aren't just a nice extra. They're what makes it possible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy of body videos.&lt;/strong&gt; People don't want videos of their bodies sent to a big AI company. With MediaPipe and a local Gemma, the video never leaves the server, and it's deleted after measuring. Only numbers and text are kept.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Near-zero cost per video.&lt;/strong&gt; A closed vision API would have to read dozens of video frames for every upload. RepCheck sends the AI a tiny JSON of numbers instead, and the model runs locally, so the cost per video is basically electricity. That is what makes a low monthly price for coaches realistic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy by design.&lt;/strong&gt; An LLM looking at a video can "see" a knee angle that isn't there. Here, measuring is done by an open pose model plus deterministic code, and the LLM only explains numbers it was given, with a check that it didn't invent any.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in.&lt;/strong&gt; Switching to a newer Gemma means changing one setting (&lt;code&gt;OLLAMA_MODEL&lt;/code&gt;). A coach can run everything on their own hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could fix it.&lt;/strong&gt; When real footage exposed rep-counting bugs, I could dig into the landmark signals myself and fix them. With a closed "send video, get feedback" API, I would have been stuck.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma.&lt;/strong&gt; The writing layer (session feedback, progress summary, weekly plan) is built for Gemma through Ollama, with structured output and code-side safety checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas.&lt;/strong&gt; Clients, sessions, weight logs and plans are stored in MongoDB (&lt;code&gt;MONGODB_URI&lt;/code&gt; points at Atlas).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs.&lt;/strong&gt; The coach can send the approved message as a voice note. The promo video's narration was also made with ElevenLabs.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>FieldDay: say any game, play it outside, and let your phone be the referee</title>
      <dc:creator>Thilakasiri H.A.B.D</dc:creator>
      <pubDate>Fri, 09 Oct 2026 06:37:11 +0000</pubDate>
      <link>https://dev.to/bin4yi/fieldday-say-any-game-play-it-outside-and-let-your-phone-be-the-referee-2b6e</link>
      <guid>https://dev.to/bin4yi/fieldday-say-any-game-play-it-outside-and-let-your-phone-be-the-referee-2b6e</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;FieldDay&lt;/strong&gt; is a web app that turns your phone into a referee for real games outside.&lt;/p&gt;

&lt;p&gt;You say a game, like &lt;em&gt;"highest throw battle, 3 rounds, 2 players"&lt;/em&gt;. FieldDay makes the game, checks&lt;br&gt;
that it is safe, and reads you the rules. Then you lean the phone on your bag and go play.&lt;/p&gt;

&lt;p&gt;The phone watches with the camera. It sees your body and the ball. It measures how high you throw&lt;br&gt;
and how high you jump. It keeps the score and shouts like a sports announcer: &lt;em&gt;"Two point four&lt;br&gt;
metres! Massive!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The screen is not the game. The field is the game. The phone just watches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you can do with it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Say any game.&lt;/strong&gt; Speak or type it. The AI turns your words into a game with real rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12 quick games:&lt;/strong&gt; Sky Toss, Jump Battle, Freeze Tag Statue, Reaction Race, Squat Storm, Boss Raid and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battles with friends on one phone:&lt;/strong&gt; turn battles, Red vs Blue teams, Chaos Mode, King of the Hill, and Boss Raid, where everyone jumps, squats and punches together to beat a monster. When the referee shouts &lt;em&gt;"FREEZE!"&lt;/em&gt;, everyone must stand still.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quests that move you around the park:&lt;/strong&gt; "Race to the biggest tree." "Find something red." The phone checks your photo, and the photo never leaves the phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ghost challenges:&lt;/strong&gt; your scores go into a QR code. A friend scans it and plays against your "ghost", with no internet needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Touch Grass meter:&lt;/strong&gt; after every game it tells you how long you played and how little you looked at the screen: &lt;em&gt;"You played 34 minutes. Screen time: 4%."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety first:&lt;/strong&gt; it says no to unsafe ideas (throwing at people, roads, climbing, water) and offers a safer game. Kids Mode uses a calm voice, and every 15 minutes it reminds you to drink water.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who is it for?&lt;/strong&gt; Friends, families, kids and school groups who want to play outside but end up on their phones. It's also for places like a park with no signal. &lt;strong&gt;FieldDay works with zero internet.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://github.com/Bin4yi/FieldDay.git" rel="noopener noreferrer"&gt;https://github.com/Bin4yi/FieldDay.git&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Home&lt;/th&gt;
&lt;th&gt;Say a game&lt;/th&gt;
&lt;th&gt;Play&lt;/th&gt;
&lt;th&gt;Quests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fwoaebcfv8nj6jlyvsf3x.png" alt="Home" width="540" height="1099"&gt;&lt;/td&gt;
&lt;td&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%2Fvgptgnjvrghxq8j2qhpr.png" alt="Say a game" width="540" height="1099"&gt;&lt;/td&gt;
&lt;td&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%2Fnx4s0xpwcz5j03738heb.png" alt="Play" width="540" height="1099"&gt;&lt;/td&gt;
&lt;td&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%2Flqdf6amprf9pxic0fvh0.png" alt="Quests" width="540" height="1099"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No ball or park nearby? Pick &lt;strong&gt;Demo camera&lt;/strong&gt; in the app. A simulated player throws and jumps, and you can watch the referee work.&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/Bin4yi" rel="noopener noreferrer"&gt;
        Bin4yi
      &lt;/a&gt; / &lt;a href="https://github.com/Bin4yi/FieldDay" rel="noopener noreferrer"&gt;
        FieldDay
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;FieldDay&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Say any game. Play it outside. The phone is the referee.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Bin4yi/FieldDay/assets/screens/hero_banner.png"&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%2FBin4yi%2FFieldDay%2FHEAD%2Fassets%2Fscreens%2Fhero_banner.png" alt="FieldDay: friends playing in a park with Volt the referee"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Bin4yi/FieldDay/docs/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FBin4yi%2FFieldDay%2FHEAD%2Fdocs%2Fdemo.gif" alt="Demo camera: a simulated player throws, the referee measures and scores" width="300"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;FieldDay turns a phone into a voice-first referee for real outdoor games, battles and quests
Say a game ("highest throw battle, 3 rounds, 2 players"), lean the phone on a bag, and play with
your body and a ball. The phone watches (pose + ball tracking), listens (bounce and catch sounds)
measures (throw height, jump height, reaction time), keeps score, and shouts like a football
announcer, a wrestling host, a calm coach, a robot or a pirate.&lt;/p&gt;
&lt;p&gt;The AI never writes code. It only fills in a &lt;strong&gt;Game Spec&lt;/strong&gt;: JSON built from fixed blocks
(trackers, events, measures, rules). A small, fully tested rules engine runs the spec.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open Mode works with zero internet&lt;/strong&gt;: the brain (Gemma), speech to text (Whisper), body and ball
tracking (MediaPipe) all run on the phone.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Two hackathons&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DEV Hacktoberfest Week 1&lt;/strong&gt;…&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/Bin4yi/FieldDay" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The git tag &lt;strong&gt;&lt;code&gt;v0.1-devto&lt;/code&gt;&lt;/strong&gt; is my submission for this challenge.&lt;/p&gt;

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

&lt;p&gt;The main idea is simple: &lt;strong&gt;the AI never writes code.&lt;/strong&gt; It only fills in a &lt;em&gt;Game Spec&lt;/em&gt;, a small piece of JSON built from fixed blocks: trackers, events, measures and rules. A small, well-tested rules engine runs that spec. So the AI can be creative, but it can't break the game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The open-source AI inside FieldDay, all running on the phone:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Open model / tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The brain&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma&lt;/strong&gt; (open weights), run in the browser with MediaPipe LLM Inference&lt;/td&gt;
&lt;td&gt;Turns your words into a Game Spec and makes quests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The ears&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Whisper tiny&lt;/strong&gt; (MIT), run with Transformers.js and ONNX Runtime Web&lt;/td&gt;
&lt;td&gt;Speech to text, so you can just say your game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The eyes&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MediaPipe Pose Landmarker&lt;/strong&gt; + &lt;strong&gt;EfficientDet&lt;/strong&gt; object detector (Apache-2.0)&lt;/td&gt;
&lt;td&gt;Finds your body and the ball in every frame&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;How a game works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You speak.&lt;/strong&gt; Whisper turns your voice into text on the phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma designs the game.&lt;/strong&gt; It writes a Game Spec. I check the spec with strict zod schemas. If something is wrong, Gemma gets one chance to fix it. If it still fails, a built-in template takes over, so you always get a game.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety check.&lt;/strong&gt; Every game passes a safety check and a "can the camera see this?" check. For example, the camera can't measure spin or heart rate, so FieldDay offers the closest game it &lt;em&gt;can&lt;/em&gt; referee.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field Check.&lt;/strong&gt; Before you play, FieldDay checks that the phone is steady, the light is good, your whole body is in view, the ball is found and the space is clear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The camera referees.&lt;/strong&gt; Pose and ball tracking turn into events like &lt;em&gt;jump&lt;/em&gt;, &lt;em&gt;ball apex&lt;/em&gt;, &lt;em&gt;catch&lt;/em&gt; and &lt;em&gt;freeze broken&lt;/em&gt;. Heights come from your body size, so it doesn't need a tape measure (about ±10% after a quick calibration).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The referee talks.&lt;/strong&gt; Short, hand-written lines in 5 styles (football announcer, wrestling host, calm coach, robot, pirate) are spoken with the phone's own voice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;No Gemma model on your phone, or no WebGPU?&lt;/strong&gt; Open Mode still works. An offline rules designer&lt;br&gt;
turns your words into a game from the templates, and the same safety check runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built with:&lt;/strong&gt; Vite + React (a PWA that works offline), Zustand, Dexie (IndexedDB), zod, and a&lt;br&gt;
pnpm monorepo with separate packages for the engine, vision, brain, quests and UI. It has 165 unit&lt;br&gt;
tests and 26 Playwright browser tests, including a test that plays a whole game in airplane mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some bugs I had to fix along the way:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Freeze never fired.&lt;/strong&gt; The body points shake a tiny bit every frame, and that looked like movement. Now I compare against a frame from about 200 ms earlier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Punches everywhere.&lt;/strong&gt; Raising your arms looked like a punch. Now a punch needs a straight arm at shoulder height that moves fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A falling ball counted as a catch.&lt;/strong&gt; Now the ball must also slow down at your hand.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;For FieldDay, open models are not a nice extra. &lt;strong&gt;Without them, the app doesn't work.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parks don't have Wi-Fi.&lt;/strong&gt; The best places to play often have weak or no signal. A closed AI API needs the internet for every request. Gemma, Whisper and MediaPipe run on the phone, so FieldDay works in airplane mode. I tested this: a typed game becomes a playable, refereed game with the network turned off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your video stays on your phone.&lt;/strong&gt; The camera watches kids and families playing. With open models, the video goes to the model &lt;em&gt;on the phone&lt;/em&gt; and nowhere else. Nothing is uploaded. That would be very hard to promise with a cloud API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's free.&lt;/strong&gt; No API key, no bill and no limits. A school can use it with a whole class, and nobody pays per game.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's fast.&lt;/strong&gt; A referee has to react right away. A call to a server and back is too slow for a &lt;em&gt;"FREEZE!"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can see inside it and change it.&lt;/strong&gt; Open weights and open tools let me test, measure and fix every part, from the pose points to the game rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed API would have made FieldDay another app that only works at home on Wi-Fi. Open AI let me&lt;br&gt;
build one that works outside, which is the whole point of touching grass.&lt;/p&gt;

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

&lt;p&gt;I built FieldDay with an AI coding agent (Claude Code) as my pair programmer. I planned the&lt;br&gt;
features, made the decisions and tested the results, and the agent helped me write and test the&lt;br&gt;
code.&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 is FieldDay's brain in Open Mode: it designs every game and quest on the phone, offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading. Now put your phone down and go play! 🌱&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Mathaka (Memory): “Did I take my medicine?” - answered by open AI on an old phone</title>
      <dc:creator>Thilakasiri H.A.B.D</dc:creator>
      <pubDate>Sun, 04 Oct 2026 11:30:06 +0000</pubDate>
      <link>https://dev.to/bin4yi/mathaka-memory-did-i-take-my-medicine-answered-by-open-ai-on-an-old-phone-5fc4</link>
      <guid>https://dev.to/bin4yi/mathaka-memory-did-i-take-my-medicine-answered-by-open-ai-on-an-old-phone-5fc4</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;In many Sri Lankan homes, the hardest medicine question is not &lt;strong&gt;when&lt;/strong&gt;. It is &lt;strong&gt;"did I already take it?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built this for my grandmother. She has mild dementia, and she often forgets her pills. Some days she misses a dose. Other days she isn't sure, so she asks us again and again: "Did I take my medicine?" We aren't always home to answer. I wanted her phone to give her that answer: kindly, the same way every time, and without guessing.&lt;/p&gt;

&lt;p&gt;We tried pill reminder apps, but none of them fit her:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;They only say &lt;em&gt;when&lt;/em&gt;.&lt;/strong&gt; The alarm rings and she takes the pills. Ten minutes later she can't remember doing it. Then she either skips the dose or takes it twice, and both are dangerous.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They are made for young people.&lt;/strong&gt; Small text, menus, swipes and settings confuse her. One wrong tap and the reminder is gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They don't speak her language.&lt;/strong&gt; Most are in English only. She reads and speaks Sinhala.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They don't know her pills.&lt;/strong&gt; Her clinic gives loose tablets in small paper envelopes, often with no label. An app that shows drug names doesn't help when she can't match a name to a white tablet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They need the internet and an account,&lt;/strong&gt; and they send her health data to someone's cloud. Her phone is old and cheap, and the signal at home isn't always good.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;strong&gt;Mathaka&lt;/strong&gt; (මතකය, "memory" in Sinhala). It is a medicine helper for older people with memory loss. It works in Sinhala, Tamil and English. It is one Android app with two roles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the elder's phone (this can be an old, cheap phone):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One gentle reminder, in the family's own recorded voice if they want.&lt;/li&gt;
&lt;li&gt;Only the pills for &lt;em&gt;this&lt;/em&gt; time of day, shown as big pictures with what they are for ("sugar medicine"), never a drug name.&lt;/li&gt;
&lt;li&gt;A big button: &lt;strong&gt;"Did I take my medicine?"&lt;/strong&gt; The app answers from its own log, in the same calm words every time: &lt;em&gt;"Yes, Ammi. You took your morning medicine at 8:00. The next one is at lunch time."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;double-dose guard.&lt;/strong&gt; If she tries to take it again, nothing is logged twice, and the app tells her kindly that she already took it.&lt;/li&gt;
&lt;li&gt;Huge text, 7:1 contrast, a high-contrast theme, a real clock, "Say it again", and no swipes or double taps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On the family's phone:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up the medicines once, by scanning the prescription and photographing each pill.&lt;/li&gt;
&lt;li&gt;See the day at a glance: doses taken, missed doses, low stock, the clinic date and a week of history.&lt;/li&gt;
&lt;li&gt;Get alerts over home Wi-Fi, or by plain SMS when there is no internet.&lt;/li&gt;
&lt;li&gt;Print a "fridge card" with every pill on paper, for days when the phone is off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also an optional &lt;strong&gt;Arduino pill box.&lt;/strong&gt; The slot that is due lights up, and pressing it means "I took it".&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%2Fleiew1z4usbuf0imi6q3.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%2Fleiew1z4usbuf0imi6q3.jpg" alt="Heavy AI once, light AI every day, no cloud" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Home&lt;/th&gt;
&lt;th&gt;This slot's pills&lt;/th&gt;
&lt;th&gt;"Did I take it?"&lt;/th&gt;
&lt;th&gt;Family dashboard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2F21ga5sr4rtel7qs9gewj.png" width="390" height="844"&gt;&lt;/td&gt;
&lt;td&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%2Fdptpzmw1yso7ec7i0ro5.png" width="390" height="844"&gt;&lt;/td&gt;
&lt;td&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%2F9bg8i7m3gv0j0fvg6va5.png" width="390" height="844"&gt;&lt;/td&gt;
&lt;td&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%2F6b1cepxw2lqpv5dwkwhb.png" width="390" height="844"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

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

&lt;p&gt;The 4.5-minute video shows the elder phone, the family phone, how the AI works, the pill measuring, the Arduino box and the test results.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Try it in a browser:&lt;/strong&gt; clone the repo, then run &lt;code&gt;npm install&lt;/code&gt; and &lt;code&gt;npm run web&lt;/code&gt;. Demo mode fills in a sample family and a week of history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try the Arduino box with no hardware:&lt;/strong&gt; open the &lt;a href="https://wokwi.com/projects/new/esp32" rel="noopener noreferrer"&gt;Wokwi ESP32 simulator&lt;/a&gt;. Paste in &lt;code&gt;firmware/esp32/mathaka_box/mathaka_box.ino&lt;/code&gt; and &lt;code&gt;diagram.json&lt;/code&gt;, then type &lt;code&gt;LIGHT 1&lt;/code&gt; in the serial monitor.&lt;/li&gt;
&lt;/ul&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/Bin4yi" rel="noopener noreferrer"&gt;
        Bin4yi
      &lt;/a&gt; / &lt;a href="https://github.com/Bin4yi/Mathaka" rel="noopener noreferrer"&gt;
        Mathaka
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Mathaka (මතකය)&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A dementia-friendly medicine helper for older people in Sri Lanka.&lt;/strong&gt; Android first, Sinhala / Tamil / English. All AI runs &lt;strong&gt;on the phones&lt;/strong&gt;, with open-weight models. There is no cloud.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A reminder is not remembering.&lt;/strong&gt; Alarm apps say &lt;em&gt;when&lt;/em&gt;. Mathaka also answers &lt;em&gt;whether you already took it&lt;/em&gt;, and stops a second dose.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Two open AIs. Gemma can see. Laya decides but cannot speak. Grandma only hears words her family wrote.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; prototype for the DEV Hacktoberfest "Build for a Friend" challenge. &lt;strong&gt;Not a medical device.&lt;/strong&gt; See &lt;a href="https://github.com/Bin4yi/Mathaka#honest-limits" rel="noopener noreferrer"&gt;Honest limits&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo video (4.5 min)&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/Bin4yi/Mathaka/docs/media/mathaka-demo.mp4" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FBin4yi%2FMathaka%2FHEAD%2Fdocs%2Fmedia%2Fposter.jpg" alt="Mathaka demo video"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;▶ &lt;strong&gt;&lt;a href="https://github.com/Bin4yi/Mathaka/docs/media/mathaka-demo.mp4" rel="noopener noreferrer"&gt;Watch the demo (MP4)&lt;/a&gt;&lt;/strong&gt;. It covers the elder flow, the family phone, the on-device AI, pill vision, the Arduino box and the evaluation
The video is made from HTML with &lt;a href="https://hyperframes.heygen.com" rel="nofollow noopener noreferrer"&gt;HyperFrames&lt;/a&gt;. Its source is in &lt;a href="https://github.com/Bin4yi/Mathaka/videos/mathaka-promo" rel="noopener noreferrer"&gt;&lt;code&gt;videos/mathaka-promo&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Real screens from the web build (&lt;code&gt;npm run web&lt;/code&gt;…&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/Bin4yi/Mathaka" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It's an Expo / React Native app (TypeScript), a shared pure-TypeScript core, an ESP32 Arduino sketch, an optional Python laptop helper, and an evaluation folder with frozen test sets. It has 124 automated tests.&lt;/p&gt;

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

&lt;p&gt;My rule was: &lt;strong&gt;heavy AI once, light AI every day, and no cloud anywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Setup happens once, on the family phone, with Gemma
&lt;/h3&gt;

&lt;p&gt;A family member photographs the prescription. &lt;strong&gt;Gemma 3 4B&lt;/strong&gt; (vision, Q4_K_M GGUF) runs &lt;em&gt;on the phone&lt;/em&gt; through &lt;a href="https://github.com/mybigday/llama.rn" rel="noopener noreferrer"&gt;llama.rn&lt;/a&gt;, which is llama.cpp for React Native. It reads the prescription into rows. It also reads the number printed on each pill and writes a short description for the family.&lt;/p&gt;

&lt;p&gt;Clinic books are handwritten, so I don't trust the model blindly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every answer must fit a &lt;strong&gt;JSON schema&lt;/strong&gt;. It's checked with zod and retried once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A person confirms every row&lt;/strong&gt; before anything is used.&lt;/li&gt;
&lt;li&gt;Gemma is &lt;strong&gt;never loaded on the elder's phone&lt;/strong&gt;. The code refuses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The pill is measured, not guessed
&lt;/h3&gt;

&lt;p&gt;You put each pill on a printed mat with four ArUco markers and a grey patch. Then plain TypeScript (no big model) does the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;finds the markers and flattens the perspective&lt;/li&gt;
&lt;li&gt;converts pixels to millimetres&lt;/li&gt;
&lt;li&gt;fixes the colour using the grey patch&lt;/li&gt;
&lt;li&gt;cuts out the pill and measures its size, shape, colour, two-colour halves and score line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the demo pill it measured &lt;strong&gt;19.2 × 9.2 mm&lt;/strong&gt;, oblong, white, with a score line, in about 200 ms. The same code runs on the phone, in the browser and in the tests.&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%2Fwzmp0h50bwxhl9qeh4fk.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%2Fwzmp0h50bwxhl9qeh4fk.jpg" alt="Pill vision: photo → top-down view → pill" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. One file moves the setup to the elder's phone
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;second person&lt;/strong&gt; must approve the whole setup. Then it is saved as one file (&lt;code&gt;.mtk&lt;/code&gt;, a zip with a SHA-256 hash for every part). You can send it by Bluetooth, a USB cable or WhatsApp-to-yourself. The elder's phone rejects any file that is broken, changed, older or not approved. There's no account and no server.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The AI that is not allowed to speak
&lt;/h3&gt;

&lt;p&gt;This is the part I care about most. &lt;strong&gt;No AI ever writes the words the elder hears.&lt;/strong&gt; Every sentence is a fixed template in Sinhala, Tamil or English, filled in with facts from her own log. A unit test blocks words like "take another".&lt;/p&gt;

&lt;p&gt;For understanding what she &lt;em&gt;means&lt;/em&gt; (like "mama beheth biwwada?", Singlish for "did I take my medicine?"), I tested &lt;strong&gt;&lt;a href="https://huggingface.co/convaiinnovations/laya" rel="noopener noreferrer"&gt;Laya&lt;/a&gt;&lt;/strong&gt;. It's an open, &lt;em&gt;non-generative&lt;/em&gt; decision model: it can only pick one option from a short list and give a probability. It cannot write a sentence.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Alerts without a cloud
&lt;/h3&gt;

&lt;p&gt;When a dose is missed, the family finds out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;over &lt;strong&gt;home Wi-Fi&lt;/strong&gt; (the two phones are paired once with a QR code)&lt;/li&gt;
&lt;li&gt;by &lt;strong&gt;plain SMS&lt;/strong&gt; if Wi-Fi fails, with no mobile data needed&lt;/li&gt;
&lt;li&gt;by &lt;strong&gt;retrying&lt;/strong&gt; in the background until the alert gets through&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  6. The Arduino pill box
&lt;/h3&gt;

&lt;p&gt;An &lt;strong&gt;ESP32&lt;/strong&gt; with 4 LEDs and 4 buttons talks to the phone over Bluetooth LE (or USB serial). The phone sends &lt;code&gt;LIGHT 1&lt;/code&gt;, and the box sends back &lt;code&gt;PRESS 1&lt;/code&gt;. &lt;strong&gt;The box never decides anything.&lt;/strong&gt; A press goes through the same double-dose guard as the screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the tests say
&lt;/h3&gt;

&lt;p&gt;I froze the test sets before measuring.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&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;"Did I take it?" answers (40 hand-written cases)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;40 / 40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Double doses stopped&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 / 4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsafe sentences said to the elder&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pill matching, known pills found (synthetic photos)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100%&lt;/strong&gt; (colour alone: 62%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pill matching, new pills rejected&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100%&lt;/strong&gt; (colour alone: 92%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The honest part: &lt;strong&gt;Laya, without training, acted wrongly on about 1 in 4 Sinhala and Singlish questions.&lt;/strong&gt; So it stays switched off. The elder's phone keeps big buttons, which can't misunderstand her. I'd rather ship buttons than a confident wrong answer to someone with dementia. I've prepared a fine-tune on Sinhala care phrases as the next step.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy that is real.&lt;/strong&gt; Medicine photos, the dose log and a family member's recorded voice never leave the two phones. With open weights I can &lt;em&gt;check&lt;/em&gt; that, instead of trusting a privacy policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works in a village.&lt;/strong&gt; After a one-time model download, everything runs offline. Alerts go by plain SMS. A cloud API stops working when the signal does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No monthly bill for a pensioner.&lt;/strong&gt; Running the model costs nothing per use, and the elder's phone can be old and cheap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could measure the risk.&lt;/strong&gt; Because Laya is open, I could test exactly how often it would act wrongly &lt;em&gt;before&lt;/em&gt; letting it near a vulnerable person. That test is the reason it's switched off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could change what matters for us:&lt;/strong&gt; Sinhala and Tamil templates, a pill pipeline built for loose clinic pills in paper envelopes, and later a model fine-tuned for Singlish that I can give back.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I built Mathaka with &lt;strong&gt;Claude Code&lt;/strong&gt; as my pair programmer, working on Windows with no Android emulator. We used the web build and headless Chrome to test the screens. The demo video was also made with code: &lt;a href="https://hyperframes.heygen.com" rel="noopener noreferrer"&gt;HyperFrames&lt;/a&gt; HTML scenes, an offline Kokoro voice and MusicGen music, all in &lt;code&gt;videos/mathaka-promo&lt;/code&gt;.&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 3 4B vision runs on the family phone through llama.rn. It reads prescriptions and pill imprints and writes pill descriptions, always behind a JSON schema and a human check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Arduino:&lt;/strong&gt; the optional pill box is an Arduino sketch for the ESP32 (Bluetooth LE + USB serial), with a Wokwi diagram so anyone can try it without hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It's a prototype. &lt;strong&gt;It is not a medical device&lt;/strong&gt;, and doctors haven't tested it.&lt;/li&gt;
&lt;li&gt;A pill photo can't safely identify a medicine. Mathaka uses it only as an extra check, after the schedule and the box slot.&lt;/li&gt;
&lt;li&gt;The pill numbers come from synthetic photos so far. I'm collecting real ones.&lt;/li&gt;
&lt;li&gt;It doesn't replace a carer. It gives the carer one less worry.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Thanks to the Gemma, llama.cpp / llama.rn, Laya, js-aruco2, Expo and HyperFrames teams. The photos in the video are from Wikimedia Commons: Ayena (public domain), Stevepb (CC0), trokilinochchi (CC BY 2.0) and Edwiyanto (CC BY-SA 4.0).&lt;/p&gt;

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