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