me.linkna.linkinbio

linkna.me

Schema Diff

+407 -51

From

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

Compare Other Versions

Lexicon Garden

@