com.atmosphereaccount.registry.profile
Schema Diff
+18 -0
Compatibility Analysis
Backward Compatible
Backward compatible. 4 non-breaking changes.
Non-Breaking Changes (4)
- AddedVertex AddedVertex { vertex_id: "com.atmosphereaccount.registry.profile:body.banner" }
- AddedVertex AddedVertex { vertex_id: "com.atmosphereaccount.registry.profile:body.iconBw" }
- AddedEdge AddedEdge { src: "com.atmosphereaccount.registry.profile:body", tgt: "com.atmosphereaccount.registry.profile:body.banner", kind: "prop", name: Some("banner") }
- AddedEdge AddedEdge { src: "com.atmosphereaccount.registry.profile:body", tgt: "com.atmosphereaccount.registry.profile:body.iconBw", kind: "prop", name: Some("iconBw") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "com.atmosphereaccount.registry.profile:body.banner" }AddedVertex { vertex_id: "com.atmosphereaccount.registry.profile:body.iconBw" }
Additional Notes
- Non-breaking: AddedEdge { src: "com.atmosphereaccount.registry.profile:body", tgt: "com.atmosphereaccount.registry.profile:body.banner", kind: "prop", name: Some("banner") }
- Non-breaking: AddedEdge { src: "com.atmosphereaccount.registry.profile:body", tgt: "com.atmosphereaccount.registry.profile:body.iconBw", kind: "prop", name: Some("iconBw") }
1
1
{
2
2
"id": "com.atmosphereaccount.registry.profile",
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
"name",
11
11
"createdAt"
12
12
],
13
13
"properties": {
14
14
"icon": {
15
15
"type": "blob",
16
16
"accept": [
17
17
"image/svg+xml"
18
18
],
19
19
"maxSize": 200000,
20
20
"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)."
21
21
},
22
22
"name": {
23
23
"type": "string",
24
24
"maxLength": 60,
25
25
"minLength": 1,
26
26
"description": "Display name for the user or project.",
27
27
"maxGraphemes": 60
28
28
},
29
29
"links": {
30
30
"type": "array",
31
31
"items": {
32
32
"ref": "#linkEntry",
33
33
"type": "ref"
34
34
},
35
35
"maxLength": 12,
36
36
"description": "Outbound buttons shown on the public profile after the Web / iOS / Android app links. 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`; new records no longer emit website entries."
37
37
},
38
38
"avatar": {
39
39
"type": "blob",
40
40
"accept": [
41
41
"image/png",
42
42
"image/jpeg",
43
43
"image/webp"
44
44
],
45
45
"maxSize": 1000000,
46
46
"description": "Project icon. Recommended 512x512 square."
47
47
},
48
+
"banner": {
49
+
"type": "blob",
50
+
"accept": [
51
+
"image/png",
52
+
"image/jpeg",
53
+
"image/webp"
54
+
],
55
+
"maxSize": 3000000,
56
+
"description": "Optional project banner image. Rendered at the top of the project page and used as the OpenGraph / Twitter card preview when the page is shared. Recommended 1200x630 (1.91:1 OG ratio)."
57
+
},
58
+
"iconBw": {
59
+
"type": "blob",
60
+
"accept": [
61
+
"image/svg+xml"
62
+
],
63
+
"maxSize": 200000,
64
+
"description": "Optional black & white companion to `icon`. Same audience and sanitisation rules — published alongside the color mark for monochrome contexts (light/dark badges, sign-in chrome, print)."
65
+
},
48
66
"iosLink": {
49
67
"type": "string",
50
68
"format": "uri",
51
69
"maxLength": 512,
52
70
"description": "Optional App Store URL for projects with an iOS app. Rendered as an iOS button on the public profile when present."
53
71
},
54
72
"mainLink": {
55
73
"type": "string",
56
74
"format": "uri",
57
75
"maxLength": 512,
58
76
"description": "Primary web destination for the project (the actual web app, service, or website). Rendered as the Web button inside the public profile card when present. Optional when an iOS or Android destination is provided."
59
77
},
60
78
"createdAt": {
61
79
"type": "string",
62
80
"format": "datetime",
63
81
"maxLength": 64
64
82
},
65
83
"categories": {
66
84
"type": "array",
67
85
"items": {
68
86
"type": "string",
69
87
"maxLength": 32,
70
88
"knownValues": [
71
89
"app",
72
90
"accountProvider",
73
91
"moderator",
74
92
"infrastructure",
75
93
"developerTool"
76
94
]
77
95
},
78
96
"maxLength": 4,
79
97
"minLength": 1,
80
98
"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."
81
99
},
82
100
"androidLink": {
83
101
"type": "string",
84
102
"format": "uri",
85
103
"maxLength": 512,
86
104
"description": "Optional Google Play or Android distribution URL for projects with an Android app. Rendered as an Android button on the public profile when present."
87
105
},
88
106
"description": {
89
107
"type": "string",
90
108
"maxLength": 500,
91
109
"description": "Optional short description for a project or bio for a user profile.",
92
110
"maxGraphemes": 500
93
111
},
94
112
"profileType": {
95
113
"type": "string",
96
114
"maxLength": 16,
97
115
"description": "Distinguishes project profiles from user profiles. Omitted means project for backwards compatibility with existing records.",
98
116
"knownValues": [
99
117
"project",
100
118
"user"
101
119
]
102
120
},
103
121
"screenshots": {
104
122
"type": "array",
105
123
"items": {
106
124
"ref": "#screenshotEntry",
107
125
"type": "ref"
108
126
},
109
127
"maxLength": 4,
110
128
"description": "Optional screenshots for the project. Up to 4 PNG, JPEG, or WebP images."
111
129
},
112
130
"subcategories": {
113
131
"type": "array",
114
132
"items": {
115
133
"type": "string",
116
134
"maxLength": 32
117
135
},
118
136
"maxLength": 10,
119
137
"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."
120
138
}
121
139
}
122
140
},
123
141
"description": "A user or project profile in the Atmosphere registry. Created by the account owner on their PDS; one record per account. Reviews, ratings, moderation, and other social data live in sibling com.atmosphereaccount.registry.* records."
124
142
},
125
143
"linkEntry": {
126
144
"type": "object",
127
145
"required": [
128
146
"kind"
129
147
],
130
148
"properties": {
131
149
"url": {
132
150
"type": "string",
133
151
"format": "uri",
134
152
"maxLength": 512,
135
153
"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`."
136
154
},
137
155
"kind": {
138
156
"type": "string",
139
157
"maxLength": 32,
140
158
"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.",
141
159
"knownValues": [
142
160
"bsky",
143
161
"tangled",
144
162
"supper",
145
163
"website",
146
164
"other"
147
165
]
148
166
},
149
167
"label": {
150
168
"type": "string",
151
169
"maxLength": 64,
152
170
"description": "Required when kind=\"other\". Used as the visible button title for custom links."
153
171
},
154
172
"clientId": {
155
173
"type": "string",
156
174
"maxLength": 64,
157
175
"description": "Required when kind=\"bsky\". Picks which Bluesky-compatible web client should host the link (bluesky, blacksky, deer, …)."
158
176
}
159
177
}
160
178
},
161
179
"screenshotEntry": {
162
180
"type": "object",
163
181
"required": [
164
182
"image"
165
183
],
166
184
"properties": {
167
185
"image": {
168
186
"type": "blob",
169
187
"accept": [
170
188
"image/png",
171
189
"image/jpeg",
172
190
"image/webp"
173
191
],
174
192
"maxSize": 5000000,
175
193
"description": "Screenshot image. Up to 5MB."
176
194
}
177
195
}
178
196
}
179
197
},
180
198
"$type": "com.atproto.lexicon.schema",
181
199
"lexicon": 1
182
200
}