{
"id": "com.luminframe.image",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"image",
"aspectRatio",
"createdAt"
],
"properties": {
"alt": {
"type": "string",
"maxLength": 10000,
"description": "Accessibility description of the image.",
"maxGraphemes": 2000
},
"image": {
"type": "blob",
"accept": [
"image/*"
],
"maxSize": 1000000,
"description": "The rendered image. When `video` is present, this is its poster frame."
},
"title": {
"type": "string",
"maxLength": 3000,
"description": "Short caption or label.",
"maxGraphemes": 300
},
"video": {
"type": "blob",
"accept": [
"video/mp4"
],
"maxSize": 5000000,
"description": "A short looping clip of the edit, present when the recipe animates. The still `image` remains required as the poster, so viewers that only know stills keep working."
},
"recipe": {
"type": "array",
"items": {
"ref": "#effectStep",
"type": "ref"
},
"maxLength": 64,
"description": "The ordered effect stack with parameters — the executable edit, so the look can be reconstructed or applied elsewhere."
},
"effects": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128
},
"maxLength": 64,
"description": "The effect keys applied, in order. Kept for lightweight display and backward compatibility; the executable form is `recipe`."
},
"remixOf": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"description": "The record this image was remixed from, if any — its lineage."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When the record was created."
},
"aspectRatio": {
"ref": "#aspectRatio",
"type": "ref",
"description": "Pixel dimensions of the render, so a viewer can lay it out without decoding."
}
}
},
"description": "An image edited in Luminframe, saved to the author's repo, together with the effect recipe used to produce it."
},
"effectStep": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"maxLength": 128,
"description": "The effect key."
},
"params": {
"type": "string",
"maxLength": 10000,
"description": "The effect's parameters, JSON-encoded. A string rather than an object because the atproto data model has no float type and effect parameters are fractional. Records saved before v4 carry a plain object here instead."
}
},
"description": "One effect in the recipe: its key and the parameters it was applied with."
},
"aspectRatio": {
"type": "object",
"required": [
"width",
"height"
],
"properties": {
"width": {
"type": "integer",
"minimum": 1
},
"height": {
"type": "integer",
"minimum": 1
}
},
"description": "The width:height ratio of the image, in pixels."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}