social.colibri.beta.actor.defs

colibri.social

Schema Diff

+114 -5

From

CID
bafyreiav2qovor5...
Indexed At
2026-08-23 14:58 UTC
View this version

To

CID
bafyreigphoaoi45...
Indexed At
2026-08-25 14:45 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

6 breaking changes, 36 non-breaking changes.

Breaking Changes (6)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#mutedChannel", src: "social.colibri.beta.actor.defs#mutedChannel", tgt: "social.colibri.beta.actor.defs#mutedChannel.channel", kind: "prop", name: Some("channel") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.source", kind: "prop", name: Some("source") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.title", kind: "prop", name: Some("title") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.kind", kind: "prop", name: Some("kind") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#mutedActor", src: "social.colibri.beta.actor.defs#mutedActor", tgt: "social.colibri.beta.actor.defs#mutedActor.did", kind: "prop", name: Some("did") }
  • KindChanged KindChanged { vertex_id: "social.colibri.beta.actor.defs#mute.subject", old_kind: "string", new_kind: "union" }
Non-Breaking Changes (36)
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.detail" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.endsAt" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.imageUri" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.kind" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.linkUri" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.source" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.startedAt" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.subtitle" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.title" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mute.subject:variant0" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mute.subject:variant1" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedActor" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedActor.did" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedChannel" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedChannel.channel" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#preferences.shareActivity" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#presence.activity" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#voiceState.serverDeafened" }
  • AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#voiceState.serverMuted" }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.detail", kind: "prop", name: Some("detail") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.endsAt", kind: "prop", name: Some("endsAt") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.imageUri", kind: "prop", name: Some("imageUri") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.linkUri", kind: "prop", name: Some("linkUri") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.startedAt", kind: "prop", name: Some("startedAt") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.subtitle", kind: "prop", name: Some("subtitle") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject", tgt: "social.colibri.beta.actor.defs#mute.subject:variant0", kind: "variant", name: Some("#mutedActor") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject", tgt: "social.colibri.beta.actor.defs#mute.subject:variant1", kind: "variant", name: Some("#mutedChannel") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject:variant0", tgt: "social.colibri.beta.actor.defs#mutedActor", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject:variant1", tgt: "social.colibri.beta.actor.defs#mutedChannel", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#preferences", tgt: "social.colibri.beta.actor.defs#preferences.shareActivity", kind: "prop", name: Some("shareActivity") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#presence", tgt: "social.colibri.beta.actor.defs#presence.activity", kind: "prop", name: Some("activity") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#presence.activity", tgt: "social.colibri.beta.actor.defs#activity", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#voiceState", tgt: "social.colibri.beta.actor.defs#voiceState.serverDeafened", kind: "prop", name: Some("serverDeafened") }
  • AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#voiceState", tgt: "social.colibri.beta.actor.defs#voiceState.serverMuted", kind: "prop", name: Some("serverMuted") }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "social.colibri.beta.actor.defs#mute.subject", sort: "format" }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.detail" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.endsAt" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.imageUri" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.kind" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.linkUri" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.source" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.startedAt" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.subtitle" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.title" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mute.subject:variant0" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mute.subject:variant1" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedActor" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedActor.did" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedChannel" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedChannel.channel" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#preferences.shareActivity" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#presence.activity" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#voiceState.serverDeafened" }
  • AddedVertex { vertex_id: "social.colibri.beta.actor.defs#voiceState.serverMuted" }

Constraint Changes

  • ConstraintRemoved ConstraintRemoved { vertex_id: "social.colibri.beta.actor.defs#mute.subject", sort: "format" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#mutedActor", src: "social.colibri.beta.actor.defs#mutedActor", tgt: "social.colibri.beta.actor.defs#mutedActor.did", kind: "prop", name: Some("did") }
  • Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#mutedChannel", src: "social.colibri.beta.actor.defs#mutedChannel", tgt: "social.colibri.beta.actor.defs#mutedChannel.channel", kind: "prop", name: Some("channel") }
  • Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.source", kind: "prop", name: Some("source") }
  • Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.title", kind: "prop", name: Some("title") }
  • Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.kind", kind: "prop", name: Some("kind") }
  • Breaking: KindChanged { vertex_id: "social.colibri.beta.actor.defs#mute.subject", old_kind: "string", new_kind: "union" }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.detail", kind: "prop", name: Some("detail") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.endsAt", kind: "prop", name: Some("endsAt") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.imageUri", kind: "prop", name: Some("imageUri") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.linkUri", kind: "prop", name: Some("linkUri") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.startedAt", kind: "prop", name: Some("startedAt") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.subtitle", kind: "prop", name: Some("subtitle") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject", tgt: "social.colibri.beta.actor.defs#mute.subject:variant0", kind: "variant", name: Some("#mutedActor") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject", tgt: "social.colibri.beta.actor.defs#mute.subject:variant1", kind: "variant", name: Some("#mutedChannel") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject:variant0", tgt: "social.colibri.beta.actor.defs#mutedActor", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject:variant1", tgt: "social.colibri.beta.actor.defs#mutedChannel", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#preferences", tgt: "social.colibri.beta.actor.defs#preferences.shareActivity", kind: "prop", name: Some("shareActivity") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#presence", tgt: "social.colibri.beta.actor.defs#presence.activity", kind: "prop", name: Some("activity") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#presence.activity", tgt: "social.colibri.beta.actor.defs#activity", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#voiceState", tgt: "social.colibri.beta.actor.defs#voiceState.serverDeafened", kind: "prop", name: Some("serverDeafened") }
  • Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#voiceState", tgt: "social.colibri.beta.actor.defs#voiceState.serverMuted", kind: "prop", name: Some("serverMuted") }
1 1
{
2 2
  "id": "social.colibri.beta.actor.defs",
3 3
  "defs": {
4 4
    "mute": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "subject",
8 8
        "createdAt"
9 9
      ],
10 10
      "properties": {
11 11
        "subject": {
12 -
          "type": "string",
13 -
          "format": "did",
14 -
          "description": "The muted user or community."
12 +
          "refs": [
13 +
            "#mutedActor",
14 +
            "#mutedChannel"
15 +
          ],
16 +
          "type": "union",
17 +
          "closed": true,
18 +
          "description": "What is muted. A user or a community is named by DID, a channel by its space."
15 19
        },
16 20
        "createdAt": {
17 21
          "type": "string",
18 22
          "format": "datetime",
19 23
          "description": "When the mute was created."
20 24
        }
21 25
      },
22 26
      "description": "A muted subject."
23 27
    },
24 28
    "status": {
25 29
      "type": "object",
26 30
      "required": [
27 31
        "text"
28 32
      ],
29 33
      "properties": {
30 34
        "text": {
31 35
          "type": "string",
32 36
          "maxLength": 32,
33 37
          "description": "The status text."
34 38
        },
35 39
        "emoji": {
36 40
          "type": "string",
37 41
          "description": "An emoji shown beside the status."
38 42
        }
39 43
      },
40 44
      "description": "A user's status line."
41 45
    },
46 +
    "activity": {
47 +
      "type": "object",
48 +
      "required": [
49 +
        "kind",
50 +
        "title",
51 +
        "source"
52 +
      ],
53 +
      "properties": {
54 +
        "kind": {
55 +
          "type": "string",
56 +
          "description": "What sort of activity this is. A client that does not know a kind falls back to naming the source.",
57 +
          "knownValues": [
58 +
            "listening",
59 +
            "playing",
60 +
            "streaming"
61 +
          ]
62 +
        },
63 +
        "title": {
64 +
          "type": "string",
65 +
          "maxLength": 256,
66 +
          "description": "The main line: a track, a game, or a stream title."
67 +
        },
68 +
        "detail": {
69 +
          "type": "string",
70 +
          "maxLength": 256,
71 +
          "description": "A third line naming where the title sits, such as the album."
72 +
        },
73 +
        "endsAt": {
74 +
          "type": "string",
75 +
          "format": "datetime",
76 +
          "description": "After this the activity is no longer current. The AppView clears it and says so, and a client treats a lapsed activity as absent."
77 +
        },
78 +
        "source": {
79 +
          "type": "string",
80 +
          "maxLength": 64,
81 +
          "description": "The service the activity was read from, such as 'teal.fm'."
82 +
        },
83 +
        "linkUri": {
84 +
          "type": "string",
85 +
          "format": "uri",
86 +
          "description": "Where the activity points, such as the track's page on the service it was played from."
87 +
        },
88 +
        "imageUri": {
89 +
          "type": "string",
90 +
          "format": "uri",
91 +
          "description": "Artwork for the activity, served by this AppView. Absent when none could be resolved."
92 +
        },
93 +
        "subtitle": {
94 +
          "type": "string",
95 +
          "maxLength": 256,
96 +
          "description": "The second line, such as the artist."
97 +
        },
98 +
        "startedAt": {
99 +
          "type": "string",
100 +
          "format": "datetime",
101 +
          "description": "When the activity began."
102 +
        }
103 +
      },
104 +
      "description": "Something the user is doing right now, read from another service they publish to. A client renders it beside their presence."
105 +
    },
42 106
    "presence": {
43 107
      "type": "object",
44 108
      "required": [
45 109
        "onlineState"
46 110
      ],
47 111
      "properties": {
48 112
        "voice": {
49 113
          "ref": "#voiceState",
50 114
          "type": "ref",
51 115
          "description": "Where the user is connected for voice, if anywhere."
52 116
        },
53 117
        "status": {
54 118
          "ref": "#status",
55 119
          "type": "ref",
56 120
          "description": "The user's status line."
57 121
        },
122 +
        "activity": {
123 +
          "ref": "#activity",
124 +
          "type": "ref",
125 +
          "description": "What the user is doing right now, when they share it and the AppView has something current."
126 +
        },
58 127
        "onlineState": {
59 128
          "type": "string",
60 129
          "description": "Derived online state.",
61 130
          "knownValues": [
62 131
            "online",
63 132
            "away",
64 133
            "dnd",
65 134
            "offline"
66 135
          ]
67 136
        }
68 137
      },
69 138
      "description": "A user's live, off-protocol state."
70 139
    },
140 +
    "mutedActor": {
141 +
      "type": "object",
142 +
      "required": [
143 +
        "did"
144 +
      ],
145 +
      "properties": {
146 +
        "did": {
147 +
          "type": "string",
148 +
          "format": "did",
149 +
          "description": "The muted user or community."
150 +
        }
151 +
      },
152 +
      "description": "A muted user or community."
153 +
    },
71 154
    "voiceState": {
72 155
      "type": "object",
73 156
      "required": [
74 157
        "channel"
75 158
      ],
76 159
      "properties": {
77 160
        "muted": {
78 161
          "type": "boolean",
79 -
          "description": "Whether the user has muted their microphone."
162 +
          "description": "Whether the user's microphone is muted, for any reason."
80 163
        },
81 164
        "channel": {
82 165
          "type": "string",
83 166
          "format": "space-ref",
84 167
          "description": "The voice channel the user is connected to."
85 168
        },
86 169
        "deafened": {
87 170
          "type": "boolean",
88 -
          "description": "Whether the user has deafened themselves."
171 +
          "description": "Whether the user has incoming audio silenced, for any reason."
172 +
        },
173 +
        "serverMuted": {
174 +
          "type": "boolean",
175 +
          "description": "Whether a moderator muted them. When this is true they cannot unmute themselves, and a client must not offer them the control."
176 +
        },
177 +
        "serverDeafened": {
178 +
          "type": "boolean",
179 +
          "description": "Whether a moderator deafened them. When this is true they cannot undeafen themselves."
89 180
        }
90 181
      },
91 182
      "description": "A user's voice connection."
92 183
    },
93 184
    "preferences": {
94 185
      "type": "object",
95 186
      "required": [
96 187
        "notificationLevel",
97 188
        "communityOrder",
98 189
        "mutes",
99 190
        "gifFavorites"
100 191
      ],
101 192
      "properties": {
102 193
        "mutes": {
103 194
          "type": "array",
104 195
          "items": {
105 196
            "ref": "#mute",
106 197
            "type": "ref"
107 198
          },
108 199
          "description": "Subjects the user has muted."
109 200
        },
110 201
        "gifFavorites": {
111 202
          "type": "array",
112 203
          "items": {
113 204
            "ref": "social.colibri.beta.embed.defs#gifView",
114 205
            "type": "ref"
115 206
          },
116 207
          "description": "GIFs saved from the picker, stored whole."
117 208
        },
209 +
        "shareActivity": {
210 +
          "type": "boolean",
211 +
          "description": "Whether the AppView may read what the user is listening to and show it to others."
212 +
        },
118 213
        "communityOrder": {
119 214
          "type": "array",
120 215
          "items": {
121 216
            "type": "string",
122 217
            "format": "did",
123 218
            "description": "A community."
124 219
          },
125 220
          "description": "Communities in preferred sidebar order."
126 221
        },
127 222
        "notificationLevel": {
128 223
          "type": "string",
129 224
          "description": "Which messages produce a notification.",
130 225
          "knownValues": [
131 226
            "all",
132 227
            "mentionsAndReplies"
133 228
          ]
134 229
        }
135 230
      },
136 231
      "description": "The authenticated user's own settings, as the AppView currently holds them."
137 232
    },
138 233
    "profileView": {
139 234
      "type": "object",
140 235
      "required": [
141 236
        "did",
142 237
        "handle",
143 238
        "displayName",
144 239
        "isBot",
145 240
        "syncBluesky"
146 241
      ],
147 242
      "properties": {
148 243
        "did": {
149 244
          "type": "string",
150 245
          "format": "did",
151 246
          "description": "The user's DID."
152 247
        },
153 248
        "isBot": {
154 249
          "type": "boolean",
155 250
          "description": "Whether the account is labelled as an automated account."
156 251
        },
157 252
        "theme": {
158 253
          "ref": "social.colibri.beta.actor.profile#theme",
159 254
          "type": "ref",
160 255
          "description": "Colibri-only profile theming, read from the profile record even when the mirrored fields come from Bluesky."
161 256
        },
162 257
        "avatar": {
163 258
          "type": "string",
164 259
          "format": "uri",
165 260
          "description": "URL of the user's avatar, served by this AppView's blob proxy."
166 261
        },
167 262
        "banner": {
168 263
          "type": "string",
169 264
          "format": "uri",
170 265
          "description": "URL of the user's profile banner, served by this AppView's blob proxy."
171 266
        },
172 267
        "handle": {
173 268
          "type": "string",
174 269
          "format": "handle",
175 270
          "description": "The user's handle, or 'handle.invalid' when it does not resolve."
176 271
        },
177 272
        "presence": {
178 273
          "ref": "#presence",
179 274
          "type": "ref",
180 275
          "description": "Live presence, when the AppView is tracking any."
181 276
        },
182 277
        "description": {
183 278
          "type": "string",
184 279
          "description": "Resolved bio."
185 280
        },
186 281
        "displayName": {
187 282
          "type": "string",
188 283
          "description": "Resolved display name, falling back to the handle."
189 284
        },
190 285
        "syncBluesky": {
191 286
          "type": "boolean",
192 287
          "description": "Whether the mirrored profile fields come from app.bsky.actor.profile."
193 288
        },
194 289
        "preferredBadge": {
195 290
          "type": "string",
196 291
          "description": "Label value of the badge the user chose to display."
197 292
        }
198 293
      },
199 294
      "description": "A Colibri user as the AppView serves them: identity, resolved profile, and presence."
295 +
    },
296 +
    "mutedChannel": {
297 +
      "type": "object",
298 +
      "required": [
299 +
        "channel"
300 +
      ],
301 +
      "properties": {
302 +
        "channel": {
303 +
          "type": "string",
304 +
          "format": "space-ref",
305 +
          "description": "The muted channel's space."
306 +
        }
307 +
      },
308 +
      "description": "A muted channel. Muting a channel silences it without leaving the community it belongs to."
200 309
    }
201 310
  },
202 311
  "$type": "com.atproto.lexicon.schema",
203 312
  "lexicon": 1
204 313
}

Compare Other Versions

Lexicon Garden

@