From
bafyreidauwqicqmynoj677qlwhjkb5pjvnwhgvfg5si4yyqkldcm2htoni
indexed 2026-08-26 01:08 UTC
View this version
To
bafyreibiw5jubytubofbeinz65tubgj533jyeczd25vcp3qmxnr5srw6fa
indexed 2026-09-06 12:49 UTC
View this version
Compatibility
breaking 2 breaking changes, 8 non-breaking changes.
Breaking changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "page.mooring.site#link", src: "page.mooring.site#link", tgt: "page.mooring.site#link.label", kind: "prop", name: Some("label") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "page.mooring.site#link", src: "page.mooring.site#link", tgt: "page.mooring.site#link.uri", kind: "prop", name: Some("uri") }
Non-breaking changes (8)
- AddedVertex AddedVertex { vertex_id: "page.mooring.site#link" }
- AddedVertex AddedVertex { vertex_id: "page.mooring.site#link.label" }
- AddedVertex AddedVertex { vertex_id: "page.mooring.site#link.uri" }
- AddedVertex AddedVertex { vertex_id: "page.mooring.site:body.links" }
- AddedVertex AddedVertex { vertex_id: "page.mooring.site:body.links:items" }
- AddedEdge AddedEdge { src: "page.mooring.site:body", tgt: "page.mooring.site:body.links", kind: "prop", name: Some("links") }
- AddedEdge AddedEdge { src: "page.mooring.site:body.links", tgt: "page.mooring.site:body.links:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "page.mooring.site:body.links:items", tgt: "page.mooring.site#link", kind: "ref", name: None }
Migration guidance
Added
AddedVertex { vertex_id: "page.mooring.site#link" }AddedVertex { vertex_id: "page.mooring.site#link.label" }AddedVertex { vertex_id: "page.mooring.site#link.uri" }AddedVertex { vertex_id: "page.mooring.site:body.links" }AddedVertex { vertex_id: "page.mooring.site:body.links:items" }
Notes
- Breaking: RequiredEdgeAdded { vertex_id: "page.mooring.site#link", src: "page.mooring.site#link", tgt: "page.mooring.site#link.label", kind: "prop", name: Some("label") }
- Breaking: RequiredEdgeAdded { vertex_id: "page.mooring.site#link", src: "page.mooring.site#link", tgt: "page.mooring.site#link.uri", kind: "prop", name: Some("uri") }
- Non-breaking: AddedEdge { src: "page.mooring.site:body", tgt: "page.mooring.site:body.links", kind: "prop", name: Some("links") }
- Non-breaking: AddedEdge { src: "page.mooring.site:body.links", tgt: "page.mooring.site:body.links:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "page.mooring.site:body.links:items", tgt: "page.mooring.site#link", kind: "ref", name: None }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {44
"careerSection": {55
"description": "Professional profile rendered from the owner's id.sifa.* records.",66
"properties": {77
"parts": {88
"description": "Which parts of the sifa profile to render, in order. When absent, renderers should show the parts that have data, in a default order.",99
"items": {1010
"knownValues": [1111
"positions",1212
"education",1313
"skills",1414
"projects",1515
"certifications",1616
"publications"1717
],1818
"type": "string"1919
},2020
"maxLength": 10,2121
"type": "array"2222
},2323
"title": {2424
"maxGraphemes": 128,2525
"maxLength": 1280,2626
"type": "string"2727
}2828
},2929
"type": "object"3030
},3131
"colors": {3232
"description": "Semantic color overrides, mirroring the role vocabulary of site.standard.theme.basic. Any subset may be set.",3333
"properties": {3434
"accent": {3535
"closed": false,3636
"description": "Color used for links and button backgrounds.",3737
"refs": [3838
"#rgb"3939
],4040
"type": "union"4141
},4242
"accentForeground": {4343
"closed": false,4444
"description": "Color used for button text.",4545
"refs": [4646
"#rgb"4747
],4848
"type": "union"4949
},5050
"background": {5151
"closed": false,5252
"description": "Color used for content background.",5353
"refs": [5454
"#rgb"5555
],5656
"type": "union"5757
},5858
"foreground": {5959
"closed": false,6060
"description": "Color used for content text.",6161
"refs": [6262
"#rgb"6363
],6464
"type": "union"6565
}6666
},6767
"type": "object"6868
},6969
"heroSection": {7070
"description": "Introductory section rendered from the owner's profile records (app.bsky.actor.profile, with id.sifa.profile.self as professional-context overlay when present).",7171
"properties": {7272
"showAvatar": {7373
"description": "Default true when absent.",7474
"type": "boolean"7575
},7676
"style": {7777
"description": "Banner treatment when the profile carries a banner: 'band' renders it full-width above the heading, 'postcard' renders it as a framed photograph beside the heading. Default 'band'. Without a banner both fall back to the avatar-led hero.",7878
"knownValues": [7979
"band",8080
"postcard"8181
],8282
"type": "string"8383
},8484
"tagline": {8585
"description": "Short line under the heading. When absent, renderers should fall back to the profile description or sifa headline.",8686
"maxGraphemes": 300,8787
"maxLength": 3000,8888
"type": "string"8989
},9090
"title": {9191
"description": "Heading override. When absent, renderers should fall back to profile data.",9292
"maxGraphemes": 128,9393
"maxLength": 1280,9494
"type": "string"9595
}9696
},9797
"type": "object"9898
},99
"link": {100
"properties": {101
"label": {102
"description": "Link text, like 'Follow me on Blacksky'.",103
"maxGraphemes": 64,104
"maxLength": 640,105
"type": "string"106
},107
"uri": {108
"description": "Where the link goes. Browsers open http(s) URLs; other schemes are the client's problem.",109
"format": "uri",110
"maxLength": 2048,111
"type": "string"112
}113
},114
"required": [115
"label",116
"uri"117
],118
"type": "object"119
},99120
"main": {100121
"description": "A Mooring site. Every field except createdAt is optional: an empty record is a valid site, and the renderer falls back to the owner's profile records and a default section order.",101122
"key": "any",102123
"record": {103124
"properties": {104125
"contactEmail": {105126
"description": "Public contact email, rendered as a contact affordance on the site. Publishing an address here makes it world-readable.",106127
"maxGraphemes": 254,107128
"maxLength": 2540,108129
"type": "string"109130
},110131
"createdAt": {111132
"description": "Client-declared timestamp when this record was created.",112133
"format": "datetime",113134
"type": "string"114135
},115136
"description": {116137
"description": "Short description of the site, used for meta tags and previews.",117138
"maxGraphemes": 3000,118139
"maxLength": 30000,119140
"type": "string"120141
},121142
"discoverable": {122143
"description": "Default true when absent. When false, the renderer emits noindex directives for the site. Does not affect the public visibility of the underlying atproto records.",123144
"type": "boolean"124145
},125146
"icon": {126147
"accept": [127148
"image/*"128149
],129150
"description": "Square image used as the site icon/favicon. Should be at least 256x256.",130151
"maxSize": 1000000,131152
"type": "blob"132153
},133154
"labels": {134155
"refs": [135156
"com.atproto.label.defs#selfLabels"136157
],137158
"type": "union"138159
},160
"links": {161
"description": "Links rendered as the site's closing actions, in order: where a visitor can follow or reach the owner, on whichever apps the owner chooses. When absent, renderers should fall back to a link to the owner's profile that works from any client.",162
"items": {163
"ref": "#link",164
"type": "ref"165
},166
"maxLength": 5,167
"type": "array"168
},139169
"name": {140170
"description": "Site title. When absent, renderers should fall back to the owner's profile displayName or handle.",141171
"maxGraphemes": 500,142172
"maxLength": 5000,143173
"type": "string"144174
},145175
"sections": {146176
"description": "Ordered sections of the site, rendered top to bottom; order is array position. When absent, renderers should use a sensible default order based on which sources have data.",147177
"items": {148178
"closed": false,149179
"refs": [150180
"#heroSection",151181
"#postsSection",152182
"#writingSection",153183
"#careerSection",154184
"#pagesSection"155185
],156186
"type": "union"157187
},158188
"maxLength": 50,159189
"type": "array"160190
},161191
"signOff": {162192
"description": "Valediction rendered before the owner's name in the site's closing sign-off, like 'Warmly,'. When absent, the sign-off shows the name alone.",163193
"maxGraphemes": 64,164194
"maxLength": 640,165195
"type": "string"166196
},167197
"theme": {168198
"ref": "#theme",169199
"type": "ref"170200
}171201
},172202
"required": [173203
"createdAt"174204
],175205
"type": "object"176206
},177207
"type": "record"178208
},179209
"pagesSection": {180210
"description": "Listing of the site's authored page.mooring.page records.",181211
"properties": {182212
"pages": {183213
"description": "Explicit ordered list of page records (AT-URIs) to show. Renderers should skip dangling references. When absent, all public pages are listed in a renderer-defined order.",184214
"items": {185215
"format": "at-uri",186216
"type": "string"187217
},188218
"maxLength": 100,189219
"type": "array"190220
},191221
"title": {192222
"maxGraphemes": 128,193223
"maxLength": 1280,194224
"type": "string"195225
}196226
},197227
"type": "object"198228
},199229
"postsSection": {200230
"description": "Recent microblog posts from the owner's app.bsky.feed.post collection.",201231
"properties": {202232
"limit": {203233
"description": "Maximum number of posts to display. Renderer default applies when absent.",204234
"maximum": 50,205235
"minimum": 1,206236
"type": "integer"207237
},208238
"title": {209239
"maxGraphemes": 128,210240
"maxLength": 1280,211241
"type": "string"212242
}213243
},214244
"type": "object"215245
},216246
"rgb": {217247
"properties": {218248
"b": {219249
"maximum": 255,220250
"minimum": 0,221251
"type": "integer"222252
},223253
"g": {224254
"maximum": 255,225255
"minimum": 0,226256
"type": "integer"227257
},228258
"r": {229259
"maximum": 255,230260
"minimum": 0,231261
"type": "integer"232262
}233263
},234264
"required": [235265
"r",236266
"g",237267
"b"238268
],239269
"type": "object"240270
},241271
"theme": {242272
"description": "Theme selection and overrides. All fields optional; renderer defaults apply.",243273
"properties": {244274
"colors": {245275
"ref": "#colors",246276
"type": "ref"247277
},248278
"preset": {249279
"description": "Named theme preset. Unknown values should fall back to the renderer's default preset.",250280
"knownValues": [251281
"classic"252282
],253283
"type": "string"254284
}255285
},256286
"type": "object"257287
},258288
"writingSection": {259289
"description": "Long-form writing from the owner's site.standard.document collection (with pub.leaflet.* legacy records as fallback).",260290
"properties": {261291
"limit": {262292
"description": "Maximum number of documents to display. Renderer default applies when absent.",263293
"maximum": 50,264294
"minimum": 1,265295
"type": "integer"266296
},267297
"publication": {268298
"description": "AT-URI of a site.standard.publication record to scope the listing to. When absent, renderers should list the owner's documents across publications.",269299
"format": "at-uri",270300
"type": "string"271301
},272302
"title": {273303
"maxGraphemes": 128,274304
"maxLength": 1280,275305
"type": "string"276306
}277307
},278308
"type": "object"279309
}280310
},281311
"description": "Configuration for a Mooring site. The record at rkey 'self' is the owner's default site; other rkeys are reserved for possible future multi-site support.",282312
"id": "page.mooring.site",283313
"lexicon": 1284314
}