Open Permaculture Data Standard
A privacy-first, offline-first data interchange standard for permaculture and food-forest systems. Records plantings, protracted observations, harvests, and the plant guilds that hold a design together. Built on VODS.
OPDS is a domain specialization of VODS (Veydrin Open Data Standard). Every OPDS document is also a valid VODS document. OPDS adds the opds_version field and the domain payload arrays on top of the VODS envelope. Four record types are defined: plantings (what was established, where, and in which layer), observations (protracted observation of guild state and succession), harvests (yield from the system), and guilds (the polyculture designs that group species by function). Refer to the VODS v1.0 specification for the envelope fields, the anonymization model, the extensions system, and the versioning contract. This document specifies only what OPDS adds.
Permaculture is a design discipline built on observation over time, on stacking plants into functional layers, and on guilds where each element serves many functions and supports its neighbours. OPDS is shaped to record that practice rather than a row-crop calendar: a guild is a first-class record, layer and succession are first-class fields, and observation is treated as data worth keeping, not a note in the margin.
vods_version, export_id, export_date, export_mode) are required in every OPDS document by virtue of the VODS dependency. Their authoritative definition is in the VODS spec.
species fields can cite. OPDS differs by being a small, signed, privacy-respecting interchange envelope aimed at citizen-science and app-level sharing rather than a platform or a species catalogue.
OPDS covers the records a permaculture or food-forest practitioner keeps while designing and tending a living system: what was planted, what has been observed over time, what was harvested, and how species are grouped into guilds. It is intended for home-scale and community-scale sites, citizen-science sharing, and app-level interchange.
OPDS does not try to be: a farm-management platform, a species or cultivar catalogue, a mapping or GIS format, a soil-laboratory result format, or a design-drawing exchange. It records observations and events, not the design drawings themselves. Broadacre row-crop agriculture is served by ADAPT and ISOBUS; soilless and controlled-environment cultivation is served by OCEADS; beekeeping is served by OHDS. Water earthworks, sectors, and detailed soil chemistry are candidate extensions for a later version and are out of scope for v1.0.
Several records use a layer field naming the vertical layer of a food-forest system. The permitted values are: canopy, understory, shrub, herbaceous, groundcover, root, vine, aquatic, fungal. Implementations MUST NOT invent layer values; a system element that does not fit is recorded without a layer.
Every OPDS document begins with the VODS envelope (inherited) followed by the OPDS domain version field.
| Field | Type | From | Req? | Description |
|---|---|---|---|---|
vods_version | string | VODS | req | VODS version. Must be "1.0". |
export_id | string | VODS | req | UUID v4 identifying this export. |
export_date | string | VODS | req | RFC 3339 timestamp of export. |
export_mode | enum | VODS | req | anonymous or tracked. Governs identifier and coordinate handling. |
opds_version | string | OPDS | req | OPDS specification version. Currently "1.0". Consumers MUST accept any version with a matching major number. |
An OPDS export MUST contain at least one non-empty array from: plantings, observations, harvests, or guilds. An envelope with no record arrays is not a meaningful export and MUST be rejected.
Records MAY carry an opt-in coordinates object, {"lat": number, "lon": number} in WGS 84. In anonymous mode, coordinates MUST be coarsened to at most one decimal degree (roughly a ten-kilometre cell), and free-text notes SHOULD be stripped. Home-site location is sensitive; see §9.
One record per planting event. The plantings array contains these records. A planting establishes a species at a location, in a layer, and optionally as part of a guild.
| Field | Type | Req? | Description |
|---|---|---|---|
planting_date | string (date) | req | ISO 8601 date the species was established. |
species | string | req | Scientific name preferred (e.g. "Malus domestica"). Free text. |
common_name | string | opt | Common name for display. |
planting_ref | string | opt | Pseudonymous identifier for this planting, so observations and harvests can reference it. |
site_ref | string | opt | Pseudonymous identifier grouping records by physical site. |
layer | enum | opt | Food-forest layer. See the layer vocabulary in §2. |
guild_ref | string | opt | guild_id of a guild this planting belongs to. |
zone | integer | opt | Permaculture zone, 0 (home) through 5 (unmanaged). |
propagation | enum | opt | seed · seedling · cutting · division · graft · transplant · other |
quantity | integer | opt | Number established. Omit if not counted. |
coordinates | object | opt | Opt-in. Coarsened in anonymous mode (§3). |
region | string | opt | ISO 3166-2 region code. |
notes | string | opt | Free-text notes. Privacy-strip in anonymous mode. |
One record per observation event. The observations array contains these records. Protracted observation is the heart of permaculture practice, so an observation carries the state of a guild, its succession stage, and the functions seen at work, not just a note.
| Field | Type | Req? | Description |
|---|---|---|---|
observation_date | string (date) | req | ISO 8601 date of observation. |
subject | enum | opt | guild · planting · system · wildlife · soil · water · other |
guild_type | string | opt | The kind of guild observed, when the subject is a guild. |
layer | enum | opt | Food-forest layer observed. See §2. |
succession_state | enum | opt | bare_ground · pioneer · early_succession · mid_succession · late_succession · climax |
functions_observed | string[] | opt | Ecological functions seen at work. Suggested values: nitrogen_fixer · dynamic_accumulator · ground_cover · pest_confuser · pollinator_attractor · windbreak · shade · mulch_source · habitat |
health | enum | opt | thriving · healthy · stressed · declining · dead |
planting_ref | string | opt | planting_ref of the planting observed. |
photo_ref | string | opt | Reference to an attached photo. Format is implementation-defined. |
coordinates | object | opt | Opt-in. Coarsened in anonymous mode (§3). |
region | string | opt | ISO 3166-2 region code. |
notes | string | opt | Free-text notes. Privacy-strip in anonymous mode. |
One record per harvest event. The harvests array contains these records. Tracks yield from the system so that a design's productivity can be seen over time.
| Field | Type | Req? | Description |
|---|---|---|---|
harvest_date | string (date) | req | ISO 8601 date of harvest. |
crop | string | req | What was harvested. Free text. |
quantity | number | req | Amount harvested in the unit given by unit. |
unit | enum | req | kg · lb · g · oz · litre · gallon · count · bunch |
planting_ref | string | opt | planting_ref the harvest came from. |
guild_ref | string | opt | guild_id the harvest came from, for whole-guild yields. |
notes | string | opt | Free-text notes. Privacy-strip in anonymous mode. |
One record per plant guild. The guilds array contains these records. A guild is a group of species chosen so that each supports the others, and it is the design unit that distinguishes permaculture from a bed of monocultures. A guild record names the group and its members, and the functions each member serves.
| Field | Type | Req? | Description |
|---|---|---|---|
guild_id | string | req | Identifier for this guild, referenced by guild_ref elsewhere. |
name | string | req | Human-readable name, e.g. "Apple guild". |
description | string | opt | What the guild is for and how it is meant to work. |
functions | string[] | opt | Design functions the guild is meant to provide. Suggested values as in functions_observed (§5). |
members | object[] | opt | The species in the guild. Each member: species (req), role (opt), layer (opt enum, §2). |
notes | string | opt | Free-text notes. |
An anonymous export with one of each record type. It validates against the OPDS v1.0 schema.
{
"vods_version": "1.0",
"export_id": "a3f8c2e1-04b7-4d9e-b221-7f3a09cc1d82",
"export_date": "2026-03-09T14:22:00Z",
"export_mode": "anonymous",
"opds_version": "1.0",
"guilds": [
{ "guild_id": "g1", "name": "Apple guild",
"functions": ["nitrogen_fixer", "pest_confuser", "pollinator_attractor"],
"members": [
{ "species": "Malus domestica", "role": "canopy fruit", "layer": "canopy" },
{ "species": "Allium sativum", "role": "pest_confuser", "layer": "groundcover" },
{ "species": "Symphytum officinale", "role": "dynamic_accumulator", "layer": "herbaceous" }
] }
],
"plantings": [
{ "planting_date": "2026-03-01", "species": "Malus domestica", "common_name": "Apple",
"planting_ref": "p1", "layer": "canopy", "guild_ref": "g1", "zone": 2, "propagation": "transplant" }
],
"observations": [
{ "observation_date": "2026-06-15", "subject": "guild", "guild_type": "apple guild",
"layer": "canopy", "succession_state": "early_succession",
"functions_observed": ["nitrogen_fixer", "pollinator_attractor"], "health": "thriving",
"planting_ref": "p1" }
],
"harvests": [
{ "harvest_date": "2026-09-20", "crop": "Apple", "quantity": 8.5, "unit": "kg",
"planting_ref": "p1", "guild_ref": "g1" }
]
}
An application claims OPDS v1.0 conformance by satisfying all VODS v1.0 conformance rules (see VODS spec §6) and the following OPDS-specific rules. A machine-readable schema for automated validation is available at opds-v1.0.schema.json.
opds_version with a value whose major number the consumer recognises.plantings, observations, harvests, or guilds.layer, propagation, subject, succession_state, health, and unit fields MUST use only their defined values. A value that does not fit is omitted, not invented.guild_ref SHOULD match a guild_id, and a planting_ref on an observation or harvest SHOULD match a planting_ref on a planting, in the same export. A dangling reference MUST NOT cause a consumer to reject the document; it is retained and treated as unresolved.anonymous mode, coordinates MUST be coarsened to at most one decimal degree, and an implementation MUST NOT emit a home-site identifier that a third party can resolve to an address.| Guild | A group of species chosen so that each supports the others, for example a fruit tree with a nitrogen fixer, a pest-confusing bulb, and a dynamic accumulator beneath it. |
| Layer | The vertical position of a plant in a stacked food-forest system, from canopy down to root and fungal layers. |
| Succession | The change of a plant community over time, from bare ground through pioneer species toward a stable climax system. |
| Zone | A permaculture design band, from zone 0 (the home) out to zone 5 (unmanaged wild), ordered by how often a place is visited. |
| Dynamic accumulator | A plant that draws nutrients from deep in the soil into its leaves, which then feed the system as mulch. |
A permaculture site is usually someone's home. Precise coordinates, a resolvable site identifier, or a photograph with embedded location can disclose where a person lives. In anonymous mode, coordinates MUST be coarsened (§3, O5), site identifiers MUST be pseudonymous, and implementations SHOULD strip embedded location metadata from any referenced photo.
The notes, description, and name fields are free text and can carry personal information a user did not mean to publish. In anonymous mode these SHOULD be omitted; when retained they MUST be treated as untrusted input by any consumer that renders them.
A sequence of plantings, harvests, and observations can reveal a household's food supply, absences, and routines. Consumers aggregating OPDS data SHOULD avoid re-publishing record-level detail tied to a single pseudonymous site in a way that re-identifies it.
species strings against an external database.| Reference | Title |
|---|---|
| VODS v1.0 | Veydrin Open Data Standard. The envelope, anonymization model, and versioning contract OPDS builds on. |
| RFC 2119 / RFC 8174 | Key words for use in RFCs to indicate requirement levels (BCP 14). |
| RFC 3339 | Date and time on the internet, used by export_date and the ISO 8601 date fields. |
| ISO 3166-2 | Country subdivision codes, used by the region field. |
| Version | Date | Changes |
|---|---|---|
1.0 | 2026-08-18 | Initial release. Planting, observation, harvest, and guild records; the food-forest layer vocabulary; permaculture zones and succession states; conformance rules O1 through O5; JSON Schema. |