From
bafyreidpfwvtx5j56wgole7cb37zc5wrmgmydf4o4nku7ncmoyjld3qnom
indexed 2026-02-18 18:06 UTC
View this version
To
bafyreiaihka6qgw2xs2rpz7jx3r23wf7gxhhafgunjr73ag5hddfggc3ya
indexed 2026-04-29 14:34 UTC
View this version
Compatibility
breaking 7 breaking changes, 46 non-breaking changes.
Breaking changes (7)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.gainforest.organization.layer#legendEntry", src: "app.gainforest.organization.layer#legendEntry", tgt: "app.gainforest.organization.layer#legendEntry.label", kind: "prop", name: Some("label") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.gainforest.organization.layer#legendEntry", src: "app.gainforest.organization.layer#legendEntry", tgt: "app.gainforest.organization.layer#legendEntry.color", kind: "prop", name: Some("color") }
- ConstraintAdded ConstraintAdded { vertex_id: "app.gainforest.organization.layer:body.uri", sort: "maxGraphemes", value: "2048" }
- ConstraintAdded ConstraintAdded { vertex_id: "app.gainforest.organization.layer:body.type", sort: "maxGraphemes", value: "64" }
- ConstraintTightened ConstraintTightened { vertex_id: "app.gainforest.organization.layer:body.type", sort: "enum", old_value: "geojson_points,geojson_points_trees,geojson_line,choropleth,choropleth_shannon,raster_tif,tms_tile", new_value: "geojson_points,geojson_points_trees,geojson_line,choropleth,choropleth_shannon,raster_tif,tms_tile,heatmap,contour,satellite_overlay" }
- ConstraintAdded ConstraintAdded { vertex_id: "app.gainforest.organization.layer:body.name", sort: "maxGraphemes", value: "256" }
- ConstraintAdded ConstraintAdded { vertex_id: "app.gainforest.organization.layer:body.description", sort: "maxGraphemes", value: "2048" }
Non-breaking changes (46)
- AddedVertex AddedVertex { vertex_id: "app.gainforest.common.defs#imageThumbnail" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer#legendEntry" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer#legendEntry.color" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer#legendEntry.label" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer#legendEntry.value" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.bounds" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.category" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.colorScale" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.dataDate" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.dataSource" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.displayOrder" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.isDefault" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.legend" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.legend:items" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.maxValue" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.minValue" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.opacity" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.propertyKey" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.siteRef" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.thumbnail" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.tileMaxZoom" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.tileMinZoom" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.tilePattern" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.organization.layer:body.unit" }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer#legendEntry", tgt: "app.gainforest.organization.layer#legendEntry.value", kind: "prop", name: Some("value") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.bounds", kind: "prop", name: Some("bounds") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.category", kind: "prop", name: Some("category") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.colorScale", kind: "prop", name: Some("colorScale") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.dataDate", kind: "prop", name: Some("dataDate") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.dataSource", kind: "prop", name: Some("dataSource") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.displayOrder", kind: "prop", name: Some("displayOrder") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.isDefault", kind: "prop", name: Some("isDefault") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.legend", kind: "prop", name: Some("legend") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.maxValue", kind: "prop", name: Some("maxValue") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.minValue", kind: "prop", name: Some("minValue") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.opacity", kind: "prop", name: Some("opacity") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.propertyKey", kind: "prop", name: Some("propertyKey") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.siteRef", kind: "prop", name: Some("siteRef") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.thumbnail", kind: "prop", name: Some("thumbnail") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.tileMaxZoom", kind: "prop", name: Some("tileMaxZoom") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.tileMinZoom", kind: "prop", name: Some("tileMinZoom") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.tilePattern", kind: "prop", name: Some("tilePattern") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.unit", kind: "prop", name: Some("unit") }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body.legend", tgt: "app.gainforest.organization.layer:body.legend:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body.legend:items", tgt: "app.gainforest.organization.layer#legendEntry", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "app.gainforest.organization.layer:body.thumbnail", tgt: "app.gainforest.common.defs#imageThumbnail", kind: "ref", name: None }
Migration guidance
Added
AddedVertex { vertex_id: "app.gainforest.common.defs#imageThumbnail" }AddedVertex { vertex_id: "app.gainforest.organization.layer#legendEntry" }AddedVertex { vertex_id: "app.gainforest.organization.layer#legendEntry.color" }AddedVertex { vertex_id: "app.gainforest.organization.layer#legendEntry.label" }AddedVertex { vertex_id: "app.gainforest.organization.layer#legendEntry.value" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.bounds" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.category" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.colorScale" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.dataDate" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.dataSource" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.displayOrder" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.isDefault" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.legend" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.legend:items" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.maxValue" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.minValue" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.opacity" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.propertyKey" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.siteRef" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.thumbnail" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.tileMaxZoom" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.tileMinZoom" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.tilePattern" }AddedVertex { vertex_id: "app.gainforest.organization.layer:body.unit" }
Constraint changes
- ConstraintAdded ConstraintAdded { vertex_id: "app.gainforest.organization.layer:body.description", sort: "maxGraphemes", value: "2048" }
- ConstraintAdded ConstraintAdded { vertex_id: "app.gainforest.organization.layer:body.name", sort: "maxGraphemes", value: "256" }
- ConstraintAdded ConstraintAdded { vertex_id: "app.gainforest.organization.layer:body.type", sort: "maxGraphemes", value: "64" }
- ConstraintTightened ConstraintTightened { vertex_id: "app.gainforest.organization.layer:body.type", sort: "enum", old_value: "geojson_points,geojson_points_trees,geojson_line,choropleth,choropleth_shannon,raster_tif,tms_tile", new_value: "geojson_points,geojson_points_trees,geojson_line,choropleth,choropleth_shannon,raster_tif,tms_tile,heatmap,contour,satellite_overlay" }
- ConstraintAdded ConstraintAdded { vertex_id: "app.gainforest.organization.layer:body.uri", sort: "maxGraphemes", value: "2048" }
Notes
- Breaking: RequiredEdgeAdded { vertex_id: "app.gainforest.organization.layer#legendEntry", src: "app.gainforest.organization.layer#legendEntry", tgt: "app.gainforest.organization.layer#legendEntry.label", kind: "prop", name: Some("label") }
- Breaking: RequiredEdgeAdded { vertex_id: "app.gainforest.organization.layer#legendEntry", src: "app.gainforest.organization.layer#legendEntry", tgt: "app.gainforest.organization.layer#legendEntry.color", kind: "prop", name: Some("color") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer#legendEntry", tgt: "app.gainforest.organization.layer#legendEntry.value", kind: "prop", name: Some("value") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.bounds", kind: "prop", name: Some("bounds") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.category", kind: "prop", name: Some("category") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.colorScale", kind: "prop", name: Some("colorScale") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.dataDate", kind: "prop", name: Some("dataDate") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.dataSource", kind: "prop", name: Some("dataSource") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.displayOrder", kind: "prop", name: Some("displayOrder") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.isDefault", kind: "prop", name: Some("isDefault") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.legend", kind: "prop", name: Some("legend") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.maxValue", kind: "prop", name: Some("maxValue") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.minValue", kind: "prop", name: Some("minValue") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.opacity", kind: "prop", name: Some("opacity") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.propertyKey", kind: "prop", name: Some("propertyKey") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.siteRef", kind: "prop", name: Some("siteRef") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.thumbnail", kind: "prop", name: Some("thumbnail") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.tileMaxZoom", kind: "prop", name: Some("tileMaxZoom") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.tileMinZoom", kind: "prop", name: Some("tileMinZoom") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.tilePattern", kind: "prop", name: Some("tilePattern") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body", tgt: "app.gainforest.organization.layer:body.unit", kind: "prop", name: Some("unit") }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body.legend", tgt: "app.gainforest.organization.layer:body.legend:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body.legend:items", tgt: "app.gainforest.organization.layer#legendEntry", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "app.gainforest.organization.layer:body.thumbnail", tgt: "app.gainforest.common.defs#imageThumbnail", kind: "ref", name: None }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {4
"legendEntry": {5
"description": "A single entry in a layer legend",6
"properties": {7
"color": {8
"description": "Color for this legend entry (e.g., '#FF5733')",9
"maxGraphemes": 16,10
"type": "string"11
},12
"label": {13
"description": "Display label for this legend entry",14
"maxGraphemes": 128,15
"type": "string"16
},17
"value": {18
"description": "Optional value associated with this legend entry",19
"maxGraphemes": 64,20
"type": "string"21
}22
},23
"required": [24
"label",25
"color"26
],27
"type": "object"28
},429
"main": {530
"description": "A declaration of a layer for an organization",631
"key": "tid",732
"record": {833
"properties": {34
"bounds": {35
"description": "Bounding box as 'west,south,east,north'",36
"maxGraphemes": 128,37
"type": "string"38
},39
"category": {40
"description": "Layer category for grouping in UI (e.g., 'Biodiversity', 'Land Cover', 'Climate', 'Infrastructure')",41
"maxGraphemes": 128,42
"type": "string"43
},44
"colorScale": {45
"description": "Named color scale for continuous data",46
"knownValues": [47
"viridis",48
"plasma",49
"inferno",50
"magma",51
"cividis",52
"turbo",53
"spectral",54
"rdylgn",55
"rdylbu",56
"custom"57
],58
"maxGraphemes": 64,59
"type": "string"60
},961
"createdAt": {1062
"description": "The date and time of the creation of the record",1163
"format": "datetime",1264
"type": "string"1365
},66
"dataDate": {67
"description": "Date of the data (ISO 8601)",68
"maxGraphemes": 64,69
"type": "string"70
},71
"dataSource": {72
"description": "Attribution/source of the layer data",73
"maxGraphemes": 512,74
"type": "string"75
},1476
"description": {1577
"description": "The description of the layer",78
"maxGraphemes": 2048,1679
"type": "string"1780
},81
"displayOrder": {82
"description": "Ordering priority for display",83
"minimum": 0,84
"type": "integer"85
},86
"isDefault": {87
"description": "Whether this layer should be shown by default",88
"type": "boolean"89
},90
"legend": {91
"description": "Legend entries for the layer",92
"items": {93
"ref": "#legendEntry",94
"type": "ref"95
},96
"maxLength": 20,97
"type": "array"98
},99
"maxValue": {100
"description": "Maximum value in the data range",101
"maxGraphemes": 32,102
"type": "string"103
},104
"minValue": {105
"description": "Minimum value in the data range",106
"maxGraphemes": 32,107
"type": "string"108
},18109
"name": {19110
"description": "The name of the site",111
"maxGraphemes": 256,112
"type": "string"113
},114
"opacity": {115
"description": "Default opacity (0-1 as string, e.g., '0.7')",116
"maxGraphemes": 8,117
"type": "string"118
},119
"propertyKey": {120
"description": "GeoJSON property key to use for choropleth coloring (e.g., 'species_richness')",121
"maxGraphemes": 128,122
"type": "string"123
},124
"siteRef": {125
"description": "AT-URI reference to the site this layer belongs to",126
"format": "at-uri",20127
"type": "string"21128
},129
"thumbnail": {130
"description": "Preview thumbnail for the layer",131
"ref": "app.gainforest.common.defs#imageThumbnail",132
"type": "ref"133
},134
"tileMaxZoom": {135
"description": "Maximum zoom level",136
"maximum": 22,137
"minimum": 0,138
"type": "integer"139
},140
"tileMinZoom": {141
"description": "Minimum zoom level",142
"maximum": 22,143
"minimum": 0,144
"type": "integer"145
},146
"tilePattern": {147
"description": "URL pattern for TMS tiles (e.g., 'https://tiles.example.com/{z}/{x}/{y}.png')",148
"maxGraphemes": 512,149
"type": "string"150
},22151
"type": {23152
"description": "The type of the layer",24153
"enum": [25154
"geojson_points",26155
"geojson_points_trees",27156
"geojson_line",28157
"choropleth",29158
"choropleth_shannon",30159
"raster_tif",31
"tms_tile"160
"tms_tile",161
"heatmap",162
"contour",163
"satellite_overlay"32164
],165
"maxGraphemes": 64,166
"type": "string"167
},168
"unit": {169
"description": "Unit of measurement for the layer data (e.g., 'species/ha', 'kg C/m²', 'mm/year')",170
"maxGraphemes": 64,33171
"type": "string"34172
},35173
"uri": {36174
"description": "The URI of the layer",37175
"format": "uri",176
"maxGraphemes": 2048,38177
"type": "string"39178
}40179
},41180
"required": [42181
"name",43182
"type",44183
"uri",45184
"createdAt"46185
],47186
"type": "object"48187
},49188
"type": "record"50189
}51190
},52191
"id": "app.gainforest.organization.layer",53192
"lexicon": 154193
}