app.bulleted.getOutline

lexicons.bulleted.app

Schema Diff

+16 -1

From

CID
bafyreigfwdttj4r...
Indexed At
2026-08-06 22:06 UTC
View this version

To

CID
bafyreiaajuzljme...
Indexed At
2026-08-15 22:07 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

1 breaking change, 3 non-breaking changes.

Breaking Changes (1)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.bulleted.getOutline#node", src: "app.bulleted.getOutline#node", tgt: "app.bulleted.getOutline#node.did", kind: "prop", name: Some("did") }
Non-Breaking Changes (3)
  • AddedVertex AddedVertex { vertex_id: "app.bulleted.getOutline#node.did" }
  • AddedVertex AddedVertex { vertex_id: "app.bulleted.getOutline#node.display" }
  • AddedEdge AddedEdge { src: "app.bulleted.getOutline#node", tgt: "app.bulleted.getOutline#node.display", kind: "prop", name: Some("display") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "app.bulleted.getOutline#node.did" }
  • AddedVertex { vertex_id: "app.bulleted.getOutline#node.display" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "app.bulleted.getOutline#node", src: "app.bulleted.getOutline#node", tgt: "app.bulleted.getOutline#node.did", kind: "prop", name: Some("did") }
  • Non-breaking: AddedEdge { src: "app.bulleted.getOutline#node", tgt: "app.bulleted.getOutline#node.display", kind: "prop", name: Some("display") }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "main": {
5 5
      "description": "The public outline for an identity, optionally zoomed to one bullet. Answers from this appview's index of public records; it does not read the identity's PDS. No authentication, because everything here is already public.",
6 6
      "errors": [
7 7
        {
8 8
          "description": "No such identity in this appview, or no such bullet in it. Also the answer for a record this appview has been asked to withhold: a status meaning 'this exists but is denied' is a way to enumerate the denylist.",
9 9
          "name": "NotFound"
10 10
        }
11 11
      ],
12 12
      "output": {
13 13
        "encoding": "application/json",
14 14
        "schema": {
15 15
          "properties": {
16 16
            "did": {
17 17
              "description": "The identity this outline belongs to, echoed back.",
18 18
              "format": "did",
19 19
              "type": "string"
20 20
            },
21 21
            "handle": {
22 22
              "description": "The handle this appview last observed for did. Absent when none has been observed. Never resolved on demand, so it may lag the network and must not be treated as authoritative.",
23 23
              "format": "handle",
24 24
              "type": "string"
25 25
            },
26 26
            "nodes": {
27 27
              "description": "Pre-order, siblings in sortKey order. Flat, not nested: parentage is in each node's parent field, exactly as it is in the records themselves.",
28 28
              "items": {
29 29
                "ref": "#node",
30 30
                "type": "ref"
31 31
              },
32 32
              "type": "array"
33 33
            },
34 34
            "outline": {
35 35
              "description": "The app.bulleted.outline record in effect at this level. It may have been written at an ancestor rather than here; uri says which, and there is deliberately no separate inherited flag because the URI already answers it.",
36 36
              "ref": "#outline",
37 37
              "type": "ref"
38 38
            },
39 39
            "root": {
40 40
              "description": "The zoomed bullet itself, so a caller can title the level without a second request. Absent when the whole outline was asked for.",
41 41
              "ref": "#node",
42 42
              "type": "ref"
43 43
            },
44 44
            "stop": {
45 45
              "description": "Which bound ended the walk. Present alongside truncated on purpose: one boolean is what most callers want, and a caller deciding whether to ask again with a larger depth needs to know which limit it hit.",
46 46
              "knownValues": [
47 47
                "complete",
48 48
                "depth",
49 49
                "limit"
50 50
              ],
51 51
              "type": "string"
52 52
            },
53 53
            "truncated": {
54 54
              "description": "Whether anything was left out. True whenever stop is not 'complete'.",
55 55
              "type": "boolean"
56 56
            }
57 57
          },
58 58
          "required": [
59 59
            "did",
60 60
            "nodes",
61 61
            "truncated"
62 62
          ],
63 63
          "type": "object"
64 64
        }
65 65
      },
66 66
      "parameters": {
67 67
        "properties": {
68 68
          "depth": {
69 69
            "default": 3,
70 70
            "description": "Levels below the root to return; 1 is the root's children only. Clamped rather than rejected, so a value outside the range is answered with the nearest one in range.",
71 71
            "maximum": 5,
72 72
            "minimum": 1,
73 73
            "type": "integer"
74 74
          },
75 75
          "did": {
76 76
            "description": "The identity whose outline to read. A DID and never a handle: a handle is a lease on a name, and resolving one here would make this endpoint an open resolver somebody else pays for.",
77 77
            "format": "did",
78 78
            "type": "string"
79 79
          },
80 80
          "limit": {
81 81
            "default": 10,
82 82
            "description": "Ceiling on nodes returned across ALL levels, not per level. Clamped rather than rejected. A per-level reading would make depth 5 with limit 100 a five-hundred-node answer to a request that said one hundred.",
83 83
            "maximum": 100,
84 84
            "minimum": 1,
85 85
            "type": "integer"
86 86
          },
87 87
          "node": {
88 88
            "description": "Record key of the bullet to zoom into. Absent means the whole outline. The record key rather than an AT-URI, matching /public/{did}/{rkey}: the identity is already named by did, and two fields that can disagree about it is a bug waiting to be written.",
89 89
            "type": "string"
90 90
          }
91 91
        },
92 92
        "required": [
93 93
          "did"
94 94
        ],
95 95
        "type": "params"
96 96
      },
97 97
      "type": "query"
98 98
    },
99 99
    "mirror": {
100 100
      "description": "Present when this row is an app.bulleted.mirror rather than a node. The row's uri addresses the mirror record in this identity's repository; original names the bullet it points at, which lives in another repository and is NOT expanded here. Ask for that identity's outline to read it.",
101 101
      "properties": {
102 102
        "original": {
103 103
          "description": "The app.bulleted.node this mirror renders.",
104 104
          "format": "at-uri",
105 105
          "type": "string"
106 106
        }
107 107
      },
108 108
      "required": [
109 109
        "original"
110 110
      ],
111 111
      "type": "object"
112 112
    },
113 113
    "node": {
114 114
      "description": "One row of an outline: an app.bulleted.node, or an app.bulleted.mirror standing in a sibling group beside them.",
115 115
      "properties": {
116 116
        "childCount": {
117 117
          "description": "How many children this bullet has, whether or not they are in this response. Without it a leaf and a bullet cut off by depth or limit are the same absence.",
118 118
          "type": "integer"
119 119
        },
120 120
        "cid": {
121 121
          "description": "The record CID as this appview last indexed it.",
122 122
          "format": "cid",
123 123
          "type": "string"
124 124
        },
125 125
        "completedAt": {
126 126
          "description": "Presence means completed; there is no separate boolean anywhere in this system.",
127 127
          "format": "datetime",
128 128
          "type": "string"
129 129
        },
130 130
        "createdAt": {
131 131
          "format": "datetime",
132 132
          "type": "string"
133 133
        },
134 +
        "did": {
135 +
          "description": "The repository this record lives in. Usually the identity the request named, and NOT always: an outline whose app.bulleted.outline admits contributors answers with their records too, rendered in place among the author's own. Read this rather than parsing the authority out of uri.",
136 +
          "format": "did",
137 +
          "type": "string"
138 +
        },
139 +
        "display": {
140 +
          "description": "Whether this row's children are shown when a reader has no preference of their own, verbatim as stored. Absent means expanded, as does any unrecognized value. Absent on a mirror, which renders another repository's subtree and has no hint of its own.",
141 +
          "knownValues": [
142 +
            "expanded",
143 +
            "collapsed"
144 +
          ],
145 +
          "type": "string"
146 +
        },
134 147
        "facets": {
135 148
          "description": "Rich text annotations over text, as stored. Byte ranges, so they index text as UTF-8.",
136 149
          "items": {
137 150
            "ref": "app.bsky.richtext.facet",
138 151
            "type": "ref"
139 152
          },
140 153
          "type": "array"
141 154
        },
142 155
        "layout": {
143 156
          "description": "How the bullet renders, verbatim as stored. An open set: a value written by a later version arrives unchanged rather than folded onto bullet.",
144 157
          "knownValues": [
145 158
            "bullet",
146 159
            "todo",
147 160
            "h1",
148 161
            "h2",
149 162
            "h3",
150 163
            "codeBlock",
151 164
            "quoteBlock"
152 165
          ],
153 166
          "type": "string"
154 167
        },
155 168
        "mirror": {
156 169
          "ref": "#mirror",
157 170
          "type": "ref"
158 171
        },
159 172
        "note": {
160 173
          "description": "The body of this bullet's app.bulleted.note, if it has one. Co-keyed with the bullet by the parallel-key rule, so it needs no URI of its own here.",
161 174
          "type": "string"
162 175
        },
163 176
        "parent": {
164 177
          "description": "The bullet this one hangs under. Absent means top level of the identity's outline, which is not the same as top level of this response — a zoomed answer's rows all carry a parent.",
165 178
          "format": "at-uri",
166 179
          "type": "string"
167 180
        },
168 181
        "rkey": {
169 182
          "description": "The record key.",
170 183
          "type": "string"
171 184
        },
172 185
        "sortKey": {
173 186
          "description": "Fractional index ordering this row among its siblings.",
174 187
          "type": "string"
175 188
        },
176 189
        "text": {
177 190
          "description": "The bullet's text, unrendered.",
178 191
          "type": "string"
179 192
        },
180 193
        "uri": {
181 194
          "description": "The record's own AT-URI.",
182 195
          "format": "at-uri",
183 196
          "type": "string"
184 197
        }
185 198
      },
186 199
      "required": [
187 200
        "uri",
188 201
        "cid",
189 202
        "rkey",
203 +
        "did",
190 204
        "sortKey",
191 205
        "text"
192 206
      ],
193 207
      "type": "object"
194 208
    },
195 209
    "outline": {
196 210
      "description": "An app.bulleted.outline record, as it applies to the level that was asked for.",
197 211
      "properties": {
198 212
        "description": {
199 213
          "type": "string"
200 214
        },
201 215
        "image": {
202 216
          "description": "Absolute URL of the preview image, served through this appview's blob proxy rather than as a raw blob reference, because a caller cannot fetch a blob without also knowing the PDS.",
203 217
          "format": "uri",
204 218
          "type": "string"
205 219
        },
206 220
        "imageAlt": {
207 221
          "type": "string"
208 222
        },
209 223
        "title": {
210 224
          "type": "string"
211 225
        },
212 226
        "uri": {
213 227
          "description": "The outline record this came from. Compare its rkey against the level to tell an inherited title from one written here.",
214 228
          "format": "at-uri",
215 229
          "type": "string"
216 230
        }
217 231
      },
218 232
      "required": [
219 233
        "uri"
220 234
      ],
221 235
      "type": "object"
222 236
    }
223 237
  },
224 238
  "id": "app.bulleted.getOutline",
225 -
  "lexicon": 1
239 +
  "lexicon": 1,
240 +
  "revision": 1
226 241
}

Compare Other Versions

Lexicon Garden

@