<?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: Ch Yasaswini</title>
    <description>The latest articles on DEV Community by Ch Yasaswini (@ch_yasaswini_74b4df50cb2c).</description>
    <link>https://dev.to/ch_yasaswini_74b4df50cb2c</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%2F2876563%2Fdff07e9e-5dd8-431f-9b22-b30b28525792.jpg</url>
      <title>DEV Community: Ch Yasaswini</title>
      <link>https://dev.to/ch_yasaswini_74b4df50cb2c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ch_yasaswini_74b4df50cb2c"/>
    <language>en</language>
    <item>
      <title>SalesWhy: I Built an AI That Explains Sales Drops — Then a Generic LLM Beat My Own Pipeline</title>
      <dc:creator>Ch Yasaswini</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:01:34 +0000</pubDate>
      <link>https://dev.to/ch_yasaswini_74b4df50cb2c/saleswhy-i-built-an-ai-that-explains-sales-drops-then-a-generic-llm-beat-my-own-pipeline-5d52</link>
      <guid>https://dev.to/ch_yasaswini_74b4df50cb2c/saleswhy-i-built-an-ai-that-explains-sales-drops-then-a-generic-llm-beat-my-own-pipeline-5d52</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;SalesWhy&lt;/strong&gt; tells a small shop owner why their sales dropped — in plain English (or Telugu), backed by actual numbers, in about 20 seconds.&lt;/p&gt;

&lt;p&gt;Picture the person this is for: she runs a little Etsy shop selling candles and ceramics on the side. Tuesday's sales were fine. Thursday they fell off a cliff. She has no idea why, and no time to become a data analyst to find out. Was it the weather? A competitor? Did she mess something up? Right now her only options are "stare at a spreadsheet" or "guess."&lt;/p&gt;

&lt;p&gt;SalesWhy takes her orders CSV — whatever export her platform gives her, no reformatting required — and gives her three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A chart of what sales actually did vs. what they &lt;em&gt;should&lt;/em&gt; have done, with the rough weeks shaded and labeled.&lt;/li&gt;
&lt;li&gt;A ranked list of likely causes (price went up, shipping got more expensive, something went out of stock — or, honestly, "not sure, might be something outside this file").&lt;/li&gt;
&lt;li&gt;A three-sentence explanation she can actually read, plus a shareable "ledger slip" PNG she can screenshot to WhatsApp a supplier or business partner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Who'd pay for this? Anyone running a one-person storefront who doesn't have, and can't afford, a data analyst — which is most of them. $5-10/month to stop guessing about your own numbers is an easy sell.&lt;/p&gt;

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

&lt;p&gt;Try it live: &lt;strong&gt;[&lt;a href="https://saleswhy.onrender.com" rel="noopener noreferrer"&gt;https://saleswhy.onrender.com&lt;/a&gt;]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or run it in 3 commands (needs &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; for local explanations):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Yasaswini-ch/SalesWhy.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;SalesWhy
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ollama pull gemma3:4b
python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt; and click &lt;strong&gt;"Try sample shop"&lt;/strong&gt; — no upload needed to see it work end to end.&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%2Fjtq6508tjtpzmkgxc3by.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%2Fjtq6508tjtpzmkgxc3by.png" alt="SalesWhy chart: actual vs expected daily sales, with shaded and labeled drop/spike windows" width="799" height="421"&gt;&lt;/a&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/Yasaswini-ch" rel="noopener noreferrer"&gt;
        Yasaswini-ch
      &lt;/a&gt; / &lt;a href="https://github.com/Yasaswini-ch/SalesWhy" rel="noopener noreferrer"&gt;
        SalesWhy
      &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;SalesWhy&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why did your sales drop? SalesWhy tells you — in plain words, backed by numbers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Upload an orders CSV from Shopify, Etsy, or any small shop export. SalesWhy predicts what sales &lt;em&gt;should&lt;/em&gt; have been, finds the days where they fell short (or jumped), names the most likely cause, and explains it in a short, plain-language note — in English or Telugu.&lt;/p&gt;

&lt;p&gt;Built for the &lt;a href="https://dev.to" rel="nofollow"&gt;DEV Hacktoberfest Open-Source AI Challenge&lt;/a&gt; — Week 2 ("Side Hustle").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo: &lt;a href="https://saleswhy.onrender.com/" rel="nofollow noopener noreferrer"&gt;saleswhy.onrender.com&lt;/a&gt;&lt;/strong&gt; — click "Try sample shop," no upload needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Yasaswini-ch/SalesWhy/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://www.python.org/downloads/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b566d396d2e22b5a6a8b05f1168f96e80fb8e42d45d17cd178a039e81a2b047a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31322d626c75652e737667" alt="Python 3.12"&gt;&lt;/a&gt;
&lt;a href="https://fastapi.tiangolo.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/81ce170c3b4f9fc287d2354fcd54a74700181b5ec4d867234e7f4014671f9f5d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6261636b656e642d466173744150492d3030393638382e737667" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/PriorLabs/TabPFN" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/153774d52f544950fffbb31528d3bbd4dbdd65c6668b8d3c0b9bc8ae4f4e6c0b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f666f726563617374696e672d54616250464e2d3742324646372e737667" alt="TabPFN"&gt;&lt;/a&gt;
&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a326073b9b4a63677821aca36a46ea88d88d9cc0f840bf4030d12cd7cea72011/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6578706c616e6174696f6e732d47656d6d612d3432383546342e737667" alt="Gemma"&gt;&lt;/a&gt;
&lt;a href="https://hacktoberfest.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3b17b6a08d5f220c343a5793e636604dbaa124e56a364f442d280abe61379514/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6666363630302e737667" alt="Hacktoberfest"&gt;&lt;/a&gt;
&lt;a href="https://render.com/deploy?repo=https://github.com/Yasaswini-ch/SalesWhy" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0ea7769291d82bc6e51b56d503bbf9e67d9527d30272ae6d34646ccd60341669/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6465706c6f792d52656e6465722d3436453342372e737667" alt="Deploy to Render"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload&lt;/strong&gt; an orders CSV (or click "Try sample shop" to see it work instantly).&lt;/li&gt;
&lt;li&gt;SalesWhy &lt;strong&gt;auto-maps your columns&lt;/strong&gt; (date, amount, quantity, product) and lets you confirm or fix the guess.&lt;/li&gt;
&lt;li&gt;It predicts expected daily revenue with &lt;strong&gt;TabPFN&lt;/strong&gt;, trained on your own earlier data.&lt;/li&gt;
&lt;li&gt;It flags windows where actual revenue was well above or below expected, and &lt;strong&gt;deterministically&lt;/strong&gt; ranks price, shipping…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Yasaswini-ch/SalesWhy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The whole thing rests on one rule I didn't let myself break: &lt;strong&gt;a language model is never allowed to decide the cause of a sales drop.&lt;/strong&gt; It only phrases a decision that's already been made by plain arithmetic. Here's the pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/PriorLabs/TabPFN" rel="noopener noreferrer"&gt;TabPFN&lt;/a&gt;&lt;/strong&gt; (local, open-weight) predicts what daily revenue &lt;em&gt;should&lt;/em&gt; have been, trained on a seller's own earlier days — no hyperparameter tuning, which is TabPFN's whole premise and exactly what makes it workable for a tool that has to retrain itself on a stranger's CSV in a few seconds.&lt;/li&gt;
&lt;li&gt;A small deterministic function flags windows where actual revenue falls well below (or jumps well above) that prediction for 2+ consecutive days.&lt;/li&gt;
&lt;li&gt;For each flagged window, I compare price, shipping cost, and active-product-count &lt;em&gt;inside&lt;/em&gt; the window against a 14-day baseline &lt;em&gt;before&lt;/em&gt; it, and rank which one moved the most. If nothing moved enough, it says "not sure" — out loud, not silently.&lt;/li&gt;
&lt;li&gt;Only &lt;em&gt;then&lt;/em&gt; does &lt;strong&gt;Gemma 3 (4B)&lt;/strong&gt;, running locally through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, get involved — and only to turn &lt;code&gt;{"cause": "stockout", "change_pct": 43.5}&lt;/code&gt; into three readable sentences, in English or Telugu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything else — the CSV column auto-mapper (so it works on Shopify, Etsy, or a raw transaction export without asking the user to reformat anything), the what-if estimator (re-predicts with a counterfactual price to say "if you hadn't raised the price, sales would've been about X"), the product drill-down, and the ledger-slip PNG export — is plain Python and a FastAPI endpoint. No agent framework, because this didn't need one.&lt;/p&gt;

&lt;p&gt;I evaluated it properly, not just vibes: injected 30 synthetic drops with known causes (price hike, stockout, freight spike) into real seller data from the &lt;a href="https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce" rel="noopener noreferrer"&gt;Olist e-commerce dataset&lt;/a&gt;, then checked whether SalesWhy named the right one. Full table and discussion in &lt;a href="https://github.com/Yasaswini-ch/SalesWhy/blob/main/results/eval.md" rel="noopener noreferrer"&gt;&lt;code&gt;results/eval.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Three concrete things open models bought me that a closed API wouldn't have, plus one honest surprise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost that actually makes the business work.&lt;/strong&gt; A shop owner checking "why did my sales drop" a few times a week, forever, needs a per-query cost near zero or the product doesn't exist. Local Gemma costs nothing beyond the laptop it's already running on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy that's actually true, not just claimed.&lt;/strong&gt; TabPFN and Gemma both run on the same machine the CSV was uploaded to. The footer of the app states exactly what ran where, read from the live config — not a marketing claim, a fact I can check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And here's the part I didn't expect going in.&lt;/strong&gt; To build a fair baseline, I gave a generic LLM (Gemini, via API — the one closed piece in this whole evaluation, used &lt;em&gt;only&lt;/em&gt; as a comparison point) the exact same raw data and asked it one plain, unstructured question: "why did sales drop?" I expected my engineered, deterministic pipeline to win easily. It didn't — &lt;strong&gt;the raw LLM call scored 53.3% accuracy against my pipeline's 36.7%&lt;/strong&gt;, on the same 30 synthetic drops. (&lt;a href="https://dev.to/prabhakar_chaudhary_7afe4/why-llms-still-struggle-with-tabular-prediction-24i"&gt;This post on why LLMs struggle with tabular prediction&lt;/a&gt; is about the opposite claim, and reading it after my own result made me take the surprise more seriously, not less.)&lt;/p&gt;

&lt;p&gt;It wasn't all good news for the generic LLM, though — it does something SalesWhy's deterministic pipeline structurally can't: it sometimes gives a &lt;em&gt;confidently wrong&lt;/em&gt; answer, blaming "orders fell" (true, but a symptom) instead of the price change that caused the orders to fall (the actual cause). SalesWhy can only ever name price, freight, stock, or say "not sure" — it can't invent a plausible-sounding non-answer. Whether 17 points of accuracy is worth that guardrail is a genuinely open question, and I'd rather report that honestly than quietly bury the number that didn't flatter my own design. (Full breakdown, including a grading bug I caught &lt;em&gt;in&lt;/em&gt; myself mid-evaluation — my keyword classifier was marking the LLM wrong because it said "zero active products" instead of my expected word "stock" — is in &lt;code&gt;results/eval.md&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;That's the open-innovation case in one sentence: because every piece of this ran somewhere I could inspect it, I could catch my own tool being outperformed, understand exactly why, and write about it instead of hiding it behind an API I couldn't see inside.&lt;/p&gt;

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

&lt;p&gt;The full build log — including every bug, every wrong turn, and the exact moment the generic-LLM baseline beat my own pipeline — is in &lt;a href="https://github.com/Yasaswini-ch/SalesWhy/blob/main/DEVLOG.md" rel="noopener noreferrer"&gt;&lt;code&gt;DEVLOG.md&lt;/code&gt;&lt;/a&gt; in the repo. &lt;em&gt;(Agent session embed/link to be added — see DevRelay session saving.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;Not an external customer yet — this was built solo against a tight deadline. But the closest thing to a first user so far: I put the running app in front of myself fresh, without pre-explaining the UI, and used it like a stranger would. First reaction: "the UI looks too boring." That's genuinely useful feedback, and it's the reason the finished app has the stamp-mark header, color-coded ledger rows, and a custom-styled chart instead of the plain bordered boxes I shipped first. The next real test is putting it in front of an actual Etsy or Shopify seller — that's the honest next step, not a fabricated success story.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of TabPFN&lt;/li&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>Nimbus Choir: Point Your Phone at the Sky, Hear It Sing</title>
      <dc:creator>Ch Yasaswini</dc:creator>
      <pubDate>Sat, 10 Oct 2026 12:51:49 +0000</pubDate>
      <link>https://dev.to/ch_yasaswini_74b4df50cb2c/nimbus-choir-point-your-phone-at-the-sky-hear-it-sing-4jl8</link>
      <guid>https://dev.to/ch_yasaswini_74b4df50cb2c/nimbus-choir-point-your-phone-at-the-sky-hear-it-sing-4jl8</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;Nimbus Choir&lt;/strong&gt; points your phone's camera at the sky and turns it into a soft, generative ambient piece -- entirely offline, no account, no cloud service watching what's above you.&lt;/p&gt;

&lt;p&gt;Every cloud the camera tracks becomes one voice in the choir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud type&lt;/strong&gt; picks the timbre (cirrus, cumulus, stratus, cumulonimbus each hum differently)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size&lt;/strong&gt; picks volume&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Height&lt;/strong&gt; picks pitch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Left-right drift&lt;/strong&gt; pans it across the stereo field&lt;/li&gt;
&lt;li&gt;A short-term weather forecast tunes how &lt;strong&gt;consonant or unsettled&lt;/strong&gt; the whole piece feels&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frndwq5gaf4kbn9z7uzug.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%2Frndwq5gaf4kbn9z7uzug.png" alt="Nimbus Choir's main screen -- camera stage, controls, and the " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The intended use is exactly what the theme asks for: point it at the sky, tap once, then put the phone down. The screen is the shortest part -- after that it's just you, outside, listening to clouds drift while an ambient pad drifts with them.&lt;/p&gt;

&lt;p&gt;There's also an optional &lt;strong&gt;Earth mode&lt;/strong&gt;: tap the globe icon, watch a few cloud shapes part to reveal a real spinning globe (actual coastlines, actual rotation -- written from scratch, no mapping library), tap a glowing region, and the same sound engine sonifies &lt;em&gt;live NASA satellite imagery&lt;/em&gt; instead of your camera. It's clearly marked "Online" and falls back to the camera automatically if the network's unreachable.&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%2Fp3rofcno3zw3qcjwqohf.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%2Fp3rofcno3zw3qcjwqohf.png" alt="The globe picker -- real coastlines, orthographic projection, snaps to the nearest live-coverage region" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://web-pi-wine-28.vercel.app/" rel="noopener noreferrer"&gt;web-pi-wine-28.vercel.app&lt;/a&gt; -- the real frontend (camera pipeline, tracking, sound engine) running live. This is a static deploy of just &lt;code&gt;/web&lt;/code&gt;, so the backend-dependent bits (tension forecast, sky narrator, Earth mode's satellite proxy) aren't reachable from it and gracefully fall back exactly as they're designed to offline -- the core camera-to-sound experience is fully live and functional. For the complete experience including those, clone the repo and run the FastAPI server alongside it (instructions below).&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Yasaswini-ch/Nimbus-Choir" rel="noopener noreferrer"&gt;github.com/Yasaswini-ch/Nimbus-Choir&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/web&lt;/code&gt;&lt;/strong&gt; -- vanilla JS + Vite. A real-time sky segmentation pipeline (sky masking, connected-component cloud detection, an IoU tracker that handles merges/splits as clouds drift and overlap) feeds a cloud-type classifier that runs &lt;strong&gt;entirely in-browser&lt;/strong&gt; via &lt;code&gt;onnxruntime-web&lt;/code&gt; -- a frozen, open-weight &lt;strong&gt;DINOv2&lt;/strong&gt; backbone with a small trained head, quantized to ONNX. Zero network calls for the core experience. The sound engine is hand-built Web Audio: detuned oscillator pads through a lowpass + slow tremolo, plus physically-modeled partial-based chimes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/training&lt;/code&gt;&lt;/strong&gt; -- the classifier pipeline. Public &lt;strong&gt;CCSN&lt;/strong&gt; cloud dataset → dedupe/augment → DINOv2 (open-weight, frozen) + trainable head, distilled with optional Tinker teacher soft-labels for extra accuracy, but &lt;strong&gt;the version actually shipped here trained on ground truth only -- $0 spent, no closed model touched at all&lt;/strong&gt;. (CCSN has no clear-sky class, so I generated 60 synthetic gradient-sky images as a documented stand-in for that one label.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/forecast&lt;/code&gt;&lt;/strong&gt; -- an open-weight &lt;strong&gt;TabPFN&lt;/strong&gt; model (a tabular foundation model) predicts the "tension" value from cloud cover + pressure trend, trained on public Open-Meteo reanalysis data across ~40 global locations. Held-out-by-location accuracy (tested on 6 cities -- Buenos Aires, Cairo, Mumbai, São Paulo, Shanghai, Sydney -- the model never saw during training): &lt;strong&gt;77.5%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/server&lt;/code&gt;&lt;/strong&gt; -- FastAPI. Serves the tension model, an optional sky narrator (local &lt;strong&gt;Gemma 3&lt;/strong&gt; via Ollama writes a caption, &lt;strong&gt;Piper&lt;/strong&gt; -- open-weight, fully offline TTS -- speaks it), and Earth mode's NASA GIBS satellite tile proxy (confirmed live against GOES-East, GOES-West, and Himawari-8, no API key needed).&lt;/p&gt;

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

&lt;p&gt;This is the part I actually want to highlight, because it wasn't just philosophical -- it changed a real decision mid-build.&lt;/p&gt;

&lt;p&gt;The narrator originally used ElevenLabs for voice. It worked, but it meant: no network → no voice, an API key to manage, and a per-character cost for something meant to run in a field with no signal. I swapped it for &lt;strong&gt;Piper&lt;/strong&gt;, an open-weight local TTS. Same user-facing feature, zero network calls, zero marginal cost, and it keeps working exactly where the app is meant to be used -- outside, possibly with no bars.&lt;/p&gt;

&lt;p&gt;That one swap is the whole argument in miniature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runs with no internet.&lt;/strong&gt; The main camera mode -- segmentation, tracking, classification, the entire sound engine -- never makes a network call after first load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing about your sky leaves your device.&lt;/strong&gt; No photos, no GPS (even the forecast lookup coarse-rounds coordinates to 0.5° before it ever leaves the client).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costs nothing to run, at any scale.&lt;/strong&gt; The open-weight classifier, TabPFN forecaster, and Piper narrator all run locally after their one-time download. No per-request bill waiting at the end of a demo day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The one online feature is opt-in and honest about it.&lt;/strong&gt; Earth mode needs the network (real satellite data has to come from somewhere), so it's the only part with an "Online" badge, and it's the only part that can't run in a field with no signal -- which is exactly why it's optional, not the default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open-weight models didn't just make this cheaper to build. They're the reason the app can keep its core promise -- point it at the actual sky, anywhere, with nothing phoning home -- instead of quietly becoming "offline, except for the parts that aren't."&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN&lt;/strong&gt; -- the &lt;code&gt;/forecast&lt;/code&gt; tension model, trained and honestly validated as described above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; -- the sky narrator's captions, generated by a local Gemma 3 model via Ollama.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>CrackIt: Big Equations, Broken into Small Pieces (Built for My Brother)</title>
      <dc:creator>Ch Yasaswini</dc:creator>
      <pubDate>Sat, 03 Oct 2026 08:42:04 +0000</pubDate>
      <link>https://dev.to/ch_yasaswini_74b4df50cb2c/crackit-big-equations-broken-into-small-pieces-built-for-my-brother-gdm</link>
      <guid>https://dev.to/ch_yasaswini_74b4df50cb2c/crackit-big-equations-broken-into-small-pieces-built-for-my-brother-gdm</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 younger brother is a diploma student in petrochemical engineering. Every evening, he sits with thick textbooks filled with dry, heavy equations like the &lt;strong&gt;Ergun Equation&lt;/strong&gt;, &lt;strong&gt;Bernoulli's Principle&lt;/strong&gt;, and &lt;strong&gt;Raoult's Law&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Like many engineering students, he gets bored and overwhelmed by abstract derivations. When you're trying to understand how a packed catalyst bed in an oil hydrotreater works, looking at this:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;Δ&lt;/span&gt;&lt;span class="mord mathnormal"&gt;P&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;ϵ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;150&lt;/span&gt;&lt;span class="mord mathnormal"&gt;μ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ϵ&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;v&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;ϵ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1.75&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ρ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ϵ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;v&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;...feels completely disconnected from real plant operations.&lt;/p&gt;

&lt;p&gt;So for the Hacktoberfest &lt;strong&gt;"Build for a Friend"&lt;/strong&gt; Weekend Challenge, I built &lt;strong&gt;CrackIt&lt;/strong&gt;: an engineering equation interpreter designed like a friendly senior explaining over a cup of chai.&lt;/p&gt;

&lt;p&gt;CrackIt breaks heavy formulas into small, practical pieces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;🎯 What It's For:&lt;/strong&gt; One clear sentence connecting the formula to real plant equipment (distillation towers, hydrotreaters, heat exchangers).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔤 Crack the Symbols:&lt;/strong&gt; Every symbol in plain words with its engineering units, plus an &lt;strong&gt;Interactive Focus&lt;/strong&gt; picker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✏️ Worked Example:&lt;/strong&gt; Calculations broken into 3 to 5 clean steps with round numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧪 Try It Live (Interactive Calculator):&lt;/strong&gt; A live numeric playground where students tweak parameters (flow rates, particle size, void fraction) and watch outputs recalculate in real time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💡 What Happens If...?:&lt;/strong&gt; Real plant intuition, e.g. "Smaller catalyst particles create a substantially higher pressure drop due to the 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 term in the denominator."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Practice Challenge &amp;amp; AI Feedback:&lt;/strong&gt; Practice problems with an answer checker powered by Google's open-weight &lt;strong&gt;Gemma 3 4B&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🌐 Live Demo &amp;amp; Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Application (on Render):&lt;/strong&gt; &lt;a href="https://crackit-ch8e.onrender.com/" rel="noopener noreferrer"&gt;https://crackit-ch8e.onrender.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&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/Yasaswini-ch" rel="noopener noreferrer"&gt;
        Yasaswini-ch
      &lt;/a&gt; / &lt;a href="https://github.com/Yasaswini-ch/CrackIt" rel="noopener noreferrer"&gt;
        CrackIt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Big equations, broken into small pieces.
    &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;⚗️ CrackIt&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Big equations, broken into small pieces.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Yasaswini-ch/CrackIt/docs/dashboard.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%2FYasaswini-ch%2FCrackIt%2FHEAD%2Fdocs%2Fdashboard.png" alt="CrackIt Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built for my brother, a diploma student in petrochemical engineering who finds heavy maths boring
CrackIt takes an engineering equation and breaks it into small, friendly parts, with a petrochemical
plant example every time, and lets you play with the numbers live.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌐 Live Demo &amp;amp; Deployment&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live on Render:&lt;/strong&gt; &lt;a href="https://crackit-ch8e.onrender.com/" rel="nofollow noopener noreferrer"&gt;https://crackit-ch8e.onrender.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Yasaswini-ch/CrackIt" rel="noopener noreferrer"&gt;https://github.com/Yasaswini-ch/CrackIt&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Type an equation name (or pick a quick card, or upload a photo of your notes) and CrackIt shows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The formula&lt;/strong&gt;, rendered properly (Ergun's viscous and inertial terms are colour-labelled)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What it's for&lt;/strong&gt;, with a real plant example&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crack the Symbols&lt;/strong&gt;, a table of every symbol, its meaning and its unit, plus an &lt;strong&gt;Interactive Focus&lt;/strong&gt; picker for any one symbol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worked example&lt;/strong&gt;, small round numbers, one step per line&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try it live&lt;/strong&gt;, a calculator pre-filled with the worked-example values. Change a…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Yasaswini-ch/CrackIt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  📸 Screenshots &amp;amp; Walkthrough
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The Equation Dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Midnight Navy and Off-White interface with Inter and STIX Two Math typography.&lt;/em&gt;&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%2Fd0jev0mndeh2p34s8axr.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%2Fd0jev0mndeh2p34s8axr.png" alt="CrackIt Dashboard" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Students can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type in any equation name (e.g. &lt;em&gt;"Ergun equation"&lt;/em&gt;, &lt;em&gt;"Q = mCpΔT"&lt;/em&gt;, or &lt;em&gt;"Bernoulli"&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Upload textbook photos to have the vision model identify the formula.&lt;/li&gt;
&lt;li&gt;Click any of the 10 quick-start cards spanning fluid dynamics, heat transfer, kinetics, and thermodynamics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The Learning Workspace
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Semantic color highlights: viscous contribution in Soft Blue (#EAF3FF) vs. inertial contribution in Soft Violet (#F1ECFF).&lt;/em&gt;&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%2Fou39iu6f8htx6n1kwzhr.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%2Fou39iu6f8htx6n1kwzhr.png" alt="CrackIt Workspace Top" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Step-by-Step Breakdown, Symbols &amp;amp; Worked Example
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Every variable cataloged with physical units, followed by sequential numeric walkthroughs.&lt;/em&gt;&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%2Fx7cexp8fz6gra7wcqk97.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%2Fx7cexp8fz6gra7wcqk97.png" alt="CrackIt Details" width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;CrackIt is built around two principles: &lt;strong&gt;deterministic physical accuracy&lt;/strong&gt; and &lt;strong&gt;open-weight AI guidance&lt;/strong&gt;. The numbers always come from plain Python, and the AI only explains and checks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│                      Browser UI: Gradio 6                       │
│      (Inter Typography + STIX Two Math + KaTeX Rendering)       │
└────────────────────────────────┬────────────────────────────────┘
                                 │
                ┌────────────────┴────────────────┐
                ▼                                 ▼
┌───────────────────────────────┐ ┌───────────────────────────────┐
│      Deterministic Core       │ │     Open-Weight AI Tutor      │
│    (Pure Python / Offline)    │ │    (Gemma 3 4B via Ollama)    │
├───────────────────────────────┤ ├───────────────────────────────┤
│ • 10 Petrochemical Formulas   │ │ • AI Practice Answer Checker  │
│ • Step-by-Step Walkthroughs   │ │ • Multimodal Vision Reader    │
│ • Real-time Live Calculator   │ │ • Cloud Fallback (Backboard)  │
└───────────────────────────────┘ └───────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. The Open-Weight AI Core: Gemma 3 4B &amp;amp; Ollama
&lt;/h3&gt;

&lt;p&gt;On local laptops, CrackIt runs fully offline via &lt;strong&gt;Ollama&lt;/strong&gt; using Google's &lt;strong&gt;&lt;code&gt;gemma3:4b&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why open-weight AI?&lt;/strong&gt; Students often study with limited bandwidth or in offline libraries. Gemma runs privately on consumer laptop hardware with zero API fees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal equation recognition:&lt;/strong&gt; Gemma's vision encoder reads textbook snapshots and identifies formulas directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pedagogical tutor mode:&lt;/strong&gt; Gemma checks student practice answers, explaining math or unit mistakes in at most two friendly sentences.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Live Cloud Deployment on Render
&lt;/h3&gt;

&lt;p&gt;The application is deployed on &lt;strong&gt;Render&lt;/strong&gt; as a Python web service using a &lt;code&gt;render.yaml&lt;/code&gt; blueprint with automated port binding and dynamic environment handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cloud Fallback &amp;amp; Prompt Evaluation via Backboard
&lt;/h3&gt;

&lt;p&gt;So the live Render demo stays responsive for judges even without a local Ollama daemon, I integrated &lt;strong&gt;Backboard&lt;/strong&gt; as a cloud inference gateway, evaluating prompts across open-weight models (&lt;code&gt;google/gemma-2-9b-it&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Industrial Design System
&lt;/h3&gt;

&lt;p&gt;Instead of generic AI gradients, CrackIt uses an engineering palette:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;90% Baseline:&lt;/strong&gt; Midnight Navy (&lt;code&gt;#14263D&lt;/code&gt;), Deep Navy (&lt;code&gt;#172B45&lt;/code&gt;), and Off-White (&lt;code&gt;#F8FAFC&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Accents:&lt;/strong&gt; Viscous laminar contribution in Engineering Blue (&lt;code&gt;#2F80ED&lt;/code&gt; / &lt;code&gt;#EAF3FF&lt;/code&gt;) and turbulent inertial contribution in Violet (&lt;code&gt;#7C5CDB&lt;/code&gt; / &lt;code&gt;#F1ECFF&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography:&lt;/strong&gt; &lt;code&gt;Inter&lt;/code&gt; for clean UI paired with &lt;code&gt;STIX Two Math&lt;/code&gt; for proper mathematical typesetting.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Engineering education shouldn't be locked behind expensive proprietary cloud subscriptions that track student data.&lt;/p&gt;

&lt;p&gt;Open-weight models like &lt;strong&gt;Gemma&lt;/strong&gt; show that a compact 4-billion-parameter model on a modest laptop can work as a personal chemical engineering tutor. When AI is open and runs locally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Students with limited connectivity can still use AI study tools.&lt;/li&gt;
&lt;li&gt;Plant engineers can run proprietary calculations without data leaving their laptops.&lt;/li&gt;
&lt;li&gt;Learners are not dependent on closed API providers.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;CrackIt was built with the help of an autonomous AI pair-programmer. From resolving Windows Hyper-V port exclusion conflicts, to refactoring Gradio 6 lifecycle hooks, to implementing the deterministic calculation engine and custom CSS design tokens, the agent and I worked through it together. You can explore the full commit history in the &lt;a href="https://github.com/Yasaswini-ch/CrackIt/commits/main" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Overall Winner:&lt;/strong&gt; &lt;em&gt;Theme: Build for a Friend&lt;/em&gt; (built for my brother studying petrochemical engineering)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Featured Partner: Render:&lt;/strong&gt; &lt;em&gt;Deployed live on Render Web Services&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Featured Partner: Gemma:&lt;/strong&gt; &lt;em&gt;Powered by Google's open-weight Gemma models (gemma3:4b locally, Gemma cloud via Backboard)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partner Category: Backboard:&lt;/strong&gt; &lt;em&gt;Open-weight inference routing and prompt benchmarking&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partner Category: Entire:&lt;/strong&gt; &lt;em&gt;Agent-assisted pairing session and documented build trajectory&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;







&lt;h2&gt;
  
  
  🧑‍🎓 The Verdict From My Brother
&lt;/h2&gt;

&lt;p&gt;After testing it, my brother gave his ultimate engineering stamp of approval:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm satisfied, but the pen and paper stays!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is exactly the right answer. CrackIt doesn't replace the notebook. It makes the math inside it actually make sense.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with ❤️ for my brother and engineering diploma students everywhere.&lt;/em&gt;&lt;/p&gt;

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