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