Open models, baked predictions, a strict front end.
Frostline trains an open model once, offline, and ships the predictions. The site is a thin, hardened reader over that artifact. Nothing proprietary, nothing you cannot run yourself.
How it works
1. Location
A US city or your device location gives a latitude and longitude.
↓
2. Frost lookup
A baked TabPFN grid is interpolated to your point. No model runs at request time.
↓
3. Planner
A deterministic function turns your frost dates and today into a sow-this-week list.
↓
4. Advice
An open Gemma model writes the plan up in plain words, with a built-in narrator as the fallback.
Open models, swappable
| Piece | Model | Licence | Swap |
|---|---|---|---|
| Frost dates | TabPFN (tabular foundation model) | Code Apache-2.0, weights per Prior Labs | Retrain the bake on your own station set |
| Advice prose | Gemma (open weights) | Gemma Terms of Use, output is yours | Point GEMMA_API_URL at any OpenAI-compatible open model |
With no key set, advice falls back to the built-in planner, so the page always renders. Set GEMMA_API_URL, GEMMA_API_KEY and GEMMA_MODEL to turn on live Gemma.
The plan endpoint
One POST returns your frost dates, the plan, and the advice. It validates the body and never runs the model at request time.
POST /api/plan
content-type: application/json
{ "lat": 45.52, "lon": -122.68, "label": "Portland, OR" }
200 OK
{
"ok": true,
"plan": {
"frost": { "lastSpringFrostDOY": 102, "firstFallFrostDOY": 310, "source": "model" },
"sowThisWeek": [ { "crop": { "name": "Garlic" }, "action": "plant-cloves", "reason": "..." } ],
"daysToFirstFall": 31
},
"advice": { "text": "Your last frost is around ...", "engine": "deterministic" }
}Repo and licence
Source is available at github.com/zkasuran/frostline. The app code is under a source-available licence (read it, run it, benchmark it). The open models and the NOAA data keep their own terms, named in the repo NOTICE and on the data sources page.