{
"id": "at.meme-museum.meme",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"image",
"alt",
"createdAt"
],
"properties": {
"alt": {
"type": "string",
"maxLength": 2000,
"description": "Accessibility alt text. Required, same convention as app.bsky.embed.images.",
"maxGraphemes": 1000
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxLength": 25
},
"image": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp",
"image/gif"
],
"maxSize": 8000000
},
"title": {
"type": "string",
"maxLength": 300,
"description": "Short human label for the meme, distinct from alt text (e.g. \"distracted boyfriend\").",
"maxGraphemes": 100
},
"width": {
"type": "integer",
"minimum": 1
},
"height": {
"type": "integer",
"minimum": 1
},
"source": {
"ref": "#source",
"type": "ref"
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"isAnimated": {
"type": "boolean",
"description": "Set client-side from frame-count inspection at upload time; not reliably inferable from mimetype alone."
},
"visibility": {
"type": "string",
"default": "public",
"maxLength": 64,
"description": "Soft signal only, not access control -- see docs/data-model.md.",
"knownValues": [
"public",
"unlisted"
]
}
}
},
"description": "A single meme asset (still or animated image) in a user's library."
},
"source": {
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "A webpage the image came from, if relevant."
},
"note": {
"type": "string",
"maxLength": 500,
"description": "Free-text credit, e.g. \"via @someone.bsky.social\"."
},
"importedFrom": {
"type": "string",
"format": "at-uri",
"description": "If copied in from another ATProto app's or user's collection, the original record's at-uri."
}
},
"description": "Provenance/attribution for a meme, if known."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}