com.getorbyt.community.defs
Schema Diff
+11 -1
Compatibility Analysis
Backward Compatible
Backward compatible. 4 non-breaking changes.
Non-Breaking Changes (4)
- AddedVertex AddedVertex { vertex_id: "com.getorbyt.community.defs#feedItem.playbackToken" }
- 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#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#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#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
},
573
583
"cancelledByDid": {
574
584
"type": "string",
575
585
"format": "did",
576
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."
577
587
},
578
588
"replacementDeclarationUri": {
579
589
"type": "string",
580
590
"format": "at-uri"
581
591
}
582
592
}
583
593
}
584
594
},
585
595
"$type": "com.atproto.lexicon.schema",
586
596
"lexicon": 1
587
597
}