fyi.atstore.listing.detail
Schema Diff
+56 -13
Compatibility Analysis
Breaking Changes Detected
4 breaking changes, 17 non-breaking changes.
Breaking Changes (4)
- KindChanged KindChanged { vertex_id: "fyi.atstore.listing.detail:body.categorySlug", old_kind: "string", new_kind: "array" }
- KindChanged KindChanged { vertex_id: "fyi.atstore.listing.detail:body.heroImage", old_kind: "string", new_kind: "blob" }
- KindChanged KindChanged { vertex_id: "fyi.atstore.listing.detail:body.icon", old_kind: "string", new_kind: "blob" }
- KindChanged KindChanged { vertex_id: "fyi.atstore.listing.detail:body.screenshots:items", old_kind: "string", new_kind: "blob" }
Non-Breaking Changes (17)
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.appTags" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.appTags:items" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.categorySlug:items" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.migratedFromAtUri" }
- AddedVertex AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.productAccountDid" }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail:body", tgt: "fyi.atstore.listing.detail:body.appTags", kind: "prop", name: Some("appTags") }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail:body", tgt: "fyi.atstore.listing.detail:body.migratedFromAtUri", kind: "prop", name: Some("migratedFromAtUri") }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail:body", tgt: "fyi.atstore.listing.detail:body.productAccountDid", kind: "prop", name: Some("productAccountDid") }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail:body.appTags", tgt: "fyi.atstore.listing.detail:body.appTags:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "fyi.atstore.listing.detail:body.categorySlug", tgt: "fyi.atstore.listing.detail:body.categorySlug:items", kind: "items", name: None }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.heroImage", sort: "format" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.heroImage", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.screenshots:items", sort: "format" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.screenshots:items", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.icon", sort: "format" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.icon", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.categorySlug", sort: "maxLength" }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.appTags" }AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.appTags:items" }AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.categorySlug:items" }AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.migratedFromAtUri" }AddedVertex { vertex_id: "fyi.atstore.listing.detail:body.productAccountDid" }
Constraint Changes
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.screenshots:items", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.screenshots:items", sort: "format" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.icon", sort: "format" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.icon", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.heroImage", sort: "maxLength" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.heroImage", sort: "format" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.atstore.listing.detail:body.categorySlug", sort: "maxLength" }
Additional Notes
- Breaking: KindChanged { vertex_id: "fyi.atstore.listing.detail:body.categorySlug", old_kind: "string", new_kind: "array" }
- Breaking: KindChanged { vertex_id: "fyi.atstore.listing.detail:body.heroImage", old_kind: "string", new_kind: "blob" }
- Breaking: KindChanged { vertex_id: "fyi.atstore.listing.detail:body.icon", old_kind: "string", new_kind: "blob" }
- Breaking: KindChanged { vertex_id: "fyi.atstore.listing.detail:body.screenshots:items", old_kind: "string", new_kind: "blob" }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail:body", tgt: "fyi.atstore.listing.detail:body.appTags", kind: "prop", name: Some("appTags") }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail:body", tgt: "fyi.atstore.listing.detail:body.migratedFromAtUri", kind: "prop", name: Some("migratedFromAtUri") }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail:body", tgt: "fyi.atstore.listing.detail:body.productAccountDid", kind: "prop", name: Some("productAccountDid") }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail:body.appTags", tgt: "fyi.atstore.listing.detail:body.appTags:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "fyi.atstore.listing.detail:body.categorySlug", tgt: "fyi.atstore.listing.detail:body.categorySlug:items", kind: "items", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
-
"description": "Public protocol or app listing in the AT Store directory.",
5
+
"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
6
"key": "tid",
7
7
"record": {
8
8
"properties": {
9
+
"appTags": {
10
+
"items": {
11
+
"maxLength": 96,
12
+
"type": "string"
13
+
},
14
+
"maxLength": 64,
15
+
"type": "array"
16
+
},
9
17
"categorySlug": {
10
-
"description": "Single browse category key (e.g. protocol/pds).",
11
-
"maxLength": 256,
12
-
"type": "string"
18
+
"description": "Browse category keys (e.g. protocol/pds). First entry is the primary category for legacy surfaces.",
19
+
"items": {
20
+
"maxLength": 256,
21
+
"type": "string"
22
+
},
23
+
"maxLength": 32,
24
+
"minLength": 1,
25
+
"type": "array"
13
26
},
14
27
"createdAt": {
15
28
"format": "datetime",
16
29
"type": "string"
17
30
},
18
31
"description": {
19
32
"maxLength": 20000,
20
33
"type": "string"
21
34
},
22
35
"externalUrl": {
23
36
"description": "Primary product or project URL.",
24
37
"format": "uri",
25
38
"maxLength": 2048,
26
39
"type": "string"
27
40
},
28
41
"heroImage": {
29
-
"description": "Hero / cover image (HTTPS URL).",
30
-
"format": "uri",
31
-
"maxLength": 2048,
32
-
"type": "string"
42
+
"accept": [
43
+
"image/png",
44
+
"image/jpeg",
45
+
"image/webp",
46
+
"image/gif",
47
+
"image/svg+xml"
48
+
],
49
+
"description": "Hero / cover image blob.",
50
+
"maxSize": 12000000,
51
+
"type": "blob"
33
52
},
34
53
"icon": {
35
-
"format": "uri",
36
-
"maxLength": 2048,
54
+
"accept": [
55
+
"image/png",
56
+
"image/jpeg",
57
+
"image/webp",
58
+
"image/gif",
59
+
"image/svg+xml"
60
+
],
61
+
"description": "Square / app icon (uploaded to repo via com.atproto.repo.uploadBlob).",
62
+
"maxSize": 2000000,
63
+
"type": "blob"
64
+
},
65
+
"migratedFromAtUri": {
66
+
"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
+
"format": "at-uri",
68
+
"maxLength": 8192,
37
69
"type": "string"
38
70
},
39
71
"name": {
40
72
"maxLength": 640,
41
73
"type": "string"
42
74
},
75
+
"productAccountDid": {
76
+
"description": "Bluesky DID for the product, app, or tool (not the AT Store publisher). Handle is resolved and stored in Postgres only.",
77
+
"maxLength": 2048,
78
+
"type": "string"
79
+
},
43
80
"screenshots": {
44
81
"items": {
45
-
"format": "uri",
46
-
"maxLength": 2048,
47
-
"type": "string"
82
+
"accept": [
83
+
"image/png",
84
+
"image/jpeg",
85
+
"image/webp",
86
+
"image/gif",
87
+
"image/svg+xml"
88
+
],
89
+
"maxSize": 12000000,
90
+
"type": "blob"
48
91
},
49
92
"maxLength": 20,
50
93
"type": "array"
51
94
},
52
95
"slug": {
53
96
"description": "Stable URL slug; unique within the publishing account.",
54
97
"maxLength": 512,
55
98
"minLength": 1,
56
99
"type": "string"
57
100
},
58
101
"tagline": {
59
102
"maxLength": 300,
60
103
"type": "string"
61
104
},
62
105
"updatedAt": {
63
106
"format": "datetime",
64
107
"type": "string"
65
108
}
66
109
},
67
110
"required": [
68
111
"slug",
69
112
"name",
70
113
"tagline",
71
114
"externalUrl",
72
115
"icon",
73
116
"heroImage",
74
117
"categorySlug",
75
118
"createdAt",
76
119
"updatedAt"
77
120
],
78
121
"type": "object"
79
122
},
80
123
"type": "record"
81
124
}
82
125
},
83
126
"id": "fyi.atstore.listing.detail",
84
127
"lexicon": 1
85
128
}