org.cannadb.growPhoto
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"main": {
"description": "A 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 metadata. Publishing this record IS the claim — contextualized by the publisher DID at display time. Visibility follows the parent grow's `listed` preference, gated by the AppView.",
"key": "tid",
"record": {
"properties": {
"caption": {
"description": "Optional plain-or-markdown caption for the photo.",
"maxGraphemes": 2000,
"maxLength": 20000,
"type": "string"
},
"createdAt": {
"description": "Client-declared timestamp when this photo record was created.",
"format": "datetime",
"type": "string"
},
"entry": {
"description": "Optional AT-URI reference to the `org.cannadb.growEntry` this photo documents (e.g., the photo taken at a given check-up or transition). Lets clients show photos inline on the timeline event. (Consumers should validate the ref resolves to an `org.cannadb.growEntry` record.)",
"format": "at-uri",
"type": "string"
},
"grow": {
"description": "AT-URI reference to the `org.cannadb.grow` this photo belongs to. Used for grow-wide shots (room, canopy, cover) or as a denormalized cache of the plant's grow. At least one of `plant` or `grow` SHOULD be present. (Consumers should validate the ref resolves to an `org.cannadb.grow` record.)",
"format": "at-uri",
"type": "string"
},
"image": {
"accept": [
"image/png",
"image/jpeg",
"image/webp"
],
"description": "The photo. Accepts common web image formats; capped at 2 MB — larger than review images (1 MB) because documenting a full run with day-by-day galleries is the point, but still bounded to keep PDS storage burden reasonable. SVG is excluded for XSS safety.",
"maxSize": 2000000,
"type": "blob"
},
"order": {
"description": "Optional manual sort order within the gallery. Lower sorts first. When absent, consumers fall back to `takenAt` then `createdAt`.",
"minimum": 0,
"type": "integer"
},
"plant": {
"description": "AT-URI reference to the `org.cannadb.plant` this photo is of. Optional, but at least one of `plant` or `grow` SHOULD be present so the photo has a home; consumers should ignore a photo that references neither. (Consumers should validate the ref resolves to an `org.cannadb.plant` record.)",
"format": "at-uri",
"type": "string"
},
"takenAt": {
"description": "When the photo was taken, if different from `createdAt`. Used to order galleries chronologically.",
"format": "datetime",
"type": "string"
}
},
"required": [
"image",
"createdAt"
],
"type": "object"
},
"type": "record"
}
},
"id": "org.cannadb.growPhoto",
"lexicon": 1
}
Metadata
- DID
-
did:plc:lrtzzib3ycggsodkfidzuorw - CID
-
bafyreigrsy3ueevhmva27a62c4jeoogtkfr4r6gplwwar244y7dknimiju - Indexed At
- 2026-06-20 00:44 UTC
- AT-URI
-
at://did:plc:lrtzzib3ycggsodkfidzuorw/com.atproto.lexicon.schema/org.cannadb.growPhoto
Similar Lexicons
Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
org.cannadb.grow record
A 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 …
-
net.atview.gallery.photo record
A photo in an atview gallery. Stores the image blob alongside accessibility text, an optional caption, and categorization tags.
-
net.atpix.gallery.photo record
ATPix photo record. Metadata mapped to Dublin Core and Schema.org ImageObject terms (see docs/lexicon/net.atpix.gallery.md).
-
An image uploaded to the garden.
-
org.cannadb.growEntry record
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 t…