me.linkna.linkinbio

linkna.me

Schema Diff

+129 -3

From

CID
bafyreicygp5ncvk...
Indexed At
2026-02-07 20:06 UTC
View this version

To

CID
bafyreiaoarpjuyv...
Indexed At
2026-02-09 15:19 UTC
View this version
1 1
{
2 2
  "id": "me.linkna.linkinbio",
3 3
  "defs": {
4 4
    "main": {
5 5
      "key": "literal:self",
6 6
      "type": "record",
7 7
      "record": {
8 8
        "type": "object",
9 9
        "required": [
10 10
          "cards"
11 11
        ],
12 12
        "properties": {
13 13
          "cards": {
14 14
            "type": "array",
15 15
            "items": {
16 16
              "refs": [
17 17
                "#linkCard",
18 18
                "#widgetGoodreads",
19 -
                "#widgetGithub"
19 +
                "#widgetGithub",
20 +
                "#widgetTealfm"
20 21
              ],
21 22
              "type": "union"
22 23
            },
23 -
            "description": "Ordered list of cards on the page. Each card is a union of linkCard, widgetGoodreads, or widgetGithub."
24 +
            "description": "Ordered list of cards on the page. Each card is a union of linkCard, widgetGoodreads, widgetGithub, or widgetTealfm."
24 25
          },
25 26
          "theme": {
26 27
            "type": "string",
27 28
            "description": "Deprecated: use themeConfig instead."
28 29
          },
29 30
          "socialIcons": {
30 31
            "type": "array",
31 32
            "items": {
32 33
              "ref": "#socialIcon",
33 34
              "type": "ref"
34 35
            },
35 36
            "description": "Social media icons displayed on the profile."
36 37
          },
37 38
          "themeConfig": {
38 39
            "ref": "#themeConfig",
39 40
            "type": "ref"
41 +
          },
42 +
          "connectedServices": {
43 +
            "ref": "#connectedServices",
44 +
            "type": "ref"
40 45
          }
41 46
        }
42 47
      },
43 48
      "description": "A user's link-in-bio page containing cards, theme configuration, and social icons."
44 49
    },
45 50
    "linkCard": {
46 51
      "type": "object",
47 52
      "properties": {
48 53
        "id": {
49 54
          "type": "string",
50 55
          "description": "Unique identifier for the card."
51 56
        },
52 57
        "url": {
53 58
          "type": "string",
54 59
          "format": "uri",
55 60
          "description": "URL the card links to."
56 61
        },
57 62
        "text": {
58 63
          "type": "string",
59 64
          "maxLength": 100,
60 65
          "description": "Display text for the card (falls back to URL domain if empty)."
61 66
        },
62 67
        "type": {
63 68
          "type": "string",
64 69
          "description": "Card type discriminator. Value: 'link' or absent for link cards."
65 70
        },
66 71
        "enabled": {
67 72
          "type": "boolean",
68 73
          "description": "Whether the card is visible on the public page. Defaults to true."
69 74
        },
70 75
        "highlighted": {
71 76
          "type": "boolean",
72 77
          "description": "Whether the card is visually highlighted."
73 78
        }
74 79
      },
75 80
      "description": "A standard link card."
76 81
    },
77 82
    "socialIcon": {
78 83
      "type": "object",
79 84
      "required": [
80 85
        "id",
81 86
        "platform",
82 87
        "url"
83 88
      ],
84 89
      "properties": {
85 90
        "id": {
86 91
          "type": "string",
87 92
          "description": "Unique identifier for the icon."
88 93
        },
89 94
        "url": {
90 95
          "type": "string",
91 96
          "format": "uri",
92 97
          "description": "URL to the user's profile on this platform."
93 98
        },
94 99
        "platform": {
95 100
          "type": "string",
96 101
          "description": "Platform identifier (e.g., 'bluesky', 'twitter', 'instagram')."
97 102
        }
98 103
      },
99 104
      "description": "A social media icon link."
100 105
    },
106 +
    "tealfmPlay": {
107 +
      "type": "object",
108 +
      "required": [
109 +
        "trackName",
110 +
        "artistName"
111 +
      ],
112 +
      "properties": {
113 +
        "coverUrl": {
114 +
          "type": "string",
115 +
          "description": "URL to the album cover image (from Cover Art Archive)."
116 +
        },
117 +
        "originUrl": {
118 +
          "type": "string",
119 +
          "description": "URL to the track on the original music service."
120 +
        },
121 +
        "trackName": {
122 +
          "type": "string",
123 +
          "description": "Track/song name."
124 +
        },
125 +
        "artistName": {
126 +
          "type": "string",
127 +
          "description": "Artist name(s)."
128 +
        },
129 +
        "playedTime": {
130 +
          "type": "string",
131 +
          "format": "datetime",
132 +
          "description": "When the track was played."
133 +
        },
134 +
        "releaseName": {
135 +
          "type": "string",
136 +
          "description": "Album/release name."
137 +
        }
138 +
      },
139 +
      "description": "A recently played track from teal.fm."
140 +
    },
101 141
    "themeConfig": {
102 142
      "type": "object",
103 143
      "properties": {
104 144
        "preset": {
105 145
          "type": "string",
106 146
          "description": "Theme preset ID."
107 147
        },
108 148
        "fontSize": {
109 149
          "type": "string",
110 150
          "description": "Font size. Default: md.",
111 151
          "knownValues": [
112 152
            "sm",
113 153
            "md",
114 154
            "lg"
115 155
          ]
116 156
        },
117 157
        "particles": {
118 158
          "type": "string",
119 159
          "description": "Background particle effect. Default: none.",
120 160
          "knownValues": [
121 161
            "none",
122 162
            "white",
123 163
            "blue"
124 164
          ]
125 165
        },
126 166
        "cardShadow": {
127 167
          "type": "string",
128 168
          "description": "Card/button shadow intensity.",
129 169
          "knownValues": [
130 170
            "none",
131 171
            "sm",
132 172
            "md",
133 173
            "lg",
134 174
            "xl"
135 175
          ]
136 176
        },
137 177
        "fontFamily": {
138 178
          "type": "string",
139 179
          "description": "Font family for the page."
140 180
        },
141 181
        "showBranding": {
142 182
          "type": "boolean",
143 183
          "description": "Whether Linkname branding is visible. Default: true."
144 184
        },
145 185
        "cardTextColor": {
146 186
          "type": "string",
147 187
          "description": "Card/button text color."
148 188
        },
149 189
        "cardHoverColor": {
150 190
          "type": "string",
151 191
          "description": "Card/button border color on hover."
152 192
        },
153 193
        "backgroundColor": {
154 194
          "type": "string",
155 195
          "description": "Page background color."
156 196
        },
157 197
        "buttonAlignment": {
158 198
          "type": "string",
159 199
          "description": "Button content alignment. Default: left.",
160 200
          "knownValues": [
161 201
            "left",
162 202
            "right"
163 203
          ]
164 204
        },
165 205
        "buttonHoverGlow": {
166 206
          "type": "boolean",
167 207
          "description": "Whether buttons glow on hover. Default: false."
168 208
        },
169 209
        "cardBorderColor": {
170 210
          "type": "string",
171 211
          "description": "Card/button border color."
172 212
        },
173 213
        "cardBorderRadius": {
174 214
          "type": "string",
175 215
          "description": "Card/button border radius.",
176 216
          "knownValues": [
177 217
            "none",
178 218
            "sm",
179 219
            "md",
180 220
            "lg",
181 221
            "full"
182 222
          ]
183 223
        },
184 224
        "contentCardColor": {
185 225
          "type": "string",
186 226
          "description": "Card container background color."
187 227
        },
188 228
        "profileAlignment": {
189 229
          "type": "string",
190 230
          "description": "Profile section alignment. Default: center.",
191 231
          "knownValues": [
192 232
            "left",
193 233
            "center",
194 234
            "right"
195 235
          ]
196 236
        },
197 237
        "profileTextColor": {
198 238
          "type": "string",
199 239
          "description": "Profile section text color."
200 240
        },
201 241
        "socialIconsColor": {
202 242
          "type": "string",
203 243
          "description": "Social icons color."
204 244
        },
205 245
        "socialIconsShape": {
206 246
          "type": "string",
207 247
          "description": "Social icons container shape. Default: dock.",
208 248
          "knownValues": [
209 249
            "dock",
210 250
            "sphere"
211 251
          ]
212 252
        },
213 253
        "backgroundGradient": {
214 254
          "type": "string",
215 255
          "description": "CSS gradient for the page background."
216 256
        },
217 257
        "profilePictureSize": {
218 258
          "type": "string",
219 259
          "description": "Profile picture size. Default: sm.",
220 260
          "knownValues": [
221 261
            "sm",
222 262
            "md",
223 263
            "lg"
224 264
          ]
225 265
        },
226 266
        "cardBackgroundColor": {
227 267
          "type": "string",
228 268
          "description": "Individual card/button background color."
229 269
        },
230 270
        "profilePictureShape": {
231 271
          "type": "string",
232 272
          "description": "Profile picture shape. Default: circle.",
233 273
          "knownValues": [
234 274
            "circle",
235 275
            "rounded",
236 276
            "square"
237 277
          ]
238 278
        },
239 279
        "buttonHoverGlowColor": {
240 280
          "type": "string",
241 281
          "description": "Color for the button hover glow effect."
242 282
        },
243 283
        "socialIconsShapeColor": {
244 284
          "type": "string",
245 285
          "description": "Background color for social icons dock/sphere."
246 286
        },
247 287
        "socialIconsBorderColor": {
248 288
          "type": "string",
249 289
          "description": "Border color for social icons dock/sphere."
250 290
        }
251 291
      },
252 292
      "description": "Theme configuration for the page appearance."
253 293
    },
254 294
    "widgetGithub": {
255 295
      "type": "object",
256 296
      "required": [
257 297
        "id",
258 298
        "type",
259 299
        "githubUsername",
260 300
        "contributions"
261 301
      ],
262 302
      "properties": {
263 303
        "id": {
264 304
          "type": "string",
265 305
          "description": "Unique identifier for the card."
266 306
        },
307 +
        "size": {
308 +
          "type": "string",
309 +
          "description": "Widget display size. Default: 1x1.",
310 +
          "knownValues": [
311 +
            "1x1",
312 +
            "1x2",
313 +
            "2x2"
314 +
          ]
315 +
        },
267 316
        "type": {
268 317
          "type": "string",
269 318
          "const": "github",
270 319
          "description": "Card type discriminator."
271 320
        },
272 321
        "enabled": {
273 322
          "type": "boolean",
274 323
          "description": "Whether the widget is visible on the public page. Defaults to true."
275 324
        },
276 325
        "lastSyncedAt": {
277 326
          "type": "string",
278 327
          "format": "datetime",
279 328
          "description": "When the contribution data was last fetched from GitHub."
280 329
        },
281 330
        "contributions": {
282 331
          "type": "array",
283 332
          "items": {
284 333
            "ref": "#githubContributionDay",
285 334
            "type": "ref"
286 335
          },
287 336
          "description": "Contribution data for the last year."
288 337
        },
289 338
        "githubUsername": {
290 339
          "type": "string",
291 340
          "description": "GitHub username."
292 341
        },
293 342
        "totalContributions": {
294 343
          "type": "integer",
295 344
          "description": "Total number of contributions in the last year."
296 345
        }
297 346
      },
298 347
      "description": "A GitHub contributions graph widget card."
299 348
    },
349 +
    "widgetTealfm": {
350 +
      "type": "object",
351 +
      "required": [
352 +
        "id",
353 +
        "type",
354 +
        "plays"
355 +
      ],
356 +
      "properties": {
357 +
        "id": {
358 +
          "type": "string",
359 +
          "description": "Unique identifier for the card."
360 +
        },
361 +
        "size": {
362 +
          "type": "string",
363 +
          "description": "Widget display size. Default: 1x1.",
364 +
          "knownValues": [
365 +
            "1x1",
366 +
            "1x2",
367 +
            "2x2"
368 +
          ]
369 +
        },
370 +
        "type": {
371 +
          "type": "string",
372 +
          "const": "tealfm",
373 +
          "description": "Card type discriminator."
374 +
        },
375 +
        "plays": {
376 +
          "type": "array",
377 +
          "items": {
378 +
            "ref": "#tealfmPlay",
379 +
            "type": "ref"
380 +
          },
381 +
          "description": "Recently played tracks."
382 +
        },
383 +
        "enabled": {
384 +
          "type": "boolean",
385 +
          "description": "Whether the widget is visible on the public page. Defaults to true."
386 +
        },
387 +
        "lastSyncedAt": {
388 +
          "type": "string",
389 +
          "format": "datetime",
390 +
          "description": "When the play data was last fetched from the PDS."
391 +
        }
392 +
      },
393 +
      "description": "A teal.fm recently played tracks widget card."
394 +
    },
300 395
    "goodreadsBook": {
301 396
      "type": "object",
302 397
      "required": [
303 398
        "title",
304 399
        "author"
305 400
      ],
306 401
      "properties": {
307 402
        "link": {
308 403
          "type": "string",
309 404
          "description": "URL to the book on Goodreads."
310 405
        },
311 406
        "title": {
312 407
          "type": "string",
313 408
          "description": "Book title."
314 409
        },
315 410
        "author": {
316 411
          "type": "string",
317 412
          "description": "Book author."
318 413
        },
319 414
        "rating": {
320 415
          "type": "integer",
321 416
          "maximum": 5,
322 417
          "minimum": 0,
323 418
          "description": "User's rating (1-5), or absent if unrated."
324 419
        },
325 420
        "coverUrl": {
326 421
          "type": "string",
327 422
          "description": "URL to the book cover image."
328 423
        }
329 424
      },
330 425
      "description": "A book from a Goodreads shelf."
331 426
    },
332 427
    "widgetGoodreads": {
333 428
      "type": "object",
334 429
      "required": [
335 430
        "id",
336 431
        "type",
337 432
        "goodreadsUserId",
338 433
        "shelf",
339 434
        "books"
340 435
      ],
341 436
      "properties": {
342 437
        "id": {
343 438
          "type": "string",
344 439
          "description": "Unique identifier for the card."
345 440
        },
441 +
        "size": {
442 +
          "type": "string",
443 +
          "description": "Widget display size. Default: 1x1.",
444 +
          "knownValues": [
445 +
            "1x1",
446 +
            "1x2",
447 +
            "2x2"
448 +
          ]
449 +
        },
346 450
        "type": {
347 451
          "type": "string",
348 452
          "const": "goodreads",
349 453
          "description": "Card type discriminator."
350 454
        },
351 455
        "books": {
352 456
          "type": "array",
353 457
          "items": {
354 458
            "ref": "#goodreadsBook",
355 459
            "type": "ref"
356 460
          },
357 -
          "description": "Books on the shelf."
461 +
          "description": "Books on the currently-reading shelf."
358 462
        },
359 463
        "shelf": {
360 464
          "type": "string",
361 465
          "description": "Shelf name (currently-reading, read, or to-read)."
362 466
        },
363 467
        "enabled": {
364 468
          "type": "boolean",
365 469
          "description": "Whether the widget is visible on the public page. Defaults to true."
366 470
        },
471 +
        "readBooks": {
472 +
          "type": "array",
473 +
          "items": {
474 +
            "ref": "#goodreadsBook",
475 +
            "type": "ref"
476 +
          },
477 +
          "description": "Books on the read shelf (used by 1x2 size)."
478 +
        },
367 479
        "lastSyncedAt": {
368 480
          "type": "string",
369 481
          "format": "datetime",
370 482
          "description": "When the book data was last fetched from Goodreads."
371 483
        },
372 484
        "goodreadsUserId": {
373 485
          "type": "string",
374 486
          "description": "Goodreads numeric user ID."
375 487
        }
376 488
      },
377 489
      "description": "A Goodreads bookshelf widget card."
378 490
    },
491 +
    "connectedServices": {
492 +
      "type": "object",
493 +
      "properties": {
494 +
        "githubUsername": {
495 +
          "type": "string",
496 +
          "description": "GitHub username."
497 +
        },
498 +
        "goodreadsUserId": {
499 +
          "type": "string",
500 +
          "description": "Goodreads numeric user ID."
501 +
        }
502 +
      },
503 +
      "description": "Saved service credentials/identifiers for pre-filling widget forms."
504 +
    },
379 505
    "githubContributionDay": {
380 506
      "type": "object",
381 507
      "required": [
382 508
        "date",
383 509
        "count",
384 510
        "level"
385 511
      ],
386 512
      "properties": {
387 513
        "date": {
388 514
          "type": "string",
389 515
          "description": "Date in YYYY-MM-DD format."
390 516
        },
391 517
        "count": {
392 518
          "type": "integer",
393 519
          "description": "Number of contributions on this day."
394 520
        },
395 521
        "level": {
396 522
          "type": "integer",
397 523
          "maximum": 4,
398 524
          "minimum": 0,
399 525
          "description": "Contribution intensity level (0=none, 4=highest)."
400 526
        }
401 527
      },
402 528
      "description": "A single day's contribution data from GitHub."
403 529
    }
404 530
  },
405 531
  "$type": "com.atproto.lexicon.schema",
406 532
  "lexicon": 1
407 533
}

Compare Other Versions

Lexicon Garden

@