This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass πΏ
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:
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 |
| 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.
| 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 |
| 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. π
Pulls daily ERA5 weather from Open-Meteo for every city above. Regeneratable. Documented in data/DATASOURCES.md.
GET /api/weather?lat=&lon= returns today's conditions + frost lag. π Primary: Open-Meteo forecast with pastdays=92 for frost history π‘οΈ Fallback: nearest city's real ERA5 row for today's calendar day (when API rate-limits on free hosting)
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
render.yaml blueprint, health check at /api/healthz, TABPFNTOKEN in env (never committed). π
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 dayssincelastfrost: 208. TabPFN was built for exactly that column. π―
