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