social.colibri.sync.subscribeEvents

colibri.social

Schema Diff

+5 -1

From

CID
bafyreiezrugguvg...
Indexed At
2026-07-29 16:12 UTC
View this version

To

CID
bafyreihrarl3uu6...
Indexed At
2026-08-15 21:21 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 2 non-breaking changes.

Non-Breaking Changes (2)
  • AddedVertex AddedVertex { vertex_id: "social.colibri.sync.subscribeEvents#messageEventData.live" }
  • AddedEdge AddedEdge { src: "social.colibri.sync.subscribeEvents#messageEventData", tgt: "social.colibri.sync.subscribeEvents#messageEventData.live", kind: "prop", name: Some("live") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "social.colibri.sync.subscribeEvents#messageEventData.live" }

Additional Notes

  • Non-breaking: AddedEdge { src: "social.colibri.sync.subscribeEvents#messageEventData", tgt: "social.colibri.sync.subscribeEvents#messageEventData.live", kind: "prop", name: Some("live") }
1 1
{
2 2
  "id": "social.colibri.sync.subscribeEvents",
3 3
  "defs": {
4 4
    "ack": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "type"
8 8
      ],
9 9
      "properties": {
10 10
        "type": {
11 11
          "type": "string",
12 12
          "const": "ack"
13 13
        }
14 14
      },
15 15
      "description": "Sent in response to a heartbeat message."
16 16
    },
17 17
    "main": {
18 18
      "type": "subscription",
19 19
      "errors": [
20 20
        {
21 -
          "name": "AuthRequired"
21 +
          "name": "AuthRequired",
22 +
          "description": "Missing, malformed, or unverifiable service auth."
22 23
        }
23 24
      ],
24 25
      "message": {
25 26
        "schema": {
26 27
          "refs": [
27 28
            "lex:social.colibri.sync.subscribeEvents#ack",
28 29
            "lex:social.colibri.sync.subscribeEvents#communityEvent",
29 30
            "lex:social.colibri.sync.subscribeEvents#memberEvent",
30 31
            "lex:social.colibri.sync.subscribeEvents#categoryEvent",
31 32
            "lex:social.colibri.sync.subscribeEvents#channelEvent",
32 33
            "lex:social.colibri.sync.subscribeEvents#messageEvent",
33 34
            "lex:social.colibri.sync.subscribeEvents#reactionEvent",
34 35
            "lex:social.colibri.sync.subscribeEvents#userEvent",
35 36
            "lex:social.colibri.sync.subscribeEvents#typingEvent",
36 37
            "lex:social.colibri.sync.subscribeEvents#voicePresenceEvent",
37 38
            "lex:social.colibri.sync.subscribeEvents#voiceStateEvent"
38 39
          ],
39 40
          "type": "union"
40 41
        }
41 42
      },
42 43
      "description": "Opens a WebSocket stream that transmits relevant events for the authenticated user."
43 44
    },
44 45
    "userEvent": {
45 46
      "type": "object",
46 47
      "required": [
47 48
        "type",
48 49
        "data"
49 50
      ],
50 51
      "properties": {
51 52
        "data": {
52 53
          "ref": "lex:social.colibri.sync.subscribeEvents#userEventData",
53 54
          "type": "ref"
54 55
        },
55 56
        "type": {
56 57
          "type": "string",
57 58
          "const": "user_event"
58 59
        }
59 60
      },
60 61
      "description": "Sent when a known user has updated their profile or Colibri status."
61 62
    },
62 63
    "userStatus": {
63 64
      "type": "object",
64 65
      "required": [
65 66
        "state",
66 67
        "text"
67 68
      ],
68 69
      "properties": {
69 70
        "text": {
70 71
          "type": "string"
71 72
        },
72 73
        "emoji": {
73 74
          "type": "string"
74 75
        },
75 76
        "state": {
76 77
          "type": "string",
77 78
          "knownValues": [
78 79
            "online",
79 80
            "away",
80 81
            "dnd",
81 82
            "offline"
82 83
          ]
83 84
        }
84 85
      }
85 86
    },
86 87
    "humEnvelope": {
87 88
      "type": "object",
88 89
      "required": [
89 90
        "origin",
90 91
        "id",
91 92
        "ttl",
92 93
        "subject",
93 94
        "community",
94 95
        "event"
95 96
      ],
96 97
      "properties": {
97 98
        "id": {
98 99
          "type": "string",
99 100
          "maxLength": 64,
100 101
          "description": "Unique id for this Hum, used by receivers to dedup across relay paths."
101 102
        },
102 103
        "ttl": {
103 104
          "type": "integer",
104 105
          "maximum": 8,
105 106
          "minimum": 0,
106 107
          "description": "Remaining relay hops. Decremented on each forward; a Hum at ttl 0 is delivered locally but never relayed."
107 108
        },
108 109
        "event": {
109 110
          "refs": [
110 111
            "lex:social.colibri.sync.subscribeEvents#userEvent",
111 112
            "lex:social.colibri.sync.subscribeEvents#typingEvent",
112 113
            "lex:social.colibri.sync.subscribeEvents#voicePresenceEvent",
113 114
            "lex:social.colibri.sync.subscribeEvents#voiceStateEvent"
114 115
          ],
115 116
          "type": "union",
116 117
          "description": "Ephemeral event payload. Only off-protocol types are permitted."
117 118
        },
118 119
        "origin": {
119 120
          "type": "string",
120 121
          "format": "did",
121 122
          "description": "DID of the AppView that first emitted this Hum."
122 123
        },
123 124
        "subject": {
124 125
          "type": "string",
125 126
          "format": "did",
126 127
          "description": "The user this event is about. Receiver MUST verify origin equals subject's declared presenceService before trusting or relaying."
127 128
        },
128 129
        "community": {
129 130
          "type": "string",
130 131
          "format": "at-uri",
131 132
          "description": "Community the event is scoped to. Receiver relays to local clients only if they are members of this community."
132 133
        }
133 134
      },
134 135
      "description": "An off-protocol event relayed between AppViews. The authenticated sender (inter-service auth JWT: aud = receiving AppView did:web, lxm = social.colibri.sync.sendHum) is the origin of record; `origin` is echoed for relay/loop control and MUST match the JWT issuer. Only off-protocol event types are permitted — on-protocol events are never carried by a Hum and are derived from the firehose instead."
135 136
    },
136 137
    "memberEvent": {
137 138
      "type": "object",
138 139
      "required": [
139 140
        "type",
140 141
        "data"
141 142
      ],
142 143
      "properties": {
143 144
        "data": {
144 145
          "ref": "lex:social.colibri.sync.subscribeEvents#memberEventData",
145 146
          "type": "ref"
146 147
        },
147 148
        "type": {
148 149
          "type": "string",
149 150
          "const": "member_event"
150 151
        }
151 152
      },
152 153
      "description": "Sent when a member has joined or left a community."
153 154
    },
154 155
    "typingEvent": {
155 156
      "type": "object",
156 157
      "required": [
157 158
        "type",
158 159
        "data"
159 160
      ],
160 161
      "properties": {
161 162
        "data": {
162 163
          "ref": "lex:social.colibri.sync.subscribeEvents#typingEventData",
163 164
          "type": "ref"
164 165
        },
165 166
        "type": {
166 167
          "type": "string",
167 168
          "const": "typing_event"
168 169
        }
169 170
      },
170 171
      "description": "Sent when a user is typing in a channel the client is viewing."
171 172
    },
172 173
    "userProfile": {
173 174
      "type": "object",
174 175
      "required": [
175 176
        "handle"
176 177
      ],
177 178
      "properties": {
178 179
        "avatar": {
179 180
          "type": "blob"
180 181
        },
181 182
        "banner": {
182 183
          "type": "blob"
183 184
        },
184 185
        "handle": {
185 186
          "type": "string",
186 187
          "format": "handle"
187 188
        },
188 189
        "description": {
189 190
          "type": "string"
190 191
        },
191 192
        "displayName": {
192 193
          "type": "string"
193 194
        }
194 195
      }
195 196
    },
196 197
    "channelEvent": {
197 198
      "type": "object",
198 199
      "required": [
199 200
        "type",
200 201
        "data"
201 202
      ],
202 203
      "properties": {
203 204
        "data": {
204 205
          "ref": "lex:social.colibri.sync.subscribeEvents#channelEventData",
205 206
          "type": "ref"
206 207
        },
207 208
        "type": {
208 209
          "type": "string",
209 210
          "const": "channel_event"
210 211
        }
211 212
      },
212 213
      "description": "Sent when a channel has been created, updated, or deleted."
213 214
    },
214 215
    "messageEvent": {
215 216
      "type": "object",
216 217
      "required": [
217 218
        "type",
218 219
        "data"
219 220
      ],
220 221
      "properties": {
221 222
        "data": {
222 223
          "ref": "lex:social.colibri.sync.subscribeEvents#messageEventData",
223 224
          "type": "ref"
224 225
        },
225 226
        "type": {
226 227
          "type": "string",
227 228
          "const": "message_event"
228 229
        }
229 230
      },
230 231
      "description": "Sent when a message has been sent, edited, or deleted."
231 232
    },
232 233
    "categoryEvent": {
233 234
      "type": "object",
234 235
      "required": [
235 236
        "type",
236 237
        "data"
237 238
      ],
238 239
      "properties": {
239 240
        "data": {
240 241
          "ref": "lex:social.colibri.sync.subscribeEvents#categoryEventData",
241 242
          "type": "ref"
242 243
        },
243 244
        "type": {
244 245
          "type": "string",
245 246
          "const": "category_event"
246 247
        }
247 248
      },
248 249
      "description": "Sent when a category has been created, updated, or deleted."
249 250
    },
250 251
    "reactionEvent": {
251 252
      "type": "object",
252 253
      "required": [
253 254
        "type",
254 255
        "data"
255 256
      ],
256 257
      "properties": {
257 258
        "data": {
258 259
          "ref": "lex:social.colibri.sync.subscribeEvents#reactionEventData",
259 260
          "type": "ref"
260 261
        },
261 262
        "type": {
262 263
          "type": "string",
263 264
          "const": "reaction_event"
264 265
        }
265 266
      },
266 267
      "description": "Sent when a reaction has been added to or removed from a message."
267 268
    },
268 269
    "userEventData": {
269 270
      "type": "object",
270 271
      "required": [
271 272
        "did",
272 273
        "profile"
273 274
      ],
274 275
      "properties": {
275 276
        "did": {
276 277
          "type": "string",
277 278
          "format": "did"
278 279
        },
279 280
        "status": {
280 281
          "ref": "lex:social.colibri.sync.subscribeEvents#userStatus",
281 282
          "type": "ref"
282 283
        },
283 284
        "profile": {
284 285
          "ref": "lex:social.colibri.sync.subscribeEvents#userProfile",
285 286
          "type": "ref"
286 287
        }
287 288
      }
288 289
    },
289 290
    "communityEvent": {
290 291
      "type": "object",
291 292
      "required": [
292 293
        "type",
293 294
        "data"
294 295
      ],
295 296
      "properties": {
296 297
        "data": {
297 298
          "ref": "lex:social.colibri.sync.subscribeEvents#communityEventData",
298 299
          "type": "ref"
299 300
        },
300 301
        "type": {
301 302
          "type": "string",
302 303
          "const": "community_event"
303 304
        }
304 305
      },
305 306
      "description": "Sent when a community has been updated or deleted."
306 307
    },
307 308
    "memberEventData": {
308 309
      "type": "object",
309 310
      "required": [
310 311
        "event",
311 312
        "community"
312 313
      ],
313 314
      "properties": {
314 315
        "event": {
315 316
          "type": "string",
316 317
          "knownValues": [
317 318
            "join",
318 319
            "leave",
319 320
            "roles_updated"
320 321
          ]
321 322
        },
322 323
        "member": {
323 324
          "ref": "lex:social.colibri.sync.subscribeEvents#memberEventMember",
324 325
          "type": "ref",
325 326
          "description": "The affected member, hydrated. Present on `join` and `roles_updated`."
326 327
        },
327 328
        "community": {
328 329
          "type": "string",
329 330
          "format": "at-uri"
330 331
        },
331 332
        "memberDid": {
332 333
          "type": "string",
333 334
          "format": "did",
334 335
          "description": "DID of the member who left. Present on `leave`."
335 336
        },
336 337
        "membership": {
337 338
          "type": "string",
338 339
          "format": "at-uri"
339 340
        }
340 341
      }
341 342
    },
342 343
    "typingEventData": {
343 344
      "type": "object",
344 345
      "required": [
345 346
        "event",
346 347
        "channel",
347 348
        "did"
348 349
      ],
349 350
      "properties": {
350 351
        "did": {
351 352
          "type": "string",
352 353
          "format": "did"
353 354
        },
354 355
        "event": {
355 356
          "type": "string",
356 357
          "knownValues": [
357 358
            "start",
358 359
            "stop"
359 360
          ]
360 361
        },
361 362
        "channel": {
362 363
          "type": "string",
363 364
          "format": "at-uri"
364 365
        }
365 366
      }
366 367
    },
367 368
    "voiceStateEvent": {
368 369
      "type": "object",
369 370
      "required": [
370 371
        "type",
371 372
        "data"
372 373
      ],
373 374
      "properties": {
374 375
        "data": {
375 376
          "ref": "lex:social.colibri.sync.subscribeEvents#voiceStateEventData",
376 377
          "type": "ref"
377 378
        },
378 379
        "type": {
379 380
          "type": "string",
380 381
          "const": "voice_state_event"
381 382
        }
382 383
      },
383 384
      "description": "Sent when a user's voice state changes within a voice channel. `muted` and `deafened` are the user's own choices; `serverMuted` and `serverDeafened` are moderator-applied and enforced by the SFU. Each field is absent when unchanged."
384 385
    },
385 386
    "channelEventData": {
386 387
      "type": "object",
387 388
      "required": [
388 389
        "event",
389 390
        "uri",
390 391
        "community"
391 392
      ],
392 393
      "properties": {
393 394
        "uri": {
394 395
          "type": "string",
395 396
          "format": "at-uri"
396 397
        },
397 398
        "name": {
398 399
          "type": "string"
399 400
        },
400 401
        "type": {
401 402
          "type": "string"
402 403
        },
403 404
        "event": {
404 405
          "type": "string",
405 406
          "knownValues": [
406 407
            "upsert",
407 408
            "delete"
408 409
          ]
409 410
        },
410 411
        "category": {
411 412
          "type": "string",
412 413
          "format": "at-uri"
413 414
        },
414 415
        "community": {
415 416
          "type": "string",
416 417
          "format": "at-uri"
417 418
        },
418 419
        "description": {
419 420
          "type": "string"
420 421
        }
421 422
      }
422 423
    },
423 424
    "messageEventData": {
424 425
      "type": "object",
425 426
      "required": [
426 427
        "event",
427 428
        "uri",
428 429
        "channel"
429 430
      ],
430 431
      "properties": {
431 432
        "uri": {
432 433
          "type": "string",
433 434
          "format": "at-uri"
434 435
        },
436 +
        "live": {
437 +
          "type": "boolean"
438 +
        },
435 439
        "text": {
436 440
          "type": "string"
437 441
        },
438 442
        "event": {
439 443
          "type": "string",
440 444
          "knownValues": [
441 445
            "upsert",
442 446
            "delete"
443 447
          ]
444 448
        },
445 449
        "edited": {
446 450
          "type": "boolean"
447 451
        },
448 452
        "facets": {
449 453
          "type": "array",
450 454
          "items": {
451 455
            "ref": "lex:social.colibri.richtext.facet",
452 456
            "type": "ref"
453 457
          }
454 458
        },
455 459
        "parent": {
456 460
          "type": "string",
457 461
          "format": "at-uri"
458 462
        },
459 463
        "channel": {
460 464
          "type": "string",
461 465
          "format": "at-uri"
462 466
        },
463 467
        "createdAt": {
464 468
          "type": "string",
465 469
          "format": "datetime"
466 470
        },
467 471
        "indexedAt": {
468 472
          "type": "string",
469 473
          "format": "datetime"
470 474
        },
471 475
        "attachments": {
472 476
          "type": "array",
473 477
          "items": {
474 478
            "type": "blob"
475 479
          }
476 480
        }
477 481
      }
478 482
    },
479 483
    "categoryEventData": {
480 484
      "type": "object",
481 485
      "required": [
482 486
        "event",
483 487
        "uri",
484 488
        "community"
485 489
      ],
486 490
      "properties": {
487 491
        "uri": {
488 492
          "type": "string",
489 493
          "format": "at-uri"
490 494
        },
491 495
        "name": {
492 496
          "type": "string"
493 497
        },
494 498
        "event": {
495 499
          "type": "string",
496 500
          "knownValues": [
497 501
            "upsert",
498 502
            "delete"
499 503
          ]
500 504
        },
501 505
        "community": {
502 506
          "type": "string",
503 507
          "format": "at-uri"
504 508
        },
505 509
        "channelOrder": {
506 510
          "type": "array",
507 511
          "items": {
508 512
            "type": "string",
509 513
            "format": "at-uri"
510 514
          }
511 515
        }
512 516
      }
513 517
    },
514 518
    "memberEventMember": {
515 519
      "type": "object",
516 520
      "required": [
517 521
        "did",
518 522
        "handle",
519 523
        "roles",
520 524
        "data"
521 525
      ],
522 526
      "properties": {
523 527
        "vc": {
524 528
          "type": "string",
525 529
          "format": "at-uri",
526 530
          "description": "AT-URI of the voice channel the member is currently connected to, if any. Only set when that channel belongs to `community`."
527 531
        },
528 532
        "did": {
529 533
          "type": "string",
530 534
          "format": "did"
531 535
        },
532 536
        "data": {
533 537
          "ref": "lex:social.colibri.actor.defs#actorData",
534 538
          "type": "ref"
535 539
        },
536 540
        "roles": {
537 541
          "type": "array",
538 542
          "items": {
539 543
            "type": "string",
540 544
            "format": "at-uri"
541 545
          }
542 546
        },
543 547
        "handle": {
544 548
          "type": "string",
545 549
          "format": "handle"
546 550
        },
547 551
        "vcMuted": {
548 552
          "type": "boolean"
549 553
        },
550 554
        "joinedAt": {
551 555
          "type": "string",
552 556
          "format": "datetime"
553 557
        },
554 558
        "nickname": {
555 559
          "type": "string"
556 560
        },
557 561
        "vcDeafened": {
558 562
          "type": "boolean"
559 563
        }
560 564
      },
561 565
      "description": "The affected member as carried by a member event. Mirrors `social.colibri.community.defs#memberView`, including the member's current voice channel state so a receiving client can place them in a voice channel without refetching."
562 566
    },
563 567
    "reactionEventData": {
564 568
      "type": "object",
565 569
      "required": [
566 570
        "event",
567 571
        "uri",
568 572
        "emoji",
569 573
        "target",
570 574
        "channel"
571 575
      ],
572 576
      "properties": {
573 577
        "uri": {
574 578
          "type": "string",
575 579
          "format": "at-uri"
576 580
        },
577 581
        "emoji": {
578 582
          "type": "string"
579 583
        },
580 584
        "event": {
581 585
          "type": "string",
582 586
          "knownValues": [
583 587
            "added",
584 588
            "removed"
585 589
          ]
586 590
        },
587 591
        "target": {
588 592
          "type": "string",
589 593
          "format": "at-uri"
590 594
        },
591 595
        "channel": {
592 596
          "type": "string",
593 597
          "format": "at-uri"
594 598
        }
595 599
      }
596 600
    },
597 601
    "communityEventData": {
598 602
      "type": "object",
599 603
      "required": [
600 604
        "event",
601 605
        "uri"
602 606
      ],
603 607
      "properties": {
604 608
        "uri": {
605 609
          "type": "string",
606 610
          "format": "at-uri"
607 611
        },
608 612
        "name": {
609 613
          "type": "string"
610 614
        },
611 615
        "event": {
612 616
          "type": "string",
613 617
          "knownValues": [
614 618
            "upsert",
615 619
            "delete"
616 620
          ]
617 621
        },
618 622
        "banner": {
619 623
          "type": "blob"
620 624
        },
621 625
        "picture": {
622 626
          "type": "blob"
623 627
        },
624 628
        "description": {
625 629
          "type": "string"
626 630
        },
627 631
        "categoryOrder": {
628 632
          "type": "array",
629 633
          "items": {
630 634
            "type": "string",
631 635
            "format": "at-uri"
632 636
          }
633 637
        },
634 638
        "requiresApprovalToJoin": {
635 639
          "type": "boolean"
636 640
        }
637 641
      }
638 642
    },
639 643
    "voicePresenceEvent": {
640 644
      "type": "object",
641 645
      "required": [
642 646
        "type",
643 647
        "data"
644 648
      ],
645 649
      "properties": {
646 650
        "data": {
647 651
          "ref": "lex:social.colibri.sync.subscribeEvents#voicePresenceEventData",
648 652
          "type": "ref"
649 653
        },
650 654
        "type": {
651 655
          "type": "string",
652 656
          "const": "voice_presence_event"
653 657
        }
654 658
      },
655 659
      "description": "Sent when a user joins or leaves a voice channel."
656 660
    },
657 661
    "voiceStateEventData": {
658 662
      "type": "object",
659 663
      "required": [
660 664
        "channel",
661 665
        "did"
662 666
      ],
663 667
      "properties": {
664 668
        "did": {
665 669
          "type": "string",
666 670
          "format": "did"
667 671
        },
668 672
        "muted": {
669 673
          "type": "boolean"
670 674
        },
671 675
        "channel": {
672 676
          "type": "string",
673 677
          "format": "at-uri"
674 678
        },
675 679
        "deafened": {
676 680
          "type": "boolean"
677 681
        },
678 682
        "serverMuted": {
679 683
          "type": "boolean"
680 684
        },
681 685
        "serverDeafened": {
682 686
          "type": "boolean"
683 687
        }
684 688
      }
685 689
    },
686 690
    "voicePresenceEventData": {
687 691
      "type": "object",
688 692
      "required": [
689 693
        "event",
690 694
        "channel",
691 695
        "did"
692 696
      ],
693 697
      "properties": {
694 698
        "did": {
695 699
          "type": "string",
696 700
          "format": "did"
697 701
        },
698 702
        "event": {
699 703
          "type": "string",
700 704
          "knownValues": [
701 705
            "join",
702 706
            "leave"
703 707
          ]
704 708
        },
705 709
        "channel": {
706 710
          "type": "string",
707 711
          "format": "at-uri"
708 712
        }
709 713
      }
710 714
    }
711 715
  },
712 716
  "$type": "com.atproto.lexicon.schema",
713 717
  "lexicon": 1,
714 718
  "revision": 1
715 719
}

Compare Other Versions

Lexicon Garden

@