at.inlay.component

inlay.at

Schema Diff

+73 -86

From

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

To

CID
bafyreid76brwsr2...
Indexed At
2026-03-27 06:44 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

32 breaking changes, 23 non-breaking changes.

Breaking Changes (32)
  • 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.type" }
  • 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#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.prop", kind: "prop", name: Some("prop") }
  • RemovedEdge RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.type", kind: "prop", name: Some("type") }
  • 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", tgt: "at.inlay.component:body.type", kind: "prop", name: Some("type") }
  • 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.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") }
  • KindChanged KindChanged { vertex_id: "at.inlay.component:body.view", old_kind: "array", new_kind: "ref" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component#viewRecord.rkey", sort: "maxLength", value: "512" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component#viewPrimitive.type", sort: "maxLength", value: "128" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component#viewPrimitive.format", sort: "maxLength", value: "64" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component#view.prop", sort: "maxLength", value: "256" }
Non-Breaking Changes (23)
  • AddedVertex AddedVertex { vertex_id: "at.inlay.component#bodyExternal.personalized" }
  • 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#bodyExternal", tgt: "at.inlay.component#bodyExternal.personalized", kind: "prop", name: Some("personalized") }
  • AddedEdge AddedEdge { src: "at.inlay.component#view", tgt: "at.inlay.component#view.accepts", kind: "prop", name: Some("accepts") }
  • AddedEdge AddedEdge { src: "at.inlay.component#view", tgt: "at.inlay.component#view.prop", kind: "prop", name: Some("prop") }
  • 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#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.format", kind: "prop", name: Some("format") }
  • AddedEdge AddedEdge { src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.type", kind: "prop", name: Some("type") }
  • AddedEdge AddedEdge { src: "at.inlay.component#viewRecord", tgt: "at.inlay.component#viewRecord.rkey", kind: "prop", name: Some("rkey") }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.inlay.component#acceptsEntry.format", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.inlay.component#acceptsEntry.prop", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.inlay.component#acceptsEntry.type", sort: "maxLength" }

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.type" }
  • 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#bodyExternal.personalized" }
  • 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#viewRecord.rkey", sort: "maxLength", value: "512" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component#viewPrimitive.type", sort: "maxLength", value: "128" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component#view.prop", sort: "maxLength", value: "256" }
  • ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component#viewPrimitive.format", sort: "maxLength", value: "64" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.inlay.component#acceptsEntry.type", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.inlay.component#acceptsEntry.format", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "at.inlay.component#acceptsEntry.prop", sort: "maxLength" }

Additional Notes

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

Compare Other Versions

Lexicon Garden

@