pics.2bit.actor.profile
Schema Diff
+24 -2
Compatibility Analysis
Backward Compatible
Backward compatible. 20 non-breaking changes.
Non-Breaking Changes (20)
- AddedVertex AddedVertex { vertex_id: "com.atproto.label.defs#selfLabels" }
- AddedVertex AddedVertex { vertex_id: "com.atproto.repo.strongRef" }
- AddedVertex AddedVertex { vertex_id: "pics.2bit.actor.profile:body.avatarContent" }
- AddedVertex AddedVertex { vertex_id: "pics.2bit.actor.profile:body.avatarContent:variant0" }
- AddedVertex AddedVertex { vertex_id: "pics.2bit.actor.profile:body.avatarContent:variant1" }
- AddedVertex AddedVertex { vertex_id: "pics.2bit.actor.profile:body.labels" }
- AddedVertex AddedVertex { vertex_id: "pics.2bit.actor.profile:body.pinnedPhotos" }
- AddedVertex AddedVertex { vertex_id: "pics.2bit.actor.profile:body.pinnedPhotos:items" }
- AddedVertex AddedVertex { vertex_id: "pics.2bit.image#mono" }
- AddedVertex AddedVertex { vertex_id: "pics.2bit.image#trichrome" }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body", tgt: "pics.2bit.actor.profile:body.avatarContent", kind: "prop", name: Some("avatarContent") }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body", tgt: "pics.2bit.actor.profile:body.labels", kind: "prop", name: Some("labels") }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body", tgt: "pics.2bit.actor.profile:body.pinnedPhotos", kind: "prop", name: Some("pinnedPhotos") }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body.avatarContent", tgt: "pics.2bit.actor.profile:body.avatarContent:variant0", kind: "variant", name: Some("pics.2bit.image#mono") }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body.avatarContent", tgt: "pics.2bit.actor.profile:body.avatarContent:variant1", kind: "variant", name: Some("pics.2bit.image#trichrome") }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body.avatarContent:variant0", tgt: "pics.2bit.image#mono", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body.avatarContent:variant1", tgt: "pics.2bit.image#trichrome", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body.labels", tgt: "com.atproto.label.defs#selfLabels", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body.pinnedPhotos", tgt: "pics.2bit.actor.profile:body.pinnedPhotos:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "pics.2bit.actor.profile:body.pinnedPhotos:items", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "com.atproto.label.defs#selfLabels" }AddedVertex { vertex_id: "com.atproto.repo.strongRef" }AddedVertex { vertex_id: "pics.2bit.actor.profile:body.avatarContent" }AddedVertex { vertex_id: "pics.2bit.actor.profile:body.avatarContent:variant0" }AddedVertex { vertex_id: "pics.2bit.actor.profile:body.avatarContent:variant1" }AddedVertex { vertex_id: "pics.2bit.actor.profile:body.labels" }AddedVertex { vertex_id: "pics.2bit.actor.profile:body.pinnedPhotos" }AddedVertex { vertex_id: "pics.2bit.actor.profile:body.pinnedPhotos:items" }AddedVertex { vertex_id: "pics.2bit.image#mono" }AddedVertex { vertex_id: "pics.2bit.image#trichrome" }
Additional Notes
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body", tgt: "pics.2bit.actor.profile:body.avatarContent", kind: "prop", name: Some("avatarContent") }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body", tgt: "pics.2bit.actor.profile:body.labels", kind: "prop", name: Some("labels") }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body", tgt: "pics.2bit.actor.profile:body.pinnedPhotos", kind: "prop", name: Some("pinnedPhotos") }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body.avatarContent", tgt: "pics.2bit.actor.profile:body.avatarContent:variant0", kind: "variant", name: Some("pics.2bit.image#mono") }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body.avatarContent", tgt: "pics.2bit.actor.profile:body.avatarContent:variant1", kind: "variant", name: Some("pics.2bit.image#trichrome") }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body.avatarContent:variant0", tgt: "pics.2bit.image#mono", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body.avatarContent:variant1", tgt: "pics.2bit.image#trichrome", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body.labels", tgt: "com.atproto.label.defs#selfLabels", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body.pinnedPhotos", tgt: "pics.2bit.actor.profile:body.pinnedPhotos:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "pics.2bit.actor.profile:body.pinnedPhotos:items", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
5
"description": "A 2bit.pics profile.",
6
6
"key": "literal:self",
7
7
"record": {
8
8
"properties": {
9
9
"avatar": {
10
-
"description": "128x112 2bpp Game Boy Camera tile data, same layout as pics.2bit.feed.photo#image. Square avatars are produced by cropping at render time, not on write.",
10
+
"description": "Superseded by `avatarContent`, and written only by profiles that predate it: 128x112 2bpp Game Boy Camera tile data, same layout as pics.2bit.feed.photo#image. Read together with `avatarColors` it means exactly what a one-exposure pics.2bit.image#mono means. Kept declared for the reason pics.2bit.feed.photo#image is: HappyView keeps only the properties a schema names, so dropping it would index every unmigrated avatar with its pixels removed.",
11
11
"maxLength": 3584,
12
12
"minLength": 3584,
13
13
"type": "bytes"
14
14
},
15
15
"avatarColors": {
16
-
"description": "Four 24-bit RGB colors (0 to 0xFFFFFF) corresponding to the avatar's 2bpp pixel values 0 through 3, where 0 is lightest and 3 is darkest.",
16
+
"description": "Superseded by pics.2bit.image#mono `colors`, and written only alongside `avatar`. Four 24-bit RGB colors (0 to 0xFFFFFF) corresponding to the avatar's 2bpp pixel values 0 through 3, where 0 is lightest and 3 is darkest.",
17
17
"items": {
18
18
"maximum": 16777215,
19
19
"minimum": 0,
20
20
"type": "integer"
21
21
},
22
22
"maxLength": 4,
23
23
"minLength": 4,
24
24
"type": "array"
25
25
},
26
+
"avatarContent": {
27
+
"description": "The avatar's pixels, in the same shapes as pics.2bit.feed.photo#content - a full 128x112 frame whose planes sit in a pack blob, never on the record. Square avatars are produced by cropping at render time, not on write. Optional only while profiles predating this field remain unmigrated; a profile carries at most one of this and `avatar`. Readers should skip a $type they don't recognize and show no avatar rather than a broken one; this union must never be closed, for the same reason as the photo's.",
28
+
"refs": [
29
+
"pics.2bit.image#mono",
30
+
"pics.2bit.image#trichrome"
31
+
],
32
+
"type": "union"
33
+
},
26
34
"createdAt": {
27
35
"description": "When this profile record was first published.",
28
36
"format": "datetime",
29
37
"type": "string"
30
38
},
31
39
"description": {
32
40
"maxGraphemes": 256,
33
41
"maxLength": 2560,
34
42
"type": "string"
35
43
},
36
44
"displayName": {
37
45
"maxGraphemes": 64,
38
46
"maxLength": 640,
39
47
"type": "string"
40
48
},
41
49
"gear": {
42
50
"description": "Main rig flex slot.",
43
51
"maxLength": 100,
44
52
"type": "string"
45
53
},
54
+
"labels": {
55
+
"description": "Self-applied labels on this account. 2bit.pics writes at most `!no-unauthenticated`, the atproto value meaning \"don't show this account to logged-out viewers\" - the same one Bluesky writes for its own logged-out visibility setting, so other clients already know how to read it.",
56
+
"ref": "com.atproto.label.defs#selfLabels",
57
+
"type": "ref"
58
+
},
59
+
"pinnedPhotos": {
60
+
"description": "Photos pinned to the top of this profile, in display order - the first ref shows first. Each must be one of this account's own pics.2bit.feed.photo records; like pics.2bit.feed.like#subject, a strongRef carries no type, so that is enforced by the AppView rather than this schema, which also drops refs to photos that have since been deleted or can't be shown. The cid is the photo's at pinning time and isn't expected to track later edits. Modeled on app.bsky.actor.profile#pinnedPost, as a short list rather than a single ref.",
61
+
"items": {
62
+
"ref": "com.atproto.repo.strongRef",
63
+
"type": "ref"
64
+
},
65
+
"maxLength": 3,
66
+
"type": "array"
67
+
},
46
68
"updatedAt": {
47
69
"description": "When this profile record was last edited. Unset on a profile that has never been edited since creation.",
48
70
"format": "datetime",
49
71
"type": "string"
50
72
}
51
73
},
52
74
"type": "object"
53
75
},
54
76
"type": "record"
55
77
}
56
78
},
57
79
"id": "pics.2bit.actor.profile",
58
80
"lexicon": 1
59
81
}