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