org.cannadb.growEntry
One append-only event on a plant's timeline. A single record type unifies what other journals split into status changes, activities, measurements, and notes — because they are all the same shape (a timestamped thing that happened to a plant) and the distinguishing detail is an open `kind` vocabulary. Stage transitions (kind "stage") are how lifecycle is tracked: the AppView reads the latest stage entry as the plant's current stage and the full set as its lifecycle history. Activities (watering, feeding, training, …) optionally carry structured `measurements`. Freeform observation is the `note` field — deliberately loose so growers can record measurements prose, LST details, and anything else without the schema being prescriptive. Photos are NOT embedded here; they are separate `org.cannadb.growPhoto` records that may link back to an entry. Publishing this record IS the claim — contextualized by the publisher DID at display time.
Details · record, key tid
| Kind | record |
|---|---|
| Record key | tid |
| Authority | cannadb.org |
| Indexed |
Record
record · key tidProperties
Client-declared timestamp when this entry record was created.
grow
string · at-uriOptional denormalized AT-URI reference to the plant's `org.cannadb.grow`. Lets the AppView assemble a whole-grow timeline and gate on the grow's `listed` preference without resolving every plant first. The plant ref is canonical; this is a cache for query efficiency and ref resilience.
kind
stringWhat kind of event this is. Open vocabulary — clients should accept unknown values and fall back to generic display, and may offer user-defined kinds. "stage" marks a lifecycle transition and is the one kind that gives `stage` meaning.
knownValues: stage | watering | feeding | note | measurement | training | transplant | topping | defoliation | flush | pest | disease | treatment | harvest
measurements
arrayStructured readings recorded with this event (height, pH, EC/PPM, runoff pH, water volume, …). Optional — most entries carry none. A feeding entry might carry pH and EC; a check-up entry might carry height. Mirrors how journaling tools attach measurements to an activity.
note
stringMarkdown-formatted free-form note — the catch-all for anything the structured fields don't capture (measurement context, LST/defoliation details, observations, photos commentary). Deliberately unstructured.
maxLength: 100000maxGraphemes: 10000
occurredAt
string · datetimeWhen the event actually happened, if different from `createdAt` (e.g., logging yesterday's feeding today). Consumers default to `createdAt` when absent. This is the field timelines sort on.
AT-URI reference to the `org.cannadb.plant` this event belongs to. (Consumers should validate the ref resolves to an `org.cannadb.plant` record.)
stage
stringThe lifecycle stage this entry marks a transition into. Set on stage transitions (typically with `kind` "stage"). The AppView treats the most recent entry carrying a `stage` as the plant's current stage, and the full ordered set as its lifecycle history. Display ordering of stages is an AppView concern. Open vocabulary.
knownValues: germinating | seedling | vegetative | flowering | drying | curing | harvested | dead
#measurement
objectA single structured reading. Both `metric` and `unit` are open vocabularies. `value` is a scaled integer in hundredths of `unit` (atproto has no float type), matching the scaled-integer convention used for cannabinoid percentages on `org.cannadb.strain`: pH 6.25 = 625 with unit "ph"; height 30.5 cm = 3050 with unit "cm"; EC 1.85 = 185 with unit "mS_cm".
Properties
What was measured. Open vocabulary — consumers accept unknown metrics and may offer user-defined ones.
knownValues: height | ph | ec | ppm | tds | runoff_ph | water_volume | temperature | humidity | pot_size
unit
stringUnit of `value`. Open vocabulary; required to interpret the scaled integer. Consumers should accept unknown units and fall back to displaying the unit string as written.
knownValues: cm | in | ph | mS_cm | ppm | ml | l | gal | celsius | fahrenheit | percent
The measured value in hundredths of `unit` (e.g., 625 = 6.25). Scaled integer because atproto has no float type.
Similar lexicons
semantic matchLexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
org.cannadb.plant
recordA single plant within a grow. The plant is the lifecycle unit: it references the `org.cannadb.grow` it belongs to and (optionally) the `org.cannadb.strain` it is. Its lifecycle stage is NOT stored as a mutable field here — stage transitions are append-only `org.cannadb.growEntry` events (kind "stage"), and the AppView computes the current stage from the latest such event. Measured harvest outcomes, once known, are recorded in the optional `harvest` object so the AppView can aggregate real cultiv
-
org.cannadb.grow
recordA grow — one documented cultivation run (a tent, a garden, a season's cycle). The grow is a lightweight container: it groups one or more `org.cannadb.plant` records and carries the shared setup and a publisher-chosen listing preference. Per-plant lifecycle, activities, notes, and measurements live in `org.cannadb.growEntry` records that reference a plant; photos live in `org.cannadb.growPhoto` records. Publishing this record IS the claim — every field is contextualized by the publisher DID at di
-
org.cannadb.growPhoto
recordA single photo in a grow's gallery. Modeled as its own record (rather than blobs embedded in entries) so galleries can grow without bloating other records and so each photo carries its own caption, ordering, and capture date. A photo attaches to a plant (the usual case — per-plant galleries) and/or to the grow (group/room shots, the cover), and may optionally link to the `org.cannadb.growEntry` it documents. The image blob lives on the publishing PDS; the record carries the blob ref plus metadat