fyi.atstore.listing.detail

atstore.fyi

Schema Diff

+45 -0

From

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

To

CID
bafyreico3oumjzo...
Indexed At
2026-04-23 03:48 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

2 breaking changes, 10 non-breaking changes.

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

Compare Other Versions

Lexicon Garden

@