Ten years of climate, sixteen days of weather
The engine behind Loam has one job: decide, today, whether a window is open for a given crop in a given place. Two sources of truth answer that question, and neither answers it alone.
The two layers
Climate normals. Ten years of ERA5-Land reanalysis, reduced once a year to a set of smoothed curves per cell: soil temperature through the season, air minima, and the dates of first and last frost with their spread. This is what “usually” means. It is computed by a Python job, outside the application, and published as tiles.
The forecast. A 16-day run for the same cell, refreshed every three hours from our own Open-Meteo instance: daily minimum and maximum air, mean soil temperature, rain. This is what this year is doing.
Inside the forecast horizon, the forecast wins — it knows things the ten-year curve cannot. Beyond sixteen days, the normals take over, because a curve built from a decade beats an extrapolation built from nothing.
The gap is the product
Most of the time the two layers agree and nothing interesting happens. The value is in the disagreement.
Take the chart on the home page. The ten-year average for that cell crosses 16 °C of soil on 4 May. This particular spring runs warm, and the forecast crosses the same line on 23 April. Eleven days. That is eleven days of growing season a calendar would have cost, and the app can say why it is eleven and not a vague “early this year”.
It runs the other way just as often. A cold April pushes the crossing later than the normal, and the app says so, with the date and the figure. A window that shifts later is still a window you can plan around — it is the silence that costs you the row.
What the engine refuses to do
Three rules constrain every decision, and they are worth stating because they are what makes the rest trustworthy.
No month ever appears in a rule. Not once, anywhere in the engine. Rules are written against conditions: this many consecutive days above this soil temperature, this many days of frost risk remaining. A cell with no frost in eight years out of ten is simply treated as frost-free. The same code decides for a garden in Brittany and a garden at 900 m in the Alps.
Nothing is advised without its number. The app never says “conditions are favourable”. It says the soil is at 17 °C and beans need 16 °C. If a rule cannot name the figure it fired on, the rule is not finished.
Stale data means silence. If the forecast for your cell is more than twelve hours old, no window is shown as open and no notification goes out. You get a banner saying the data is stale instead. A wrong answer delivered confidently is worse than no answer, because you would have acted on it.
Where it stands
The engine is being validated against reference gardens before anything opens to the public. The bar is set in the spec: zero tender plantings recommended and then killed by a frost, at least 90 % of frosts alerted the evening before, at most one false alert in three, and windows within a fortnight of the published extension calendars.
We will publish those results here, including the ones that come back badly.