fyi.atstore.listing.detail

atstore.fyi

Schema Diff

+56 -13

From

CID
bafyreic22wkhhdd...
Indexed At
2026-04-10 06:13 UTC
View this version

To

CID
bafyreigkuqax7u4...
Indexed At
2026-04-23 00:44 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@