app.atmobb.forum.profile

lexicons.atmobb.app

Schema Diff

+69 -1

From

CID
bafyreihklfu26fw...
Indexed At
2026-09-13 00:02 UTC
View this version

To

CID
bafyreifspsdwjy4...
Indexed At
2026-10-07 04:30 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 33 non-breaking changes.

Non-Breaking Changes (33)
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile#membership" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.gatedSince" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.inviteCap" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.inviteDays" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.mode" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.prompt" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.hideCredit" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.hideDefaultStamps" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.hideProfileSkins" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro:items" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro:items:variant0" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro:items:variant1" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro:items:variant2" }
  • AddedVertex AddedVertex { vertex_id: "app.atmobb.forum.profile:body.membership" }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.gatedSince", kind: "prop", name: Some("gatedSince") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.inviteCap", kind: "prop", name: Some("inviteCap") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.inviteDays", kind: "prop", name: Some("inviteDays") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.mode", kind: "prop", name: Some("mode") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.prompt", kind: "prop", name: Some("prompt") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.hideCredit", kind: "prop", name: Some("hideCredit") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.hideDefaultStamps", kind: "prop", name: Some("hideDefaultStamps") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.hideProfileSkins", kind: "prop", name: Some("hideProfileSkins") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.intro", kind: "prop", name: Some("intro") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.membership", kind: "prop", name: Some("membership") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body.intro", tgt: "app.atmobb.forum.profile:body.intro:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body.intro:items", tgt: "app.atmobb.forum.profile:body.intro:items:variant0", kind: "variant", name: Some("app.atmobb.richtext.block#text") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body.intro:items", tgt: "app.atmobb.forum.profile:body.intro:items:variant1", kind: "variant", name: Some("app.atmobb.richtext.block#quote") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body.intro:items", tgt: "app.atmobb.forum.profile:body.intro:items:variant2", kind: "variant", name: Some("app.atmobb.richtext.block#code") }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body.intro:items:variant0", tgt: "app.atmobb.richtext.block#text", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body.intro:items:variant1", tgt: "app.atmobb.richtext.block#quote", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body.intro:items:variant2", tgt: "app.atmobb.richtext.block#code", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "app.atmobb.forum.profile:body.membership", tgt: "app.atmobb.forum.profile#membership", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "app.atmobb.forum.profile#membership" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.gatedSince" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.inviteCap" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.inviteDays" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.mode" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile#membership.prompt" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.hideCredit" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.hideDefaultStamps" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.hideProfileSkins" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro:items" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro:items:variant0" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro:items:variant1" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.intro:items:variant2" }
  • AddedVertex { vertex_id: "app.atmobb.forum.profile:body.membership" }

Additional Notes

  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.gatedSince", kind: "prop", name: Some("gatedSince") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.inviteCap", kind: "prop", name: Some("inviteCap") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.inviteDays", kind: "prop", name: Some("inviteDays") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.mode", kind: "prop", name: Some("mode") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile#membership", tgt: "app.atmobb.forum.profile#membership.prompt", kind: "prop", name: Some("prompt") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.hideCredit", kind: "prop", name: Some("hideCredit") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.hideDefaultStamps", kind: "prop", name: Some("hideDefaultStamps") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.hideProfileSkins", kind: "prop", name: Some("hideProfileSkins") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.intro", kind: "prop", name: Some("intro") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body", tgt: "app.atmobb.forum.profile:body.membership", kind: "prop", name: Some("membership") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body.intro", tgt: "app.atmobb.forum.profile:body.intro:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body.intro:items", tgt: "app.atmobb.forum.profile:body.intro:items:variant0", kind: "variant", name: Some("app.atmobb.richtext.block#text") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body.intro:items", tgt: "app.atmobb.forum.profile:body.intro:items:variant1", kind: "variant", name: Some("app.atmobb.richtext.block#quote") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body.intro:items", tgt: "app.atmobb.forum.profile:body.intro:items:variant2", kind: "variant", name: Some("app.atmobb.richtext.block#code") }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body.intro:items:variant0", tgt: "app.atmobb.richtext.block#text", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body.intro:items:variant1", tgt: "app.atmobb.richtext.block#quote", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body.intro:items:variant2", tgt: "app.atmobb.richtext.block#code", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "app.atmobb.forum.profile:body.membership", tgt: "app.atmobb.forum.profile#membership", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "font": {
5 5
      "properties": {
6 6
        "family": {
7 7
          "maxGraphemes": 64,
8 8
          "maxLength": 640,
9 9
          "type": "string"
10 10
        },
11 11
        "source": {
12 12
          "accept": [
13 13
            "font/woff",
14 14
            "font/woff2"
15 15
          ],
16 16
          "maxSize": 2000000,
17 17
          "type": "blob"
18 18
        },
19 19
        "style": {
20 20
          "knownValues": [
21 21
            "normal",
22 22
            "italic"
23 23
          ],
24 24
          "maxLength": 16,
25 25
          "type": "string"
26 26
        },
27 27
        "weight": {
28 28
          "maximum": 900,
29 29
          "minimum": 100,
30 30
          "type": "integer"
31 31
        }
32 32
      },
33 33
      "required": [
34 34
        "family",
35 35
        "weight",
36 36
        "style",
37 37
        "source"
38 38
      ],
39 39
      "type": "object"
40 40
    },
41 41
    "homepage": {
42 42
      "properties": {
43 43
        "featuredThreads": {
44 44
          "items": {
45 45
            "format": "at-uri",
46 46
            "type": "string"
47 47
          },
48 48
          "maxLength": 3,
49 49
          "type": "array"
50 50
        },
51 51
        "layout": {
52 52
          "knownValues": [
53 53
            "boards",
54 54
            "latest",
55 55
            "categories-latest"
56 56
          ],
57 57
          "maxLength": 32,
58 58
          "type": "string"
59 59
        },
60 60
        "sidebar": {
61 61
          "type": "boolean"
62 62
        },
63 63
        "welcome": {
64 64
          "knownValues": [
65 65
            "classic",
66 66
            "compact",
67 67
            "hidden"
68 68
          ],
69 69
          "maxLength": 32,
70 70
          "type": "string"
71 71
        }
72 72
      },
73 73
      "type": "object"
74 74
    },
75 75
    "main": {
76 76
      "description": "A forum's identity and configuration. Lives in the forum account's repo; the forum's DID is the forum's identity.",
77 77
      "key": "literal:self",
78 78
      "record": {
79 79
        "properties": {
80 80
          "avatar": {
81 81
            "accept": [
82 82
              "image/png",
83 83
              "image/jpeg",
84 84
              "image/webp"
85 85
            ],
86 86
            "maxSize": 1000000,
87 87
            "type": "blob"
88 88
          },
89 89
          "banner": {
90 90
            "accept": [
91 91
              "image/png",
92 92
              "image/jpeg",
93 93
              "image/webp"
94 94
            ],
95 95
            "maxSize": 2000000,
96 96
            "type": "blob"
97 97
          },
98 98
          "createdAt": {
99 99
            "format": "datetime",
100 100
            "type": "string"
101 101
          },
102 102
          "customCss": {
103 103
            "description": "Forum-owned CSS applied to public pages. Admin pages deliberately ignore it so a broken stylesheet can always be repaired.",
104 104
            "maxLength": 100000,
105 105
            "type": "string"
106 106
          },
107 107
          "customFonts": {
108 108
            "description": "Forum-owned webfont faces available to customCss.",
109 109
            "items": {
110 110
              "ref": "#font",
111 111
              "type": "ref"
112 112
            },
113 113
            "maxLength": 12,
114 114
            "type": "array"
115 115
          },
116 116
          "description": {
117 117
            "maxGraphemes": 1000,
118 118
            "maxLength": 10000,
119 119
            "type": "string"
120 120
          },
121 121
          "favicon": {
122 122
            "accept": [
123 123
              "image/png",
124 124
              "image/jpeg",
125 125
              "image/webp"
126 126
            ],
127 127
            "description": "Forum-owned browser icon.",
128 128
            "maxSize": 1000000,
129 129
            "type": "blob"
130 130
          },
131 +
          "hideCredit": {
132 +
            "description": "Hide the 'powered by atmobb' badge in the page footer. Absent means shown.",
133 +
            "type": "boolean"
134 +
          },
135 +
          "hideDefaultStamps": {
136 +
            "description": "Hide the board and arrival default stamps on member rails. The 'here since' line always shows. Absent means shown.",
137 +
            "type": "boolean"
138 +
          },
139 +
          "hideProfileSkins": {
140 +
            "description": "Show every member profile page in the forum's own colors, ignoring members' profile skins. Banner patterns and headlines still show. Absent means skins show.",
141 +
            "type": "boolean"
142 +
          },
131 143
          "homepage": {
132 144
            "description": "Optional forum homepage presentation. Absent values retain the classic board index.",
133 145
            "ref": "#homepage",
134 146
            "type": "ref"
135 147
          },
148 +
          "intro": {
149 +
            "description": "Rich welcome shown in the home page hero under the description. Absent means the hero shows the name and description only.",
150 +
            "items": {
151 +
              "refs": [
152 +
                "app.atmobb.richtext.block#text",
153 +
                "app.atmobb.richtext.block#quote",
154 +
                "app.atmobb.richtext.block#code"
155 +
              ],
156 +
              "type": "union"
157 +
            },
158 +
            "maxLength": 50,
159 +
            "type": "array"
160 +
          },
136 161
          "links": {
137 162
            "items": {
138 163
              "format": "uri",
139 164
              "type": "string"
140 165
            },
141 166
            "maxLength": 20,
142 167
            "type": "array"
143 168
          },
169 +
          "membership": {
170 +
            "description": "How people join. Absent means open: declaring membership is joining.",
171 +
            "ref": "#membership",
172 +
            "type": "ref"
173 +
          },
144 174
          "name": {
145 175
            "maxGraphemes": 100,
146 176
            "maxLength": 1000,
147 177
            "type": "string"
148 178
          },
149 179
          "ogImage": {
150 180
            "accept": [
151 181
              "image/png"
152 182
            ],
153 183
            "description": "Forum-owned 1200 by 630 PNG used as the forum landing page's social preview image.",
154 184
            "maxSize": 2000000,
155 185
            "type": "blob"
156 186
          },
157 187
          "ogTheme": {
158 188
            "description": "Visual preset used by the generated forum landing page social preview.",
159 189
            "knownValues": [
160 190
              "classic",
161 191
              "midnight",
162 192
              "ocean",
163 193
              "forest",
164 194
              "plum"
165 195
            ],
166 196
            "maxLength": 32,
167 197
            "type": "string"
168 198
          },
169 199
          "ranks": {
170 -
            "description": "Post-count rank ladder, ordered ascending by minPosts. Ranks are computed by appviews from indexed post counts.",
200 +
            "description": "Deprecated and no longer rendered: post-count ranks gave way to stamps (app.atmobb.forum.stamp). Kept so older records still validate.",
171 201
            "items": {
172 202
              "ref": "#rank",
173 203
              "type": "ref"
174 204
            },
175 205
            "maxLength": 50,
176 206
            "type": "array"
177 207
          },
178 208
          "rules": {
179 209
            "items": {
180 210
              "refs": [
181 211
                "app.atmobb.richtext.block#text",
182 212
                "app.atmobb.richtext.block#quote",
183 213
                "app.atmobb.richtext.block#code"
184 214
              ],
185 215
              "type": "union"
186 216
            },
187 217
            "maxLength": 50,
188 218
            "type": "array"
189 219
          },
190 220
          "theme": {
191 221
            "description": "Built-in color theme preset. Absent means the classic atmobb skin. Custom CSS loads after the preset and may override it.",
192 222
            "knownValues": [
193 223
              "classic",
194 224
              "sky",
195 225
              "bubblegum",
196 226
              "midnight",
197 227
              "forest"
198 228
            ],
199 229
            "maxLength": 32,
200 230
            "type": "string"
201 231
          }
202 232
        },
203 233
        "required": [
204 234
          "name"
205 235
        ],
206 236
        "type": "object"
207 237
      },
208 238
      "type": "record"
209 239
    },
240 +
    "membership": {
241 +
      "description": "Join policy for a forum. In the apply and invite modes only accounts the forum has accepted (an acceptMember moderation action) may post; reading stays public.",
242 +
      "properties": {
243 +
        "gatedSince": {
244 +
          "description": "When the forum last entered a gated mode. Posts written while the forum was open are served regardless of membership.",
245 +
          "format": "datetime",
246 +
          "type": "string"
247 +
        },
248 +
        "inviteCap": {
249 +
          "description": "Open invites an ordinary member may hold at once. 0 means only staff mint invites.",
250 +
          "maximum": 100,
251 +
          "minimum": 0,
252 +
          "type": "integer"
253 +
        },
254 +
        "inviteDays": {
255 +
          "description": "Days before an unredeemed invite expires.",
256 +
          "maximum": 365,
257 +
          "minimum": 1,
258 +
          "type": "integer"
259 +
        },
260 +
        "mode": {
261 +
          "knownValues": [
262 +
            "open",
263 +
            "apply",
264 +
            "invite"
265 +
          ],
266 +
          "maxLength": 32,
267 +
          "type": "string"
268 +
        },
269 +
        "prompt": {
270 +
          "description": "The one question shown on the application form in apply mode.",
271 +
          "maxGraphemes": 300,
272 +
          "maxLength": 3000,
273 +
          "type": "string"
274 +
        }
275 +
      },
276 +
      "type": "object"
277 +
    },
210 278
    "rank": {
211 279
      "properties": {
212 280
        "minPosts": {
213 281
          "minimum": 0,
214 282
          "type": "integer"
215 283
        },
216 284
        "title": {
217 285
          "maxGraphemes": 64,
218 286
          "maxLength": 640,
219 287
          "type": "string"
220 288
        }
221 289
      },
222 290
      "required": [
223 291
        "title",
224 292
        "minPosts"
225 293
      ],
226 294
      "type": "object"
227 295
    }
228 296
  },
229 297
  "id": "app.atmobb.forum.profile",
230 298
  "lexicon": 1
231 299
}

Compare Other Versions

Lexicon Garden

@