<?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: Shubham Nayak</title>
    <description>The latest articles on DEV Community by Shubham Nayak (@shubham_nayak_).</description>
    <link>https://dev.to/shubham_nayak_</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%2F2471825%2F7cf6e965-3ff2-4c88-b583-d41e308ebe11.jpeg</url>
      <title>DEV Community: Shubham Nayak</title>
      <link>https://dev.to/shubham_nayak_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubham_nayak_"/>
    <language>en</language>
    <item>
      <title>I Built a Local AI Gym Log for a Friend Who Always Forgot His Weights</title>
      <dc:creator>Shubham Nayak</dc:creator>
      <pubDate>Sun, 04 Oct 2026 11:28:04 +0000</pubDate>
      <link>https://dev.to/shubham_nayak_/i-built-a-local-ai-gym-log-for-a-friend-who-always-forgot-his-weights-5b14</link>
      <guid>https://dev.to/shubham_nayak_/i-built-a-local-ai-gym-log-for-a-friend-who-always-forgot-his-weights-5b14</guid>
      <description>&lt;p&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;/p&gt;

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

&lt;h2&gt;
  
  
  Gym Log Buddy — A Local AI Workout Logger Built for a Friend
&lt;/h2&gt;

&lt;p&gt;My friend goes to the gym regularly, but he has one surprisingly annoying problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;He forgets what weight he lifted last time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;He doesn't want a complicated fitness app with endless menus and forms. During a workout, he just wants to quickly write something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bench 60kg 8 reps 3 sets, incline db 22 x 10 x 3, squat 80 5x5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;So I built &lt;strong&gt;Gym Log Buddy&lt;/strong&gt; around the way he already takes notes.&lt;/p&gt;

&lt;p&gt;Instead of forcing him to structure his workout, the app lets him write naturally. A local &lt;strong&gt;Gemma 3&lt;/strong&gt; model running through &lt;strong&gt;Ollama&lt;/strong&gt; converts the messy note into structured workout data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exercise&lt;/li&gt;
&lt;li&gt;Weight&lt;/li&gt;
&lt;li&gt;Reps&lt;/li&gt;
&lt;li&gt;Sets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before anything is saved, the extracted data is shown in a review table so my friend can verify and correct it.&lt;/p&gt;

&lt;p&gt;The confirmed workout is then stored locally in SQLite.&lt;/p&gt;

&lt;p&gt;On the next session, Gym Log Buddy can show what he did previously and suggest a target for his next workout.&lt;/p&gt;
&lt;h3&gt;
  
  
  AI where it helps. Deterministic code where it doesn't.
&lt;/h3&gt;

&lt;p&gt;I deliberately didn't use AI for everything.&lt;/p&gt;

&lt;p&gt;Gemma 3 handles the part that requires language understanding: turning messy human text into structured data.&lt;/p&gt;

&lt;p&gt;The progressive-overload calculation is plain Python:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the previous workout reached &lt;strong&gt;10+ reps&lt;/strong&gt;, increase the weight by &lt;strong&gt;2.5 kg&lt;/strong&gt; and target 8 reps.&lt;/li&gt;
&lt;li&gt;Otherwise, keep the weight and target one additional rep.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the predictable part of the application deterministic, testable, and easy to understand.&lt;/p&gt;

&lt;p&gt;And the most important feedback?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Bahut accha hai, keep it up."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My friend said it was very good and encouraged me to keep going.&lt;/p&gt;

&lt;p&gt;That's the user requirement that mattered most.&lt;/p&gt;


&lt;h1&gt;
  
  
  Demo
&lt;/h1&gt;

&lt;p&gt;Gym Log Buddy is intentionally a &lt;strong&gt;local application&lt;/strong&gt;, not a hosted AI service.&lt;/p&gt;

&lt;p&gt;It runs on the laptop with Ollama and Gemma 3 installed.&lt;/p&gt;
&lt;h3&gt;
  
  
  🎥 Video Demo
&lt;/h3&gt;

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

&lt;p&gt;The demo shows the local Streamlit application processing workout notes and turning them into structured workout data.&lt;/p&gt;


&lt;h1&gt;
  
  
  Code
&lt;/h1&gt;

&lt;p&gt;The complete project is open source on GitHub:&lt;/p&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/Shubham-cyber-prog" rel="noopener noreferrer"&gt;
        Shubham-cyber-prog
      &lt;/a&gt; / &lt;a href="https://github.com/Shubham-cyber-prog/Gym-Log-Buddy" rel="noopener noreferrer"&gt;
        Gym-Log-Buddy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local-first gym log: Gemma 3 (via Ollama) turns messy workout notes into structured data.
    &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;Gym Log Buddy&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Gym Log Buddy is a local-first workout tracking application that extracts structured exercises, weights, reps, and sets from natural language workout notes
It is built for a gym buddy who wants quick, friction-free workout logging without manual forms, accounts, or subscriptions
It runs entirely on your local machine using an open-source language model (Gemma 3 via Ollama) for text extraction, deterministic Python rules for progressive overload recommendations, and SQLite for storage.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Plain English input: Type workout notes naturally (e.g. "bench 60kg 8 reps 3 sets, incline db 22 x 10 x 3, squat 80 5x5").&lt;/li&gt;
&lt;li&gt;Local open-source model: Uses Gemma 3 via Ollama. No cloud APIs, no API keys, and no paid services.&lt;/li&gt;
&lt;li&gt;Deterministic progressive overload
&lt;ul&gt;
&lt;li&gt;If last reps &amp;gt;= 10: suggest +2.5 kg and 8 reps&lt;/li&gt;
&lt;li&gt;Otherwise: suggest same weight and +1 rep&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dual interfaces
&lt;ul&gt;
&lt;li&gt;CLI (cli.py): log, last, suggest, history commands.&lt;/li&gt;
&lt;li&gt;Streamlit UI (app.py)…&lt;/li&gt;
&lt;/ul&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/Shubham-cyber-prog/Gym-Log-Buddy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemma 3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streamlit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Requests&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model name is kept as a single configuration constant, making it straightforward to experiment with other local models.&lt;/p&gt;




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

&lt;p&gt;The architecture is intentionally simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Messy workout note
        ↓
   Gemma 3 / Ollama
        ↓
 Structured JSON
        ↓
 Validation &amp;amp; safeguards
        ↓
 Review / confirmation
        ↓
      SQLite
        ↓
 Workout history
        ↓
 Progressive overload target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire AI inference pipeline runs locally.&lt;/p&gt;

&lt;p&gt;No workout note needs to be sent to a cloud AI provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Gemma 3?
&lt;/h2&gt;

&lt;p&gt;The core problem isn't mathematical.&lt;/p&gt;

&lt;p&gt;It's language understanding.&lt;/p&gt;

&lt;p&gt;A person can write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bench 60 8x3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;did bench today, 60kg, 8 reps x 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bench 60kg 8 reps 3 sets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A useful workout logger needs to understand that these are describing the same kind of information.&lt;/p&gt;

&lt;p&gt;Gemma 3 provides the natural-language understanding needed to turn those messy inputs into a structured representation.&lt;/p&gt;

&lt;p&gt;Python then takes over for everything deterministic.&lt;/p&gt;




&lt;h2&gt;
  
  
  I Tested the Real Model — Including Its Failures
&lt;/h2&gt;

&lt;p&gt;One of the most important parts of this project was not hiding model failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failure #1 — 60 Became 27.2 kg
&lt;/h3&gt;

&lt;p&gt;Input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bench 60 8x3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gemma initially interpreted &lt;code&gt;60&lt;/code&gt; as pounds and converted it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exercise"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bench Press"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"weight_kg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;27.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dangerous part was that the output looked completely valid.&lt;/p&gt;

&lt;p&gt;There was no exception.&lt;/p&gt;

&lt;p&gt;No malformed JSON.&lt;/p&gt;

&lt;p&gt;Just the wrong workout.&lt;/p&gt;

&lt;p&gt;I fixed this by making kilograms the explicit default and allowing conversion only when the input explicitly contains &lt;code&gt;lb&lt;/code&gt;, &lt;code&gt;lbs&lt;/code&gt;, or &lt;code&gt;pounds&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Failure #2 — The Model Invented an Exercise
&lt;/h3&gt;

&lt;p&gt;Input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;did legs today, felt good
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model invented a Squat with null values.&lt;/p&gt;

&lt;p&gt;The input contained no exercise.&lt;/p&gt;

&lt;p&gt;I added a prompt rule requiring an empty exercise list for non-workout commentary, along with a programmatic validation rule that removes records where weight, reps, and sets are all null.&lt;/p&gt;




&lt;h3&gt;
  
  
  Failure #3 — My Schema Couldn't Represent &lt;code&gt;8,8,6&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bb row 70 8,8,6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model repeatedly interpreted this incorrectly because my schema only supports one &lt;code&gt;reps&lt;/code&gt; value per exercise.&lt;/p&gt;

&lt;p&gt;The actual workout has different repetitions across sets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8 reps
8 reps
6 reps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of manipulating the benchmark to make the result look better, I kept the failure and documented it as a schema limitation.&lt;/p&gt;

&lt;p&gt;This also reinforced why the application has an explicit confirmation step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI can suggest. The user confirms.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Then I Found Benchmark Leakage
&lt;/h2&gt;

&lt;p&gt;At one point, the benchmark reached:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18/18 — 100%&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That looked great.&lt;/p&gt;

&lt;p&gt;It was also invalid.&lt;/p&gt;

&lt;p&gt;I had accidentally included exact test inputs as few-shot examples in the prompt.&lt;/p&gt;

&lt;p&gt;After removing those examples, I discovered a second leakage issue: parts of the same test inputs were still present in the prompt's rules section.&lt;/p&gt;

&lt;p&gt;I removed those as well and added an automated test that checks for test-input leakage.&lt;/p&gt;

&lt;p&gt;The final evaluation was split honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Held-out inputs:&lt;/strong&gt; 15/18 = &lt;strong&gt;83.3%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Original inputs:&lt;/strong&gt; 18/18, but not counted as evidence because the prompt had been developed around them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;36 total live model inferences&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am deliberately &lt;strong&gt;not presenting 91.7% as a general AI accuracy number&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The benchmark is small and project-specific.&lt;/p&gt;

&lt;p&gt;The important result for me was that the evaluation became cleaner and more trustworthy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing Beyond the Model
&lt;/h2&gt;

&lt;p&gt;I also discovered a bug that the original test suite completely missed.&lt;/p&gt;

&lt;p&gt;The parser and database tests were passing, but the Streamlit application could crash on a fresh database with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NameError: name 'selected_chart_ex' is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem was that my original tests never actually executed the Streamlit application.&lt;/p&gt;

&lt;p&gt;So I added Streamlit's &lt;code&gt;AppTest&lt;/code&gt; framework and created tests for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Empty database rendering&lt;/li&gt;
&lt;li&gt;Workout history rendering&lt;/li&gt;
&lt;li&gt;Chart rendering&lt;/li&gt;
&lt;li&gt;Exercise-name normalization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project now has &lt;strong&gt;20 automated pytest tests&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The parser tests use a mocked model, while the actual Gemma 3 evaluation lives separately in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tests/live_check.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This distinction matters because mocked tests verify application behavior, while live tests verify the behavior of the actual local model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Running Gemma 3 Without a Dedicated GPU
&lt;/h2&gt;

&lt;p&gt;I ran the project on a laptop with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intel Iris Xe integrated graphics&lt;/li&gt;
&lt;li&gt;16 GB RAM&lt;/li&gt;
&lt;li&gt;Windows 11&lt;/li&gt;
&lt;li&gt;No dedicated GPU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final live evaluation averaged approximately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17.9 seconds&lt;/strong&gt; for first-run inference.&lt;/p&gt;

&lt;p&gt;Repeated runs averaged around:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9.5 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I didn't perform controlled hardware benchmarking, so these should be considered practical observations rather than formal performance claims.&lt;/p&gt;

&lt;p&gt;It's perfectly acceptable for logging a workout after training.&lt;/p&gt;

&lt;p&gt;It would not be ideal for real-time interaction between sets.&lt;/p&gt;

&lt;p&gt;And that's an important trade-off to acknowledge.&lt;/p&gt;




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

&lt;p&gt;For this project, open innovation wasn't just about using an open model because it was interesting.&lt;/p&gt;

&lt;p&gt;It changed what I could build.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔒 Privacy
&lt;/h2&gt;

&lt;p&gt;Workout history is personal data.&lt;/p&gt;

&lt;p&gt;With local inference, the workout notes stay on the user's machine instead of being sent to a third-party AI API.&lt;/p&gt;

&lt;p&gt;There is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No cloud AI endpoint&lt;/li&gt;
&lt;li&gt;No API key&lt;/li&gt;
&lt;li&gt;No per-request AI cost&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌐 Offline Capability
&lt;/h2&gt;

&lt;p&gt;Once Gemma 3 is downloaded, the core parsing workflow can run without an internet connection.&lt;/p&gt;

&lt;p&gt;That's particularly useful for gyms where mobile connectivity can be unreliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  💰 Zero Ongoing AI Cost
&lt;/h2&gt;

&lt;p&gt;A hosted AI API would introduce usage costs and external dependencies.&lt;/p&gt;

&lt;p&gt;Running Gemma 3 locally means the model can be used without paying for every workout entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Model Freedom
&lt;/h2&gt;

&lt;p&gt;The application isn't locked to one proprietary AI provider.&lt;/p&gt;

&lt;p&gt;The model is configurable, so I can experiment with different open models as they improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧪 Inspectability
&lt;/h2&gt;

&lt;p&gt;Because the inference pipeline runs locally, I can inspect the prompt, model output, validation logic, and evaluation process myself.&lt;/p&gt;

&lt;p&gt;I can test failures instead of simply trusting an API response.&lt;/p&gt;

&lt;h3&gt;
  
  
  The honest trade-off
&lt;/h3&gt;

&lt;p&gt;A larger hosted model would probably be faster and more accurate.&lt;/p&gt;

&lt;p&gt;Gemma 3 running locally on my hardware isn't.&lt;/p&gt;

&lt;p&gt;I chose:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy + offline capability + zero per-request cost&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;over:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maximum speed + maximum model accuracy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The confirmation workflow is how I make that trade-off practical.&lt;/p&gt;




&lt;h1&gt;
  
  
  One Important Privacy Caveat
&lt;/h1&gt;

&lt;p&gt;I also discovered something important while writing the project documentation.&lt;/p&gt;

&lt;p&gt;My project directory is currently inside OneDrive.&lt;/p&gt;

&lt;p&gt;That means the SQLite database can potentially be synchronized by OneDrive.&lt;/p&gt;

&lt;p&gt;So "local AI" does not automatically mean "private forever."&lt;/p&gt;

&lt;p&gt;For the database to remain truly local, the project/database should be stored outside cloud-synchronized folders.&lt;/p&gt;

&lt;p&gt;I documented this limitation rather than hiding it.&lt;/p&gt;




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

&lt;p&gt;I built Gym Log Buddy using &lt;strong&gt;Google Antigravity&lt;/strong&gt; as the coding agent.&lt;/p&gt;

&lt;p&gt;The agent helped with implementation and refactoring, while I reviewed the generated code, ran the tests, evaluated the real model, and investigated failures.&lt;/p&gt;

&lt;p&gt;A second AI assistant was also used as a reviewer.&lt;/p&gt;

&lt;p&gt;That review process helped uncover two particularly important issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Benchmark contamination / prompt leakage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Streamlit &lt;code&gt;NameError&lt;/code&gt; that the original tests couldn't detect&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal wasn't to blindly accept generated code.&lt;/p&gt;

&lt;p&gt;It was to use the agent to accelerate development while still treating testing, evaluation, and review as engineering responsibilities.&lt;/p&gt;




&lt;h1&gt;
  
  
  Prize Categories
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🏆 Best Use of Gemma
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gemma 3&lt;/strong&gt; is the core AI component of Gym Log Buddy.&lt;/p&gt;

&lt;p&gt;It runs locally through Ollama and converts unstructured workout notes into structured workout data.&lt;/p&gt;

&lt;p&gt;The project demonstrates a practical use of an open-weight model where local inference provides meaningful benefits in &lt;strong&gt;privacy, offline capability, cost, and model flexibility&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Gym Log Buddy started with a very small problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My friend keeps forgetting his gym weights.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It ended up becoming an experiment in local AI, evaluation, prompt leakage, schema design, testing, privacy, and honest benchmarking.&lt;/p&gt;

&lt;p&gt;I didn't build a huge fitness platform.&lt;/p&gt;

&lt;p&gt;I built a small tool for one real person.&lt;/p&gt;

&lt;p&gt;And that's exactly what this challenge was about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build for a friend. Build something useful. Then test whether it actually works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading, and happy Hacktoberfest! 🚀&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%2Fo4gd5zwcyw13h5771zcs.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%2Fo4gd5zwcyw13h5771zcs.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;a href="https://dev.tourl"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>"Innovating Tomorrow: How Our Hackathon Project is Powering a Smarter Future"</title>
      <dc:creator>Shubham Nayak</dc:creator>
      <pubDate>Sun, 20 Jul 2025 13:36:15 +0000</pubDate>
      <link>https://dev.to/shubham_nayak_/innovating-tomorrow-how-our-hackathon-project-is-powering-a-smarter-future-4bel</link>
      <guid>https://dev.to/shubham_nayak_/innovating-tomorrow-how-our-hackathon-project-is-powering-a-smarter-future-4bel</guid>
      <description>&lt;p&gt;🧠&lt;strong&gt;Our Project&lt;/strong&gt;: Silent SOS – A Gesture/Voice-Based Emergency Alert System&lt;br&gt;
At the heart of every hackathon lies a purpose—to innovate, solve real problems, and build something impactful in record time. For our team, that purpose took the form of Silent SOS, a safety-focused web application that uses gesture and voice triggers to silently raise emergency alerts.&lt;/p&gt;

&lt;p&gt;With growing concerns about personal safety and harassment, especially in public or isolated spaces, we wanted to create a discreet and fast emergency alert system—without needing to unlock a phone or type anything.&lt;/p&gt;

&lt;p&gt;🔧** Tech Stack + Bolt Integration**&lt;br&gt;
We built our project using:&lt;/p&gt;

&lt;p&gt;Frontend: HTML, CSS, JavaScript (Vanilla)&lt;/p&gt;

&lt;p&gt;Backend: Node.js + Express&lt;/p&gt;

&lt;p&gt;Database: MongoDB&lt;/p&gt;

&lt;p&gt;Realtime Alert System: Bolt API for sending instant alerts (notifications, webhooks, and integrations)&lt;/p&gt;

&lt;p&gt;Bolt made a huge difference by allowing us to send fast, reliable emergency alerts, integrating seamlessly with our backend using webhooks and trigger-based flows.&lt;/p&gt;

&lt;p&gt;⚙️ &lt;strong&gt;How SilentSOS Works&lt;/strong&gt;&lt;br&gt;
Voice or Gesture Recognition: Detects predefined gestures or trigger words like “Help!” using Web Speech API and Hand Detection Models.&lt;/p&gt;

&lt;p&gt;Silent Alert: Sends data to our backend with location &amp;amp; timestamp.&lt;/p&gt;

&lt;p&gt;Bolt Trigger: Instantly pushes alert via SMS/Discord/Webhook to saved contacts using Bolt.&lt;/p&gt;

&lt;p&gt;Live Dashboard: Admin panel to view active alerts and track responses.&lt;/p&gt;

&lt;p&gt;💡&lt;strong&gt;Challenges We Faced&lt;/strong&gt;&lt;br&gt;
Gesture Accuracy: Calibrating for different lighting and hand sizes.&lt;/p&gt;

&lt;p&gt;Silent Triggers: Ensuring no UI popups so the alert remains hidden.&lt;/p&gt;

&lt;p&gt;Bolt Webhook Timing: Syncing real-time data with the alert system.&lt;/p&gt;

&lt;p&gt;Breakthrough moment: When Bolt successfully triggered a live SMS and webhook alert with just a gesture in under 3 seconds.&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Favorite Bolt Features&lt;/strong&gt;&lt;br&gt;
🔔 Real-time Webhook Triggers – Lightning-fast and developer-friendly&lt;/p&gt;

&lt;p&gt;🧩 Easy to integrate – No lengthy setup, minimal code required&lt;/p&gt;

&lt;p&gt;📡 Reliable delivery – Worked every time under load&lt;/p&gt;

&lt;p&gt;👥 &lt;strong&gt;Team Members&lt;/strong&gt;&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/shubham_nayak_"&gt;@shubham_nayak_&lt;/a&gt;  (Me – Frontend &amp;amp; Integration)&lt;/p&gt;

&lt;p&gt;Submission posted by &lt;a class="mentioned-user" href="https://dev.to/shubham_nayak_"&gt;@shubham_nayak_&lt;/a&gt;  on behalf of the team.&lt;/p&gt;

&lt;p&gt;🎯 *&lt;em&gt;What We Learned *&lt;/em&gt;&lt;br&gt;
How to balance UX with urgency in safety apps&lt;/p&gt;

&lt;p&gt;Integrating Bolt APIs for real-time use cases&lt;/p&gt;

&lt;p&gt;Working collaboratively under pressure and making quick architectural decisions&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.amazonaws.com%2Fuploads%2Farticles%2F7qrwf1fdmblkdli54v32.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.amazonaws.com%2Fuploads%2Farticles%2F7qrwf1fdmblkdli54v32.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💬 &lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;br&gt;
Participating in this hackathon was more than just coding—it was about building with purpose. Bolt’s simplicity and power enabled us to create something potentially life-saving. We're excited to continue improving SilentSOS, adding more AI capabilities and mobile support.&lt;/p&gt;

&lt;p&gt;Let’s continue building for impact, with speed and safety.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hackathon #BoltHackathon #DevChallenge #SilentSOS #WebDev #AI #EmergencyTech
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>wlhchallenge</category>
      <category>bolt</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
