{
"id": "com.atmosphereaccount.registry.profile",
"defs": {
"main": {
"key": "literal:self",
"type": "record",
"record": {
"type": "object",
"required": [
"name",
"description",
"categories",
"createdAt"
],
"properties": {
"icon": {
"type": "blob",
"accept": [
"image/svg+xml"
],
"maxSize": 200000,
"description": "Optional vector icon (SVG) intended for developers building badges, app showcases, sign-in flows, etc. Not displayed on the public Explore profile. Sanitised on upload (script tags, event handlers, foreignObject and javascript:/data: hrefs are stripped)."
},
"name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Display name for the project.",
"maxGraphemes": 60
},
"links": {
"type": "array",
"items": {
"ref": "#linkEntry",
"type": "ref"
},
"maxLength": 12,
"description": "Outbound buttons shown on the public profile. Atmosphere links (kind = bsky / tangled / supper) derive their URL from the project's current handle by default; a `url` override is allowed for tangled / supper when the canonical destination differs from the handle. Custom link kinds (kind = website / other) always carry their `url`."
},
"avatar": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp"
],
"maxSize": 1000000,
"description": "Project icon. Recommended 512x512 square."
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"categories": {
"type": "array",
"items": {
"type": "string",
"knownValues": [
"app",
"accountProvider",
"moderator",
"infrastructure",
"developerTool"
]
},
"maxLength": 4,
"minLength": 1,
"description": "All categories that apply to the project. A project can be both an app and an account provider, etc. The first item is treated as the primary category for sort/grouping. New values can be added to knownValues over time without breaking existing records."
},
"description": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Short description of the project.",
"maxGraphemes": 500
},
"subcategories": {
"type": "array",
"items": {
"type": "string",
"maxLength": 32
},
"maxLength": 10,
"description": "Open-ended subcategory tags. For apps: microblog, photo, video, blogging, music, events, clients, tools, social, reading, productivity, research, science, reviews, gaming, community, food, location, liveStreaming, niche, content, art."
}
}
},
"description": "A project's profile in the Atmosphere registry. Created by the project's own account on its PDS; one record per account. Kept intentionally minimal so future additions (reviews, age ratings, donations metadata, etc.) live in sibling com.atmosphereaccount.registry.* records."
},
"linkEntry": {
"type": "object",
"required": [
"kind"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 512,
"description": "Optional for atmosphere kinds (bsky derives URL from clientId+handle; tangled/supper default to the canonical handle URL but accept an override). Required for `website` and `other`."
},
"kind": {
"type": "string",
"description": "Link kind. Drives the icon/label and how `url` / `clientId` are resolved at render time. New atmosphere services can be added to knownValues without breaking older records.",
"knownValues": [
"bsky",
"tangled",
"supper",
"website",
"other"
]
},
"label": {
"type": "string",
"maxLength": 64,
"description": "Required when kind=\"other\". Used as the visible button title for custom links."
},
"clientId": {
"type": "string",
"maxLength": 64,
"description": "Required when kind=\"bsky\". Picks which Bluesky-compatible web client should host the link (bluesky, blacksky, deer, …)."
}
}
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}