space.highport.sites.defs
Schema Diff
+42 -9
Compatibility Analysis
Backward Compatible
Backward compatible. 13 non-breaking changes.
Non-Breaking Changes (13)
- AddedVertex AddedVertex { vertex_id: "space.highport.sites.defs#access" }
- AddedVertex AddedVertex { vertex_id: "space.highport.sites.defs#access.audience" }
- AddedVertex AddedVertex { vertex_id: "space.highport.sites.defs#access.audience:variant0" }
- AddedVertex AddedVertex { vertex_id: "space.highport.sites.defs#access.requireAuth" }
- AddedVertex AddedVertex { vertex_id: "space.highport.sites.defs#access.requireAuth:items" }
- AddedVertex AddedVertex { vertex_id: "space.highport.sites.defs#spaceMembers" }
- AddedVertex AddedVertex { vertex_id: "space.highport.sites.defs#wellKnown.standardSitePublication" }
- AddedEdge AddedEdge { src: "space.highport.sites.defs#access", tgt: "space.highport.sites.defs#access.audience", kind: "prop", name: Some("audience") }
- AddedEdge AddedEdge { src: "space.highport.sites.defs#access", tgt: "space.highport.sites.defs#access.requireAuth", kind: "prop", name: Some("requireAuth") }
- AddedEdge AddedEdge { src: "space.highport.sites.defs#access.audience", tgt: "space.highport.sites.defs#access.audience:variant0", kind: "variant", name: Some("space.highport.sites.defs#spaceMembers") }
- AddedEdge AddedEdge { src: "space.highport.sites.defs#access.audience:variant0", tgt: "space.highport.sites.defs#spaceMembers", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "space.highport.sites.defs#access.requireAuth", tgt: "space.highport.sites.defs#access.requireAuth:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "space.highport.sites.defs#wellKnown", tgt: "space.highport.sites.defs#wellKnown.standardSitePublication", kind: "prop", name: Some("standardSitePublication") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "space.highport.sites.defs#access" }AddedVertex { vertex_id: "space.highport.sites.defs#access.audience" }AddedVertex { vertex_id: "space.highport.sites.defs#access.audience:variant0" }AddedVertex { vertex_id: "space.highport.sites.defs#access.requireAuth" }AddedVertex { vertex_id: "space.highport.sites.defs#access.requireAuth:items" }AddedVertex { vertex_id: "space.highport.sites.defs#spaceMembers" }AddedVertex { vertex_id: "space.highport.sites.defs#wellKnown.standardSitePublication" }
Additional Notes
- Non-breaking: AddedEdge { src: "space.highport.sites.defs#access", tgt: "space.highport.sites.defs#access.audience", kind: "prop", name: Some("audience") }
- Non-breaking: AddedEdge { src: "space.highport.sites.defs#access", tgt: "space.highport.sites.defs#access.requireAuth", kind: "prop", name: Some("requireAuth") }
- Non-breaking: AddedEdge { src: "space.highport.sites.defs#access.audience", tgt: "space.highport.sites.defs#access.audience:variant0", kind: "variant", name: Some("space.highport.sites.defs#spaceMembers") }
- Non-breaking: AddedEdge { src: "space.highport.sites.defs#access.audience:variant0", tgt: "space.highport.sites.defs#spaceMembers", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "space.highport.sites.defs#access.requireAuth", tgt: "space.highport.sites.defs#access.requireAuth:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "space.highport.sites.defs#wellKnown", tgt: "space.highport.sites.defs#wellKnown.standardSitePublication", kind: "prop", name: Some("standardSitePublication") }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
+
"access": {
5
+
"description": "Which parts of a site require a signed-in reader, and which readers qualify. Absent means nothing is gated and the owner budget decides every path, which suits most sites. This is content policy, not billing: it lives in the record, so it moves with the site and anyone can read it.",
6
+
"properties": {
7
+
"audience": {
8
+
"closed": true,
9
+
"description": "Who the requireAuth paths are for. Absent means any signed-in reader. Only meaningful alongside requireAuth. The union is closed so that a host which does not recognize an audience rejects the record instead of opening the gate to everyone.",
10
+
"refs": [
11
+
"space.highport.sites.defs#spaceMembers"
12
+
],
13
+
"type": "union"
14
+
},
15
+
"requireAuth": {
16
+
"description": "Path prefixes that always require a signed-in reader and always bill that reader, whatever the owner budget says. Matched against the normalized request path, so a prefix covers everything under it. \"/\" gates the whole site, the same as an owner budget of zero.",
17
+
"items": {
18
+
"maxLength": 1024,
19
+
"type": "string"
20
+
},
21
+
"maxLength": 64,
22
+
"type": "array"
23
+
}
24
+
},
25
+
"type": "object"
26
+
},
4
27
"manifest": {
5
-
"description": "A path-keyed bundle of resources — bard's camelCase subset of a MASL bundle-mode document. The inline source of a site, or the content of a tile.",
28
+
"description": "A bundle of resources keyed by path, using bard's camelCase subset of a MASL bundle-mode document. It is a site's inline source or a tile's content.",
6
29
"properties": {
7
30
"name": {
8
-
"description": "Bundle name. Required when the manifest is a tile's content; optional for an inline site source.",
31
+
"description": "Bundle name. Required for tile content, optional for an inline site source.",
9
32
"maxGraphemes": 100,
10
33
"maxLength": 1000,
11
34
"type": "string"
12
35
},
13
36
"resources": {
14
-
"description": "Map of absolute request path (beginning with '/') to space.highport.sites.defs#resource. Lexicon has no map type. A '/' entry is required for tile content and recommended for sites.",
37
+
"description": "Map of absolute request path (starting with '/') to space.highport.sites.defs#resource, since Lexicon has no map type. Tile content must have a '/' entry, and sites should.",
15
38
"type": "unknown"
16
39
}
17
40
},
18
41
"required": [
19
42
"resources"
20
43
],
21
44
"type": "object"
22
45
},
23
46
"redirect": {
24
47
"properties": {
25
48
"from": {
26
-
"description": "The request path to match, optionally including a query string. Matching is exact.",
49
+
"description": "The request path to match, optionally with a query string. Must match exactly.",
27
50
"maxLength": 2048,
28
51
"type": "string"
29
52
},
30
53
"status": {
31
54
"description": "Redirect status. Defaults to 302.",
32
55
"knownValues": [
33
56
301,
34
57
302,
35
58
307,
36
59
308
37
60
],
38
61
"type": "integer"
39
62
},
40
63
"to": {
41
-
"description": "Destination path. Must be an absolute path on this site that exists as a manifest key.",
64
+
"description": "Destination path. Must be an absolute path that exists as a manifest key on this site.",
42
65
"maxLength": 2048,
43
66
"type": "string"
44
67
}
45
68
},
46
69
"required": [
47
70
"from",
48
71
"to"
49
72
],
50
73
"type": "object"
51
74
},
52
75
"resource": {
53
-
"description": "A single addressable resource within a manifest.",
76
+
"description": "One addressable resource in a manifest.",
54
77
"properties": {
55
78
"contentEncoding": {
56
-
"description": "Declares the stored blob is already encoded with this algorithm; the origin serves it as-is with a matching Content-Encoding header.",
79
+
"description": "The encoding the stored blob already has. The origin serves it unchanged, with a matching Content-Encoding header.",
57
80
"knownValues": [
58
81
"gzip",
59
82
"br",
60
83
"zstd",
61
84
"identity"
62
85
],
63
86
"type": "string"
64
87
},
65
88
"contentType": {
66
-
"description": "Serve the asset with this content type instead of the blob's mimeType.",
89
+
"description": "Content type to serve instead of the blob's mimeType.",
67
90
"maxLength": 255,
68
91
"type": "string"
69
92
},
70
93
"src": {
71
94
"description": "The blob holding this resource's bytes.",
72
95
"type": "blob"
73
96
},
74
97
"status": {
75
98
"description": "Response status. Defaults to 200 for manifest entries and 404 for the notFound resource.",
76
99
"knownValues": [
77
100
200,
78
101
404,
79
102
410
80
103
],
81
104
"type": "integer"
82
105
}
83
106
},
84
107
"required": [
85
108
"src"
86
109
],
87
110
"type": "object"
88
111
},
112
+
"spaceMembers": {
113
+
"description": "The members of the space this site lives in, as the space's host reports them. Only valid on a site served from a space, and rejected (not ignored) anywhere else. The record lists no members; the space's host is asked.",
114
+
"properties": {},
115
+
"type": "object"
116
+
},
89
117
"wellKnown": {
90
-
"description": "Controls the responses bard synthesizes under /.well-known/. Every field defaults to true; the object exists only to turn things off.",
118
+
"description": "Controls the responses bard generates under /.well-known/. Both flags default to true and exist only to turn things off. standardSitePublication is absent unless the publisher sets it.",
91
119
"properties": {
92
120
"atproto": {
93
121
"description": "Serve GET /.well-known/atproto-did with the site's owning DID. Default true.",
94
122
"type": "boolean"
95
123
},
96
124
"rasl": {
97
125
"description": "Serve GET /.well-known/rasl/{cid} for every CID this site references. Default true.",
98
126
"type": "boolean"
127
+
},
128
+
"standardSitePublication": {
129
+
"description": "Serve GET /.well-known/site.standard.publication with this AT-URI. It must name a site.standard.publication record in the site owner's repository whose url host is this domain, or the site record is rejected at indexing. While set, a manifest entry at that path is rejected.",
130
+
"format": "at-uri",
131
+
"type": "string"
99
132
}
100
133
},
101
134
"type": "object"
102
135
}
103
136
},
104
137
"id": "space.highport.sites.defs",
105
138
"lexicon": 1
106
139
}