fyi.opensocial.site
Schema Diff
+39 -1
Compatibility Analysis
Breaking Changes Detected
2 breaking changes, 12 non-breaking changes.
Breaking Changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "fyi.opensocial.site#appview", src: "fyi.opensocial.site#appview", tgt: "fyi.opensocial.site#appview.service", kind: "prop", name: Some("service") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "fyi.opensocial.site#appview", src: "fyi.opensocial.site#appview", tgt: "fyi.opensocial.site#appview.prefix", kind: "prop", name: Some("prefix") }
Non-Breaking Changes (12)
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.site#appview" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.site#appview.prefix" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.site#appview.service" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.site#tab.appviews" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.site#tab.appviews:items" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.site#tab.network" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.site#tab.network:items" }
- AddedEdge AddedEdge { src: "fyi.opensocial.site#tab", tgt: "fyi.opensocial.site#tab.appviews", kind: "prop", name: Some("appviews") }
- AddedEdge AddedEdge { src: "fyi.opensocial.site#tab", tgt: "fyi.opensocial.site#tab.network", kind: "prop", name: Some("network") }
- AddedEdge AddedEdge { src: "fyi.opensocial.site#tab.appviews", tgt: "fyi.opensocial.site#tab.appviews:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "fyi.opensocial.site#tab.appviews:items", tgt: "fyi.opensocial.site#appview", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "fyi.opensocial.site#tab.network", tgt: "fyi.opensocial.site#tab.network:items", kind: "items", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "fyi.opensocial.site#appview" }AddedVertex { vertex_id: "fyi.opensocial.site#appview.prefix" }AddedVertex { vertex_id: "fyi.opensocial.site#appview.service" }AddedVertex { vertex_id: "fyi.opensocial.site#tab.appviews" }AddedVertex { vertex_id: "fyi.opensocial.site#tab.appviews:items" }AddedVertex { vertex_id: "fyi.opensocial.site#tab.network" }AddedVertex { vertex_id: "fyi.opensocial.site#tab.network:items" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "fyi.opensocial.site#appview", src: "fyi.opensocial.site#appview", tgt: "fyi.opensocial.site#appview.service", kind: "prop", name: Some("service") }
- Breaking: RequiredEdgeAdded { vertex_id: "fyi.opensocial.site#appview", src: "fyi.opensocial.site#appview", tgt: "fyi.opensocial.site#appview.prefix", kind: "prop", name: Some("prefix") }
- Non-breaking: AddedEdge { src: "fyi.opensocial.site#tab", tgt: "fyi.opensocial.site#tab.appviews", kind: "prop", name: Some("appviews") }
- Non-breaking: AddedEdge { src: "fyi.opensocial.site#tab", tgt: "fyi.opensocial.site#tab.network", kind: "prop", name: Some("network") }
- Non-breaking: AddedEdge { src: "fyi.opensocial.site#tab.appviews", tgt: "fyi.opensocial.site#tab.appviews:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "fyi.opensocial.site#tab.appviews:items", tgt: "fyi.opensocial.site#appview", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "fyi.opensocial.site#tab.network", tgt: "fyi.opensocial.site#tab.network:items", kind: "items", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
+
"appview": {
5
+
"description": "An app server a tab reads for the viewer: what its methods' names start with, and the service, by DID and id.",
6
+
"properties": {
7
+
"prefix": {
8
+
"description": "social.grain",
9
+
"maxLength": 253,
10
+
"type": "string"
11
+
},
12
+
"service": {
13
+
"description": "did:web:grain.social#grain_appview",
14
+
"maxLength": 2048,
15
+
"type": "string"
16
+
}
17
+
},
18
+
"required": [
19
+
"prefix",
20
+
"service"
21
+
],
22
+
"type": "object"
23
+
},
4
24
"channel": {
5
25
"properties": {
6
26
"front": {
7
27
"description": "The site's front page, drawn across the whole window with nothing around it, at every path at the group's address but the channels' (/c/<channel>/<tab>). Members land in the channels at the address itself, and see it at any other of its paths. One tab at most, and one anyone may see.",
8
28
"type": "boolean"
9
29
},
10
30
"members": {
11
31
"description": "Shown to members only.",
12
32
"type": "boolean"
13
33
},
14
34
"name": {
15
35
"maxGraphemes": 64,
16
36
"maxLength": 640,
17
37
"type": "string"
18
38
},
19
39
"roles": {
20
40
"description": "Shown only to members with one of these roles, by the group's role ids: a channel for those who run part of the group. Implies members.",
21
41
"items": {
22
42
"maxLength": 128,
23
43
"type": "string"
24
44
},
25
45
"maxLength": 20,
26
46
"type": "array"
27
47
},
28
48
"slug": {
29
49
"description": "Lowercase letters, digits and dashes; its address within the site.",
30
50
"maxLength": 64,
31
51
"type": "string"
32
52
},
33
53
"tabs": {
34
54
"items": {
35
55
"ref": "#tab",
36
56
"type": "ref"
37
57
},
38
58
"maxLength": 50,
39
59
"type": "array"
40
60
}
41
61
},
42
62
"required": [
43
63
"slug",
44
64
"tabs"
45
65
],
46
66
"type": "object"
47
67
},
48
68
"file": {
49
69
"properties": {
50
70
"file": {
51
71
"maxSize": 5000000,
52
72
"type": "blob"
53
73
},
54
74
"path": {
55
75
"maxLength": 512,
56
76
"type": "string"
57
77
}
58
78
},
59
79
"required": [
60
80
"path",
61
81
"file"
62
82
],
63
83
"type": "object"
64
84
},
65
85
"main": {
66
86
"description": "A group's site, in its members space: channels of tabs, shown one at a time, each a whole HTML document drawn in a sandboxed frame. Authored by the group DID; written through putSite by whoever holds group.configure. Anyone else is handed only its public part, by the host. A group without one is shown the starter.",
67
87
"key": "literal:self",
68
88
"record": {
69
89
"properties": {
70
90
"channels": {
71
91
"items": {
72
92
"ref": "#channel",
73
93
"type": "ref"
74
94
},
75
95
"maxLength": 50,
76
96
"type": "array"
77
97
},
78
98
"files": {
79
99
"description": "Everything the site is made of, by path. A tab's page is `<channel>/<tab>.html`, or `<channel>/<tab>/index.html` with what it uses beside it; `site.css` is put in front of every tab.",
80
100
"items": {
81
101
"ref": "#file",
82
102
"type": "ref"
83
103
},
84
104
"maxLength": 500,
85
105
"type": "array"
86
106
},
87
107
"theme": {
88
108
"ref": "#theme",
89
109
"type": "ref"
90
110
},
91
111
"updatedAt": {
92
112
"format": "datetime",
93
113
"type": "string"
94
114
}
95
115
},
96
116
"required": [
97
117
"channels",
98
118
"files",
99
119
"updatedAt"
100
120
],
101
121
"type": "object"
102
122
},
103
123
"type": "record"
104
124
},
105
125
"tab": {
106
126
"properties": {
107
127
"about": {
108
128
"description": "The one thing it is for, which its page shows: an event's or a chat room's URI in one of the group's spaces, a board's space, or a member's DID. Its tab comes and goes with it.",
109
129
"maxLength": 512,
110
130
"type": "string"
111
131
},
132
+
"appviews": {
133
+
"description": "The app servers it reads for the viewer, by the start of their methods' names. Bluesky's, for app.bsky, needs no naming.",
134
+
"items": {
135
+
"ref": "fyi.opensocial.site#appview",
136
+
"type": "ref"
137
+
},
138
+
"maxLength": 10,
139
+
"type": "array"
140
+
},
112
141
"asGroup": {
113
142
"description": "What it writes as the group rather than as the viewer, and the kind of space each goes in.",
114
143
"items": {
115
144
"ref": "fyi.opensocial.template#asGroup",
116
145
"type": "ref"
117
146
},
118
147
"type": "array"
119
148
},
120
149
"calls": {
121
-
"description": "The host methods it may call for the viewer.",
150
+
"description": "The methods it may call for the viewer: the host's, and an app server's, like Bluesky's.",
122
151
"items": {
123
152
"format": "nsid",
124
153
"type": "string"
125
154
},
126
155
"maxLength": 50,
127
156
"type": "array"
128
157
},
129
158
"cid": {
130
159
"description": "With a template URI: that version only.",
131
160
"format": "cid",
132
161
"type": "string"
133
162
},
134
163
"labels": {
135
164
"description": "Its words for what it lets people do, by record kind or method.",
136
165
"items": {
137
166
"ref": "fyi.opensocial.template#label",
138
167
"type": "ref"
139
168
},
140
169
"type": "array"
141
170
},
142
171
"members": {
143
172
"description": "Shown to members only.",
144
173
"type": "boolean"
145
174
},
175
+
"network": {
176
+
"description": "Collections it reads from everyone on the network who writes them, not only the group and its members: the host keeps each one whole from when the site is saved, and won't save one more accounts write than it can keep.",
177
+
"items": {
178
+
"format": "nsid",
179
+
"type": "string"
180
+
},
181
+
"maxLength": 20,
182
+
"type": "array"
183
+
},
146
184
"page": {
147
185
"description": "One of the site's files to show, which tabs alike share (every event's tab, say). Read before the tab's own file and its template.",
148
186
"maxLength": 256,
149
187
"type": "string"
150
188
},
151
189
"reads": {
152
190
"description": "The collections it may read from the group, its members and its spaces.",
153
191
"items": {
154
192
"format": "nsid",
155
193
"type": "string"
156
194
},
157
195
"maxLength": 50,
158
196
"type": "array"
159
197
},
160
198
"roles": {
161
199
"description": "For members with one of these roles, by the group's role ids. Others don't see it, or its tab. Members only.",
162
200
"items": {
163
201
"maxLength": 64,
164
202
"type": "string"
165
203
},
166
204
"maxLength": 20,
167
205
"type": "array"
168
206
},
169
207
"slug": {
170
208
"maxLength": 64,
171
209
"type": "string"
172
210
},
173
211
"template": {
174
212
"description": "Drawn from a template when the site has no page of its own for it: a bundled one by name, a fyi.opensocial.template by URI, or a member's fyi.opensocial.page by its URI in the group's space for members' work. A member's page is only ever drawn for members.",
175
213
"maxLength": 512,
176
214
"type": "string"
177
215
},
178
216
"title": {
179
217
"maxGraphemes": 64,
180
218
"maxLength": 640,
181
219
"type": "string"
182
220
},
183
221
"writes": {
184
222
"description": "The collections it may write for the viewer, in their account or one of the group's spaces.",
185
223
"items": {
186
224
"format": "nsid",
187
225
"type": "string"
188
226
},
189
227
"maxLength": 50,
190
228
"type": "array"
191
229
}
192
230
},
193
231
"required": [
194
232
"slug"
195
233
],
196
234
"type": "object"
197
235
},
198
236
"theme": {
199
237
"description": "Colours, fonts and corners as CSS values, and what sits behind the tabs.",
200
238
"properties": {
201
239
"accent": {
202
240
"maxLength": 200,
203
241
"type": "string"
204
242
},
205
243
"accentInk": {
206
244
"maxLength": 200,
207
245
"type": "string"
208
246
},
209
247
"bg": {
210
248
"maxLength": 200,
211
249
"type": "string"
212
250
},
213
251
"fontBody": {
214
252
"maxLength": 200,
215
253
"type": "string"
216
254
},
217
255
"fontDisplay": {
218
256
"maxLength": 200,
219
257
"type": "string"
220
258
},
221
259
"ink": {
222
260
"maxLength": 200,
223
261
"type": "string"
224
262
},
225
263
"line": {
226
264
"maxLength": 200,
227
265
"type": "string"
228
266
},
229
267
"muted": {
230
268
"maxLength": 200,
231
269
"type": "string"
232
270
},
233
271
"radius": {
234
272
"maxLength": 200,
235
273
"type": "string"
236
274
},
237
275
"surface": {
238
276
"maxLength": 200,
239
277
"type": "string"
240
278
},
241
279
"wallpaper": {
242
280
"description": "A built-in wallpaper by name, `banner` for the group's banner, or the path of an image in the site's files.",
243
281
"maxLength": 512,
244
282
"type": "string"
245
283
}
246
284
},
247
285
"type": "object"
248
286
}
249
287
},
250
288
"id": "fyi.opensocial.site",
251
289
"lexicon": 1
252
290
}