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