{
"id": "social.wips.update",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"project",
"createdAt"
],
"properties": {
"text": {
"type": "string",
"maxLength": 80000,
"description": "Optional caption / body text. Required by application semantics when facets are present.",
"maxGraphemes": 8000
},
"links": {
"type": "array",
"items": {
"ref": "social.wips.defs#titledLink",
"type": "ref"
},
"maxLength": 50,
"description": "Ordered user-authored links. App View may derive previews separately. Protocol ceiling is generous; operational UI limits belong in the app."
},
"media": {
"type": "array",
"items": {
"refs": [
"social.wips.defs#image",
"social.wips.defs#video"
],
"type": "union"
},
"maxLength": 50,
"description": "Ordered media items. May freely mix images and videos using shared social.wips.defs media objects. Operational upload limits and safe MIME policy belong in the app, not as tiny product-shaped protocol caps."
},
"facets": {
"type": "array",
"items": {
"ref": "app.bsky.richtext.facet",
"type": "ref"
},
"maxLength": 20,
"description": "Rich-text annotations (mentions, links, tags) over text, using official app.bsky.richtext.facet. Application validators enforce UTF-8 codepoint-aligned byte ranges, per-facet feature caps, and http(s) link URIs. Ceiling is sized so max text + 50 media + 50 links + max facets stay under the explicit DAG-CBOR record budget."
},
"project": {
"ref": "social.wips.defs#uriRef",
"type": "ref",
"description": "Stable AT URI of the social.wips.project record this update belongs to."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when the update was originally created."
},
"allowComments": {
"type": "boolean",
"description": "When false, wips.social application/comment semantics reject new comments on this update. Omitted means true. Not a PDS-enforced lock."
}
}
},
"description": "Update posted to one project. project.uri is a weak AT URI ref so it survives project edits."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1,
"description": "A project update with optional text, ordered mixed media, ordered links, and optional rich-text facets. Application validators require at least one of non-empty text, known image/video media, or links (media union stays open; unknown variants alone do not satisfy content). Optional allowComments defaults to true when omitted (enforced by application/comment semantics). Protocol ceilings are generous and non-product-shaped while keeping worst-case DAG-CBOR size under the explicit record budget."
}