{
"id": "me.linkna.linkinbio",
"defs": {
"main": {
"key": "literal:self",
"type": "record",
"record": {
"type": "object",
"required": [
"cards"
],
"properties": {
"cards": {
"type": "array",
"items": {
"refs": [
"#linkCard",
"#headerCard",
"#widgetGoodreads",
"#widgetGithub",
"#widgetTealfm",
"#widgetLastfm",
"#widgetClock",
"#widgetYoutube",
"#widgetPatreon",
"#widgetSubstack",
"#widgetBeehiiv",
"#widgetVideo",
"#widgetTwitch",
"#widgetDiscord",
"#widgetReddit",
"#widgetMedium",
"#widgetMap"
],
"type": "union"
},
"description": "Ordered list of cards on the page."
},
"theme": {
"type": "string",
"description": "Deprecated: use themeConfig instead."
},
"socialIcons": {
"type": "array",
"items": {
"ref": "#socialIcon",
"type": "ref"
},
"description": "Social media icons displayed on the profile."
},
"themeConfig": {
"ref": "#themeConfig",
"type": "ref"
},
"connectedServices": {
"ref": "#connectedServices",
"type": "ref"
}
}
},
"description": "A user's link-in-bio page containing cards, theme configuration, and social icons."
},
"linkCard": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"url": {
"type": "string",
"format": "uri",
"description": "URL the card links to."
},
"text": {
"type": "string",
"maxLength": 100,
"description": "Display text for the card (falls back to URL domain if empty)."
},
"type": {
"type": "string",
"description": "Card type discriminator. Value: 'link' or absent for link cards."
},
"enabled": {
"type": "boolean",
"description": "Whether the card is visible on the public page. Defaults to true."
},
"highlighted": {
"type": "boolean",
"description": "Whether the card is visually highlighted."
}
},
"description": "A standard link card."
},
"widgetMap": {
"type": "object",
"required": [
"id",
"type",
"locationName",
"latitude",
"longitude"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "map",
"description": "Card type discriminator."
},
"zoom": {
"type": "integer",
"description": "Map zoom level (1-18). Default: 12."
},
"style": {
"type": "string",
"description": "Map style. Default: light.",
"knownValues": [
"light",
"dark"
]
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"latitude": {
"type": "number",
"description": "Latitude coordinate."
},
"longitude": {
"type": "number",
"description": "Longitude coordinate."
},
"locationName": {
"type": "string",
"description": "Display name for the location."
}
},
"description": "A map location widget card."
},
"headerCard": {
"type": "object",
"required": [
"id",
"type",
"text"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"text": {
"type": "string",
"maxLength": 100,
"description": "Header text displayed as a section divider."
},
"type": {
"type": "string",
"const": "header",
"description": "Card type discriminator."
},
"enabled": {
"type": "boolean",
"description": "Whether the header is visible on the public page. Defaults to true."
},
"alignment": {
"enum": [
"left",
"center",
"right"
],
"type": "string",
"description": "Text alignment for the header. Defaults to the user's button alignment."
}
},
"description": "A section header/divider card."
},
"redditPost": {
"type": "object",
"required": [
"title",
"subreddit",
"url",
"score",
"numComments"
],
"properties": {
"url": {
"type": "string",
"description": "Post URL."
},
"score": {
"type": "integer",
"description": "Post score."
},
"title": {
"type": "string",
"description": "Post title."
},
"subreddit": {
"type": "string",
"description": "Subreddit name."
},
"numComments": {
"type": "integer",
"description": "Number of comments."
}
},
"description": "A Reddit post."
},
"socialIcon": {
"type": "object",
"required": [
"id",
"platform",
"url"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the icon."
},
"url": {
"type": "string",
"format": "uri",
"description": "URL to the user's profile on this platform."
},
"platform": {
"type": "string",
"description": "Platform identifier (e.g., 'bluesky', 'twitter', 'instagram')."
}
},
"description": "A social media icon link."
},
"tealfmPlay": {
"type": "object",
"required": [
"trackName",
"artistName"
],
"properties": {
"coverUrl": {
"type": "string",
"description": "URL to the album cover image (from Cover Art Archive)."
},
"originUrl": {
"type": "string",
"description": "URL to the track on the original music service."
},
"trackName": {
"type": "string",
"description": "Track/song name."
},
"artistName": {
"type": "string",
"description": "Artist name(s)."
},
"playedTime": {
"type": "string",
"format": "datetime",
"description": "When the track was played."
},
"releaseName": {
"type": "string",
"description": "Album/release name."
}
},
"description": "A recently played track from teal.fm."
},
"themeConfig": {
"type": "object",
"properties": {
"preset": {
"type": "string",
"description": "Theme preset ID (e.g., 'custom', 'agate', 'air', 'astrid', 'aura')."
},
"fontSize": {
"type": "string",
"description": "Font size. Default: md.",
"knownValues": [
"sm",
"md",
"lg"
]
},
"particles": {
"type": "string",
"description": "Background particle effect. Default: none.",
"knownValues": [
"none",
"white",
"blue",
"leaves",
"grid-sm",
"grid-lg"
]
},
"cardShadow": {
"type": "string",
"description": "Card/button shadow intensity.",
"knownValues": [
"none",
"sm",
"md",
"lg",
"xl"
]
},
"fontFamily": {
"type": "string",
"description": "Font family for the page."
},
"cursorStyle": {
"type": "string",
"description": "Custom cursor style. Default: default.",
"knownValues": [
"default",
"hello-kitty"
]
},
"showBranding": {
"type": "boolean",
"description": "Whether Linkname branding is visible. Default: true."
},
"cardTextColor": {
"type": "string",
"description": "Card/button text color."
},
"cardHoverColor": {
"type": "string",
"description": "Card/button border color on hover."
},
"cursorSparkles": {
"type": "boolean",
"description": "Whether cursor has sparkle trail. Default: false."
},
"backgroundColor": {
"type": "string",
"description": "Page background color."
},
"backgroundImage": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp"
],
"maxSize": 10000000,
"description": "Background wallpaper image blob."
},
"buttonAlignment": {
"type": "string",
"description": "Button content alignment. Default: left.",
"knownValues": [
"left",
"right"
]
},
"buttonHoverGlow": {
"type": "boolean",
"description": "Whether buttons glow on hover. Default: false."
},
"cardBorderColor": {
"type": "string",
"description": "Card/button border color."
},
"cardBorderRadius": {
"type": "string",
"description": "Card/button border radius.",
"knownValues": [
"none",
"sm",
"md",
"lg",
"full"
]
},
"contentCardColor": {
"type": "string",
"description": "Card container background color."
},
"profileAlignment": {
"type": "string",
"description": "Profile section alignment. Default: center.",
"knownValues": [
"left",
"center",
"right"
]
},
"profileTextColor": {
"type": "string",
"description": "Profile section text color."
},
"socialIconsColor": {
"type": "string",
"description": "Social icons color."
},
"socialIconsShape": {
"type": "string",
"description": "Social icons container shape. Default: dock.",
"knownValues": [
"dock",
"sphere"
]
},
"backgroundGradient": {
"type": "string",
"description": "CSS gradient for the page background."
},
"profilePictureSize": {
"type": "string",
"description": "Profile picture size. Default: sm.",
"knownValues": [
"sm",
"md",
"lg"
]
},
"cardBackgroundColor": {
"type": "string",
"description": "Individual card/button background color."
},
"profilePictureShape": {
"type": "string",
"description": "Profile picture shape. Default: circle.",
"knownValues": [
"circle",
"rounded",
"square"
]
},
"buttonHoverGlowColor": {
"type": "string",
"description": "Color for the button hover glow effect."
},
"backgroundImageCredit": {
"type": "string",
"format": "uri",
"description": "Optional credit URL for the wallpaper image artist. Stored for attribution purposes only, not displayed on the public page."
},
"socialIconsShapeColor": {
"type": "string",
"description": "Background color for social icons dock/sphere."
},
"socialIconsBorderColor": {
"type": "string",
"description": "Border color for social icons dock/sphere."
}
},
"description": "Theme configuration for the page appearance."
},
"widgetClock": {
"type": "object",
"required": [
"id",
"type",
"mode"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"mode": {
"type": "string",
"description": "Widget mode: clock (timezone display), countdown (to a target date), or timer (interactive stopwatch).",
"knownValues": [
"clock",
"countdown",
"timer"
]
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "clock",
"description": "Card type discriminator."
},
"label": {
"type": "string",
"maxLength": 100,
"description": "Optional display label for the widget."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"timezone": {
"type": "string",
"description": "IANA timezone identifier for clock mode (e.g. 'America/New_York')."
},
"targetDate": {
"type": "string",
"format": "datetime",
"description": "ISO 8601 target date for countdown mode."
}
},
"description": "A clock, countdown, or stopwatch timer widget card."
},
"widgetVideo": {
"type": "object",
"required": [
"id",
"type",
"videoBlobRef",
"did"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"alt": {
"type": "string",
"maxLength": 1000,
"description": "Alt text for accessibility."
},
"did": {
"type": "string",
"description": "Author DID for constructing PDS blob URLs."
},
"loop": {
"type": "boolean",
"description": "Whether the video loops. Defaults to true."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "video",
"description": "Card type discriminator."
},
"muted": {
"type": "boolean",
"description": "Whether the video is muted. Defaults to true."
},
"title": {
"type": "string",
"maxLength": 100,
"description": "Video title overlay."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When the video was uploaded."
},
"aspectRatio": {
"ref": "#videoAspectRatio",
"type": "ref",
"description": "Video aspect ratio."
},
"showOverlay": {
"type": "boolean",
"description": "Whether to show the title overlay. Defaults to false."
},
"videoBlobRef": {
"type": "blob",
"description": "Reference to the uploaded video blob."
}
},
"description": "A video widget card."
},
"widgetGithub": {
"type": "object",
"required": [
"id",
"type",
"githubUsername",
"contributions"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2"
]
},
"type": {
"type": "string",
"const": "github",
"description": "Card type discriminator."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the contribution data was last fetched from GitHub."
},
"contributions": {
"type": "array",
"items": {
"ref": "#githubContributionDay",
"type": "ref"
},
"description": "Contribution data for the last year."
},
"githubUsername": {
"type": "string",
"description": "GitHub username."
},
"totalContributions": {
"type": "integer",
"description": "Total number of contributions in the last year."
}
},
"description": "A GitHub contributions graph widget card."
},
"widgetLastfm": {
"type": "object",
"required": [
"id",
"type",
"lastfmUsername",
"plays"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2"
]
},
"type": {
"type": "string",
"const": "lastfm",
"description": "Card type discriminator."
},
"plays": {
"type": "array",
"items": {
"ref": "#tealfmPlay",
"type": "ref"
},
"description": "Recently played tracks from Last.fm."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the play data was last fetched from Last.fm."
},
"coverArtNotice": {
"type": "string",
"description": "Copyright notice for cover art images."
},
"lastfmUsername": {
"type": "string",
"description": "Last.fm username for fetching scrobbles."
}
},
"description": "A Last.fm recently played tracks widget card."
},
"widgetMedium": {
"type": "object",
"required": [
"id",
"type",
"username",
"profileUrl"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"bio": {
"type": "string",
"description": "Medium bio."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "medium",
"description": "Card type discriminator."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"articles": {
"type": "array",
"items": {
"ref": "#mediumArticle",
"type": "ref"
},
"description": "Recent articles."
},
"username": {
"type": "string",
"description": "Medium username."
},
"profileUrl": {
"type": "string",
"description": "Medium profile URL."
},
"displayName": {
"type": "string",
"description": "Medium display name."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the Medium data was last fetched."
},
"followerCount": {
"type": "integer",
"description": "Number of followers."
}
},
"description": "A Medium profile widget card."
},
"widgetReddit": {
"type": "object",
"required": [
"id",
"type",
"username",
"profileUrl"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "reddit",
"description": "Card type discriminator."
},
"karma": {
"type": "integer",
"description": "Total karma."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"username": {
"type": "string",
"description": "Reddit username."
},
"avatarUrl": {
"type": "string",
"description": "Reddit avatar URL."
},
"linkKarma": {
"type": "integer",
"description": "Link karma."
},
"profileUrl": {
"type": "string",
"description": "Reddit profile URL."
},
"recentPosts": {
"type": "array",
"items": {
"ref": "#redditPost",
"type": "ref"
},
"description": "Recent posts."
},
"commentKarma": {
"type": "integer",
"description": "Comment karma."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the Reddit data was last fetched."
}
},
"description": "A Reddit profile widget card."
},
"widgetTealfm": {
"type": "object",
"required": [
"id",
"type",
"plays"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2"
]
},
"type": {
"type": "string",
"const": "tealfm",
"description": "Card type discriminator."
},
"plays": {
"type": "array",
"items": {
"ref": "#tealfmPlay",
"type": "ref"
},
"description": "Recently played tracks."
},
"source": {
"type": "string",
"description": "Data source for the widget. 'lastfm' for imported Last.fm scrobbles, 'tealfm' (default) for native AT Protocol plays.",
"knownValues": [
"tealfm",
"lastfm"
]
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the play data was last fetched from the PDS."
},
"coverArtNotice": {
"type": "string",
"description": "Copyright notice for cover art images."
}
},
"description": "A teal.fm recently played tracks widget card."
},
"widgetTwitch": {
"type": "object",
"required": [
"id",
"type",
"username"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "twitch",
"description": "Card type discriminator."
},
"isLive": {
"type": "boolean",
"description": "Whether the channel is currently live."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"username": {
"type": "string",
"description": "Twitch username."
},
"streamGame": {
"type": "string",
"description": "Current stream game/category."
},
"displayName": {
"type": "string",
"description": "Twitch display name."
},
"streamTitle": {
"type": "string",
"description": "Current stream title."
},
"viewerCount": {
"type": "integer",
"description": "Current viewer count."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the channel data was last fetched."
},
"profileImageUrl": {
"type": "string",
"description": "Twitch profile image URL."
}
},
"description": "A Twitch channel widget card."
},
"youtubeVideo": {
"type": "object",
"required": [
"videoId",
"title",
"publishedAt"
],
"properties": {
"title": {
"type": "string",
"description": "Video title."
},
"isShort": {
"type": "boolean",
"description": "Whether this is a YouTube Short."
},
"videoId": {
"type": "string",
"description": "YouTube video ID."
},
"publishedAt": {
"type": "string",
"description": "When the video was published."
}
},
"description": "A YouTube video."
},
"goodreadsBook": {
"type": "object",
"required": [
"title",
"author"
],
"properties": {
"link": {
"type": "string",
"description": "URL to the book on Goodreads."
},
"title": {
"type": "string",
"description": "Book title."
},
"author": {
"type": "string",
"description": "Book author."
},
"rating": {
"type": "integer",
"maximum": 5,
"minimum": 0,
"description": "User's rating (1-5), or absent if unrated."
},
"coverUrl": {
"type": "string",
"description": "URL to the book cover image."
}
},
"description": "A book from a Goodreads shelf."
},
"mediumArticle": {
"type": "object",
"required": [
"title",
"url",
"publishedAt",
"claps"
],
"properties": {
"url": {
"type": "string",
"description": "Article URL."
},
"claps": {
"type": "integer",
"description": "Number of claps."
},
"title": {
"type": "string",
"description": "Article title."
},
"subtitle": {
"type": "string",
"description": "Article subtitle."
},
"publishedAt": {
"type": "string",
"description": "When the article was published."
},
"readingTime": {
"type": "integer",
"description": "Estimated reading time in minutes."
}
},
"description": "A Medium article."
},
"widgetBeehiiv": {
"type": "object",
"required": [
"id",
"type",
"publicationId",
"publicationName",
"publicationUrl"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "beehiiv",
"description": "Card type discriminator."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"imageUrl": {
"type": "string",
"description": "Publication image URL."
},
"description": {
"type": "string",
"description": "Publication description."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the publication data was last fetched."
},
"publicationId": {
"type": "string",
"description": "Beehiiv publication ID."
},
"publicationUrl": {
"type": "string",
"description": "URL to the Beehiiv publication."
},
"publicationName": {
"type": "string",
"description": "Beehiiv publication name."
}
},
"description": "A Beehiiv publication widget card."
},
"widgetDiscord": {
"type": "object",
"required": [
"id",
"type",
"serverId",
"serverName",
"inviteUrl"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "discord",
"description": "Card type discriminator."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"iconUrl": {
"type": "string",
"description": "Server icon URL."
},
"serverId": {
"type": "string",
"description": "Discord server ID."
},
"bannerUrl": {
"type": "string",
"description": "Server banner URL."
},
"inviteUrl": {
"type": "string",
"description": "Discord invite URL."
},
"serverName": {
"type": "string",
"description": "Discord server name."
},
"description": {
"type": "string",
"description": "Server description."
},
"memberCount": {
"type": "integer",
"description": "Total member count."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the server data was last fetched."
},
"presenceCount": {
"type": "integer",
"description": "Online member count."
}
},
"description": "A Discord server widget card."
},
"widgetPatreon": {
"type": "object",
"required": [
"id",
"type",
"campaignId",
"creatorName",
"campaignUrl"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "patreon",
"description": "Card type discriminator."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"imageUrl": {
"type": "string",
"description": "Campaign image URL."
},
"postCount": {
"type": "integer",
"description": "Number of posts."
},
"campaignId": {
"type": "string",
"description": "Patreon campaign ID."
},
"campaignUrl": {
"type": "string",
"description": "URL to the Patreon campaign."
},
"creatorName": {
"type": "string",
"description": "Patreon creator name."
},
"patronCount": {
"type": "integer",
"description": "Number of patrons."
},
"creationName": {
"type": "string",
"description": "Name of the creation/project."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the campaign data was last fetched."
}
},
"description": "A Patreon campaign widget card."
},
"widgetYoutube": {
"type": "object",
"required": [
"id",
"type",
"channelId",
"channelName",
"channelUrl"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "youtube",
"description": "Card type discriminator."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"channelId": {
"type": "string",
"description": "YouTube channel ID."
},
"channelUrl": {
"type": "string",
"description": "URL to the YouTube channel."
},
"channelName": {
"type": "string",
"description": "YouTube channel name."
},
"latestVideo": {
"ref": "#youtubeVideo",
"type": "ref",
"description": "The latest video from the channel."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the video data was last fetched."
}
},
"description": "A YouTube channel widget card."
},
"widgetSubstack": {
"type": "object",
"required": [
"id",
"type",
"publicationId",
"publicationName",
"publicationUrl"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2",
"2x1"
]
},
"type": {
"type": "string",
"const": "substack",
"description": "Card type discriminator."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"imageUrl": {
"type": "string",
"description": "Publication image URL."
},
"postCount": {
"type": "integer",
"description": "Number of posts."
},
"authorName": {
"type": "string",
"description": "Author name."
},
"description": {
"type": "string",
"description": "Publication description."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the publication data was last fetched."
},
"coverImageUrl": {
"type": "string",
"description": "Publication cover image URL."
},
"publicationId": {
"type": "string",
"description": "Substack publication ID."
},
"publicationUrl": {
"type": "string",
"description": "URL to the Substack publication."
},
"publicationName": {
"type": "string",
"description": "Substack publication name."
},
"subscriberCount": {
"type": "integer",
"description": "Number of subscribers."
}
},
"description": "A Substack publication widget card."
},
"widgetGoodreads": {
"type": "object",
"required": [
"id",
"type",
"goodreadsUserId",
"shelf",
"books"
],
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the card."
},
"size": {
"type": "string",
"description": "Widget display size. Default: 1x1.",
"knownValues": [
"1x1",
"1x2",
"2x2"
]
},
"type": {
"type": "string",
"const": "goodreads",
"description": "Card type discriminator."
},
"books": {
"type": "array",
"items": {
"ref": "#goodreadsBook",
"type": "ref"
},
"description": "Books on the currently-reading shelf."
},
"shelf": {
"type": "string",
"description": "Shelf name (currently-reading, read, or to-read)."
},
"enabled": {
"type": "boolean",
"description": "Whether the widget is visible on the public page. Defaults to true."
},
"readBooks": {
"type": "array",
"items": {
"ref": "#goodreadsBook",
"type": "ref"
},
"description": "Books on the read shelf (used by 1x2 size)."
},
"lastSyncedAt": {
"type": "string",
"format": "datetime",
"description": "When the book data was last fetched from Goodreads."
},
"goodreadsUserId": {
"type": "string",
"description": "Goodreads numeric user ID."
}
},
"description": "A Goodreads bookshelf widget card."
},
"videoAspectRatio": {
"type": "object",
"required": [
"width",
"height"
],
"properties": {
"width": {
"type": "integer",
"description": "Video width."
},
"height": {
"type": "integer",
"description": "Video height."
}
},
"description": "Video aspect ratio dimensions."
},
"connectedServices": {
"type": "object",
"properties": {
"githubUsername": {
"type": "string",
"description": "GitHub username."
},
"lastfmUsername": {
"type": "string",
"description": "Last.fm username."
},
"goodreadsUserId": {
"type": "string",
"description": "Goodreads numeric user ID."
}
},
"description": "Saved service credentials/identifiers for pre-filling widget forms."
},
"githubContributionDay": {
"type": "object",
"required": [
"date",
"count",
"level"
],
"properties": {
"date": {
"type": "string",
"description": "Date in YYYY-MM-DD format."
},
"count": {
"type": "integer",
"description": "Number of contributions on this day."
},
"level": {
"type": "integer",
"maximum": 4,
"minimum": 0,
"description": "Contribution intensity level (0=none, 4=highest)."
}
},
"description": "A single day's contribution data from GitHub."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}