{
"id": "blue.moji.embed.sticker",
"defs": {
"main": {
"type": "object",
"required": [
"sticker"
],
"properties": {
"sticker": {
"ref": "#sticker",
"type": "ref"
}
},
"description": "A full-sized Bluemoji sticker attached to a post as media, in the style of app.bsky.embed.external. References a blue.moji.collection.item record in the sticker owner's repo."
},
"view": {
"type": "object",
"required": [
"sticker"
],
"properties": {
"sticker": {
"ref": "#viewSticker",
"type": "ref"
}
}
},
"sticker": {
"type": "object",
"required": [
"did",
"name",
"formats"
],
"properties": {
"alt": {
"type": "string",
"description": "Alt text description of the sticker, for accessibility."
},
"did": {
"type": "string",
"format": "did",
"description": "DID of the repo that owns the sticker record. Combined with the format CIDs to construct blob/CDN URLs without a getRecord round-trip, mirroring blue.moji.richtext.facet. Self-attested; see security note on this object."
},
"name": {
"type": "string",
"description": "Colon-wrapped alias of the source Bluemoji (e.g. :blobcat:). Implementers should use this as fallback text when assets are unavailable."
},
"record": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"description": "Strong reference to the source blue.moji.collection.item record. Use this as the verification anchor: resolve it and compare formats before trusting this embed's claims."
},
"formats": {
"refs": [
"#formats_v0"
],
"type": "union",
"closed": false,
"description": "CIDs of the full-size sticker renditions. Open union to allow future formats."
},
"aspectRatio": {
"ref": "app.bsky.embed.defs#aspectRatio",
"type": "ref"
}
},
"description": "SECURITY: did/name/formats are self-attested by the posting client, like blue.moji.richtext.facet. Verify against the record strongRef (or by re-deriving the rkey from name and looking up did's blue.moji.collection.item) before rendering an image, if the render surface matters for trust."
},
"formats_v0": {
"type": "object",
"properties": {
"lottie": {
"type": "string",
"format": "cid"
},
"gif_512": {
"type": "string",
"format": "cid"
},
"png_512": {
"type": "string",
"format": "cid"
},
"apng_512": {
"type": "string",
"format": "cid"
},
"webp_512": {
"type": "string",
"format": "cid"
}
},
"description": "CIDs of the full-size (512px-class) blobs stored in the sticker owner's repo under blue.moji.collection.item stickerFormats. CID-only, like blue.moji.richtext.facet#formats_v1, because blobs cannot be referenced across repos."
},
"viewSticker": {
"type": "object",
"required": [
"fullsize",
"name"
],
"properties": {
"alt": {
"type": "string"
},
"name": {
"type": "string"
},
"thumb": {
"type": "string",
"format": "uri",
"description": "URL of the 128px inline-emoji rendition, if available."
},
"labels": {
"type": "array",
"items": {
"ref": "com.atproto.label.defs#label",
"type": "ref"
},
"description": "AppViews producing this view MUST populate labels (and reflect the source item's adultOnly) from the verified blue.moji.collection.item record, not from the embed's own self-attested fields — see the security note on #sticker. Consumers SHOULD warn or blur before rendering fullsize/thumb when present."
},
"record": {
"ref": "com.atproto.repo.strongRef",
"type": "ref"
},
"fullsize": {
"type": "string",
"format": "uri",
"description": "Fully-qualified URL of the full-size sticker asset."
},
"aspectRatio": {
"ref": "app.bsky.embed.defs#aspectRatio",
"type": "ref"
}
}
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}