01
Add the plant, and the day it went out
Ninety-seven plant types across ten categories, ten locations from garden bed to cold frame to allotment, four sun exposures and eight growth stages. The planting date is the field everything else keys off.
plant_types.dart
02
Every plant says why you'd pinch it
Not a species list with a name and a photo. Each type carries what pinching that particular plant buys you — more blooms and bushier growth on a dahlia, delayed flowering on basil — and it is shown in the picker, at the moment you are choosing.
pinchBenefit
03
Tasks come off your date, not a calendar
A nightly job walks every growing plant and materialises its care tasks from the day you planted it plus an offset. The reminder to stake a dahlia lands three weeks after it went into your soil, not in a generic article about June.
plantOutAt + offsetDays
04
One digest, at an hour you chose
An hourly job sends only to people whose chosen hour it is, skips their quiet hours, and writes a per-day marker so it cannot send twice. A gardening app that pings you at ten at night is one you delete.
withinQuietHours()
05
Photograph it, and the phone stays out of the analysis
The photo uploads once. A storage trigger derives a thumbnail and a medium copy server-side, and the model is handed a bucket reference rather than the image being sent a second time from the handset.
onUserPhotoUploaded
06
The model is asked for candidates, not an answer
Identification returns the top three with the reasoning behind each, a confidence band written in words rather than a percentage, and three questions it wants you to answer before it commits any further.
candidates (top 3), questions (3)
07
The checks that would disprove it come before the treatment
The model is asked for the likely issues and, alongside them, `confirm` — the signs you have to go outside and look for yourself. The app renders those as their own card, and its position is the point: it sits between the diagnosis and the treatment, so the doubt reaches you before the action does.
confirm[] rendered before actions[]
08
Log what you actually did
Eight event types, and they are the ones that matter to a grower rather than a generic note field: pinched, staked, fed, deadheaded, pest, disease, bud set, first bloom.
add_event_page.dart
09
Or let it draft the entries for you
Photograph the plant and it proposes up to five timeline entries, each with the reason it thinks so and a plain-word confidence. You accept the ones that are right. It never writes to your log on its own.
≤5 suggestions, each with a reason