A review of a cannabis strain or cut. Reviews are where subjective experience lives — the reviewer's perceived flavors and effects, multi-axis ratings, prose body, and optional images. Reviews reference exactly one strain record via `subject` and aggregate at the AppView layer into per-strain summaries (community-derived effect/flavor percentages, average ratings). Publishing this record IS the claim — every field is contextualized by the publisher DID at display time. CannaDB editorial accounts do not publish reviews.
tid
Timestamp-based ID
Properties
body
string
Optional
Markdown-formatted review prose. Optional — a review can be ratings-only or tag-only. Capped at 5000 graphemes (50000 bytes) — enforced by the lexicon to keep reviews modest.
maxLength: 50000 bytesmaxGraphemes: 5000 graphemescreatedAt
string
datetime
Required
Client-declared timestamp when this review was originally written.
effects
array
of
string
Optional
Effect descriptors as the reviewer experienced them. Open vocabulary — see `flavors` for rationale. The AppView aggregates across reviews into community-derived effect percentages on the strain (the canonical "top effects" surface visitors expect on a strain page).
flavors
array
of
string
Optional
Flavor descriptors as the reviewer experienced them. Open vocabulary — the lexicon does not enforce a closed set; the AppView normalizes near-duplicates at index time and aggregates across reviews into community-derived flavor percentages on the strain.
growRef
string
at-uri
Optional
Forward-compatible AT-URI reference to a grow record (`org.cannadb.grow`, Phase 6) backing this review. Optional and speculative — the grow record type does not exist yet and this field is a placeholder for the eventual review-grow linkage. Consumers should ignore this field until the grow lexicon ships.
images
array
of
blob
Optional
Up to three image blobs attached to this review. Each image accepts common web image formats and is capped at 1 MB. Reviews are deliberately limited to three images to keep PDS storage burden modest; richer photo galleries belong in grow records (Phase 6).
maxLength: 3 itemsratings
ref
#ratings
Optional
Multi-axis numeric ratings on a 1–5 scale. All axes are independently optional — a reviewer may rate only `overall`, only some axes, or skip ratings entirely. The AppView averages each axis across reviews for the per-strain summary.
subject
string
at-uri
Required
AT-URI reference to an `org.cannadb.strain` record (any `kind`). Required. (The lexicon spec does not enforce collection constraints on at-uri; consumers must validate the ref resolves to an `org.cannadb.strain` record and reject reviews whose subject points elsewhere.)
View raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"subject",
"createdAt"
],
"properties": {
"body": {
"type": "string",
"maxLength": 50000,
"description": "Markdown-formatted review prose. Optional — a review can be ratings-only or tag-only. Capped at 5000 graphemes (50000 bytes) — enforced by the lexicon to keep reviews modest.",
"maxGraphemes": 5000
},
"images": {
"type": "array",
"items": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp"
],
"maxSize": 1000000,
"description": "A single review image."
},
"maxLength": 3,
"description": "Up to three image blobs attached to this review. Each image accepts common web image formats and is capped at 1 MB. Reviews are deliberately limited to three images to keep PDS storage burden modest; richer photo galleries belong in grow records (Phase 6)."
},
"effects": {
"type": "array",
"items": {
"type": "string",
"description": "A single effect descriptor."
},
"description": "Effect descriptors as the reviewer experienced them. Open vocabulary — see `flavors` for rationale. The AppView aggregates across reviews into community-derived effect percentages on the strain (the canonical \"top effects\" surface visitors expect on a strain page)."
},
"flavors": {
"type": "array",
"items": {
"type": "string",
"description": "A single flavor descriptor."
},
"description": "Flavor descriptors as the reviewer experienced them. Open vocabulary — the lexicon does not enforce a closed set; the AppView normalizes near-duplicates at index time and aggregates across reviews into community-derived flavor percentages on the strain."
},
"growRef": {
"type": "string",
"format": "at-uri",
"description": "Forward-compatible AT-URI reference to a grow record (`org.cannadb.grow`, Phase 6) backing this review. Optional and speculative — the grow record type does not exist yet and this field is a placeholder for the eventual review-grow linkage. Consumers should ignore this field until the grow lexicon ships."
},
"ratings": {
"ref": "#ratings",
"type": "ref",
"description": "Multi-axis numeric ratings on a 1–5 scale. All axes are independently optional — a reviewer may rate only `overall`, only some axes, or skip ratings entirely. The AppView averages each axis across reviews for the per-strain summary."
},
"subject": {
"type": "string",
"format": "at-uri",
"description": "AT-URI reference to an `org.cannadb.strain` record (any `kind`). Required. (The lexicon spec does not enforce collection constraints on at-uri; consumers must validate the ref resolves to an `org.cannadb.strain` record and reject reviews whose subject points elsewhere.)"
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this review was originally written."
}
}
},
"description": "A review of a cannabis strain or cut. Reviews are where subjective experience lives — the reviewer's perceived flavors and effects, multi-axis ratings, prose body, and optional images. Reviews reference exactly one strain record via `subject` and aggregate at the AppView layer into per-strain summaries (community-derived effect/flavor percentages, average ratings). Publishing this record IS the claim — every field is contextualized by the publisher DID at display time. CannaDB editorial accounts do not publish reviews."
}