me.linkna.linkinbio

linkna.me

Schema Diff

+54 -1

From

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

Compare Other Versions

Lexicon Garden

@