{
"id": "pub.oysters.defs",
"defs": {
"tagView": {
"type": "object",
"required": [
"slug",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 256,
"description": "The tag's display name."
},
"slug": {
"type": "string",
"maxLength": 128,
"description": "The tag as it appears in a record and in /t/ URLs."
},
"description": {
"type": "string",
"maxLength": 1024,
"description": "What the tag is for."
}
},
"description": "One tag in the board's curated vocabulary."
},
"postView": {
"type": "object",
"required": [
"uri",
"author",
"record",
"indexedAt"
],
"properties": {
"cid": {
"type": "string",
"format": "cid",
"description": "CID of the exact revision indexed. Absent for a record indexed before its CID was known."
},
"uri": {
"type": "string",
"format": "at-uri",
"description": "The submission's AT-URI. This is the stable identifier; do not key on anything else."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128
},
"description": "Tags from this board's curated vocabulary. The record may claim others; those are not echoed here."
},
"author": {
"ref": "#actorView",
"type": "ref",
"description": "Who submitted it."
},
"record": {
"type": "unknown",
"description": "The pub.oysters.post record, rebuilt from the indexed fields. Fields this board does not index are not echoed; fetch the record from the author's repository if you need it byte-for-byte."
},
"indexedAt": {
"type": "string",
"format": "datetime",
"description": "When this board first saw the record. Ranking uses this rather than the record's own createdAt, which its author chose."
},
"upvoteCount": {
"type": "integer",
"minimum": 0,
"description": "Live upvotes. Not the ranking score, which is deliberately not exposed."
},
"commentCount": {
"type": "integer",
"minimum": 0,
"description": "Live comments, at any depth."
}
},
"description": "A submission with everything needed to render it: the record as written, its author, and the counts this board derived."
},
"actorView": {
"type": "object",
"required": [
"did"
],
"properties": {
"did": {
"type": "string",
"format": "did",
"description": "The account's DID, which is its permanent identity."
},
"avatar": {
"type": "string",
"format": "uri",
"description": "URL of the account's avatar image."
},
"handle": {
"type": "string",
"format": "handle",
"description": "The handle the DID document claims, as last seen. Absent until we have resolved one."
},
"displayName": {
"type": "string",
"maxLength": 256,
"description": "A chosen name, if the account has one.",
"maxGraphemes": 64
}
},
"description": "An account, hydrated enough to render a byline without resolving the DID."
},
"commentView": {
"type": "object",
"required": [
"uri",
"author",
"record",
"indexedAt"
],
"properties": {
"cid": {
"type": "string",
"format": "cid",
"description": "CID of the exact revision indexed."
},
"uri": {
"type": "string",
"format": "at-uri",
"description": "The comment's AT-URI."
},
"author": {
"ref": "#actorView",
"type": "ref",
"description": "Who wrote it."
},
"record": {
"type": "unknown",
"description": "The pub.oysters.comment record, rebuilt from the indexed fields. See postView.record."
},
"indexedAt": {
"type": "string",
"format": "datetime",
"description": "When this board first saw the record."
},
"upvoteCount": {
"type": "integer",
"minimum": 0,
"description": "Live upvotes on this comment."
}
},
"description": "One comment in a discussion."
},
"threadViewPost": {
"type": "object",
"required": [
"post"
],
"properties": {
"post": {
"ref": "#postView",
"type": "ref",
"description": "The submission the discussion is about."
},
"replies": {
"type": "array",
"items": {
"ref": "#threadViewComment",
"type": "ref"
},
"description": "Top-level comments, each with their own replies."
}
},
"description": "A submission and its whole discussion."
},
"threadViewComment": {
"type": "object",
"required": [
"comment"
],
"properties": {
"comment": {
"ref": "#commentView",
"type": "ref",
"description": "The comment at this node."
},
"replies": {
"type": "array",
"items": {
"ref": "#threadViewComment",
"type": "ref"
},
"description": "Direct replies, each with their own replies. Empty at the depth limit rather than absent, so a client can tell a leaf from a truncation only by comparing against the depth it asked for."
}
},
"description": "A comment and its replies, nested. Replies are ordered the way the board displays them: by weighted score, ties broken by age."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}