<?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: Pranjal Manhgaye</title>
    <description>The latest articles on DEV Community by Pranjal Manhgaye (@pranjal_manhgaye_d94d7a8f).</description>
    <link>https://dev.to/pranjal_manhgaye_d94d7a8f</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%2F4161234%2F6dadaf15-7f8b-495f-ae10-8a80b823d487.png</url>
      <title>DEV Community: Pranjal Manhgaye</title>
      <link>https://dev.to/pranjal_manhgaye_d94d7a8f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pranjal_manhgaye_d94d7a8f"/>
    <language>en</language>
    <item>
      <title>PLOT 🌿 - TabPFN on Real Frost Data Tells You to Touch Grass</title>
      <dc:creator>Pranjal Manhgaye</dc:creator>
      <pubDate>Fri, 09 Oct 2026 11:12:57 +0000</pubDate>
      <link>https://dev.to/pranjal_manhgaye_d94d7a8f/plot-tabpfn-on-real-frost-data-tells-you-to-touch-grass-54k1</link>
      <guid>https://dev.to/pranjal_manhgaye_d94d7a8f/plot-tabpfn-on-real-frost-data-tells-you-to-touch-grass-54k1</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;
  
  
  💡 The idea in one breath
&lt;/h2&gt;

&lt;p&gt;Most weather apps keep you scrolling. &lt;strong&gt;PLOT&lt;/strong&gt; does the opposite. 📵➡️🌱&lt;/p&gt;

&lt;p&gt;You pick a place (or share your location 📍). Real weather loads 🌦️. &lt;strong&gt;TabPFN&lt;/strong&gt;, an open tabular foundation model 🧠, reads your day like a row in a frost table and answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⏸️ &lt;strong&gt;Wait&lt;/strong&gt; · 🚶 &lt;strong&gt;Walk&lt;/strong&gt; · 🌿 &lt;strong&gt;Garden&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then it hands you &lt;strong&gt;three concrete steps&lt;/strong&gt; and expects you to leave. The screen's job is under a minute. ⏱️&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🚀 &lt;strong&gt;Live demo&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://plot-touch-grass.onrender.com" rel="noopener noreferrer"&gt;plot-touch-grass.onrender.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💻 &lt;strong&gt;Source&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/PranjalManhgaye/plot-touch-grass" rel="noopener noreferrer"&gt;github.com/PranjalManhgaye/plot-touch-grass&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🌿 &lt;strong&gt;Product&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;PLOT - outdoor action signal + checklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 &lt;strong&gt;Brain&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://docs.priorlabs.ai/" rel="noopener noreferrer"&gt;TabPFN&lt;/a&gt; (&lt;code&gt;tabpfn-client&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📊 &lt;strong&gt;Training data&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;30,684&lt;/strong&gt; real daily rows, 12 US cities, 2018-2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌦️ &lt;strong&gt;Weather&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://open-meteo.com" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt; ERA5 reanalysis + live forecast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☁️ &lt;strong&gt;Hosting&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://render.com" rel="noopener noreferrer"&gt;Render&lt;/a&gt; free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚡ &lt;strong&gt;Stack&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;FastAPI, static UI, no chat layer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;👥 Who it's for:&lt;/strong&gt; anyone with a yard, balcony, or park nearby who overthinks the forecast and under-leaves the house.&lt;/p&gt;




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

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

&lt;p&gt;🎥 &lt;strong&gt;Screen recording:&lt;/strong&gt; &lt;em&gt;[&lt;a href="https://www.youtube.com/watch?v=0zisIS7GLjg" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=0zisIS7GLjg&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Try it yourself:&lt;/strong&gt; &lt;a href="https://plot-touch-grass.onrender.com" rel="noopener noreferrer"&gt;plot-touch-grass.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⏳ &lt;em&gt;First load on Render free tier may take ~30s while the service wakes up.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  📸 Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🏔️ Hero - PLOT landing page&lt;/strong&gt;&lt;br&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%2Fy4mdslrgdzl8khq62xhe.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%2Fy4mdslrgdzl8khq62xhe.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌦️ Live weather - Open-Meteo fills the form&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%2Fn3ri4w21u120x0di1tje.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%2Fn3ri4w21u120x0di1tje.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 TabPFN signal - wait / walk / garden with confidence&lt;/strong&gt;&lt;/p&gt;
&lt;h2&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%2Firwsiae43wkrba339mn1.png" alt=" " width="800" height="401"&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  ⚙️ How it works (60 seconds)
&lt;/h2&gt;


&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    subgraph YOU["You"]
        A["Pick city or use location"]
    end

    subgraph DATA["Open-Meteo"]
        B["Today's temps, rain, wind, soil"]
        C["92-day frost window"]
    end

    subgraph AI["TabPFN"]
        D["Classify: wait, walk, garden"]
        E["Class probabilities"]
    end

    subgraph OUT["Outside"]
        F["3-step checklist"]
        G["Phone down"]
    end

    A --&amp;gt; B
    A --&amp;gt; C
    B --&amp;gt; D
    C --&amp;gt; D
    D --&amp;gt; E
    E --&amp;gt; F
    F --&amp;gt; G&lt;/code&gt;&lt;/pre&gt;


&lt;h3&gt;
  
  
  🗺️ User journey
&lt;/h3&gt;


&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    participant U as User
    participant UI as PLOT UI
    participant OM as Open-Meteo
    participant T as TabPFN
    participant Y as Your yard

    U-&amp;gt;&amp;gt;UI: Open site / pick Portland
    UI-&amp;gt;&amp;gt;OM: GET /api/weather
    OM--&amp;gt;&amp;gt;UI: Real temps, frost lag, soil
    U-&amp;gt;&amp;gt;UI: Get outdoor signal
    UI-&amp;gt;&amp;gt;T: POST /api/check
    T--&amp;gt;&amp;gt;UI: garden, 83% confidence
    UI--&amp;gt;&amp;gt;U: Checklist (3 steps)
    U-&amp;gt;&amp;gt;Y: Goes outside&lt;/code&gt;&lt;/pre&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture
&lt;/h2&gt;


&lt;pre data-lang="mermaid"&gt;&lt;code&gt;graph TB
    subgraph Client["Browser"]
        WEB["Static UI / web"]
    end

    subgraph RenderHost["Render - plot-touch-grass"]
        API["FastAPI / backend/main.py"]
        ENG["OutdoorEngine / TabPFNClassifier"]
        CSV[("outdoor_history.csv - 30684 ERA5 rows")]
        WX["weather.py - Open-Meteo + fallback"]
    end

    subgraph External["Open services"]
        OM["Open-Meteo API"]
        TP["Prior Labs TabPFN"]
    end

    WEB --&amp;gt;|/api/weather| API
    WEB --&amp;gt;|/api/check| API
    API --&amp;gt; WX
    WX --&amp;gt; OM
    API --&amp;gt; ENG
    ENG --&amp;gt; CSV
    ENG --&amp;gt; TP&lt;/code&gt;&lt;/pre&gt;




&lt;h2&gt;
  
  
  📈 The data story (real, not synthetic)
&lt;/h2&gt;

&lt;p&gt;This is the part I cared about most. &lt;strong&gt;No fake temperatures.&lt;/strong&gt; ✅&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A["Open-Meteo Historical API - ERA5"] --&amp;gt; B["scripts/fetch_real_data.py"]
    B --&amp;gt; C["12 cities x 7 years of daily rows"]
    C --&amp;gt; D["Feature engineering"]
    D --&amp;gt; D1["days_since_last_frost from min temp at 0C"]
    D --&amp;gt; D2["soil_moisture, wind, daylight"]
    D --&amp;gt; E["Labels via backend/labels.py"]
    E --&amp;gt; F["outdoor_history.csv - 30684 rows"]
    F --&amp;gt; G["TabPFN fit and predict"]&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  🌎 Cities in the training set
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Climate&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🌲 Portland, OR&lt;/td&gt;
&lt;td&gt;Cool marine&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌧️ Seattle, WA&lt;/td&gt;
&lt;td&gt;Marine west coast&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🏙️ Chicago, IL&lt;/td&gt;
&lt;td&gt;Continental&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❄️ Minneapolis, MN&lt;/td&gt;
&lt;td&gt;Upper Midwest&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⛰️ Denver, CO&lt;/td&gt;
&lt;td&gt;High plains&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🗽 New York, NY&lt;/td&gt;
&lt;td&gt;Humid subtropical&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🦞 Boston, MA&lt;/td&gt;
&lt;td&gt;Coastal temperate&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌳 Atlanta, GA&lt;/td&gt;
&lt;td&gt;Warm humid&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🤠 Austin, TX&lt;/td&gt;
&lt;td&gt;Warm&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☀️ Phoenix, AZ&lt;/td&gt;
&lt;td&gt;Desert&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌴 Miami, FL&lt;/td&gt;
&lt;td&gt;Tropical humid&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌊 Los Angeles, CA&lt;/td&gt;
&lt;td&gt;Mediterranean&lt;/td&gt;
&lt;td&gt;~2,557&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  📊 Label distribution (on real weather)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🚶 &lt;strong&gt;walk&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Good to be outside, not a planting day&lt;/td&gt;
&lt;td&gt;~57%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⏸️ &lt;strong&gt;wait&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Frost risk or bad conditions, prep indoors&lt;/td&gt;
&lt;td&gt;~30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌿 &lt;strong&gt;garden&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Frost window + workable soil, hands in dirt&lt;/td&gt;
&lt;td&gt;~13%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Labels come from &lt;strong&gt;transparent horticulture heuristics&lt;/strong&gt; in &lt;code&gt;backend/labels.py&lt;/code&gt; (frost-free days, precip, wind bounds). TabPFN learns patterns in the &lt;strong&gt;table&lt;/strong&gt;, not chat prose. I'm upfront about that. 📝&lt;/p&gt;




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

&lt;h3&gt;
  
  
  1️⃣ Real training pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python scripts/fetch_real_data.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pulls daily ERA5 weather from Open-Meteo for every city above. Regeneratable. Documented in &lt;code&gt;data/DATA_SOURCES.md&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  2️⃣ TabPFN as the classifier
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tabpfn_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TabPFNClassifier&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TabPFNClassifier&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="c1"&gt;# real rows
&lt;/span&gt;&lt;span class="n"&gt;proba&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_proba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# wait / walk / garden
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open-weight tabular model. Swap it without rewriting the product. 🔁&lt;/p&gt;
&lt;h3&gt;
  
  
  3️⃣ Live weather endpoint
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;GET /api/weather?lat=&amp;amp;lon=&lt;/code&gt; returns today's conditions + frost lag.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Primary:&lt;/strong&gt; Open-Meteo forecast with &lt;code&gt;past_days=92&lt;/code&gt; for frost history&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Fallback:&lt;/strong&gt; nearest city's real ERA5 row for today's calendar day (when API rate-limits on free hosting)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4️⃣ UI that stays out of the way
&lt;/h3&gt;

&lt;p&gt;No chat bubble. No purple gradients. One brand (&lt;strong&gt;PLOT&lt;/strong&gt;), one CTA, one result card. ✨&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏙️ City presets across 12 climates&lt;/li&gt;
&lt;li&gt;📍 &lt;strong&gt;Use my location&lt;/strong&gt; (browser geolocation)&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Refresh live weather&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Checklist that ends at the door&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  5️⃣ Deployed on Render
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;render.yaml&lt;/code&gt; blueprint, health check at &lt;code&gt;/api/healthz&lt;/code&gt;, &lt;code&gt;TABPFN_TOKEN&lt;/code&gt; in env (never committed). 🔒&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/PranjalManhgaye" rel="noopener noreferrer"&gt;
        PranjalManhgaye
      &lt;/a&gt; / &lt;a href="https://github.com/PranjalManhgaye/plot-touch-grass" rel="noopener noreferrer"&gt;
        plot-touch-grass
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      PLOT - TabPFN outdoor go-signal for Hacktoberfest Touch Grass
    &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;PLOT&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Leave the screen. Tend the ground.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PLOT is a Hacktoberfest Week 1 (&lt;em&gt;Touch Grass&lt;/em&gt;) project. It uses &lt;strong&gt;Prior Labs TabPFN&lt;/strong&gt; on &lt;strong&gt;real weather data&lt;/strong&gt; (Open-Meteo ERA5) to classify today’s outdoor action as &lt;strong&gt;wait&lt;/strong&gt;, &lt;strong&gt;walk&lt;/strong&gt;, or &lt;strong&gt;garden&lt;/strong&gt; — then gives a short checklist meant to end at your door.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; &lt;a href="https://plot-touch-grass.onrender.com" rel="nofollow noopener noreferrer"&gt;https://plot-touch-grass.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/PranjalManhgaye/plot-touch-grass" rel="noopener noreferrer"&gt;https://github.com/PranjalManhgaye/plot-touch-grass&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick a city or use your location → live weather loads → TabPFN predicts → go outside.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Real data (not synthetic)&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;What&lt;/th&gt;

&lt;th&gt;Source&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;Training rows&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;30,684&lt;/strong&gt; daily observations, 12 US cities, 2018–2024&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Weather&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;a href="https://open-meteo.com" rel="nofollow noopener noreferrer"&gt;Open-Meteo&lt;/a&gt; ERA5 reanalysis&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Frost lag&lt;/td&gt;

&lt;td&gt;Computed from real daily min temps ≤ 0 °C&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Labels&lt;/td&gt;

&lt;td&gt;Transparent horticulture heuristics (&lt;code&gt;backend/labels.py&lt;/code&gt;)&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Live inputs&lt;/td&gt;

&lt;td&gt;Open-Meteo forecast + 120-day archive&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;See &lt;code&gt;data/DATA_SOURCES.md&lt;/code&gt; for full provenance.&lt;/p&gt;

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

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python3 -m venv .venv
&lt;span class="pl-c1"&gt;source&lt;/span&gt; .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; set TABPFN_TOKEN&lt;/span&gt;
PYTHONPATH=. uvicorn backend.main:app --reload --host 127.0.0.1 --port&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/PranjalManhgaye/plot-touch-grass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plot/
├── backend/
│   ├── engine.py      # TabPFN + transparent baseline
│   ├── weather.py     # Open-Meteo live + ERA5 fallback
│   ├── labels.py      # Documented outdoor-action heuristics
│   └── main.py        # FastAPI routes
├── data/
│   └── outdoor_history.csv   # 30,684 real ERA5 rows
├── scripts/
│   └── fetch_real_data.py
└── web/               # Static UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Frost and planting decisions are &lt;strong&gt;tabular&lt;/strong&gt; 📋. They belong in a spreadsheet, not a chat thread. 💬❌&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔒 Closed approach&lt;/th&gt;
&lt;th&gt;🌱 Open approach (PLOT)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Garden API locks your coordinates to a vendor&lt;/td&gt;
&lt;td&gt;Open-Meteo: free ERA5, no key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chat model guesses from prose&lt;/td&gt;
&lt;td&gt;TabPFN: probabilities over &lt;strong&gt;features&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can't explain why without prompt engineering&lt;/td&gt;
&lt;td&gt;&lt;code&gt;garden: 83%, wait: 9%, walk: 8%&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-token cost at scale&lt;/td&gt;
&lt;td&gt;Tabular fit once, predict cheaply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model swap = rewrite the app&lt;/td&gt;
&lt;td&gt;Swap TabPFN version, keep the CSV&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;🔐 Privacy:&lt;/strong&gt; we don't store your location. Weather is fetched per request. Training table ships with the repo and is auditable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏕️ Offline path:&lt;/strong&gt; the CSV + open model path means this could run on a laptop in the backcountry with cached rows. That's the Touch Grass future I want.&lt;/p&gt;

&lt;p&gt;A closed chat API wouldn't know what to do with &lt;code&gt;days_since_last_frost: 208&lt;/code&gt;. TabPFN was built for exactly that column. 🎯&lt;/p&gt;




&lt;h2&gt;
  
  
  🏆 What I'd tell judges
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🌿 &lt;strong&gt;Theme fit&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Screen is the shortest part; checklist ends at the door&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 &lt;strong&gt;Real open AI&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;TabPFN on 30k+ ERA5 rows, not a wrapper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📝 &lt;strong&gt;Honest labels&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Heuristics documented, not pretending it's human survey data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 &lt;strong&gt;Shipped&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Live URL, GitHub, Render deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚫 &lt;strong&gt;No chatbot cosplay&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Tabular foundation model where it actually belongs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;&lt;em&gt;Built with TabPFN docs + Open-Meteo API. Happy to answer questions in the comments.&lt;/em&gt; 💬&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; - core classifier on real frost/weather tables&lt;/li&gt;
&lt;li&gt;☁️ &lt;strong&gt;Best Use of Render&lt;/strong&gt; - production deploy at plot-touch-grass.onrender.com&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Links
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Live app&lt;/td&gt;
&lt;td&gt;&lt;a href="https://plot-touch-grass.onrender.com" rel="noopener noreferrer"&gt;plot-touch-grass.onrender.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💻 GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/PranjalManhgaye/plot-touch-grass" rel="noopener noreferrer"&gt;PranjalManhgaye/plot-touch-grass&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌦️ Open-Meteo&lt;/td&gt;
&lt;td&gt;&lt;a href="https://open-meteo.com" rel="noopener noreferrer"&gt;open-meteo.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 TabPFN&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.priorlabs.ai" rel="noopener noreferrer"&gt;docs.priorlabs.ai&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☁️ Render&lt;/td&gt;
&lt;td&gt;&lt;a href="https://render.com" rel="noopener noreferrer"&gt;render.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading. Now go touch some grass.&lt;/em&gt; 🌿👋&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
