me.linkna.linkinbio
Schema Diff
+407 -51
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
}