{
"id": "social.skyphone.video.post",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"video",
"durationMs",
"aspectRatio",
"createdAt"
],
"properties": {
"video": {
"type": "blob",
"accept": [
"video/mp4"
],
"maxSize": 1073741824,
"description": "Server-side transcoded canonical video (H.264/AAC, up to 1080p, at most 1GB)."
},
"compat": {
"type": "blob",
"accept": [
"video/mp4"
],
"maxSize": 100000000,
"description": "Bluesky-compatible mp4, only produced for videos of 3 minutes or less, at most 100MB."
},
"captions": {
"type": "array",
"items": {
"ref": "app.bsky.embed.video#caption",
"type": "ref"
},
"maxLength": 20,
"description": "Optional WebVTT caption tracks, same shape as app.bsky.embed.video#caption. Absence means no captions were supplied; it does not mean the video has burned-in subtitles."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When this record was created."
},
"durationMs": {
"type": "integer",
"maximum": 3600000,
"minimum": 0,
"description": "Duration in milliseconds, as measured by the transcoding worker (ffprobe), not client-reported."
},
"aspectRatio": {
"ref": "app.bsky.embed.defs#aspectRatio",
"type": "ref",
"description": "Pixel dimensions of the canonical video, as measured by the transcoding worker. Required so clients can reserve layout before the blob is fetched."
}
}
},
"description": "Canonical video record. The video blob and durationMs MUST NOT change after creation; replacing the video requires a new record. This record intentionally carries no human-readable metadata: title, description, thumbnail and the announcement post live in a social.skyphone.video.meta record with the same record key in the same repo."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}