<?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: Manpreet Singh</title>
    <description>The latest articles on DEV Community by Manpreet Singh (@manpreet_singh_89e08f9bcd).</description>
    <link>https://dev.to/manpreet_singh_89e08f9bcd</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%2F4160454%2Fa3d7f644-000e-4e41-9821-73874a5913b0.jpg</url>
      <title>DEV Community: Manpreet Singh</title>
      <link>https://dev.to/manpreet_singh_89e08f9bcd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manpreet_singh_89e08f9bcd"/>
    <language>en</language>
    <item>
      <title>RasoiIQ: I built my friend a "kal kitna banana hai?" forecaster with TabPFN that runs offline on a laptop</title>
      <dc:creator>Manpreet Singh</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:54:36 +0000</pubDate>
      <link>https://dev.to/manpreet_singh_89e08f9bcd/rasoiiq-i-built-my-friend-a-kal-kitna-banana-hai-forecaster-with-tabpfn-that-runs-offline-on-a-5e3h</link>
      <guid>https://dev.to/manpreet_singh_89e08f9bcd/rasoiiq-i-built-my-friend-a-kal-kitna-banana-hai-forecaster-with-tabpfn-that-runs-offline-on-a-5e3h</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 &lt;strong&gt;Simran&lt;/strong&gt; runs a home food business out of her kitchen in &lt;strong&gt;Chandigarh&lt;/strong&gt;. Every night she asks herself the same question: &lt;em&gt;kal kitna banana hai?&lt;/em&gt; How much should I cook tomorrow?&lt;/p&gt;

&lt;p&gt;She answers it by gut feeling. When she guesses high, food goes to waste and so does her money. When she guesses low, she runs out by lunch and has to turn regulars away. Festivals make it harder still: Karva Chauth, Navratri and Diwali are all coming up, plus the random bulk "party orders" that show up out of nowhere.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;RasoiIQ&lt;/strong&gt; (&lt;em&gt;rasoi&lt;/em&gt; means kitchen). She gives it a CSV of past orders, and it tells her for each dish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🍛 &lt;strong&gt;How many plates to prep tomorrow&lt;/strong&gt;, with a likely range ("likely 17 to 35")&lt;/li&gt;
&lt;li&gt;🛒 &lt;strong&gt;A shopping list&lt;/strong&gt; worked out from per-plate ingredients&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;A chart of the last 4 weeks&lt;/strong&gt;: what actually sold vs what the model would have predicted&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;An honest score&lt;/strong&gt;: how far off the model was on days it never saw, compared with plain "same weekday average" guessing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It runs &lt;strong&gt;entirely on a laptop CPU&lt;/strong&gt;. No account, no API key, no cloud, no monthly bill, and it works with the Wi-Fi off.&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%2Fb9xmez15ccnlpxmkcmeo.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%2Fb9xmez15ccnlpxmkcmeo.png" alt="Screenshot showing the application interface " width="780" height="1688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What Simran said:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I showed Simran RasoiIQ today. Her verdict: it's &lt;strong&gt;"very helpful"&lt;/strong&gt;, and she &lt;strong&gt;really likes it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's the whole point of this build. She doesn't need a dashboard or an ML lecture. She needs to open one page at night and know how much dal to soak and how many parathas to roll for tomorrow. Next, I'm loading her real order history so the forecast learns her kitchen instead of my sample data.&lt;/p&gt;

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

&lt;p&gt;🌐 &lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://rasoiiq-production.up.railway.app/" rel="noopener noreferrer"&gt;https://rasoiiq-production.up.railway.app/&lt;/a&gt; (try it with the sample CSVs)&lt;/p&gt;

&lt;p&gt;🎥 &lt;strong&gt;Video (70 seconds):&lt;/strong&gt; &lt;a href="https://drive.google.com/file/d/1CBp2dvfI0dxjZag-CzH3yITX9l9vd0Gi/view?usp=sharing" rel="noopener noreferrer"&gt;Watch the demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows: opening the page → tomorrow's forecast for each dish → ticking "festival or party tomorrow?" → uploading a messy CSV → the chart and the accuracy score.&lt;/p&gt;

&lt;p&gt;RasoiIQ is &lt;strong&gt;local-first on purpose&lt;/strong&gt; (that's the point, see below), so there's no public URL. It runs on your machine with one command:&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/ms-singh83/RasoiIQ
&lt;span class="nb"&gt;cd &lt;/span&gt;RasoiIQ
./run.sh        &lt;span class="c"&gt;# then open http://localhost:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fiba0xdqftc8ndlebjrk1.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%2Fiba0xdqftc8ndlebjrk1.png" alt="Screenshot showing the charts" width="716" height="1136"&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/ms-singh83" rel="noopener noreferrer"&gt;
        ms-singh83
      &lt;/a&gt; / &lt;a href="https://github.com/ms-singh83/RasoiIQ" rel="noopener noreferrer"&gt;
        RasoiIQ
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      RasoiIQ is an AI-powered demand forecasting tool for home food businesses. Upload past order data, predict tomorrow’s item-wise demand using TabPFN, and get an easy-to-follow Hinglish prep and shopping list with Gemma—all with privacy-friendly local processing.
    &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;RasoiIQ: kal kitna banana hai?&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Built for a friend.&lt;/strong&gt; Simran runs a home food business in Chandigarh. Every night she guesses how many plates of dal makhani, rajma chawal and aloo paratha to prep for tomorrow. Guess high and food goes to waste; guess low and she turns customers away. RasoiIQ looks at her past orders and tells her, dish by dish, how much to prep tomorrow, what to buy, and how sure it is.&lt;/p&gt;

&lt;p&gt;This was built for the DEV Hacktoberfest 2026 challenge, theme &lt;strong&gt;Build for a Friend&lt;/strong&gt;, category &lt;strong&gt;Best Use of TabPFN&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sample data notice.&lt;/strong&gt; Simran's real order history isn't in this repo. The screenshots and the numbers below use &lt;code&gt;data/sample_orders.csv&lt;/code&gt;, a 90-day &lt;strong&gt;synthetic&lt;/strong&gt; dataset made by &lt;code&gt;scripts/generate_sample.py&lt;/code&gt;. The page itself shows &lt;strong&gt;nothing until you upload a CSV&lt;/strong&gt;; if you upload one of the sample files, it is labelled as sample data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Built&lt;/strong&gt;…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ms-singh83/RasoiIQ" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;app/forecast.py&lt;/code&gt;: TabPFN fit/predict, quantiles, rolling backtest&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app/features.py&lt;/code&gt;: leak-free features (each one only uses data from before the day it predicts)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app/data.py&lt;/code&gt;: survives a real-world messy CSV&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app/static/index.html&lt;/code&gt;: one mobile-first page, no external scripts, so it works offline&lt;/li&gt;
&lt;li&gt;36 tests, including one real TabPFN prediction on CPU&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  The open model at the core: TabPFN
&lt;/h3&gt;

&lt;p&gt;Simran doesn't have years of sales data. She has a few months at most. Classic ML wants lots of data, a training loop and hyperparameter tuning. Prophet-style time-series tools want long seasonal history.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/PriorLabs/TabPFN" rel="noopener noreferrer"&gt;TabPFN&lt;/a&gt;, Prior Labs' &lt;strong&gt;tabular foundation model&lt;/strong&gt;, flips that around. It was pre-trained on millions of synthetic tables, so you hand it a &lt;em&gt;small&lt;/em&gt; table and it predicts in a single forward pass. There's no training loop and nothing to tune. A home kitchen with 90 days of orders is exactly what it was built for.&lt;/p&gt;

&lt;p&gt;Each row is &lt;strong&gt;one dish on one day&lt;/strong&gt;, and the features are things Simran already thinks about:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Why it matters in her kitchen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;day_of_week&lt;/code&gt;, &lt;code&gt;is_weekend&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Sunday aloo-paratha rush vs weekday office tiffins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;is_festival&lt;/code&gt;, &lt;code&gt;is_festival_eve&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;built-in Chandigarh/Punjab calendar + "party"/"puja" in her notes + a tick box for tomorrow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;lag_1&lt;/code&gt;, &lt;code&gt;lag_7&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yesterday, and the same day last week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;mean_7&lt;/code&gt;, &lt;code&gt;mean_28&lt;/code&gt;, &lt;code&gt;trend_7&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;is a dish catching on or fading?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;same_weekday_avg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the "careful human" guess, given to TabPFN as a hint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;item_code&lt;/code&gt;, &lt;code&gt;day_index&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;which dish, and slow word-of-mouth growth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The part I'm proudest of: turning uncertainty into a prep number
&lt;/h3&gt;

&lt;p&gt;I don't just ask TabPFN for one number. I ask for its &lt;strong&gt;10th, 50th and 90th percentiles&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TabPFNRegressor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_default_for_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ModelVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;V2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cpu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;p10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p90&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_tomorrow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantiles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;quantiles&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;prep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p50&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p90&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p50&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# buffer grows with uncertainty
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A steady dish like dal makhani gets a small buffer. A volatile one, like a new dish that's still catching on, gets a bigger one. That's TabPFN's predictive distribution turned into a decision a home cook can act on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it actually better than guessing?
&lt;/h3&gt;

&lt;p&gt;Judges hate made-up numbers, and so do I. Every number below comes from &lt;code&gt;scripts/evaluate.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method:&lt;/strong&gt; hide the last 28 days and forecast them &lt;strong&gt;one day at a time&lt;/strong&gt;, using only what was known the night before. TabPFN is refit every 7 days. The opponent is what a careful person would do by hand: &lt;strong&gt;the average of the same weekday over the last 4 weeks.&lt;/strong&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%2Faour9fxyyovr0gt7k5kz.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%2Faour9fxyyovr0gt7k5kz.png" alt="Screenshot showing the accuracy of the system" width="716" height="770"&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;Dataset (synthetic)&lt;/th&gt;
&lt;th&gt;Baseline MAE (plates)&lt;/th&gt;
&lt;th&gt;TabPFN MAE&lt;/th&gt;
&lt;th&gt;TabPFN vs baseline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clean 90-day sample, 5 dishes&lt;/td&gt;
&lt;td&gt;3.62&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.33&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.9% closer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 fresh 90-day samples&lt;/td&gt;
&lt;td&gt;3.61–4.34&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.05–3.66&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;13–18% closer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messy per-order log, 6 dishes&lt;/td&gt;
&lt;td&gt;3.58&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16.1% closer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Being honest:&lt;/strong&gt; I don't have Simran's real order history in the repo yet, so these are on realistic &lt;strong&gt;synthetic&lt;/strong&gt; order logs that I generated. They show the pipeline works; her real data will be noisier. On the messy log, most of the gain came from a &lt;em&gt;new dish&lt;/em&gt; (Chole Bhature), where the weekday average still counted the weeks before it existed (6.76 plates off vs TabPFN's 3.28). TabPFN was actually slightly &lt;strong&gt;worse&lt;/strong&gt; on two steady dishes. Small data, honest results.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bug that taught me the most
&lt;/h3&gt;

&lt;p&gt;My first version lost to plain guessing by &lt;strong&gt;40%&lt;/strong&gt; on one dataset. The cause: the kitchen had been &lt;strong&gt;closed&lt;/strong&gt; the day before the test window, so every dish showed 0 orders. TabPFN read "yesterday everyone ordered zero" as demand collapsing, and predicted almost nothing for a week.&lt;/p&gt;

&lt;p&gt;The fix was a domain rule, not a model tweak: &lt;strong&gt;a day with zero orders across every dish means the kitchen was shut, not that nobody was hungry.&lt;/strong&gt; Those days become missing values, which TabPFN handles natively. After that, TabPFN beat the baseline on every dataset, including five fresh ones generated &lt;em&gt;after&lt;/em&gt; the fix so I couldn't have tuned to them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-world messy data
&lt;/h3&gt;

&lt;p&gt;Real order logs are messy, so RasoiIQ copes with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one row per customer order (it adds them up)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Date/Dish/Qty&lt;/code&gt; instead of &lt;code&gt;date/item/quantity&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Indian day-first dates (&lt;code&gt;04/10/2026&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dal makhani&lt;/code&gt; vs &lt;code&gt;DAL MAKHANI&lt;/code&gt; (merged)&lt;/li&gt;
&lt;li&gt;refunds, blanks, &lt;code&gt;"two"&lt;/code&gt; typed as a word (skipped, with a friendly warning)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Making it run on an 8 GB Intel iMac with no GPU
&lt;/h3&gt;

&lt;p&gt;This was the hardware constraint that shaped everything. PyTorch &lt;strong&gt;stopped shipping Intel-Mac builds after 2.2.2&lt;/strong&gt;, and newer TabPFN releases need torch ≥ 2.5. Before writing any app code, I:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;found the newest TabPFN that accepts torch 2.2.2 (&lt;strong&gt;tabpfn 6.4.1&lt;/strong&gt;, with numpy &amp;lt; 2),&lt;/li&gt;
&lt;li&gt;ran a &lt;strong&gt;real tiny TabPFN prediction on CPU&lt;/strong&gt; to prove the stack works,&lt;/li&gt;
&lt;li&gt;cross-resolved every dependency for &lt;code&gt;x86_64-apple-darwin&lt;/code&gt; to confirm an Intel-Mac wheel exists,&lt;/li&gt;
&lt;li&gt;kept the table &lt;strong&gt;under 1,000 rows&lt;/strong&gt; so TabPFN stays quick on a CPU.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I also chose &lt;strong&gt;TabPFN-2 weights&lt;/strong&gt;: they download &lt;strong&gt;without any login&lt;/strong&gt;, and their license (Apache 2.0 + attribution) allows use in Simran's business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python · FastAPI · TabPFN-2 (CPU) · one HTML page with a hand-drawn SVG chart · pytest. Optional: Gemma via API to rewrite the prep list in Hinglish. It's off by default; when it's on, it gets only the finished list and its output is rejected if it changes a single number.&lt;/p&gt;

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

&lt;p&gt;For a one-woman home kitchen, a closed forecasting API simply wouldn't work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔒 &lt;strong&gt;Her sales data stays on her laptop.&lt;/strong&gt; Her order history is her customer list, her prices and her busiest days. With an open-weight model running locally, none of it ever leaves her machine.&lt;/li&gt;
&lt;li&gt;💸 &lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No subscription and no per-prediction bill. Even a small monthly fee eats into the margins of a business that sells plates of rajma chawal.&lt;/li&gt;
&lt;li&gt;📴 &lt;strong&gt;It works offline.&lt;/strong&gt; After a one-time 44 MB download, RasoiIQ runs with no internet. I tested this by running a forecast inside a sandbox with &lt;strong&gt;no network at all&lt;/strong&gt;. TabPFN's telemetry is switched off too.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;No lock-in.&lt;/strong&gt; The model is a file on disk. If a better open model comes out, it's a one-function swap.&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Open made the &lt;em&gt;right&lt;/em&gt; model possible.&lt;/strong&gt; A closed general-purpose LLM is the wrong tool for "how many plates tomorrow". An open, specialised tabular foundation model gave calibrated ranges from 90 rows on an old iMac.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I built RasoiIQ with an AI coding agent (Claude Code). I set the constraints: an Intel iMac, CPU only, under 1,000 rows, no paid services, no invented numbers. Then I let it work overnight while logging every decision in &lt;a href="https://github.com/ms-singh83/RasoiIQ/blob/claude/demand-forecaster-hacktoberfest-k6kp0q/DECISIONS.md" rel="noopener noreferrer"&gt;&lt;code&gt;DECISIONS.md&lt;/code&gt;&lt;/a&gt; and every blocker in &lt;a href="https://github.com/ms-singh83/RasoiIQ/blob/claude/demand-forecaster-hacktoberfest-k6kp0q/BLOCKERS.md" rel="noopener noreferrer"&gt;&lt;code&gt;BLOCKERS.md&lt;/code&gt;&lt;/a&gt;. The closed-day bug above was caught by its own evaluation runs, and the before/after numbers are in the repo.&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; TabPFN is the core of the project: quantile forecasts from a small CSV on CPU, turned into a prep decision, and benchmarked against a baseline with a leak-free rolling backtest.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with PriorLabs-TabPFN.&lt;/em&gt; TabPFN-2 weights are used under the &lt;a href="https://huggingface.co/Prior-Labs/TabPFN-v2-reg/blob/main/LICENSE.txt" rel="noopener noreferrer"&gt;Prior Labs License&lt;/a&gt;.&lt;/p&gt;

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