page.mooring.site

mooring.page

Schema Diff

+6 -0

From

CID
bafyreiaz673qofo...
Indexed At
2026-08-25 12:44 UTC
View this version

To

CID
bafyreidauwqicqm...
Indexed At
2026-08-26 01:08 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 2 non-breaking changes.

Non-Breaking Changes (2)
  • AddedVertex AddedVertex { vertex_id: "page.mooring.site:body.signOff" }
  • AddedEdge AddedEdge { src: "page.mooring.site:body", tgt: "page.mooring.site:body.signOff", kind: "prop", name: Some("signOff") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "page.mooring.site:body.signOff" }

Additional Notes

  • Non-breaking: AddedEdge { src: "page.mooring.site:body", tgt: "page.mooring.site:body.signOff", kind: "prop", name: Some("signOff") }
1 1
{
2 2
  "id": "page.mooring.site",
3 3
  "defs": {
4 4
    "rgb": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "r",
8 8
        "g",
9 9
        "b"
10 10
      ],
11 11
      "properties": {
12 12
        "b": {
13 13
          "type": "integer",
14 14
          "maximum": 255,
15 15
          "minimum": 0
16 16
        },
17 17
        "g": {
18 18
          "type": "integer",
19 19
          "maximum": 255,
20 20
          "minimum": 0
21 21
        },
22 22
        "r": {
23 23
          "type": "integer",
24 24
          "maximum": 255,
25 25
          "minimum": 0
26 26
        }
27 27
      }
28 28
    },
29 29
    "main": {
30 30
      "key": "any",
31 31
      "type": "record",
32 32
      "record": {
33 33
        "type": "object",
34 34
        "required": [
35 35
          "createdAt"
36 36
        ],
37 37
        "properties": {
38 38
          "icon": {
39 39
            "type": "blob",
40 40
            "accept": [
41 41
              "image/*"
42 42
            ],
43 43
            "maxSize": 1000000,
44 44
            "description": "Square image used as the site icon/favicon. Should be at least 256x256."
45 45
          },
46 46
          "name": {
47 47
            "type": "string",
48 48
            "maxLength": 5000,
49 49
            "description": "Site title. When absent, renderers should fall back to the owner's profile displayName or handle.",
50 50
            "maxGraphemes": 500
51 51
          },
52 52
          "theme": {
53 53
            "ref": "#theme",
54 54
            "type": "ref"
55 55
          },
56 56
          "labels": {
57 57
            "refs": [
58 58
              "com.atproto.label.defs#selfLabels"
59 59
            ],
60 60
            "type": "union"
61 61
          },
62 +
          "signOff": {
63 +
            "type": "string",
64 +
            "maxLength": 640,
65 +
            "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.",
66 +
            "maxGraphemes": 64
67 +
          },
62 68
          "sections": {
63 69
            "type": "array",
64 70
            "items": {
65 71
              "refs": [
66 72
                "#heroSection",
67 73
                "#postsSection",
68 74
                "#writingSection",
69 75
                "#careerSection",
70 76
                "#pagesSection"
71 77
              ],
72 78
              "type": "union",
73 79
              "closed": false
74 80
            },
75 81
            "maxLength": 50,
76 82
            "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."
77 83
          },
78 84
          "createdAt": {
79 85
            "type": "string",
80 86
            "format": "datetime",
81 87
            "description": "Client-declared timestamp when this record was created."
82 88
          },
83 89
          "description": {
84 90
            "type": "string",
85 91
            "maxLength": 30000,
86 92
            "description": "Short description of the site, used for meta tags and previews.",
87 93
            "maxGraphemes": 3000
88 94
          },
89 95
          "contactEmail": {
90 96
            "type": "string",
91 97
            "maxLength": 2540,
92 98
            "description": "Public contact email, rendered as a contact affordance on the site. Publishing an address here makes it world-readable.",
93 99
            "maxGraphemes": 254
94 100
          },
95 101
          "discoverable": {
96 102
            "type": "boolean",
97 103
            "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."
98 104
          }
99 105
        }
100 106
      },
101 107
      "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."
102 108
    },
103 109
    "theme": {
104 110
      "type": "object",
105 111
      "properties": {
106 112
        "colors": {
107 113
          "ref": "#colors",
108 114
          "type": "ref"
109 115
        },
110 116
        "preset": {
111 117
          "type": "string",
112 118
          "description": "Named theme preset. Unknown values should fall back to the renderer's default preset.",
113 119
          "knownValues": [
114 120
            "classic"
115 121
          ]
116 122
        }
117 123
      },
118 124
      "description": "Theme selection and overrides. All fields optional; renderer defaults apply."
119 125
    },
120 126
    "colors": {
121 127
      "type": "object",
122 128
      "properties": {
123 129
        "accent": {
124 130
          "refs": [
125 131
            "#rgb"
126 132
          ],
127 133
          "type": "union",
128 134
          "closed": false,
129 135
          "description": "Color used for links and button backgrounds."
130 136
        },
131 137
        "background": {
132 138
          "refs": [
133 139
            "#rgb"
134 140
          ],
135 141
          "type": "union",
136 142
          "closed": false,
137 143
          "description": "Color used for content background."
138 144
        },
139 145
        "foreground": {
140 146
          "refs": [
141 147
            "#rgb"
142 148
          ],
143 149
          "type": "union",
144 150
          "closed": false,
145 151
          "description": "Color used for content text."
146 152
        },
147 153
        "accentForeground": {
148 154
          "refs": [
149 155
            "#rgb"
150 156
          ],
151 157
          "type": "union",
152 158
          "closed": false,
153 159
          "description": "Color used for button text."
154 160
        }
155 161
      },
156 162
      "description": "Semantic color overrides, mirroring the role vocabulary of site.standard.theme.basic. Any subset may be set."
157 163
    },
158 164
    "heroSection": {
159 165
      "type": "object",
160 166
      "properties": {
161 167
        "style": {
162 168
          "type": "string",
163 169
          "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.",
164 170
          "knownValues": [
165 171
            "band",
166 172
            "postcard"
167 173
          ]
168 174
        },
169 175
        "title": {
170 176
          "type": "string",
171 177
          "maxLength": 1280,
172 178
          "description": "Heading override. When absent, renderers should fall back to profile data.",
173 179
          "maxGraphemes": 128
174 180
        },
175 181
        "tagline": {
176 182
          "type": "string",
177 183
          "maxLength": 3000,
178 184
          "description": "Short line under the heading. When absent, renderers should fall back to the profile description or sifa headline.",
179 185
          "maxGraphemes": 300
180 186
        },
181 187
        "showAvatar": {
182 188
          "type": "boolean",
183 189
          "description": "Default true when absent."
184 190
        }
185 191
      },
186 192
      "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)."
187 193
    },
188 194
    "pagesSection": {
189 195
      "type": "object",
190 196
      "properties": {
191 197
        "pages": {
192 198
          "type": "array",
193 199
          "items": {
194 200
            "type": "string",
195 201
            "format": "at-uri"
196 202
          },
197 203
          "maxLength": 100,
198 204
          "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."
199 205
        },
200 206
        "title": {
201 207
          "type": "string",
202 208
          "maxLength": 1280,
203 209
          "maxGraphemes": 128
204 210
        }
205 211
      },
206 212
      "description": "Listing of the site's authored page.mooring.page records."
207 213
    },
208 214
    "postsSection": {
209 215
      "type": "object",
210 216
      "properties": {
211 217
        "limit": {
212 218
          "type": "integer",
213 219
          "maximum": 50,
214 220
          "minimum": 1,
215 221
          "description": "Maximum number of posts to display. Renderer default applies when absent."
216 222
        },
217 223
        "title": {
218 224
          "type": "string",
219 225
          "maxLength": 1280,
220 226
          "maxGraphemes": 128
221 227
        }
222 228
      },
223 229
      "description": "Recent microblog posts from the owner's app.bsky.feed.post collection."
224 230
    },
225 231
    "careerSection": {
226 232
      "type": "object",
227 233
      "properties": {
228 234
        "parts": {
229 235
          "type": "array",
230 236
          "items": {
231 237
            "type": "string",
232 238
            "knownValues": [
233 239
              "positions",
234 240
              "education",
235 241
              "skills",
236 242
              "projects",
237 243
              "certifications",
238 244
              "publications"
239 245
            ]
240 246
          },
241 247
          "maxLength": 10,
242 248
          "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."
243 249
        },
244 250
        "title": {
245 251
          "type": "string",
246 252
          "maxLength": 1280,
247 253
          "maxGraphemes": 128
248 254
        }
249 255
      },
250 256
      "description": "Professional profile rendered from the owner's id.sifa.* records."
251 257
    },
252 258
    "writingSection": {
253 259
      "type": "object",
254 260
      "properties": {
255 261
        "limit": {
256 262
          "type": "integer",
257 263
          "maximum": 50,
258 264
          "minimum": 1,
259 265
          "description": "Maximum number of documents to display. Renderer default applies when absent."
260 266
        },
261 267
        "title": {
262 268
          "type": "string",
263 269
          "maxLength": 1280,
264 270
          "maxGraphemes": 128
265 271
        },
266 272
        "publication": {
267 273
          "type": "string",
268 274
          "format": "at-uri",
269 275
          "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."
270 276
        }
271 277
      },
272 278
      "description": "Long-form writing from the owner's site.standard.document collection (with pub.leaflet.* legacy records as fallback)."
273 279
    }
274 280
  },
275 281
  "$type": "com.atproto.lexicon.schema",
276 282
  "lexicon": 1,
277 283
  "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."
278 284
}

Compare Other Versions

Lexicon Garden

@