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