PLOT ๐ฟ - TabPFN on Real Frost Data Tells You to Touch Grass

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass ๐ฟ
๐ก The idea in one breath
Most weather apps keep you scrolling. PLOT does the opposite. ๐ตโก๏ธ๐ฑ
You pick a place (or share your location ๐). Real weather loads ๐ฆ๏ธ. TabPFN, an open tabular foundation model ๐ง , reads your day like a row in a frost table and answers:
โธ๏ธ Wait ยท ๐ถ Walk ยท ๐ฟ Garden
Then it hands you three concrete steps and expects you to leave. The screen's job is under a minute. โฑ๏ธ
| ๐ Live demo | plot-touch-grass.onrender.com |
| ๐ป Source | github.com/PranjalManhgaye/plot-touch-grass |
๐ ๏ธ What I Built
| Field | Value |
|---|---|
| ๐ฟ Product | PLOT - outdoor action signal + checklist |
| ๐ง Brain | TabPFN (tabpfn-client) |
| ๐ Training data | 30,684 real daily rows, 12 US cities, 2018-2024 |
| ๐ฆ๏ธ Weather | Open-Meteo ERA5 reanalysis + live forecast |
| โ๏ธ Hosting | Render free tier |
| โก Stack | FastAPI, static UI, no chat layer |
๐ฅ Who it's for: anyone with a yard, balcony, or park nearby who overthinks the forecast and under-leaves the house.
๐ฌ Demo
๐ฅ Screen recording: [https://www.youtube.com/watch?v=0zisIS7GLjg]
๐ Try it yourself: plot-touch-grass.onrender.com
โณ First load on Render free tier may take ~30s while the service wakes up.
๐ธ Screenshots
Upload your images in the DEV editor and replace the placeholders below.
๐๏ธ Hero - PLOT landing page

๐ฆ๏ธ Live weather - Open-Meteo fills the form
๐ฏ TabPFN signal - wait / walk / garden with confidence
โ๏ธ How it works (60 seconds)
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 --> B A --> C B --> D C --> D D --> E E --> F F --> G ๐บ๏ธ User journey
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->>UI: Open site / pick Portland UI->>OM: GET /api/weather OM-->>UI: Real temps, frost lag, soil U->>UI: Get outdoor signal UI->>T: POST /api/check T-->>UI: garden, 83% confidence UI-->>U: Checklist (3 steps) U->>Y: Goes outside ๐๏ธ Architecture
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 -->|/api/weather| API WEB -->|/api/check| API API --> WX WX --> OM API --> ENG ENG --> CSV ENG --> TP ๐ The data story (real, not synthetic)
This is the part I cared about most. No fake temperatures. โ
flowchart TD A["Open-Meteo Historical API - ERA5"] --> B["scripts/fetch_real_data.py"] B --> C["12 cities x 7 years of daily rows"] C --> D["Feature engineering"] D --> D1["days_since_last_frost from min temp at 0C"] D --> D2["soil_moisture, wind, daylight"] D --> E["Labels via backend/labels.py"] E --> F["outdoor_history.csv - 30684 rows"] F --> G["TabPFN fit and predict"] ๐ Cities in the training set
| City | Climate | Rows |
|---|---|---|
| ๐ฒ Portland, OR | Cool marine | ~2,557 |
| ๐ง๏ธ Seattle, WA | Marine west coast | ~2,557 |
| ๐๏ธ Chicago, IL | Continental | ~2,557 |
| โ๏ธ Minneapolis, MN | Upper Midwest | ~2,557 |
| โฐ๏ธ Denver, CO | High plains | ~2,557 |
| ๐ฝ New York, NY | Humid subtropical | ~2,557 |
| ๐ฆ Boston, MA | Coastal temperate | ~2,557 |
| ๐ณ Atlanta, GA | Warm humid | ~2,557 |
| ๐ค Austin, TX | Warm | ~2,557 |
| โ๏ธ Phoenix, AZ | Desert | ~2,557 |
| ๐ด Miami, FL | Tropical humid | ~2,557 |
| ๐ Los Angeles, CA | Mediterranean | ~2,557 |
๐ Label distribution (on real weather)
| Action | Meaning | Share |
|---|---|---|
| ๐ถ walk | Good to be outside, not a planting day | ~57% |
| โธ๏ธ wait | Frost risk or bad conditions, prep indoors | ~30% |
| ๐ฟ garden | Frost window + workable soil, hands in dirt | ~13% |
Labels come from transparent horticulture heuristics in backend/labels.py (frost-free days, precip, wind bounds). TabPFN learns patterns in the table, not chat prose. I'm upfront about that. ๐
๐จ How I Built It
1๏ธโฃ Real training pipeline
python scripts/fetch_real_data.py Pulls daily ERA5 weather from Open-Meteo for every city above. Regeneratable. Documented in data/DATA_SOURCES.md.
2๏ธโฃ TabPFN as the classifier
from tabpfn_client import TabPFNClassifier model = TabPFNClassifier() model.fit(X_train, y_train) # real rows proba = model.predict_proba(X_today) # wait / walk / garden Open-weight tabular model. Swap it without rewriting the product. ๐
3๏ธโฃ Live weather endpoint
GET /api/weather?lat=&lon= returns today's conditions + frost lag.
- ๐ Primary: Open-Meteo forecast with
past_days=92for frost history - ๐ก๏ธ Fallback: nearest city's real ERA5 row for today's calendar day (when API rate-limits on free hosting)
4๏ธโฃ UI that stays out of the way
No chat bubble. No purple gradients. One brand (PLOT), one CTA, one result card. โจ
- ๐๏ธ City presets across 12 climates
- ๐ Use my location (browser geolocation)
- ๐ Refresh live weather
- โ Checklist that ends at the door
5๏ธโฃ Deployed on Render
render.yaml blueprint, health check at /api/healthz, TABPFN_TOKEN in env (never committed). ๐
๐ป Code
PranjalManhgaye / plot-touch-grass
PLOT - TabPFN outdoor go-signal for Hacktoberfest Touch Grass
PLOT
Leave the screen. Tend the ground.
PLOT is a Hacktoberfest Week 1 (Touch Grass) project. It uses Prior Labs TabPFN on real weather data (Open-Meteo ERA5) to classify todayโs outdoor action as wait, walk, or garden โ then gives a short checklist meant to end at your door.
Live demo
- App: https://plot-touch-grass.onrender.com
- Repo: https://github.com/PranjalManhgaye/plot-touch-grass
Pick a city or use your location โ live weather loads โ TabPFN predicts โ go outside.
Real data (not synthetic)
| What | Source |
|---|---|
| Training rows | 30,684 daily observations, 12 US cities, 2018โ2024 |
| Weather | Open-Meteo ERA5 reanalysis |
| Frost lag | Computed from real daily min temps โค 0 ยฐC |
| Labels | Transparent horticulture heuristics (backend/labels.py) |
| Live inputs | Open-Meteo forecast + 120-day archive |
See data/DATA_SOURCES.md for full provenance.
Quick start
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt cp .env.example .env # set TABPFN_TOKEN PYTHONPATH=. uvicorn backend.main:app --reload --host 127.0.0.1 --portโฆ 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 ๐ Why Does Open Innovation Matter?
Frost and planting decisions are tabular ๐. They belong in a spreadsheet, not a chat thread. ๐ฌโ
| ๐ Closed approach | ๐ฑ Open approach (PLOT) |
|---|---|
| Garden API locks your coordinates to a vendor | Open-Meteo: free ERA5, no key |
| Chat model guesses from prose | TabPFN: probabilities over features |
| Can't explain why without prompt engineering | garden: 83%, wait: 9%, walk: 8% |
| Per-token cost at scale | Tabular fit once, predict cheaply |
| Model swap = rewrite the app | Swap TabPFN version, keep the CSV |
๐ Privacy: we don't store your location. Weather is fetched per request. Training table ships with the repo and is auditable.
๐๏ธ Offline path: 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.
A closed chat API wouldn't know what to do with days_since_last_frost: 208. TabPFN was built for exactly that column. ๐ฏ
๐ What I'd tell judges
| ๐ฟ Theme fit | Screen is the shortest part; checklist ends at the door |
| ๐ง Real open AI | TabPFN on 30k+ ERA5 rows, not a wrapper |
| ๐ Honest labels | Heuristics documented, not pretending it's human survey data |
| ๐ Shipped | Live URL, GitHub, Render deploy |
| ๐ซ No chatbot cosplay | Tabular foundation model where it actually belongs |
๐ค My Agent Session
Built with Cursor + TabPFN docs + Open-Meteo API. Happy to answer questions in the comments. ๐ฌ
๐ Prize Categories
- ๐ง Best Use of TabPFN - core classifier on real frost/weather tables
- โ๏ธ Best Use of Render - production deploy at plot-touch-grass.onrender.com
๐ Links
| Resource | URL |
|---|---|
| ๐ Live app | plot-touch-grass.onrender.com |
| ๐ป GitHub | PranjalManhgaye/plot-touch-grass |
| ๐ฆ๏ธ Open-Meteo | open-meteo.com |
| ๐ง TabPFN | docs.priorlabs.ai |
| โ๏ธ Render | render.com |
Thanks for reading. Now go touch some grass. ๐ฟ๐
ๅๆ๏ผhttps://www.a8q9.cn/en/article/plot-tabpfn-on-real-frost-data-tells-you-to-touch-grass-31c111.html
