com.cultureblocs.defs

cultureblocs.com

Schema Diff

+130 -1

From

CID
bafyreie22msjy4d...
Indexed At
2026-07-22 10:01 UTC
View this version

To

CID
bafyreihfq7dbiyt...
Indexed At
2026-08-17 10:44 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

7 breaking changes, 30 non-breaking changes.

Breaking Changes (7)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#imageRef", src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.image", kind: "prop", name: Some("image") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#creditRef", src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.name", kind: "prop", name: Some("name") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#didRef", src: "com.cultureblocs.defs#didRef", tgt: "com.cultureblocs.defs#didRef.did", kind: "prop", name: Some("did") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#externalId", src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.scheme", kind: "prop", name: Some("scheme") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#externalId", src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.id", kind: "prop", name: Some("id") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#aspectRatio", src: "com.cultureblocs.defs#aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio.width", kind: "prop", name: Some("width") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#aspectRatio", src: "com.cultureblocs.defs#aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio.height", kind: "prop", name: Some("height") }
Non-Breaking Changes (30)
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio.height" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio.width" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.did" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.name" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.role" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#didRef" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#didRef.did" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#didRef.name" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#externalId" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.id" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.scheme" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.uri" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.alt" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.aspectRatio" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.image" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#mediaRef.aspectRatio" }
  • AddedVertex AddedVertex { vertex_id: "com.cultureblocs.defs#workRef.creatorDid" }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.did", kind: "prop", name: Some("did") }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.role", kind: "prop", name: Some("role") }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#didRef", tgt: "com.cultureblocs.defs#didRef.name", kind: "prop", name: Some("name") }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.uri", kind: "prop", name: Some("uri") }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.alt", kind: "prop", name: Some("alt") }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.aspectRatio", kind: "prop", name: Some("aspectRatio") }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#imageRef.aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#mediaRef", tgt: "com.cultureblocs.defs#mediaRef.aspectRatio", kind: "prop", name: Some("aspectRatio") }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#mediaRef.aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "com.cultureblocs.defs#workRef", tgt: "com.cultureblocs.defs#workRef.creatorDid", kind: "prop", name: Some("creatorDid") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio.height" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#aspectRatio.width" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.did" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.name" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#creditRef.role" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#didRef" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#didRef.did" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#didRef.name" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#externalId" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.id" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.scheme" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#externalId.uri" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.alt" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.aspectRatio" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#imageRef.image" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#mediaRef.aspectRatio" }
  • AddedVertex { vertex_id: "com.cultureblocs.defs#workRef.creatorDid" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#creditRef", src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.name", kind: "prop", name: Some("name") }
  • Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#aspectRatio", src: "com.cultureblocs.defs#aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio.width", kind: "prop", name: Some("width") }
  • Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#aspectRatio", src: "com.cultureblocs.defs#aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio.height", kind: "prop", name: Some("height") }
  • Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#externalId", src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.scheme", kind: "prop", name: Some("scheme") }
  • Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#externalId", src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.id", kind: "prop", name: Some("id") }
  • Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#imageRef", src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.image", kind: "prop", name: Some("image") }
  • Breaking: RequiredEdgeAdded { vertex_id: "com.cultureblocs.defs#didRef", src: "com.cultureblocs.defs#didRef", tgt: "com.cultureblocs.defs#didRef.did", kind: "prop", name: Some("did") }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.did", kind: "prop", name: Some("did") }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#creditRef", tgt: "com.cultureblocs.defs#creditRef.role", kind: "prop", name: Some("role") }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#didRef", tgt: "com.cultureblocs.defs#didRef.name", kind: "prop", name: Some("name") }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#externalId", tgt: "com.cultureblocs.defs#externalId.uri", kind: "prop", name: Some("uri") }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.alt", kind: "prop", name: Some("alt") }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.aspectRatio", kind: "prop", name: Some("aspectRatio") }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#imageRef.aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#mediaRef", tgt: "com.cultureblocs.defs#mediaRef.aspectRatio", kind: "prop", name: Some("aspectRatio") }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#mediaRef.aspectRatio", tgt: "com.cultureblocs.defs#aspectRatio", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "com.cultureblocs.defs#workRef", tgt: "com.cultureblocs.defs#workRef.creatorDid", kind: "prop", name: Some("creatorDid") }
1 1
{
2 2
  "id": "com.cultureblocs.defs",
3 3
  "defs": {
4 4
    "geo": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "lat",
8 8
        "lng",
9 9
        "precision"
10 10
      ],
11 11
      "properties": {
12 12
        "lat": {
13 13
          "type": "number"
14 14
        },
15 15
        "lng": {
16 16
          "type": "number"
17 17
        },
18 18
        "precision": {
19 19
          "type": "string",
20 20
          "description": "Declared coordinate fuzzing level. Coordinates MUST already be fuzzed to this precision before the record leaves Tier 0.",
21 21
          "knownValues": [
22 22
            "exact",
23 23
            "100m",
24 24
            "1km",
25 25
            "city"
26 26
          ]
27 27
        }
28 28
      }
29 29
    },
30 +
    "didRef": {
31 +
      "type": "object",
32 +
      "required": [
33 +
        "did"
34 +
      ],
35 +
      "properties": {
36 +
        "did": {
37 +
          "type": "string",
38 +
          "format": "did"
39 +
        },
40 +
        "name": {
41 +
          "type": "string",
42 +
          "maxGraphemes": 300
43 +
        }
44 +
      },
45 +
      "description": "A person or organisation by DID, with a descriptive fallback name."
46 +
    },
30 47
    "linkRef": {
31 48
      "type": "object",
32 49
      "required": [
33 50
        "uri"
34 51
      ],
35 52
      "properties": {
36 53
        "uri": {
37 54
          "type": "string",
38 55
          "format": "uri"
39 56
        },
40 57
        "title": {
41 58
          "type": "string",
42 59
          "maxGraphemes": 300
43 60
        }
44 61
      },
45 62
      "description": "External link attached to a bead or strand: event page, venue page, ticket listing."
46 63
    },
47 64
    "workRef": {
48 65
      "type": "object",
49 66
      "properties": {
50 67
        "date": {
51 68
          "type": "string",
52 69
          "description": "Freeform creation date, e.g. '1972' or 'c. 1889'",
53 70
          "maxGraphemes": 100
54 71
        },
55 72
        "image": {
56 73
          "ref": "#mediaRef",
57 74
          "type": "ref"
58 75
        },
59 76
        "title": {
60 77
          "type": "string",
61 78
          "maxGraphemes": 500
62 79
        },
63 80
        "creator": {
64 81
          "type": "string",
65 82
          "maxGraphemes": 300
66 83
        },
67 84
        "wikidata": {
68 85
          "type": "string",
69 86
          "description": "Wikidata QID, e.g. Q1892745"
70 87
        },
71 88
        "accession": {
72 89
          "ref": "#accessionRef",
73 90
          "type": "ref"
74 91
        },
75 92
        "linkedArt": {
76 93
          "type": "string",
77 94
          "format": "uri",
78 95
          "description": "Linked Art object URI"
96 +
        },
97 +
        "creatorDid": {
98 +
          "type": "string",
99 +
          "format": "did",
100 +
          "description": "DID of the creative who made this work, when known. The `creator` string remains the descriptive fallback."
79 101
        }
80 102
      },
81 103
      "description": "Reference to an artwork/creative work. At least one resolvable ID or a descriptive fallback (title)."
82 104
    },
105 +
    "imageRef": {
106 +
      "type": "object",
107 +
      "required": [
108 +
        "image"
109 +
      ],
110 +
      "properties": {
111 +
        "alt": {
112 +
          "type": "string",
113 +
          "description": "What the image shows. Absent means absent — readers must not substitute a title.",
114 +
          "maxGraphemes": 2000
115 +
        },
116 +
        "image": {
117 +
          "type": "blob",
118 +
          "accept": [
119 +
            "image/*"
120 +
          ],
121 +
          "maxSize": 2000000
122 +
        },
123 +
        "aspectRatio": {
124 +
          "ref": "#aspectRatio",
125 +
          "type": "ref"
126 +
        }
127 +
      },
128 +
      "description": "A published image and the two things a reader needs to present it honestly: what it shows, and how much room it takes. Field names match app.bsky.embed.images#image and the community standalone-image proposal, so this can become a ref to a shared lexicon without changing the published payload."
129 +
    },
83 130
    "mediaRef": {
84 131
      "type": "object",
85 132
      "required": [
86 133
        "uri"
87 134
      ],
88 135
      "properties": {
89 136
        "alt": {
90 137
          "type": "string",
91 138
          "maxGraphemes": 1000
92 139
        },
93 140
        "uri": {
94 141
          "type": "string",
95 142
          "format": "uri"
96 143
        },
97 144
        "mime": {
98 145
          "type": "string",
99 146
          "maxGraphemes": 100
147 +
        },
148 +
        "aspectRatio": {
149 +
          "ref": "#aspectRatio",
150 +
          "type": "ref"
100 151
        }
101 152
      },
102 -
      "description": "Tier 0/1 media reference. Replaced by an atproto blob at promotion time."
153 +
      "description": "Tier 0/1 media reference. Replaced by an imageRef at promotion time; alt text and aspectRatio carry across unchanged."
103 154
    },
104 155
    "placeRef": {
105 156
      "type": "object",
106 157
      "properties": {
107 158
        "did": {
108 159
          "type": "string",
109 160
          "format": "did",
110 161
          "description": "Venue DID if it has an ATProto account"
111 162
        },
112 163
        "geo": {
113 164
          "ref": "#geo",
114 165
          "type": "ref"
115 166
        },
116 167
        "name": {
117 168
          "type": "string",
118 169
          "maxGraphemes": 300
119 170
        }
120 171
      },
121 172
      "description": "A venue with an ATProto identity, or an ad-hoc named place."
122 173
    },
174 +
    "creditRef": {
175 +
      "type": "object",
176 +
      "required": [
177 +
        "name"
178 +
      ],
179 +
      "properties": {
180 +
        "did": {
181 +
          "type": "string",
182 +
          "format": "did"
183 +
        },
184 +
        "name": {
185 +
          "type": "string",
186 +
          "maxGraphemes": 300
187 +
        },
188 +
        "role": {
189 +
          "type": "string",
190 +
          "maxGraphemes": 100
191 +
        }
192 +
      },
193 +
      "description": "A named contributor. `role` is deliberately freeform: role vocabularies differ per industry and belong in referencing layers, not in this schema."
194 +
    },
123 195
    "strongRef": {
124 196
      "type": "object",
125 197
      "required": [
126 198
        "uri"
127 199
      ],
128 200
      "properties": {
129 201
        "cid": {
130 202
          "type": "string"
131 203
        },
132 204
        "uri": {
133 205
          "type": "string",
134 206
          "format": "uri"
135 207
        }
136 208
      },
137 209
      "description": "Local stand-in for com.atproto.repo.strongRef"
138 210
    },
211 +
    "externalId": {
212 +
      "type": "object",
213 +
      "required": [
214 +
        "scheme",
215 +
        "id"
216 +
      ],
217 +
      "properties": {
218 +
        "id": {
219 +
          "type": "string",
220 +
          "maxGraphemes": 200
221 +
        },
222 +
        "uri": {
223 +
          "type": "string",
224 +
          "format": "uri",
225 +
          "description": "Resolvable URL for this identifier, where one exists."
226 +
        },
227 +
        "scheme": {
228 +
          "type": "string",
229 +
          "knownValues": [
230 +
            "isni",
231 +
            "ipi",
232 +
            "ipn",
233 +
            "orcid",
234 +
            "wikidata",
235 +
            "musicbrainz",
236 +
            "auracle",
237 +
            "isrc",
238 +
            "iswc",
239 +
            "isan",
240 +
            "doi",
241 +
            "viaf",
242 +
            "discogs",
243 +
            "rsl"
244 +
          ],
245 +
          "maxGraphemes": 64
246 +
        }
247 +
      },
248 +
      "description": "An identifier for this subject in another system. Registries are peers: no scheme is privileged, and knownValues is advisory so new schemes need no schema change."
249 +
    },
139 250
    "provenance": {
140 251
      "type": "object",
141 252
      "required": [
142 253
        "app",
143 254
        "mintedAt"
144 255
      ],
145 256
      "properties": {
146 257
        "app": {
147 258
          "type": "string",
148 259
          "description": "Producing app id, e.g. 'culturebloc', 'ar-gallery'",
149 260
          "maxGraphemes": 100
150 261
        },
151 262
        "device": {
152 263
          "type": "string",
153 264
          "description": "Device identifier, e.g. StickS3 id",
154 265
          "maxGraphemes": 100
155 266
        },
156 267
        "mintId": {
157 268
          "type": "string",
158 269
          "description": "Device-generated mint identifier (hex). Shared between both parties' beads on a mutual mint — the encounter join key.",
159 270
          "maxGraphemes": 64
160 271
        },
161 272
        "mintedAt": {
162 273
          "type": "string",
163 274
          "format": "datetime"
164 275
        },
165 276
        "mutualMint": {
166 277
          "type": "boolean",
167 278
          "description": "True if created by a mutual-press ceremony"
168 279
        },
169 280
        "timeAnchored": {
170 281
          "type": "boolean",
171 282
          "description": "False when the device knew only the time-of-day or nothing; createdAt is then a best guess"
172 283
        }
173 284
      }
174 285
    },
286 +
    "aspectRatio": {
287 +
      "type": "object",
288 +
      "required": [
289 +
        "width",
290 +
        "height"
291 +
      ],
292 +
      "properties": {
293 +
        "width": {
294 +
          "type": "integer",
295 +
          "minimum": 1
296 +
        },
297 +
        "height": {
298 +
          "type": "integer",
299 +
          "minimum": 1
300 +
        }
301 +
      },
302 +
      "description": "Pixel dimensions, so a reader can reserve layout space before the image bytes arrive. Shape matches app.bsky.embed.images#aspectRatio."
303 +
    },
175 304
    "accessionRef": {
176 305
      "type": "object",
177 306
      "required": [
178 307
        "institution",
179 308
        "id"
180 309
      ],
181 310
      "properties": {
182 311
        "id": {
183 312
          "type": "string",
184 313
          "description": "Accession/inventory number",
185 314
          "maxGraphemes": 200
186 315
        },
187 316
        "institution": {
188 317
          "type": "string",
189 318
          "format": "did",
190 319
          "description": "DID of the holding institution"
191 320
        }
192 321
      }
193 322
    }
194 323
  },
195 324
  "$type": "com.atproto.lexicon.schema",
196 325
  "lexicon": 1
197 326
}

Compare Other Versions

Lexicon Garden

@