at.inlay.component

inlay.at

Schema Diff

+68 -78

From

CID
bafyreie34glisqg...
Indexed At
2026-02-18 18:28 UTC
View this version

To

CID
bafyreicl425kwjr...
Indexed At
2026-03-19 20:26 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

34 breaking changes, 18 non-breaking changes.

Breaking Changes (34)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.inlay.component#view", src: "at.inlay.component#view", tgt: "at.inlay.component#view.prop", kind: "prop", name: Some("prop") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.inlay.component#view", src: "at.inlay.component#view", tgt: "at.inlay.component#view.accepts", kind: "prop", name: Some("accepts") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.inlay.component#viewPrimitive", src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.type", kind: "prop", name: Some("type") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.inlay.component#acceptsEntry", src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.prop", kind: "prop", name: Some("prop") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.inlay.component#acceptsEntry", src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.type", kind: "prop", name: Some("type") }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.collection" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.format" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.prop" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.type" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#viewCollection" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#viewCollection.collection" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#viewIdentity" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.accepts" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.accepts:items" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.view:items" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant0" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant1" }
  • RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant2" }
  • RemovedEdge RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.collection", kind: "prop", name: Some("collection") }
  • RemovedEdge RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.format", kind: "prop", name: Some("format") }
  • RemovedEdge RemovedEdge { src: "at.inlay.component#viewCollection", tgt: "at.inlay.component#viewCollection.collection", kind: "prop", name: Some("collection") }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body", tgt: "at.inlay.component:body.accepts", kind: "prop", name: Some("accepts") }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.accepts", tgt: "at.inlay.component:body.accepts:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.accepts:items", tgt: "at.inlay.component#acceptsEntry", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.view", tgt: "at.inlay.component:body.view:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant0", kind: "variant", name: Some("#viewRecord") }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant1", kind: "variant", name: Some("#viewCollection") }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant2", kind: "variant", name: Some("#viewIdentity") }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items:variant0", tgt: "at.inlay.component#viewRecord", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items:variant1", tgt: "at.inlay.component#viewCollection", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items:variant2", tgt: "at.inlay.component#viewIdentity", kind: "ref", name: None }
  • KindChanged KindChanged { vertex_id: "at.inlay.component:body.view", old_kind: "array", new_kind: "ref" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component:body.view", sort: "ref", value: "#view" }
Non-Breaking Changes (18)
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#view" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.accepts" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.accepts:items" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.accepts:items:variant0" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.accepts:items:variant1" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.prop" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#viewPrimitive" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#viewPrimitive.format" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#viewPrimitive.type" }
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#viewRecord.rkey" }
  • AddedEdge AddedEdge { src: "at.inlay.component#view.accepts", tgt: "at.inlay.component#view.accepts:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "at.inlay.component#view.accepts:items", tgt: "at.inlay.component#view.accepts:items:variant0", kind: "variant", name: Some("#viewRecord") }
  • AddedEdge AddedEdge { src: "at.inlay.component#view.accepts:items", tgt: "at.inlay.component#view.accepts:items:variant1", kind: "variant", name: Some("#viewPrimitive") }
  • AddedEdge AddedEdge { src: "at.inlay.component#view.accepts:items:variant0", tgt: "at.inlay.component#viewRecord", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "at.inlay.component#view.accepts:items:variant1", tgt: "at.inlay.component#viewPrimitive", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.format", kind: "prop", name: Some("format") }
  • AddedEdge AddedEdge { src: "at.inlay.component#viewRecord", tgt: "at.inlay.component#viewRecord.rkey", kind: "prop", name: Some("rkey") }
  • AddedEdge AddedEdge { src: "at.inlay.component:body.view", tgt: "at.inlay.component#view", kind: "ref", name: None }

Migration Guidance

Removed Elements

  • RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry" }
  • RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.collection" }
  • RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.format" }
  • RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.prop" }
  • RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.type" }
  • RemovedVertex { vertex_id: "at.inlay.component#viewCollection" }
  • RemovedVertex { vertex_id: "at.inlay.component#viewCollection.collection" }
  • RemovedVertex { vertex_id: "at.inlay.component#viewIdentity" }
  • RemovedVertex { vertex_id: "at.inlay.component:body.accepts" }
  • RemovedVertex { vertex_id: "at.inlay.component:body.accepts:items" }
  • RemovedVertex { vertex_id: "at.inlay.component:body.view:items" }
  • RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant0" }
  • RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant1" }
  • RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant2" }

Added Elements

  • AddedVertex { vertex_id: "at.inlay.component#view" }
  • AddedVertex { vertex_id: "at.inlay.component#view.accepts" }
  • AddedVertex { vertex_id: "at.inlay.component#view.accepts:items" }
  • AddedVertex { vertex_id: "at.inlay.component#view.accepts:items:variant0" }
  • AddedVertex { vertex_id: "at.inlay.component#view.accepts:items:variant1" }
  • AddedVertex { vertex_id: "at.inlay.component#view.prop" }
  • AddedVertex { vertex_id: "at.inlay.component#viewPrimitive" }
  • AddedVertex { vertex_id: "at.inlay.component#viewPrimitive.format" }
  • AddedVertex { vertex_id: "at.inlay.component#viewPrimitive.type" }
  • AddedVertex { vertex_id: "at.inlay.component#viewRecord.rkey" }

Constraint Changes

  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component:body.view", sort: "ref", value: "#view" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "at.inlay.component#viewPrimitive", src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.type", kind: "prop", name: Some("type") }
  • Breaking: RequiredEdgeAdded { vertex_id: "at.inlay.component#view", src: "at.inlay.component#view", tgt: "at.inlay.component#view.prop", kind: "prop", name: Some("prop") }
  • Breaking: RequiredEdgeAdded { vertex_id: "at.inlay.component#view", src: "at.inlay.component#view", tgt: "at.inlay.component#view.accepts", kind: "prop", name: Some("accepts") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "at.inlay.component#acceptsEntry", src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.prop", kind: "prop", name: Some("prop") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "at.inlay.component#acceptsEntry", src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.type", kind: "prop", name: Some("type") }
  • Breaking: RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.collection", kind: "prop", name: Some("collection") }
  • Breaking: RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.format", kind: "prop", name: Some("format") }
  • Breaking: RemovedEdge { src: "at.inlay.component#viewCollection", tgt: "at.inlay.component#viewCollection.collection", kind: "prop", name: Some("collection") }
  • Breaking: RemovedEdge { src: "at.inlay.component:body", tgt: "at.inlay.component:body.accepts", kind: "prop", name: Some("accepts") }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.accepts", tgt: "at.inlay.component:body.accepts:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.accepts:items", tgt: "at.inlay.component#acceptsEntry", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.view", tgt: "at.inlay.component:body.view:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant0", kind: "variant", name: Some("#viewRecord") }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant1", kind: "variant", name: Some("#viewCollection") }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant2", kind: "variant", name: Some("#viewIdentity") }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.view:items:variant0", tgt: "at.inlay.component#viewRecord", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.view:items:variant1", tgt: "at.inlay.component#viewCollection", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "at.inlay.component:body.view:items:variant2", tgt: "at.inlay.component#viewIdentity", kind: "ref", name: None }
  • Breaking: KindChanged { vertex_id: "at.inlay.component:body.view", old_kind: "array", new_kind: "ref" }
  • Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts", tgt: "at.inlay.component#view.accepts:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts:items", tgt: "at.inlay.component#view.accepts:items:variant0", kind: "variant", name: Some("#viewRecord") }
  • Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts:items", tgt: "at.inlay.component#view.accepts:items:variant1", kind: "variant", name: Some("#viewPrimitive") }
  • Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts:items:variant0", tgt: "at.inlay.component#viewRecord", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts:items:variant1", tgt: "at.inlay.component#viewPrimitive", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.format", kind: "prop", name: Some("format") }
  • Non-breaking: AddedEdge { src: "at.inlay.component#viewRecord", tgt: "at.inlay.component#viewRecord.rkey", kind: "prop", name: Some("rkey") }
  • Non-breaking: AddedEdge { src: "at.inlay.component:body.view", tgt: "at.inlay.component#view", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 -
    "acceptsEntry": {
5 -
      "description": "Declares a data type this component can handle, routed to a specific prop.",
6 -
      "properties": {
7 -
        "collection": {
8 -
          "description": "For at-uri strings, restricts to this collection.",
9 -
          "format": "nsid",
10 -
          "type": "string"
11 -
        },
12 -
        "format": {
13 -
          "description": "String format constraint. Only applies when type is 'string'.",
14 -
          "knownValues": [
15 -
            "at-uri",
16 -
            "did",
17 -
            "datetime",
18 -
            "uri",
19 -
            "handle",
20 -
            "at-identifier",
21 -
            "nsid",
22 -
            "cid",
23 -
            "language",
24 -
            "record-key",
25 -
            "tid"
26 -
          ],
27 -
          "maxLength": 64,
28 -
          "type": "string"
29 -
        },
30 -
        "prop": {
31 -
          "description": "Prop to bind matched data to.",
32 -
          "maxLength": 256,
33 -
          "type": "string"
34 -
        },
35 -
        "type": {
36 -
          "description": "Lexicon field type.",
37 -
          "knownValues": [
38 -
            "string",
39 -
            "integer",
40 -
            "boolean",
41 -
            "blob",
42 -
            "cid-link",
43 -
            "bytes"
44 -
          ],
45 -
          "maxLength": 128,
46 -
          "type": "string"
47 -
        }
48 -
      },
49 -
      "required": [
50 -
        "type",
51 -
        "prop"
52 -
      ],
53 -
      "type": "object"
54 -
    },
55 4
    "bodyExternal": {
56 5
      "description": "Component rendered by calling a remote XRPC endpoint",
57 6
      "properties": {
58 7
        "did": {
59 8
          "description": "DID of the service hosting this component",
60 9
          "format": "did",
61 10
          "type": "string"
62 11
        }
63 12
      },
64 13
      "required": [
65 14
        "did"
66 15
      ],
67 16
      "type": "object"
68 17
    },
69 18
    "bodyTemplate": {
70 19
      "description": "Component rendered by the host from a serialized element tree",
71 20
      "properties": {
72 21
        "node": {
73 22
          "description": "Serialized element tree with bindings",
74 23
          "type": "unknown"
75 24
        }
76 25
      },
77 26
      "required": [
78 27
        "node"
79 28
      ],
80 29
      "type": "object"
81 30
    },
82 31
    "main": {
83 32
      "description": "Component record - declares an implementation of a type",
84 33
      "key": "tid",
85 34
      "record": {
86 35
        "properties": {
87 -
          "accepts": {
88 -
            "description": "Data types this component can render. Used for data-driven discovery.",
89 -
            "items": {
90 -
              "ref": "#acceptsEntry",
91 -
              "type": "ref"
92 -
            },
93 -
            "type": "array"
94 -
          },
95 36
          "body": {
96 37
            "description": "How this component is rendered. Omit for primitives rendered by the host.",
97 38
            "refs": [
98 39
              "#bodyExternal",
99 40
              "#bodyTemplate"
100 41
            ],
101 42
            "type": "union"
102 43
          },
103 44
          "createdAt": {
104 45
            "format": "datetime",
105 46
            "type": "string"
106 47
          },
107 48
          "description": {
108 49
            "maxGraphemes": 1000,
109 50
            "maxLength": 10000,
110 51
            "type": "string"
111 52
          },
112 53
          "imports": {
113 54
            "description": "Ordered list of pack URIs (import stack). First pack that exports an NSID wins.",
114 55
            "items": {
115 56
              "format": "at-uri",
116 57
              "type": "string"
117 58
            },
118 59
            "type": "array"
119 60
          },
120 61
          "type": {
121 62
            "description": "NSID this component implements (also the XRPC procedure)",
122 63
            "format": "nsid",
123 64
            "type": "string"
124 65
          },
125 66
          "updatedAt": {
126 67
            "description": "Last update timestamp. Set by the publish flow to bust cached responses.",
127 68
            "format": "datetime",
128 69
            "type": "string"
129 70
          },
130 71
          "via": {
131 72
            "description": "Platform-managed deployment metadata",
132 73
            "refs": [
133 74
              "at.inlay.defs#viaValtown"
134 75
            ],
135 76
            "type": "union"
136 77
          },
137 78
          "view": {
138 -
            "description": "What kinds of pages this component is a view for",
139 -
            "items": {
140 -
              "refs": [
141 -
                "#viewRecord",
142 -
                "#viewCollection",
143 -
                "#viewIdentity"
144 -
              ],
145 -
              "type": "union"
146 -
            },
147 -
            "type": "array"
79 +
            "description": "What data this component views and which prop receives it",
80 +
            "ref": "#view",
81 +
            "type": "ref"
148 82
          }
149 83
        },
150 84
        "required": [
151 85
          "type"
152 86
        ],
153 87
        "type": "object"
154 88
      },
155 89
      "type": "record"
156 90
    },
157 -
    "viewCollection": {
158 -
      "description": "Component is a view for a collection listing. Omit collection for a generic collection view.",
91 +
    "view": {
92 +
      "description": "Declares what data this component views and which prop receives it.",
159 93
      "properties": {
160 -
        "collection": {
161 -
          "description": "The collection this component lists. Omit for any-collection.",
162 -
          "format": "nsid",
94 +
        "accepts": {
95 +
          "description": "Data types this view accepts.",
96 +
          "items": {
97 +
            "refs": [
98 +
              "#viewRecord",
99 +
              "#viewPrimitive"
100 +
            ],
101 +
            "type": "union"
102 +
          },
103 +
          "minLength": 1,
104 +
          "type": "array"
105 +
        },
106 +
        "prop": {
107 +
          "description": "Which component prop receives the view data.",
108 +
          "maxLength": 256,
163 109
          "type": "string"
164 110
        }
165 111
      },
112 +
      "required": [
113 +
        "prop",
114 +
        "accepts"
115 +
      ],
166 116
      "type": "object"
167 117
    },
168 -
    "viewIdentity": {
169 -
      "description": "Component is a view for an identity (person/DID).",
170 -
      "properties": {},
118 +
    "viewPrimitive": {
119 +
      "description": "View accepts a primitive value type.",
120 +
      "properties": {
121 +
        "format": {
122 +
          "description": "String format constraint. Only applies when type is 'string'.",
123 +
          "knownValues": [
124 +
            "at-uri",
125 +
            "did",
126 +
            "datetime",
127 +
            "uri",
128 +
            "handle",
129 +
            "at-identifier",
130 +
            "nsid",
131 +
            "cid",
132 +
            "language",
133 +
            "record-key",
134 +
            "tid"
135 +
          ],
136 +
          "maxLength": 64,
137 +
          "type": "string"
138 +
        },
139 +
        "type": {
140 +
          "description": "Lexicon primitive type.",
141 +
          "knownValues": [
142 +
            "string",
143 +
            "integer",
144 +
            "boolean",
145 +
            "blob",
146 +
            "cid-link",
147 +
            "bytes"
148 +
          ],
149 +
          "maxLength": 128,
150 +
          "type": "string"
151 +
        }
152 +
      },
153 +
      "required": [
154 +
        "type"
155 +
      ],
171 156
      "type": "object"
172 157
    },
173 158
    "viewRecord": {
174 -
      "description": "Component is a view for individual records of a collection. Omit collection for a generic record view.",
159 +
      "description": "View accepts individual records of a collection. Omit collection for a generic record view. When rkey is present, the component accepts bare DIDs (expanded to full AT URIs) and appears on identity pages.",
175 160
      "properties": {
176 161
        "collection": {
177 162
          "description": "The collection this component views. Omit for any-collection.",
178 163
          "format": "nsid",
179 164
          "type": "string"
165 +
        },
166 +
        "rkey": {
167 +
          "description": "The record key, baked from the collection's lexicon at authoring time. Presence enables DID expansion and identity page routing.",
168 +
          "maxLength": 512,
169 +
          "type": "string"
180 170
        }
181 171
      },
182 172
      "type": "object"
183 173
    }
184 174
  },
185 175
  "id": "at.inlay.component",
186 176
  "lexicon": 1
187 177
}

Compare Other Versions

Lexicon Garden

@