com.getorbyt.community.defs
Schema Diff
+7 -1
Compatibility Analysis
Backward Compatible
Backward compatible. 2 non-breaking changes.
Non-Breaking Changes (2)
- AddedVertex AddedVertex { vertex_id: "com.getorbyt.community.defs#view.avatarVideo" }
- 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#view.avatarVideo" }
Additional Notes
- 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
},
175
181
"playbackToken": {
176
182
"type": "string",
177
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."
178
184
},
179
185
"removedReason": {
180
186
"type": "string",
181
187
"maxLength": 1000,
182
188
"description": "Present only for the post author and Community moderators."
183
189
},
184
190
"removalActionId": {
185
191
"type": "string",
186
192
"maxLength": 128,
187
193
"description": "Stable identifier for this specific removal. Present to the author and moderators and used to bind one appeal to one removal."
188
194
}
189
195
}
190
196
},
191
197
"appealView": {
192
198
"type": "object",
193
199
"required": [
194
200
"id",
195
201
"community",
196
202
"post",
197
203
"removalActionId",
198
204
"authorDid",
199
205
"text",
200
206
"status",
201
207
"createdAt"
202
208
],
203
209
"properties": {
204
210
"id": {
205
211
"type": "string",
206
212
"maxLength": 128
207
213
},
208
214
"post": {
209
215
"type": "string",
210
216
"format": "at-uri"
211
217
},
212
218
"text": {
213
219
"type": "string",
214
220
"maxLength": 2000
215
221
},
216
222
"status": {
217
223
"type": "string",
218
224
"knownValues": [
219
225
"open",
220
226
"resolved"
221
227
]
222
228
},
223
229
"authorDid": {
224
230
"type": "string",
225
231
"format": "did"
226
232
},
227
233
"community": {
228
234
"type": "string",
229
235
"format": "at-uri"
230
236
},
231
237
"createdAt": {
232
238
"type": "string",
233
239
"format": "datetime"
234
240
},
235
241
"resolution": {
236
242
"type": "string",
237
243
"knownValues": [
238
244
"upheld",
239
245
"restored"
240
246
]
241
247
},
242
248
"resolvedAt": {
243
249
"type": "string",
244
250
"format": "datetime"
245
251
},
246
252
"resolvedByDid": {
247
253
"type": "string",
248
254
"format": "did"
249
255
},
250
256
"resolutionNote": {
251
257
"type": "string",
252
258
"maxLength": 2000
253
259
},
254
260
"removalActionId": {
255
261
"type": "string",
256
262
"maxLength": 128
257
263
}
258
264
}
259
265
},
260
266
"auditEvent": {
261
267
"type": "object",
262
268
"required": [
263
269
"id",
264
270
"community",
265
271
"kind",
266
272
"actorDid",
267
273
"createdAt"
268
274
],
269
275
"properties": {
270
276
"id": {
271
277
"type": "string",
272
278
"maxLength": 128
273
279
},
274
280
"kind": {
275
281
"type": "string",
276
282
"knownValues": [
277
283
"published",
278
284
"unpublished",
279
285
"deletion-begun",
280
286
"deletion-cancelled",
281
287
"deleted",
282
288
"transfer-invited",
283
289
"transfer-accepted",
284
290
"transfer-cancelled",
285
291
"transfer-completed",
286
292
"member-role-changed",
287
293
"member-muted",
288
294
"member-unmuted",
289
295
"member-banned",
290
296
"member-unbanned",
291
297
"post-removed",
292
298
"post-restored",
293
299
"post-pinned",
294
300
"post-unpinned",
295
301
"report-created",
296
302
"report-resolved",
297
303
"appeal-created",
298
304
"appeal-resolved"
299
305
]
300
306
},
301
307
"summary": {
302
308
"type": "string",
303
309
"maxLength": 2000
304
310
},
305
311
"actorDid": {
306
312
"type": "string",
307
313
"format": "did"
308
314
},
309
315
"community": {
310
316
"type": "string",
311
317
"format": "at-uri"
312
318
},
313
319
"createdAt": {
314
320
"type": "string",
315
321
"format": "datetime"
316
322
},
317
323
"subjectDid": {
318
324
"type": "string",
319
325
"format": "did"
320
326
},
321
327
"subjectUri": {
322
328
"type": "string",
323
329
"format": "at-uri"
324
330
}
325
331
}
326
332
},
327
333
"memberView": {
328
334
"type": "object",
329
335
"required": [
330
336
"did"
331
337
],
332
338
"properties": {
333
339
"did": {
334
340
"type": "string",
335
341
"format": "did"
336
342
},
337
343
"role": {
338
344
"type": "string",
339
345
"description": "Absent means member.",
340
346
"knownValues": [
341
347
"owner",
342
348
"moderator",
343
349
"member"
344
350
]
345
351
},
346
352
"status": {
347
353
"type": "string",
348
354
"description": "Absent means active.",
349
355
"knownValues": [
350
356
"active",
351
357
"muted",
352
358
"banned"
353
359
]
354
360
},
355
361
"joinedAt": {
356
362
"type": "string",
357
363
"format": "datetime"
358
364
},
359
365
"membershipUri": {
360
366
"type": "string",
361
367
"format": "at-uri"
362
368
},
363
369
"viewerActions": {
364
370
"type": "array",
365
371
"items": {
366
372
"type": "string",
367
373
"knownValues": [
368
374
"setRole",
369
375
"mute",
370
376
"unmute",
371
377
"ban",
372
378
"unban"
373
379
]
374
380
},
375
381
"maxLength": 16,
376
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."
377
383
}
378
384
}
379
385
},
380
386
"reportView": {
381
387
"type": "object",
382
388
"required": [
383
389
"id",
384
390
"community",
385
391
"post",
386
392
"reporterDid",
387
393
"reason",
388
394
"status",
389
395
"createdAt"
390
396
],
391
397
"properties": {
392
398
"id": {
393
399
"type": "string",
394
400
"maxLength": 128
395
401
},
396
402
"post": {
397
403
"type": "string",
398
404
"format": "at-uri"
399
405
},
400
406
"reason": {
401
407
"type": "string",
402
408
"maxLength": 2000
403
409
},
404
410
"status": {
405
411
"type": "string",
406
412
"knownValues": [
407
413
"open",
408
414
"resolved"
409
415
]
410
416
},
411
417
"community": {
412
418
"type": "string",
413
419
"format": "at-uri"
414
420
},
415
421
"createdAt": {
416
422
"type": "string",
417
423
"format": "datetime"
418
424
},
419
425
"resolution": {
420
426
"type": "string",
421
427
"knownValues": [
422
428
"removed",
423
429
"dismissed"
424
430
]
425
431
},
426
432
"resolvedAt": {
427
433
"type": "string",
428
434
"format": "datetime"
429
435
},
430
436
"reporterDid": {
431
437
"type": "string",
432
438
"format": "did"
433
439
},
434
440
"resolvedByDid": {
435
441
"type": "string",
436
442
"format": "did"
437
443
},
438
444
"resolutionNote": {
439
445
"type": "string",
440
446
"maxLength": 2000
441
447
}
442
448
}
443
449
},
444
450
"viewerState": {
445
451
"type": "object",
446
452
"properties": {
447
453
"role": {
448
454
"type": "string",
449
455
"knownValues": [
450
456
"owner",
451
457
"moderator",
452
458
"member"
453
459
]
454
460
},
455
461
"canPost": {
456
462
"type": "boolean",
457
463
"default": false
458
464
},
459
465
"canManage": {
460
466
"type": "boolean",
461
467
"default": false
462
468
},
463
469
"canModerate": {
464
470
"type": "boolean",
465
471
"default": false
466
472
},
467
473
"membershipUri": {
468
474
"type": "string",
469
475
"format": "at-uri"
470
476
},
471
477
"canAssignRoles": {
472
478
"type": "boolean",
473
479
"default": false,
474
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."
475
481
},
476
482
"membershipStatus": {
477
483
"type": "string",
478
484
"description": "Absent means none.",
479
485
"knownValues": [
480
486
"none",
481
487
"active",
482
488
"muted",
483
489
"banned"
484
490
]
485
491
},
486
492
"canListRestrictedMembers": {
487
493
"type": "boolean",
488
494
"default": false,
489
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."
490
496
}
491
497
},
492
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."
493
499
},
494
500
"writeStatus": {
495
501
"type": "object",
496
502
"required": [
497
503
"uri",
498
504
"status"
499
505
],
500
506
"properties": {
501
507
"uri": {
502
508
"type": "string",
503
509
"format": "at-uri"
504
510
},
505
511
"error": {
506
512
"type": "string",
507
513
"maxLength": 1000,
508
514
"description": "Why the record was rejected. Present only for `rejected`."
509
515
},
510
516
"status": {
511
517
"type": "string",
512
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.",
513
519
"knownValues": [
514
520
"indexed",
515
521
"pending",
516
522
"rejected",
517
523
"deleted"
518
524
]
519
525
},
520
526
"indexedAt": {
521
527
"type": "string",
522
528
"format": "datetime"
523
529
}
524
530
},
525
531
"description": "The fate of one record the caller wrote to their own repository."
526
532
},
527
533
"transferView": {
528
534
"type": "object",
529
535
"required": [
530
536
"id",
531
537
"community",
532
538
"fromDid",
533
539
"toDid",
534
540
"status",
535
541
"expiresAt",
536
542
"createdAt"
537
543
],
538
544
"properties": {
539
545
"id": {
540
546
"type": "string",
541
547
"maxLength": 128
542
548
},
543
549
"toDid": {
544
550
"type": "string",
545
551
"format": "did"
546
552
},
547
553
"status": {
548
554
"type": "string",
549
555
"knownValues": [
550
556
"pending",
551
557
"accepted",
552
558
"completed",
553
559
"cancelled",
554
560
"expired"
555
561
]
556
562
},
557
563
"fromDid": {
558
564
"type": "string",
559
565
"format": "did"
560
566
},
561
567
"community": {
562
568
"type": "string",
563
569
"format": "at-uri"
564
570
},
565
571
"createdAt": {
566
572
"type": "string",
567
573
"format": "datetime"
568
574
},
569
575
"expiresAt": {
570
576
"type": "string",
571
577
"format": "datetime"
572
578
},
573
579
"updatedAt": {
574
580
"type": "string",
575
581
"format": "datetime"
576
582
},
577
583
"cancelledByDid": {
578
584
"type": "string",
579
585
"format": "did",
580
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."
581
587
},
582
588
"replacementDeclarationUri": {
583
589
"type": "string",
584
590
"format": "at-uri"
585
591
}
586
592
}
587
593
}
588
594
},
589
595
"$type": "com.atproto.lexicon.schema",
590
596
"lexicon": 1
591
597
}