space.highport.sites.defs
Schema Diff
+14 -1
Compatibility Analysis
Backward Compatible
Backward compatible. 6 non-breaking changes.
Non-Breaking Changes (6)
- 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#spaceMembers" }
- 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.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 }
Migration Guidance
Added Elements
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#spaceMembers" }
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.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 }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"access": {
5
-
"description": "Which parts of a site require a signed-in reader. Absent means none of it: the domain's owner budget decides every path, which is the arrangement almost every site wants. This is content policy rather than a billing arrangement — it says which parts of a publication are premium, it survives moving to another host, and a reader of the record can see it without asking the host.",
5
+
"description": "Which parts of a site require a signed-in reader, and which readers count. Absent means none of it: the domain's owner budget decides every path, which is the arrangement almost every site wants. This is content policy rather than a billing arrangement — it says which parts of a publication are premium and to whom, it survives moving to another host, and a reader of the record can see it without asking the host.",
6
6
"properties": {
7
+
"audience": {
8
+
"closed": true,
9
+
"description": "Who the paths in requireAuth are for. Absent means any signed-in reader, which is what requireAuth alone has always meant. Meaningful only alongside requireAuth: an audience with nothing gated narrows a gate that is not there. The union is closed because a host that cannot evaluate an audience must refuse the record rather than serve it to everybody — an unrecognized audience that fell open would be a gate quietly removed by a schema it did not understand.",
10
+
"refs": [
11
+
"space.highport.sites.defs#spaceMembers"
12
+
],
13
+
"type": "union"
14
+
},
7
15
"requireAuth": {
8
16
"description": "Path prefixes that always require a signed-in reader and always bill that reader, whatever the owner budget says and whether or not it is spent. Matched against the normalized request path, so a prefix covers everything beneath it. A prefix of \"/\" is the whole site and says the same thing as an owner budget of zero.",
9
17
"items": {
10
18
"maxLength": 1024,
11
19
"type": "string"
12
20
},
13
21
"maxLength": 64,
14
22
"type": "array"
15
23
}
16
24
},
17
25
"type": "object"
18
26
},
19
27
"manifest": {
20
28
"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.",
21
29
"properties": {
22
30
"name": {
23
31
"description": "Bundle name. Required when the manifest is a tile's content; optional for an inline site source.",
24
32
"maxGraphemes": 100,
25
33
"maxLength": 1000,
26
34
"type": "string"
27
35
},
28
36
"resources": {
29
37
"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.",
30
38
"type": "unknown"
31
39
}
32
40
},
33
41
"required": [
34
42
"resources"
35
43
],
36
44
"type": "object"
37
45
},
38
46
"redirect": {
39
47
"properties": {
40
48
"from": {
41
49
"description": "The request path to match, optionally including a query string. Matching is exact.",
42
50
"maxLength": 2048,
43
51
"type": "string"
44
52
},
45
53
"status": {
46
54
"description": "Redirect status. Defaults to 302.",
47
55
"knownValues": [
48
56
301,
49
57
302,
50
58
307,
51
59
308
52
60
],
53
61
"type": "integer"
54
62
},
55
63
"to": {
56
64
"description": "Destination path. Must be an absolute path on this site that exists as a manifest key.",
57
65
"maxLength": 2048,
58
66
"type": "string"
59
67
}
60
68
},
61
69
"required": [
62
70
"from",
63
71
"to"
64
72
],
65
73
"type": "object"
66
74
},
67
75
"resource": {
68
76
"description": "A single addressable resource within a manifest.",
69
77
"properties": {
70
78
"contentEncoding": {
71
79
"description": "Declares the stored blob is already encoded with this algorithm; the origin serves it as-is with a matching Content-Encoding header.",
72
80
"knownValues": [
73
81
"gzip",
74
82
"br",
75
83
"zstd",
76
84
"identity"
77
85
],
78
86
"type": "string"
79
87
},
80
88
"contentType": {
81
89
"description": "Serve the asset with this content type instead of the blob's mimeType.",
82
90
"maxLength": 255,
83
91
"type": "string"
84
92
},
85
93
"src": {
86
94
"description": "The blob holding this resource's bytes.",
87
95
"type": "blob"
88
96
},
89
97
"status": {
90
98
"description": "Response status. Defaults to 200 for manifest entries and 404 for the notFound resource.",
91
99
"knownValues": [
92
100
200,
93
101
404,
94
102
410
95
103
],
96
104
"type": "integer"
97
105
}
98
106
},
99
107
"required": [
100
108
"src"
101
109
],
102
110
"type": "object"
103
111
},
112
+
"spaceMembers": {
113
+
"description": "The members of the space this site is held in, as its host answers for them. Valid only on a site served from a space; a site published to a repository has no space to ask about and the field is refused there rather than ignored. Carries no member list and names no identity: the space's own host is asked, and the answer is not part of the record.",
114
+
"properties": {},
115
+
"type": "object"
116
+
},
104
117
"wellKnown": {
105
118
"description": "Controls the responses bard synthesizes under /.well-known/. Every field defaults to true; the object exists only to turn things off.",
106
119
"properties": {
107
120
"atproto": {
108
121
"description": "Serve GET /.well-known/atproto-did with the site's owning DID. Default true.",
109
122
"type": "boolean"
110
123
},
111
124
"rasl": {
112
125
"description": "Serve GET /.well-known/rasl/{cid} for every CID this site references. Default true.",
113
126
"type": "boolean"
114
127
}
115
128
},
116
129
"type": "object"
117
130
}
118
131
},
119
132
"id": "space.highport.sites.defs",
120
133
"lexicon": 1
121
134
}