How this data is collected
This page explains, in plain terms, where the numbers come from and what they can and cannot tell you. We would rather be upfront about the limits than oversell an early dataset.
What one record is
A gardener adds a plant to their garden in Hortus. When it opens its first flower of the year, they tap a button that says it is blooming. That tap is one record: the plant's species, the date, and the region it is in. Nobody fills out a form or measures anything. It is a single honest moment, logged once.
Where the warmth number comes from
Alongside the date, each record stores how warm the season has been at that gardener's location so far. Warmth adds up day by day: warmer days add more, cool days add little. Pairing the bloom date with that running total is more useful than the date alone, because it separates an early spring from a plant that simply blooms early.
When weather data is not available for a location, the record still saves, just without a warmth number. Those records are counted, but they are left out of any warmth average.
What the location tells you (and what it does not)
Location is only ever recorded at the province or state level. There are no coordinates, no street, no postal or ZIP code, and no city in this dataset. That is a deliberate privacy floor: it keeps the data safe to open up, at the cost of fine geographic detail. If a gardener did not share a region, the record is placed in a clearly-labelled "region not shared" bucket rather than guessed.
How much data there is right now
As of today there are 22 records across 3 regions and 16 species. That is a small sample. For most species in most regions there are only a handful of logs, which is enough for a glimpse but not for a trend. The dataset is designed to deepen season over season.
The biases you should keep in mind
- Who is logging. These are Hortus gardeners, mostly people who chose to plant native and track their gardens. They are not a random sample of all gardens.
- Effort and attention. A bloom is only recorded if someone notices it and taps the button that day. Plants that are watched closely get logged; quieter ones in the same garden may be missed. This is the classic observer and effort bias in all community-science data.
- Geography is skewed. Records cluster where Hortus has the most gardeners, not evenly across the map. Some provinces and states will be well represented long before others.
- First-year effects. A newly planted specimen may bloom differently from an established one, and we do not distinguish plant age.
None of this makes the data useless. It makes it community-science data, which is valuable precisely because it is broad and first-party, as long as it is read with these limits in view.
Technical detail
The warmth model, precisely
The warmth number is growing degree days (GDD), base 10 degrees Celsius, accumulated since 1 April of the current year. For each day, GDD is max(0, (Tmax + Tmin) / 2 − 10), and the season total is the sum of daily GDD from 1 April to the bloom date.
Daily temperatures come from the Open-Meteo ERA5 archive, which lags real time by about five days. The gap between the archive edge and today is stitched from the forecast provider's recorded past days, so the number reflects the whole season to date. The identical accumulator drives the in-app season-pace card, so a bloom logged "at 512 GDD" matches exactly what the app reported that day.
The stored GDD is an integer. It is null when temperature data could not be fetched at log time; those rows are excluded from every warmth average and reported through a separate sample-size column.
Day of year in the export is a 1-based ordinal (1 to 366) computed in UTC, so bloom timing can be compared across regions without a date parser.