me.linkna.linkinbio
Schema Diff
+502 -25
1
1
{
2
2
"id": "me.linkna.linkinbio",
3
3
"defs": {
4
-
"card": {
4
+
"main": {
5
+
"key": "literal:self",
6
+
"type": "record",
7
+
"record": {
8
+
"type": "object",
9
+
"required": [
10
+
"cards"
11
+
],
12
+
"properties": {
13
+
"cards": {
14
+
"type": "array",
15
+
"items": {
16
+
"refs": [
17
+
"#linkCard",
18
+
"#widgetGoodreads",
19
+
"#widgetGithub",
20
+
"#widgetTealfm"
21
+
],
22
+
"type": "union"
23
+
},
24
+
"description": "Ordered list of cards on the page. Each card is a union of linkCard, widgetGoodreads, widgetGithub, or widgetTealfm."
25
+
},
26
+
"theme": {
27
+
"type": "string",
28
+
"description": "Deprecated: use themeConfig instead."
29
+
},
30
+
"socialIcons": {
31
+
"type": "array",
32
+
"items": {
33
+
"ref": "#socialIcon",
34
+
"type": "ref"
35
+
},
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"
45
+
}
46
+
}
47
+
},
48
+
"description": "A user's link-in-bio page containing cards, theme configuration, and social icons."
49
+
},
50
+
"linkCard": {
5
51
"type": "object",
6
52
"properties": {
7
53
"id": {
8
54
"type": "string",
9
55
"description": "Unique identifier for the card."
10
56
},
11
57
"url": {
12
58
"type": "string",
13
59
"format": "uri",
14
60
"description": "URL the card links to."
15
61
},
16
62
"text": {
17
63
"type": "string",
18
64
"maxLength": 100,
19
-
"description": "Display text for the card."
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."
20
74
},
21
75
"highlighted": {
22
76
"type": "boolean",
23
-
"description": "Whether the card is highlighted."
77
+
"description": "Whether the card is visually highlighted."
78
+
}
79
+
},
80
+
"description": "A standard link card."
81
+
},
82
+
"socialIcon": {
83
+
"type": "object",
84
+
"required": [
85
+
"id",
86
+
"platform",
87
+
"url"
88
+
],
89
+
"properties": {
90
+
"id": {
91
+
"type": "string",
92
+
"description": "Unique identifier for the icon."
93
+
},
94
+
"url": {
95
+
"type": "string",
96
+
"format": "uri",
97
+
"description": "URL to the user's profile on this platform."
98
+
},
99
+
"platform": {
100
+
"type": "string",
101
+
"description": "Platform identifier (e.g., 'bluesky', 'twitter', 'instagram')."
102
+
}
103
+
},
104
+
"description": "A social media icon link."
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."
24
137
}
25
138
},
26
-
"description": "A single card/link on the page."
139
+
"description": "A recently played track from teal.fm."
27
140
},
28
-
"main": {
29
-
"key": "literal:self",
30
-
"type": "record",
31
-
"record": {
32
-
"type": "object",
33
-
"required": [
34
-
"cards"
35
-
],
36
-
"properties": {
37
-
"cards": {
38
-
"type": "array",
39
-
"items": {
40
-
"ref": "#card",
41
-
"type": "ref"
42
-
},
43
-
"description": "Ordered list of cards on the page."
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"
44
380
},
45
-
"theme": {
46
-
"type": "string",
47
-
"description": "Theme identifier for page styling."
48
-
}
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."
49
391
}
50
392
},
51
-
"description": "A user's link-in-bio page containing cards."
393
+
"description": "A teal.fm recently played tracks widget card."
394
+
},
395
+
"goodreadsBook": {
396
+
"type": "object",
397
+
"required": [
398
+
"title",
399
+
"author"
400
+
],
401
+
"properties": {
402
+
"link": {
403
+
"type": "string",
404
+
"description": "URL to the book on Goodreads."
405
+
},
406
+
"title": {
407
+
"type": "string",
408
+
"description": "Book title."
409
+
},
410
+
"author": {
411
+
"type": "string",
412
+
"description": "Book author."
413
+
},
414
+
"rating": {
415
+
"type": "integer",
416
+
"maximum": 5,
417
+
"minimum": 0,
418
+
"description": "User's rating (1-5), or absent if unrated."
419
+
},
420
+
"coverUrl": {
421
+
"type": "string",
422
+
"description": "URL to the book cover image."
423
+
}
424
+
},
425
+
"description": "A book from a Goodreads shelf."
426
+
},
427
+
"widgetGoodreads": {
428
+
"type": "object",
429
+
"required": [
430
+
"id",
431
+
"type",
432
+
"goodreadsUserId",
433
+
"shelf",
434
+
"books"
435
+
],
436
+
"properties": {
437
+
"id": {
438
+
"type": "string",
439
+
"description": "Unique identifier for the card."
440
+
},
441
+
"size": {
442
+
"type": "string",
443
+
"description": "Widget display size. Default: 1x1.",
444
+
"knownValues": [
445
+
"1x1",
446
+
"1x2",
447
+
"2x2"
448
+
]
449
+
},
450
+
"type": {
451
+
"type": "string",
452
+
"const": "goodreads",
453
+
"description": "Card type discriminator."
454
+
},
455
+
"books": {
456
+
"type": "array",
457
+
"items": {
458
+
"ref": "#goodreadsBook",
459
+
"type": "ref"
460
+
},
461
+
"description": "Books on the currently-reading shelf."
462
+
},
463
+
"shelf": {
464
+
"type": "string",
465
+
"description": "Shelf name (currently-reading, read, or to-read)."
466
+
},
467
+
"enabled": {
468
+
"type": "boolean",
469
+
"description": "Whether the widget is visible on the public page. Defaults to true."
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
+
},
479
+
"lastSyncedAt": {
480
+
"type": "string",
481
+
"format": "datetime",
482
+
"description": "When the book data was last fetched from Goodreads."
483
+
},
484
+
"goodreadsUserId": {
485
+
"type": "string",
486
+
"description": "Goodreads numeric user ID."
487
+
}
488
+
},
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."
52
529
}
53
530
},
54
531
"$type": "com.atproto.lexicon.schema",
55
532
"lexicon": 1
56
533
}