<?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: Aditya rane</title>
    <description>The latest articles on DEV Community by Aditya rane (@arane).</description>
    <link>https://dev.to/arane</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%2F4157066%2F0348c891-96ac-4dac-b76a-f1d668267e1a.png</url>
      <title>DEV Community: Aditya rane</title>
      <link>https://dev.to/arane</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arane"/>
    <language>en</language>
    <item>
      <title>LiftCast: A Local-First AI Workout Forecaster Built for a Friend</title>
      <dc:creator>Aditya rane</dc:creator>
      <pubDate>Sat, 03 Oct 2026 21:39:38 +0000</pubDate>
      <link>https://dev.to/arane/liftcast-a-local-first-ai-workout-forecaster-built-for-a-friend-2cp3</link>
      <guid>https://dev.to/arane/liftcast-a-local-first-ai-workout-forecaster-built-for-a-friend-2cp3</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;My friend lifts four days a week at our college gym. He never logs his workouts. Instead, he just texts me quick WhatsApp notes on his walk home: &lt;em&gt;"bench 60 8 8 7, last set died"&lt;/em&gt;. Because his history lived in unstructured chats, he had no way of knowing whether his strength was actually progressing or stalled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LiftCast&lt;/strong&gt; is a local-first tracker and strength forecaster built for his workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10-Second Shorthand Logger:&lt;/strong&gt; Pastes raw text, typos, or Hinglish notes. A local &lt;strong&gt;Gemma&lt;/strong&gt; model parses them into structured sets via an enforced JSON schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-Context Progress Forecaster:&lt;/strong&gt; Prior Labs' &lt;strong&gt;TabPFN&lt;/strong&gt; runs locally on CPU to forecast his next session's top set with calibrated 95% prediction intervals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plateau Detection &amp;amp; Barbell Visualizer:&lt;/strong&gt; Uses a 56-day regression slope to flag genuine stalls (ignoring routine deloads) and renders a color-coded barbell sleeve graphic showing exact plates to load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hands-Free Audio Briefing:&lt;/strong&gt; Synthesizes a 10-second voice recap via ElevenLabs (with offline browser speech fallback) straight into his gym earbuds.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🎬 &lt;strong&gt;&lt;a href="https://github.com/Adityarane012/LiftCast/raw/main/brag-output/brag.mp4" rel="noopener noreferrer"&gt;Watch 20s Product Demo (MP4)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codespaces.new/Adityarane012/LiftCast" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/codespaces/badge.svg" alt="Open in GitHub Codespaces" width="249" height="32"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1-Click Cloud Sandbox:&lt;/strong&gt; Click the badge above or launch directly at &lt;strong&gt;&lt;a href="https://codespaces.new/Adityarane012/LiftCast" rel="noopener noreferrer"&gt;codespaces.new/Adityarane012/LiftCast&lt;/a&gt;&lt;/strong&gt; to run the app in your browser. In the terminal, run:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;PYTHONPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;src streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Demo Data:&lt;/strong&gt; In the app sidebar, click &lt;strong&gt;"Seed Rich 6-Month Demo DB"&lt;/strong&gt; to populate 26 weeks of authentic training plateaus, forecasts, and plate calculations across 7 compound lifts.&lt;/li&gt;
&lt;/ul&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%2Fraw.githubusercontent.com%2FAdityarane012%2FLiftCast%2Fmain%2Fdocs%2Fassets%2Farchitecture.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%2Fraw.githubusercontent.com%2FAdityarane012%2FLiftCast%2Fmain%2Fdocs%2Fassets%2Farchitecture.png" alt="LiftCast Architecture" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Repository:&lt;/strong&gt; &lt;a href="https://github.com/Adityarane012/LiftCast" rel="noopener noreferrer"&gt;github.com/Adityarane012/LiftCast&lt;/a&gt;&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/Adityarane012" rel="noopener noreferrer"&gt;
        Adityarane012
      &lt;/a&gt; / &lt;a href="https://github.com/Adityarane012/LiftCast" rel="noopener noreferrer"&gt;
        LiftCast
      &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;⚡ LiftCast&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A local-first AI workout logger and strength progress forecaster, built for a friend.&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Entry for the DEV Hacktoberfest Weekend Challenge: "Build for a Friend"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/Adityarane012/LiftCast/actions" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8277813a37b16004bcbfc887b10d3f21a92404c48f06f2712e0fa64782678638/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f41646974796172616e653031322f4c696674436173742f63692e796d6c3f6272616e63683d6d61696e267374796c653d666f722d7468652d6261646765266c6f676f3d676974687562616374696f6e73266c6f676f436f6c6f723d7768697465" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Adityarane012/LiftCast/tests/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8ec64cea092af5cfab832008556cd2e0b7d6bf52cdb5fdc92b92e436eab41de3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7079746573742d35392532307061737365642d3130623938313f7374796c653d666f722d7468652d6261646765266c6f676f3d707974657374" alt="Tests: Passing"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Adityarane012/LiftCast" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9d21cf7ed347f26d0a76e26b881236deaeef4f77ce6bcc7016fa70e0353a8172/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e3131253230253743253230332e3132253230253743253230332e31332d3337373641423f7374796c653d666f722d7468652d6261646765266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python: 3.11 | 3.12 | 3.13"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Adityarane012/LiftCast/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7a1226d14a365d288bfe51ece915ee0c7e754a16faa51ff06436504de29b33b4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e7376673f7374796c653d666f722d7468652d6261646765" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Adityarane012/LiftCast/CLAUDE.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/267bebc61ea50ecaba322fff4e52b50b0ab6631e2c2091f3c66121f061fc5b3d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269766163792d3130302532352532304f66666c696e652532302532462532304e6f253230436c6f75642d3862356366363f7374796c653d666f722d7468652d6261646765" alt="Privacy: 100% Local"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/Adityarane012/LiftCast/docs/assets/liftcast_hero.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%2FAdityarane012%2FLiftCast%2FHEAD%2Fdocs%2Fassets%2Fliftcast_hero.png" alt="LiftCast Hero Banner" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 The Real Problem&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;My friend lifts 4 days a week at our college gym. He has never logged a single session.&lt;/p&gt;

&lt;p&gt;Every existing tracker (Strong, Hevy, Liftoff) demands structured data entry while you are out of breath:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tap search.&lt;/li&gt;
&lt;li&gt;Pick the exact movement variant from a dropdown.&lt;/li&gt;
&lt;li&gt;Type weight, type reps.&lt;/li&gt;
&lt;li&gt;Tap checkmark for set 1.&lt;/li&gt;
&lt;li&gt;Repeat 15 to 20 times per session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The friction is too high. Instead, he texts me informal notes on WhatsApp while walking home:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"bench 60 8 8 7, last set died"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"aaj lat pulldown 55 pe 10 10 9"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because he never logs, he cannot answer the central question of strength training:&lt;br&gt;
&lt;strong&gt;"Am I actually progressing on this lift over the last 8 weeks, or have I&lt;/strong&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/Adityarane012/LiftCast" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Key components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/liftcast/forecast.py&lt;/code&gt;: Local CPU TabPFN forecaster with a 40-point rolling-origin backtest.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/liftcast/parser.py&lt;/code&gt;: Schema-constrained Gemma parser via Ollama with heuristic regex fallback.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/liftcast/detect.py&lt;/code&gt;: 56-day least-squares linear slope plateau detection.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/liftcast/coach.py&lt;/code&gt;: Strict regex numeric guard preventing LLM stat hallucinations.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TabPFN (Prior Labs):&lt;/strong&gt; In-context tabular foundation model running locally on CPU. We normalize lift history as a ratio to personal best, allowing a single prior to forecast across disparate exercises without fine-tuning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma (Google / Ollama):&lt;/strong&gt; Runs locally (&lt;code&gt;gemma4:e2b&lt;/code&gt; / &lt;code&gt;gemma3:1b&lt;/code&gt;) with an enforced JSON schema to extract structured exercises, units, and rep arrays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict Numeric Guard:&lt;/strong&gt; Pure mathematical verification layer. Every number in coach summaries is validated against deterministic database stats before speech synthesis.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Sovereignty:&lt;/strong&gt; Workout logs, bodyweight, and personal notes stay in a local SQLite database (&lt;code&gt;data/liftcast.db&lt;/code&gt;). Zero cloud egress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% Offline Gym Floor Reliability:&lt;/strong&gt; Works in basement gyms with zero cell service—local Ollama, local CPU TabPFN, and native browser speech fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent Availability:&lt;/strong&gt; Open weights and local inference mean no monthly API bills, no rate limits, and zero risk of vendor deprecation.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Pair-programmed with an AI coding agent to implement the math core, build 59 automated tests, and configure multi-version CI testing (Python 3.11, 3.12, 3.13) on GitHub Actions.&lt;/p&gt;

&lt;p&gt;{% agent_session 4326f2b3-2ac2-4dfd-8d9d-9c1622013b1d %}&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of TabPFN
&lt;/h3&gt;

&lt;p&gt;LiftCast uses &lt;strong&gt;TabPFN&lt;/strong&gt; running locally on CPU to perform in-context strength progression forecasting and uncertainty estimation from historical session logs, evaluated via a 40-point rolling-origin backtest benchmark against traditional linear regression baselines.&lt;/p&gt;

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