com.getorbyt.community.defs

getorbyt.com

Schema Diff

+16 -1

From

CID
bafyreidpwly4zle...
Indexed At
2026-09-02 18:57 UTC
View this version

To

CID
bafyreiezb7zkrs3...
Indexed At
2026-09-13 19:26 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 6 non-breaking changes.

Non-Breaking Changes (6)
  • AddedVertex AddedVertex { vertex_id: "com.getorbyt.community.defs#feedItem.playbackToken" }
  • AddedVertex AddedVertex { vertex_id: "com.getorbyt.community.defs#transferView.cancelledByDid" }
  • AddedVertex AddedVertex { vertex_id: "com.getorbyt.community.defs#view.avatarVideo" }
  • AddedEdge AddedEdge { src: "com.getorbyt.community.defs#feedItem", tgt: "com.getorbyt.community.defs#feedItem.playbackToken", kind: "prop", name: Some("playbackToken") }
  • AddedEdge AddedEdge { src: "com.getorbyt.community.defs#transferView", tgt: "com.getorbyt.community.defs#transferView.cancelledByDid", kind: "prop", name: Some("cancelledByDid") }
  • AddedEdge AddedEdge { src: "com.getorbyt.community.defs#view", tgt: "com.getorbyt.community.defs#view.avatarVideo", kind: "prop", name: Some("avatarVideo") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "com.getorbyt.community.defs#feedItem.playbackToken" }
  • AddedVertex { vertex_id: "com.getorbyt.community.defs#transferView.cancelledByDid" }
  • AddedVertex { vertex_id: "com.getorbyt.community.defs#view.avatarVideo" }

Additional Notes

  • Non-breaking: AddedEdge { src: "com.getorbyt.community.defs#feedItem", tgt: "com.getorbyt.community.defs#feedItem.playbackToken", kind: "prop", name: Some("playbackToken") }
  • Non-breaking: AddedEdge { src: "com.getorbyt.community.defs#transferView", tgt: "com.getorbyt.community.defs#transferView.cancelledByDid", kind: "prop", name: Some("cancelledByDid") }
  • Non-breaking: AddedEdge { src: "com.getorbyt.community.defs#view", tgt: "com.getorbyt.community.defs#view.avatarVideo", kind: "prop", name: Some("avatarVideo") }
1 1
{
2 2
  "id": "com.getorbyt.community.defs",
3 3
  "defs": {
4 4
    "rule": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "text"
8 8
      ],
9 9
      "properties": {
10 10
        "text": {
11 11
          "type": "string",
12 12
          "maxLength": 500
13 13
        }
14 14
      },
15 15
      "description": "One Community rule. An object rather than a bare string so a title, an ordinal or a createdAt can be added later without a schema break."
16 16
    },
17 17
    "view": {
18 18
      "type": "object",
19 19
      "required": [
20 20
        "uri",
21 21
        "cid",
22 22
        "name",
23 23
        "ownerDid",
24 24
        "createdAt"
25 25
      ],
26 26
      "properties": {
27 27
        "cid": {
28 28
          "type": "string",
29 29
          "format": "cid"
30 30
        },
31 31
        "uri": {
32 32
          "type": "string",
33 33
          "format": "at-uri"
34 34
        },
35 35
        "name": {
36 36
          "type": "string",
37 37
          "maxLength": 63,
38 38
          "minLength": 2
39 39
        },
40 40
        "rules": {
41 41
          "type": "array",
42 42
          "items": {
43 43
            "ref": "#rule",
44 44
            "type": "ref"
45 45
          },
46 46
          "maxLength": 20
47 47
        },
48 48
        "access": {
49 49
          "type": "string",
50 50
          "description": "How Community content is accessed. Public is the only enabled value; clients must fail closed for unknown values.",
51 51
          "knownValues": [
52 52
            "public"
53 53
          ]
54 54
        },
55 55
        "avatar": {
56 56
          "type": "string",
57 -
          "format": "uri"
57 +
          "format": "uri",
58 +
          "description": "The Community's artwork as an image. Animated where the source was, and the only artwork field a client without a video player should read."
58 59
        },
59 60
        "labels": {
60 61
          "type": "array",
61 62
          "items": {
62 63
            "ref": "com.atproto.label.defs#label",
63 64
            "type": "ref"
64 65
          },
65 66
          "description": "Labels applied to this Community. Clients moderate against these exactly as they do app.bsky.feed.defs#postView labels."
66 67
        },
67 68
        "viewer": {
68 69
          "ref": "#viewerState",
69 70
          "type": "ref"
70 71
        },
71 72
        "ownerDid": {
72 73
          "type": "string",
73 74
          "format": "did",
74 75
          "description": "The account whose repository holds the Community declaration record. Clients hydrate it to a profile through their authenticated Bluesky AppView."
75 76
        },
76 77
        "createdAt": {
77 78
          "type": "string",
78 79
          "format": "datetime"
79 80
        },
80 81
        "postCount": {
81 82
          "type": "integer",
82 83
          "minimum": 0
83 84
        },
84 85
        "updatedAt": {
85 86
          "type": "string",
86 87
          "format": "datetime"
87 88
        },
88 89
        "postPolicy": {
89 90
          "type": "string",
90 91
          "description": "The raw value its owner wrote, not the value this service resolved. Absent means anyone, which is also how a server that predates this field behaves.",
91 92
          "knownValues": [
92 93
            "anyone",
93 94
            "members",
94 95
            "moderators"
95 96
          ]
96 97
        },
97 98
        "accentColor": {
98 99
          "type": "string",
99 100
          "maxLength": 32
100 101
        },
102 +
        "avatarVideo": {
103 +
          "type": "string",
104 +
          "format": "uri",
105 +
          "description": "A looping, silent MP4 rendition of the same artwork, when the owner supplied one. Clients that can play video use it for a full-bleed header and fall back to `avatar`; clients that cannot ignore it. It never replaces `avatar`, which stays the still or animated image every surface that is not a video player renders."
106 +
        },
101 107
        "description": {
102 108
          "type": "string",
103 109
          "maxLength": 2000
104 110
        },
105 111
        "memberCount": {
106 112
          "type": "integer",
107 113
          "minimum": 0
108 114
        },
109 115
        "viewerActions": {
110 116
          "type": "array",
111 117
          "items": {
112 118
            "type": "string",
113 119
            "knownValues": [
114 120
              "edit",
115 121
              "unpublish",
116 122
              "publish",
117 123
              "transfer",
118 124
              "delete",
119 125
              "view-reports",
120 126
              "view-audit-log"
121 127
            ]
122 128
          },
123 129
          "maxLength": 32,
124 130
          "description": "Actions the authenticated viewer may perform, decided by the service. Clients render only recognized values and infer nothing from role."
125 131
        },
126 132
        "declarationUri": {
127 133
          "type": "string",
128 134
          "format": "at-uri",
129 135
          "description": "The live declaration record. Absent means it is the same as uri."
130 136
        },
131 137
        "publicationState": {
132 138
          "type": "string",
133 139
          "description": "Service-owned lifecycle state. Absent means published. Unknown values must be treated as unavailable.",
134 140
          "knownValues": [
135 141
            "published",
136 142
            "unpublished",
137 143
            "deleting",
138 144
            "deleted"
139 145
          ]
140 146
        }
141 147
      },
142 148
      "description": "A hydrated Community. Only the fields that identify the Community are required; counts and viewer state are optional so a cheaper view can omit them without a schema break."
143 149
    },
144 150
    "feedItem": {
145 151
      "type": "object",
146 152
      "required": [
147 153
        "post"
148 154
      ],
149 155
      "properties": {
150 156
        "post": {
151 157
          "type": "string",
152 158
          "format": "at-uri",
153 159
          "description": "The linked app.bsky.feed.post URI. Clients hydrate it through their authenticated Bluesky AppView."
154 160
        },
155 161
        "pinned": {
156 162
          "type": "boolean",
157 163
          "default": false
158 164
        },
159 165
        "status": {
160 166
          "type": "string",
161 167
          "description": "Community-level state; absent means visible. `removed` is a moderator removal scoped to this Community; the underlying app.bsky.feed.post remains live on the network. Only the author and Community moderators receive removed items.",
162 168
          "knownValues": [
163 169
            "visible",
164 170
            "removed"
165 171
          ]
166 172
        },
167 173
        "removedAt": {
168 174
          "type": "string",
169 175
          "format": "datetime"
170 176
        },
171 177
        "removedBy": {
172 178
          "type": "string",
173 179
          "format": "did"
174 180
        },
181 +
        "playbackToken": {
182 +
          "type": "string",
183 +
          "description": "Server-issued, viewer-bound token proving this item was served to this viewer for this post. Clients pass it back to com.getorbyt.video.recordLoop after a completed playback."
184 +
        },
175 185
        "removedReason": {
176 186
          "type": "string",
177 187
          "maxLength": 1000,
178 188
          "description": "Present only for the post author and Community moderators."
179 189
        },
180 190
        "removalActionId": {
181 191
          "type": "string",
182 192
          "maxLength": 128,
183 193
          "description": "Stable identifier for this specific removal. Present to the author and moderators and used to bind one appeal to one removal."
184 194
        }
185 195
      }
186 196
    },
187 197
    "appealView": {
188 198
      "type": "object",
189 199
      "required": [
190 200
        "id",
191 201
        "community",
192 202
        "post",
193 203
        "removalActionId",
194 204
        "authorDid",
195 205
        "text",
196 206
        "status",
197 207
        "createdAt"
198 208
      ],
199 209
      "properties": {
200 210
        "id": {
201 211
          "type": "string",
202 212
          "maxLength": 128
203 213
        },
204 214
        "post": {
205 215
          "type": "string",
206 216
          "format": "at-uri"
207 217
        },
208 218
        "text": {
209 219
          "type": "string",
210 220
          "maxLength": 2000
211 221
        },
212 222
        "status": {
213 223
          "type": "string",
214 224
          "knownValues": [
215 225
            "open",
216 226
            "resolved"
217 227
          ]
218 228
        },
219 229
        "authorDid": {
220 230
          "type": "string",
221 231
          "format": "did"
222 232
        },
223 233
        "community": {
224 234
          "type": "string",
225 235
          "format": "at-uri"
226 236
        },
227 237
        "createdAt": {
228 238
          "type": "string",
229 239
          "format": "datetime"
230 240
        },
231 241
        "resolution": {
232 242
          "type": "string",
233 243
          "knownValues": [
234 244
            "upheld",
235 245
            "restored"
236 246
          ]
237 247
        },
238 248
        "resolvedAt": {
239 249
          "type": "string",
240 250
          "format": "datetime"
241 251
        },
242 252
        "resolvedByDid": {
243 253
          "type": "string",
244 254
          "format": "did"
245 255
        },
246 256
        "resolutionNote": {
247 257
          "type": "string",
248 258
          "maxLength": 2000
249 259
        },
250 260
        "removalActionId": {
251 261
          "type": "string",
252 262
          "maxLength": 128
253 263
        }
254 264
      }
255 265
    },
256 266
    "auditEvent": {
257 267
      "type": "object",
258 268
      "required": [
259 269
        "id",
260 270
        "community",
261 271
        "kind",
262 272
        "actorDid",
263 273
        "createdAt"
264 274
      ],
265 275
      "properties": {
266 276
        "id": {
267 277
          "type": "string",
268 278
          "maxLength": 128
269 279
        },
270 280
        "kind": {
271 281
          "type": "string",
272 282
          "knownValues": [
273 283
            "published",
274 284
            "unpublished",
275 285
            "deletion-begun",
276 286
            "deletion-cancelled",
277 287
            "deleted",
278 288
            "transfer-invited",
279 289
            "transfer-accepted",
280 290
            "transfer-cancelled",
281 291
            "transfer-completed",
282 292
            "member-role-changed",
283 293
            "member-muted",
284 294
            "member-unmuted",
285 295
            "member-banned",
286 296
            "member-unbanned",
287 297
            "post-removed",
288 298
            "post-restored",
289 299
            "post-pinned",
290 300
            "post-unpinned",
291 301
            "report-created",
292 302
            "report-resolved",
293 303
            "appeal-created",
294 304
            "appeal-resolved"
295 305
          ]
296 306
        },
297 307
        "summary": {
298 308
          "type": "string",
299 309
          "maxLength": 2000
300 310
        },
301 311
        "actorDid": {
302 312
          "type": "string",
303 313
          "format": "did"
304 314
        },
305 315
        "community": {
306 316
          "type": "string",
307 317
          "format": "at-uri"
308 318
        },
309 319
        "createdAt": {
310 320
          "type": "string",
311 321
          "format": "datetime"
312 322
        },
313 323
        "subjectDid": {
314 324
          "type": "string",
315 325
          "format": "did"
316 326
        },
317 327
        "subjectUri": {
318 328
          "type": "string",
319 329
          "format": "at-uri"
320 330
        }
321 331
      }
322 332
    },
323 333
    "memberView": {
324 334
      "type": "object",
325 335
      "required": [
326 336
        "did"
327 337
      ],
328 338
      "properties": {
329 339
        "did": {
330 340
          "type": "string",
331 341
          "format": "did"
332 342
        },
333 343
        "role": {
334 344
          "type": "string",
335 345
          "description": "Absent means member.",
336 346
          "knownValues": [
337 347
            "owner",
338 348
            "moderator",
339 349
            "member"
340 350
          ]
341 351
        },
342 352
        "status": {
343 353
          "type": "string",
344 354
          "description": "Absent means active.",
345 355
          "knownValues": [
346 356
            "active",
347 357
            "muted",
348 358
            "banned"
349 359
          ]
350 360
        },
351 361
        "joinedAt": {
352 362
          "type": "string",
353 363
          "format": "datetime"
354 364
        },
355 365
        "membershipUri": {
356 366
          "type": "string",
357 367
          "format": "at-uri"
358 368
        },
359 369
        "viewerActions": {
360 370
          "type": "array",
361 371
          "items": {
362 372
            "type": "string",
363 373
            "knownValues": [
364 374
              "setRole",
365 375
              "mute",
366 376
              "unmute",
367 377
              "ban",
368 378
              "unban"
369 379
            ]
370 380
          },
371 381
          "maxLength": 16,
372 382
          "description": "The manageMember actions this viewer may take on this member, decided by the service. A client renders only the values it recognises and offers nothing else, so a change to who may do what reaches installed clients without a release. Absent means the service predates this field, not that no action is permitted — a client should fall back to its own rules only then."
373 383
        }
374 384
      }
375 385
    },
376 386
    "reportView": {
377 387
      "type": "object",
378 388
      "required": [
379 389
        "id",
380 390
        "community",
381 391
        "post",
382 392
        "reporterDid",
383 393
        "reason",
384 394
        "status",
385 395
        "createdAt"
386 396
      ],
387 397
      "properties": {
388 398
        "id": {
389 399
          "type": "string",
390 400
          "maxLength": 128
391 401
        },
392 402
        "post": {
393 403
          "type": "string",
394 404
          "format": "at-uri"
395 405
        },
396 406
        "reason": {
397 407
          "type": "string",
398 408
          "maxLength": 2000
399 409
        },
400 410
        "status": {
401 411
          "type": "string",
402 412
          "knownValues": [
403 413
            "open",
404 414
            "resolved"
405 415
          ]
406 416
        },
407 417
        "community": {
408 418
          "type": "string",
409 419
          "format": "at-uri"
410 420
        },
411 421
        "createdAt": {
412 422
          "type": "string",
413 423
          "format": "datetime"
414 424
        },
415 425
        "resolution": {
416 426
          "type": "string",
417 427
          "knownValues": [
418 428
            "removed",
419 429
            "dismissed"
420 430
          ]
421 431
        },
422 432
        "resolvedAt": {
423 433
          "type": "string",
424 434
          "format": "datetime"
425 435
        },
426 436
        "reporterDid": {
427 437
          "type": "string",
428 438
          "format": "did"
429 439
        },
430 440
        "resolvedByDid": {
431 441
          "type": "string",
432 442
          "format": "did"
433 443
        },
434 444
        "resolutionNote": {
435 445
          "type": "string",
436 446
          "maxLength": 2000
437 447
        }
438 448
      }
439 449
    },
440 450
    "viewerState": {
441 451
      "type": "object",
442 452
      "properties": {
443 453
        "role": {
444 454
          "type": "string",
445 455
          "knownValues": [
446 456
            "owner",
447 457
            "moderator",
448 458
            "member"
449 459
          ]
450 460
        },
451 461
        "canPost": {
452 462
          "type": "boolean",
453 463
          "default": false
454 464
        },
455 465
        "canManage": {
456 466
          "type": "boolean",
457 467
          "default": false
458 468
        },
459 469
        "canModerate": {
460 470
          "type": "boolean",
461 471
          "default": false
462 472
        },
463 473
        "membershipUri": {
464 474
          "type": "string",
465 475
          "format": "at-uri"
466 476
        },
467 477
        "canAssignRoles": {
468 478
          "type": "boolean",
469 479
          "default": false,
470 480
          "description": "Whether this viewer may promote or demote another member. Separate from canManage, which is authority over the declaration record itself and belongs only to the repository that holds it. A service may grant administration to an account that does not hold the record."
471 481
        },
472 482
        "membershipStatus": {
473 483
          "type": "string",
474 484
          "description": "Absent means none.",
475 485
          "knownValues": [
476 486
            "none",
477 487
            "active",
478 488
            "muted",
479 489
            "banned"
480 490
          ]
481 491
        },
482 492
        "canListRestrictedMembers": {
483 493
          "type": "boolean",
484 494
          "default": false,
485 495
          "description": "Whether listMembers will answer this viewer for a status other than active. Stated rather than inferred from canModerate so the rule can change without a client release; a client that predates this field may fall back to canModerate."
486 496
        }
487 497
      },
488 498
      "description": "The requesting account's relationship to a Community. Every field is optional; an absent field means the viewer holds no membership and no privilege."
489 499
    },
490 500
    "writeStatus": {
491 501
      "type": "object",
492 502
      "required": [
493 503
        "uri",
494 504
        "status"
495 505
      ],
496 506
      "properties": {
497 507
        "uri": {
498 508
          "type": "string",
499 509
          "format": "at-uri"
500 510
        },
501 511
        "error": {
502 512
          "type": "string",
503 513
          "maxLength": 1000,
504 514
          "description": "Why the record was rejected. Present only for `rejected`."
505 515
        },
506 516
        "status": {
507 517
          "type": "string",
508 518
          "description": "`pending` means the record has not reached this service yet, which is the normal state for a few seconds after a write. `rejected` means it will never be indexed as written.",
509 519
          "knownValues": [
510 520
            "indexed",
511 521
            "pending",
512 522
            "rejected",
513 523
            "deleted"
514 524
          ]
515 525
        },
516 526
        "indexedAt": {
517 527
          "type": "string",
518 528
          "format": "datetime"
519 529
        }
520 530
      },
521 531
      "description": "The fate of one record the caller wrote to their own repository."
522 532
    },
523 533
    "transferView": {
524 534
      "type": "object",
525 535
      "required": [
526 536
        "id",
527 537
        "community",
528 538
        "fromDid",
529 539
        "toDid",
530 540
        "status",
531 541
        "expiresAt",
532 542
        "createdAt"
533 543
      ],
534 544
      "properties": {
535 545
        "id": {
536 546
          "type": "string",
537 547
          "maxLength": 128
538 548
        },
539 549
        "toDid": {
540 550
          "type": "string",
541 551
          "format": "did"
542 552
        },
543 553
        "status": {
544 554
          "type": "string",
545 555
          "knownValues": [
546 556
            "pending",
547 557
            "accepted",
548 558
            "completed",
549 559
            "cancelled",
550 560
            "expired"
551 561
          ]
552 562
        },
553 563
        "fromDid": {
554 564
          "type": "string",
555 565
          "format": "did"
556 566
        },
557 567
        "community": {
558 568
          "type": "string",
559 569
          "format": "at-uri"
560 570
        },
561 571
        "createdAt": {
562 572
          "type": "string",
563 573
          "format": "datetime"
564 574
        },
565 575
        "expiresAt": {
566 576
          "type": "string",
567 577
          "format": "datetime"
568 578
        },
569 579
        "updatedAt": {
570 580
          "type": "string",
571 581
          "format": "datetime"
572 582
        },
583 +
        "cancelledByDid": {
584 +
          "type": "string",
585 +
          "format": "did",
586 +
          "description": "Who ended the invitation. Present only once status is cancelled, and the one thing that tells a withdrawal by the inviting account apart from a decline by the invited one."
587 +
        },
573 588
        "replacementDeclarationUri": {
574 589
          "type": "string",
575 590
          "format": "at-uri"
576 591
        }
577 592
      }
578 593
    }
579 594
  },
580 595
  "$type": "com.atproto.lexicon.schema",
581 596
  "lexicon": 1
582 597
}

Compare Other Versions

Lexicon Garden

@