fyi.atstore.listing.detail
Schema Diff
+45 -0
Compatibility Analysis
Breaking Changes Detected
2 breaking changes, 10 non-breaking changes.
Breaking Changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "fyi.atstore.listing.detail#link", src: "fyi.atstore.listing.detail#link", tgt: "fyi.atstore.listing.detail#link.url", kind: "prop", name: Some("url") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "fyi.atstore.listing.detail#link", src: "fyi.atstore.listing.detail#link", tgt: "fyi.atstore.listing.detail#link.type", kind: "prop", name: Some("type") }
Non-Breaking Changes (10)
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail#link" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail#link.label" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail#link.type" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail#link.url" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.links" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.links:items" }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail#link", tgt: "fyi.atstore.listing.detail#link.label", kind: "prop", name: Some("label") }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail:body", tgt: "fyi.atstore.listing.detail:body.links", kind: "prop", name: Some("links") }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail:body.links", tgt: "fyi.atstore.listing.detail:body.links:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail:body.links:items", tgt: "fyi.atstore.listing.detail#link", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "fyi.atstore.listing.detail#link" }AddedVertex { vertex_id: "fyi.atstore.listing.detail#link.label" }AddedVertex { vertex_id: "fyi.atstore.listing.detail#link.type" }AddedVertex { vertex_id: "fyi.atstore.listing.detail#link.url" }AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.links" }AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.links:items" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "fyi.atstore.listing.detail#link", src: "fyi.atstore.listing.detail#link", tgt: "fyi.atstore.listing.detail#link.url", kind: "prop", name: Some("url") }
- Breaking: RequiredEdgeAdded { vertex_id: "fyi.atstore.listing.detail#link", src: "fyi.atstore.listing.detail#link", tgt: "fyi.atstore.listing.detail#link.type", kind: "prop", name: Some("type") }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail#link", tgt: "fyi.atstore.listing.detail#link.label", kind: "prop", name: Some("label") }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail:body", tgt: "fyi.atstore.listing.detail:body.links", kind: "prop", name: Some("links") }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail:body.links", tgt: "fyi.atstore.listing.detail:body.links:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail:body.links:items", tgt: "fyi.atstore.listing.detail#link", kind: "ref", name: None }
1
1
{
2
2
"id": "fyi.atstore.listing.detail",
3
3
"defs": {
4
+
"link": {
5
+
"type": "object",
6
+
"required": [
7
+
"type",
8
+
"url"
9
+
],
10
+
"properties": {
11
+
"url": {
12
+
"type": "string",
13
+
"format": "uri",
14
+
"description": "The destination URL."
15
+
},
16
+
"type": {
17
+
"type": "string",
18
+
"description": "The kind of link.",
19
+
"knownValues": [
20
+
"privacy",
21
+
"terms",
22
+
"support",
23
+
"contact",
24
+
"docs",
25
+
"blog",
26
+
"changelog",
27
+
"source",
28
+
"status",
29
+
"other"
30
+
]
31
+
},
32
+
"label": {
33
+
"type": "string",
34
+
"maxLength": 100,
35
+
"description": "Optional human-readable label, especially useful when type is 'other'.",
36
+
"maxGraphemes": 50
37
+
}
38
+
}
39
+
},
4
40
"main": {
5
41
"key": "tid",
6
42
"type": "record",
7
43
"record": {
8
44
"type": "object",
9
45
"required": [
10
46
"slug",
11
47
"name",
12
48
"tagline",
13
49
"externalUrl",
14
50
"icon",
15
51
"heroImage",
16
52
"categorySlug",
17
53
"createdAt",
18
54
"updatedAt"
19
55
],
20
56
"properties": {
21
57
"icon": {
22
58
"type": "blob",
23
59
"accept": [
24
60
"image/png",
25
61
"image/jpeg",
26
62
"image/webp",
27
63
"image/gif",
28
64
"image/svg+xml"
29
65
],
30
66
"maxSize": 2000000,
31
67
"description": "Square / app icon (uploaded to repo via com.atproto.repo.uploadBlob)."
32
68
},
33
69
"name": {
34
70
"type": "string",
35
71
"maxLength": 640
36
72
},
37
73
"slug": {
38
74
"type": "string",
39
75
"maxLength": 512,
40
76
"minLength": 1,
41
77
"description": "Stable URL slug; unique within the publishing account."
42
78
},
79
+
"links": {
80
+
"type": "array",
81
+
"items": {
82
+
"ref": "#link",
83
+
"type": "ref"
84
+
},
85
+
"maxLength": 12,
86
+
"description": "Relevant links for the app, including trust/compliance, support, and project resources."
87
+
},
43
88
"appTags": {
44
89
"type": "array",
45
90
"items": {
46
91
"type": "string",
47
92
"maxLength": 96
48
93
},
49
94
"maxLength": 64
50
95
},
51
96
"tagline": {
52
97
"type": "string",
53
98
"maxLength": 300
54
99
},
55
100
"createdAt": {
56
101
"type": "string",
57
102
"format": "datetime"
58
103
},
59
104
"heroImage": {
60
105
"type": "blob",
61
106
"accept": [
62
107
"image/png",
63
108
"image/jpeg",
64
109
"image/webp",
65
110
"image/gif",
66
111
"image/svg+xml"
67
112
],
68
113
"maxSize": 12000000,
69
114
"description": "Hero / cover image blob."
70
115
},
71
116
"updatedAt": {
72
117
"type": "string",
73
118
"format": "datetime"
74
119
},
75
120
"description": {
76
121
"type": "string",
77
122
"maxLength": 20000
78
123
},
79
124
"externalUrl": {
80
125
"type": "string",
81
126
"format": "uri",
82
127
"maxLength": 2048,
83
128
"description": "Primary product or project URL."
84
129
},
85
130
"screenshots": {
86
131
"type": "array",
87
132
"items": {
88
133
"type": "blob",
89
134
"accept": [
90
135
"image/png",
91
136
"image/jpeg",
92
137
"image/webp",
93
138
"image/gif",
94
139
"image/svg+xml"
95
140
],
96
141
"maxSize": 12000000
97
142
},
98
143
"maxLength": 20
99
144
},
100
145
"categorySlug": {
101
146
"type": "array",
102
147
"items": {
103
148
"type": "string",
104
149
"maxLength": 256
105
150
},
106
151
"maxLength": 32,
107
152
"minLength": 1,
108
153
"description": "Browse category keys (e.g. protocol/pds). First entry is the primary category for legacy surfaces."
109
154
},
110
155
"migratedFromAtUri": {
111
156
"type": "string",
112
157
"format": "at-uri",
113
158
"maxLength": 8192,
114
159
"description": "When this listing.detail record supersedes a prior record in another repo (e.g. moved from the AT Store publisher to a product owner PDS), the at:// URI of that prior fyi.atstore.listing.detail record."
115
160
},
116
161
"productAccountDid": {
117
162
"type": "string",
118
163
"maxLength": 2048,
119
164
"description": "Bluesky DID for the product, app, or tool (not the AT Store publisher). Handle is resolved and stored in Postgres only."
120
165
}
121
166
}
122
167
},
123
168
"description": "Public protocol or app listing in the AT Store directory. Images are stored as repo blobs (Kitchen-style); the web app caches HTTPS URLs in Postgres separately."
124
169
}
125
170
},
126
171
"$type": "com.atproto.lexicon.schema",
127
172
"lexicon": 1
128
173
}