# org.cannadb.grow

> Published by [cannadb.org](https://lexicon.garden/identity/did:plc:lrtzzib3ycggsodkfidzuorw)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:lrtzzib3ycggsodkfidzuorw/org.cannadb.grow)
- [Documentation](https://lexicon.garden/lexicon/did:plc:lrtzzib3ycggsodkfidzuorw/org.cannadb.grow/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:lrtzzib3ycggsodkfidzuorw/org.cannadb.grow/examples)

## Definitions

### `org.cannadb.grow`

**Type**: `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 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 display time. NOTE on visibility: all atproto records are public regardless of `listed`; `listed` controls only whether the AppView includes this grow (and its plants/entries/photos) in public listing, search, and per-strain aggregation. Unlisted is not private.

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `name` | `string` | Yes | Display name for this grow, e.g., "Wedding Cake — Spring '26 Tent". Capped to keep listing cards tidy. |
| `listed` | `boolean` | No | Publisher's index preference. Absent or true means the AppView MAY include this grow — and its plants, entries, and photos — in public listing, search, and per-strain grow aggregation. False means the AppView SHOULD exclude the whole grow subtree from those public surfaces. This controls indexing only: the records remain public on the PDS and resolvable by direct AT-URI regardless. It is independent of AppView moderation (a listed grow may still be editorially hidden). |
| `medium` | `string` | No | Static setup descriptor for the growing medium. Open vocabulary. |
| `status` | `string` | No | Coarse grow-level status. Distinct from per-plant lifecycle stage (which is event-sourced via `org.cannadb.growEntry`). Open vocabulary — clients should accept unknown values and fall back to generic display. |
| `endedAt` | `string` (datetime) | No | When the grow run ended (final harvest, or the run was abandoned/archived). Optional. |
| `createdAt` | `string` (datetime) | Yes | Client-declared timestamp when this grow record was originally created. |
| `startedAt` | `string` (datetime) | No | When the grow run began (typically the first germination/plant date). Optional. |
| `coverImage` | `blob` | No | One representative image for the grow's listing card and header. Richer photo galleries belong in `org.cannadb.growPhoto` records. Capped at 2 MB to keep PDS storage burden modest; SVG is excluded for XSS safety. |
| `description` | `string` | No | Markdown-formatted overview of the grow — setup, intent, lighting/nutrient regimen, room notes. Per-plant and per-event detail belongs in `org.cannadb.growEntry` records; this is the grow-wide writeup. |
| `environment` | `string` | No | Static setup descriptor for where the grow runs. Live sensor/environment/controller telemetry is out of scope for CannaDB (it remains the domain of self-hosted tools like Isley). Open vocabulary. |

## Raw Schema

```json
{
  "id": "org.cannadb.grow",
  "defs": {
    "main": {
      "key": "tid",
      "type": "record",
      "record": {
        "type": "object",
        "required": [
          "name",
          "createdAt"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 2000,
            "description": "Display name for this grow, e.g., \"Wedding Cake — Spring '26 Tent\". Capped to keep listing cards tidy.",
            "maxGraphemes": 200
          },
          "listed": {
            "type": "boolean",
            "description": "Publisher's index preference. Absent or true means the AppView MAY include this grow — and its plants, entries, and photos — in public listing, search, and per-strain grow aggregation. False means the AppView SHOULD exclude the whole grow subtree from those public surfaces. This controls indexing only: the records remain public on the PDS and resolvable by direct AT-URI regardless. It is independent of AppView moderation (a listed grow may still be editorially hidden)."
          },
          "medium": {
            "type": "string",
            "description": "Static setup descriptor for the growing medium. Open vocabulary.",
            "knownValues": [
              "soil",
              "living_soil",
              "coco",
              "hydro",
              "rockwool",
              "aeroponic",
              "other"
            ]
          },
          "status": {
            "type": "string",
            "description": "Coarse grow-level status. Distinct from per-plant lifecycle stage (which is event-sourced via `org.cannadb.growEntry`). Open vocabulary — clients should accept unknown values and fall back to generic display.",
            "knownValues": [
              "active",
              "harvested",
              "archived",
              "abandoned"
            ]
          },
          "endedAt": {
            "type": "string",
            "format": "datetime",
            "description": "When the grow run ended (final harvest, or the run was abandoned/archived). Optional."
          },
          "createdAt": {
            "type": "string",
            "format": "datetime",
            "description": "Client-declared timestamp when this grow record was originally created."
          },
          "startedAt": {
            "type": "string",
            "format": "datetime",
            "description": "When the grow run began (typically the first germination/plant date). Optional."
          },
          "coverImage": {
            "type": "blob",
            "accept": [
              "image/png",
              "image/jpeg",
              "image/webp"
            ],
            "maxSize": 2000000,
            "description": "One representative image for the grow's listing card and header. Richer photo galleries belong in `org.cannadb.growPhoto` records. Capped at 2 MB to keep PDS storage burden modest; SVG is excluded for XSS safety."
          },
          "description": {
            "type": "string",
            "maxLength": 100000,
            "description": "Markdown-formatted overview of the grow — setup, intent, lighting/nutrient regimen, room notes. Per-plant and per-event detail belongs in `org.cannadb.growEntry` records; this is the grow-wide writeup.",
            "maxGraphemes": 10000
          },
          "environment": {
            "type": "string",
            "description": "Static setup descriptor for where the grow runs. Live sensor/environment/controller telemetry is out of scope for CannaDB (it remains the domain of self-hosted tools like Isley). Open vocabulary.",
            "knownValues": [
              "indoor",
              "outdoor",
              "greenhouse",
              "mixed"
            ]
          }
        }
      },
      "description": "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 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 display time. NOTE on visibility: all atproto records are public regardless of `listed`; `listed` controls only whether the AppView includes this grow (and its plants/entries/photos) in public listing, search, and per-strain aggregation. Unlisted is not private."
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1
}
```
