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