com.cultureblocs.defs

cultureblocs.com

Schema Diff

+48 -1

From

CID
bafyreibfuixgugn...
Indexed At
2026-07-27 13:18 UTC
View this version

To

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

Compatibility Analysis

Breaking Changes Detected

3 breaking changes, 13 non-breaking changes.

Breaking Changes (3)
  • 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#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 (13)
  • 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#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" }
  • 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 }

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#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" }

Additional Notes

  • 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#imageRef", src: "com.cultureblocs.defs#imageRef", tgt: "com.cultureblocs.defs#imageRef.image", kind: "prop", name: Some("image") }
  • 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 }
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 30
    "didRef": {
31 31
      "type": "object",
32 32
      "required": [
33 33
        "did"
34 34
      ],
35 35
      "properties": {
36 36
        "did": {
37 37
          "type": "string",
38 38
          "format": "did"
39 39
        },
40 40
        "name": {
41 41
          "type": "string",
42 42
          "maxGraphemes": 300
43 43
        }
44 44
      },
45 45
      "description": "A person or organisation by DID, with a descriptive fallback name."
46 46
    },
47 47
    "linkRef": {
48 48
      "type": "object",
49 49
      "required": [
50 50
        "uri"
51 51
      ],
52 52
      "properties": {
53 53
        "uri": {
54 54
          "type": "string",
55 55
          "format": "uri"
56 56
        },
57 57
        "title": {
58 58
          "type": "string",
59 59
          "maxGraphemes": 300
60 60
        }
61 61
      },
62 62
      "description": "External link attached to a bead or strand: event page, venue page, ticket listing."
63 63
    },
64 64
    "workRef": {
65 65
      "type": "object",
66 66
      "properties": {
67 67
        "date": {
68 68
          "type": "string",
69 69
          "description": "Freeform creation date, e.g. '1972' or 'c. 1889'",
70 70
          "maxGraphemes": 100
71 71
        },
72 72
        "image": {
73 73
          "ref": "#mediaRef",
74 74
          "type": "ref"
75 75
        },
76 76
        "title": {
77 77
          "type": "string",
78 78
          "maxGraphemes": 500
79 79
        },
80 80
        "creator": {
81 81
          "type": "string",
82 82
          "maxGraphemes": 300
83 83
        },
84 84
        "wikidata": {
85 85
          "type": "string",
86 86
          "description": "Wikidata QID, e.g. Q1892745"
87 87
        },
88 88
        "accession": {
89 89
          "ref": "#accessionRef",
90 90
          "type": "ref"
91 91
        },
92 92
        "linkedArt": {
93 93
          "type": "string",
94 94
          "format": "uri",
95 95
          "description": "Linked Art object URI"
96 96
        },
97 97
        "creatorDid": {
98 98
          "type": "string",
99 99
          "format": "did",
100 100
          "description": "DID of the creative who made this work, when known. The `creator` string remains the descriptive fallback."
101 101
        }
102 102
      },
103 103
      "description": "Reference to an artwork/creative work. At least one resolvable ID or a descriptive fallback (title)."
104 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 +
    },
105 130
    "mediaRef": {
106 131
      "type": "object",
107 132
      "required": [
108 133
        "uri"
109 134
      ],
110 135
      "properties": {
111 136
        "alt": {
112 137
          "type": "string",
113 138
          "maxGraphemes": 1000
114 139
        },
115 140
        "uri": {
116 141
          "type": "string",
117 142
          "format": "uri"
118 143
        },
119 144
        "mime": {
120 145
          "type": "string",
121 146
          "maxGraphemes": 100
147 +
        },
148 +
        "aspectRatio": {
149 +
          "ref": "#aspectRatio",
150 +
          "type": "ref"
122 151
        }
123 152
      },
124 -
      "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."
125 154
    },
126 155
    "placeRef": {
127 156
      "type": "object",
128 157
      "properties": {
129 158
        "did": {
130 159
          "type": "string",
131 160
          "format": "did",
132 161
          "description": "Venue DID if it has an ATProto account"
133 162
        },
134 163
        "geo": {
135 164
          "ref": "#geo",
136 165
          "type": "ref"
137 166
        },
138 167
        "name": {
139 168
          "type": "string",
140 169
          "maxGraphemes": 300
141 170
        }
142 171
      },
143 172
      "description": "A venue with an ATProto identity, or an ad-hoc named place."
144 173
    },
145 174
    "creditRef": {
146 175
      "type": "object",
147 176
      "required": [
148 177
        "name"
149 178
      ],
150 179
      "properties": {
151 180
        "did": {
152 181
          "type": "string",
153 182
          "format": "did"
154 183
        },
155 184
        "name": {
156 185
          "type": "string",
157 186
          "maxGraphemes": 300
158 187
        },
159 188
        "role": {
160 189
          "type": "string",
161 190
          "maxGraphemes": 100
162 191
        }
163 192
      },
164 193
      "description": "A named contributor. `role` is deliberately freeform: role vocabularies differ per industry and belong in referencing layers, not in this schema."
165 194
    },
166 195
    "strongRef": {
167 196
      "type": "object",
168 197
      "required": [
169 198
        "uri"
170 199
      ],
171 200
      "properties": {
172 201
        "cid": {
173 202
          "type": "string"
174 203
        },
175 204
        "uri": {
176 205
          "type": "string",
177 206
          "format": "uri"
178 207
        }
179 208
      },
180 209
      "description": "Local stand-in for com.atproto.repo.strongRef"
181 210
    },
182 211
    "externalId": {
183 212
      "type": "object",
184 213
      "required": [
185 214
        "scheme",
186 215
        "id"
187 216
      ],
188 217
      "properties": {
189 218
        "id": {
190 219
          "type": "string",
191 220
          "maxGraphemes": 200
192 221
        },
193 222
        "uri": {
194 223
          "type": "string",
195 224
          "format": "uri",
196 225
          "description": "Resolvable URL for this identifier, where one exists."
197 226
        },
198 227
        "scheme": {
199 228
          "type": "string",
200 229
          "knownValues": [
201 230
            "isni",
202 231
            "ipi",
203 232
            "ipn",
204 233
            "orcid",
205 234
            "wikidata",
206 235
            "musicbrainz",
207 236
            "auracle",
208 237
            "isrc",
209 238
            "iswc",
210 239
            "isan",
211 240
            "doi",
212 241
            "viaf",
213 242
            "discogs",
214 243
            "rsl"
215 244
          ],
216 245
          "maxGraphemes": 64
217 246
        }
218 247
      },
219 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."
220 249
    },
221 250
    "provenance": {
222 251
      "type": "object",
223 252
      "required": [
224 253
        "app",
225 254
        "mintedAt"
226 255
      ],
227 256
      "properties": {
228 257
        "app": {
229 258
          "type": "string",
230 259
          "description": "Producing app id, e.g. 'culturebloc', 'ar-gallery'",
231 260
          "maxGraphemes": 100
232 261
        },
233 262
        "device": {
234 263
          "type": "string",
235 264
          "description": "Device identifier, e.g. StickS3 id",
236 265
          "maxGraphemes": 100
237 266
        },
238 267
        "mintId": {
239 268
          "type": "string",
240 269
          "description": "Device-generated mint identifier (hex). Shared between both parties' beads on a mutual mint — the encounter join key.",
241 270
          "maxGraphemes": 64
242 271
        },
243 272
        "mintedAt": {
244 273
          "type": "string",
245 274
          "format": "datetime"
246 275
        },
247 276
        "mutualMint": {
248 277
          "type": "boolean",
249 278
          "description": "True if created by a mutual-press ceremony"
250 279
        },
251 280
        "timeAnchored": {
252 281
          "type": "boolean",
253 282
          "description": "False when the device knew only the time-of-day or nothing; createdAt is then a best guess"
254 283
        }
255 284
      }
256 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 +
    },
257 304
    "accessionRef": {
258 305
      "type": "object",
259 306
      "required": [
260 307
        "institution",
261 308
        "id"
262 309
      ],
263 310
      "properties": {
264 311
        "id": {
265 312
          "type": "string",
266 313
          "description": "Accession/inventory number",
267 314
          "maxGraphemes": 200
268 315
        },
269 316
        "institution": {
270 317
          "type": "string",
271 318
          "format": "did",
272 319
          "description": "DID of the holding institution"
273 320
        }
274 321
      }
275 322
    }
276 323
  },
277 324
  "$type": "com.atproto.lexicon.schema",
278 325
  "lexicon": 1
279 326
}

Compare Other Versions

Lexicon Garden

@