{
"id": "com.cultureblocs.defs",
"defs": {
"geo": {
"type": "object",
"required": [
"lat",
"lng",
"precision"
],
"properties": {
"lat": {
"type": "number"
},
"lng": {
"type": "number"
},
"precision": {
"type": "string",
"description": "Declared coordinate fuzzing level. Coordinates MUST already be fuzzed to this precision before the record leaves Tier 0.",
"knownValues": [
"exact",
"100m",
"1km",
"city"
]
}
}
},
"didRef": {
"type": "object",
"required": [
"did"
],
"properties": {
"did": {
"type": "string",
"format": "did"
},
"name": {
"type": "string",
"maxGraphemes": 300
}
},
"description": "A person or organisation by DID, with a descriptive fallback name."
},
"linkRef": {
"type": "object",
"required": [
"uri"
],
"properties": {
"uri": {
"type": "string",
"format": "uri"
},
"title": {
"type": "string",
"maxGraphemes": 300
}
},
"description": "External link attached to a bead or strand: event page, venue page, ticket listing."
},
"workRef": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Freeform creation date, e.g. '1972' or 'c. 1889'",
"maxGraphemes": 100
},
"image": {
"ref": "#mediaRef",
"type": "ref"
},
"title": {
"type": "string",
"maxGraphemes": 500
},
"creator": {
"type": "string",
"maxGraphemes": 300
},
"wikidata": {
"type": "string",
"description": "Wikidata QID, e.g. Q1892745"
},
"accession": {
"ref": "#accessionRef",
"type": "ref"
},
"linkedArt": {
"type": "string",
"format": "uri",
"description": "Linked Art object URI"
},
"creatorDid": {
"type": "string",
"format": "did",
"description": "DID of the creative who made this work, when known. The `creator` string remains the descriptive fallback."
}
},
"description": "Reference to an artwork/creative work. At least one resolvable ID or a descriptive fallback (title)."
},
"imageRef": {
"type": "object",
"required": [
"image"
],
"properties": {
"alt": {
"type": "string",
"description": "What the image shows. Absent means absent — readers must not substitute a title.",
"maxGraphemes": 2000
},
"image": {
"type": "blob",
"accept": [
"image/*"
],
"maxSize": 2000000
},
"aspectRatio": {
"ref": "#aspectRatio",
"type": "ref"
}
},
"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."
},
"mediaRef": {
"type": "object",
"required": [
"uri"
],
"properties": {
"alt": {
"type": "string",
"maxGraphemes": 1000
},
"uri": {
"type": "string",
"format": "uri"
},
"mime": {
"type": "string",
"maxGraphemes": 100
},
"aspectRatio": {
"ref": "#aspectRatio",
"type": "ref"
}
},
"description": "Tier 0/1 media reference. Replaced by an imageRef at promotion time; alt text and aspectRatio carry across unchanged."
},
"placeRef": {
"type": "object",
"properties": {
"did": {
"type": "string",
"format": "did",
"description": "Venue DID if it has an ATProto account"
},
"geo": {
"ref": "#geo",
"type": "ref"
},
"name": {
"type": "string",
"maxGraphemes": 300
}
},
"description": "A venue with an ATProto identity, or an ad-hoc named place."
},
"creditRef": {
"type": "object",
"required": [
"name"
],
"properties": {
"did": {
"type": "string",
"format": "did"
},
"name": {
"type": "string",
"maxGraphemes": 300
},
"role": {
"type": "string",
"maxGraphemes": 100
}
},
"description": "A named contributor. `role` is deliberately freeform: role vocabularies differ per industry and belong in referencing layers, not in this schema."
},
"strongRef": {
"type": "object",
"required": [
"uri"
],
"properties": {
"cid": {
"type": "string"
},
"uri": {
"type": "string",
"format": "uri"
}
},
"description": "Local stand-in for com.atproto.repo.strongRef"
},
"externalId": {
"type": "object",
"required": [
"scheme",
"id"
],
"properties": {
"id": {
"type": "string",
"maxGraphemes": 200
},
"uri": {
"type": "string",
"format": "uri",
"description": "Resolvable URL for this identifier, where one exists."
},
"scheme": {
"type": "string",
"knownValues": [
"isni",
"ipi",
"ipn",
"orcid",
"wikidata",
"musicbrainz",
"auracle",
"isrc",
"iswc",
"isan",
"doi",
"viaf",
"discogs",
"rsl"
],
"maxGraphemes": 64
}
},
"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."
},
"provenance": {
"type": "object",
"required": [
"app",
"mintedAt"
],
"properties": {
"app": {
"type": "string",
"description": "Producing app id, e.g. 'culturebloc', 'ar-gallery'",
"maxGraphemes": 100
},
"device": {
"type": "string",
"description": "Device identifier, e.g. StickS3 id",
"maxGraphemes": 100
},
"mintId": {
"type": "string",
"description": "Device-generated mint identifier (hex). Shared between both parties' beads on a mutual mint — the encounter join key.",
"maxGraphemes": 64
},
"mintedAt": {
"type": "string",
"format": "datetime"
},
"mutualMint": {
"type": "boolean",
"description": "True if created by a mutual-press ceremony"
},
"timeAnchored": {
"type": "boolean",
"description": "False when the device knew only the time-of-day or nothing; createdAt is then a best guess"
}
}
},
"aspectRatio": {
"type": "object",
"required": [
"width",
"height"
],
"properties": {
"width": {
"type": "integer",
"minimum": 1
},
"height": {
"type": "integer",
"minimum": 1
}
},
"description": "Pixel dimensions, so a reader can reserve layout space before the image bytes arrive. Shape matches app.bsky.embed.images#aspectRatio."
},
"accessionRef": {
"type": "object",
"required": [
"institution",
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Accession/inventory number",
"maxGraphemes": 200
},
"institution": {
"type": "string",
"format": "did",
"description": "DID of the holding institution"
}
}
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}