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.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
}

Compare Other Versions

Lexicon Garden

@