community.gifthood.listing
Schema Diff
+8 -0
Compatibility Analysis
Backward Compatible
Backward compatible. 6 non-breaking changes.
Non-Breaking Changes (6)
- AddedVertex AddedVertex { vertex_id: "app.bsky.richtext.facet" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.facets" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.facets:items" }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.facets", kind: "prop", name: Some("facets") }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body.facets", tgt: "community.gifthood.listing:body.facets:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body.facets:items", tgt: "app.bsky.richtext.facet", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "app.bsky.richtext.facet" }AddedVertex { vertex_id: "community.gifthood.listing:body.facets" }AddedVertex { vertex_id: "community.gifthood.listing:body.facets:items" }
Additional Notes
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.facets", kind: "prop", name: Some("facets") }
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body.facets", tgt: "community.gifthood.listing:body.facets:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body.facets:items", tgt: "app.bsky.richtext.facet", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
5
"description": "An offer or request for a free item, discoverable by approximate location.",
6
6
"key": "tid",
7
7
"record": {
8
8
"properties": {
9
9
"category": {
10
10
"description": "Optional single-level category for opt-out feed filtering. Append-only enum; unknown or missing values index as 'other'. Never used for proximity or safety logic.",
11
11
"enum": [
12
12
"furniture",
13
13
"kitchen",
14
14
"clothing",
15
15
"baby",
16
16
"books",
17
17
"instruments",
18
18
"electronics",
19
19
"tools",
20
20
"garden",
21
21
"health",
22
22
"pets",
23
23
"hobbies",
24
24
"food",
25
25
"animals",
26
26
"service",
27
27
"other"
28
28
],
29
29
"type": "string"
30
30
},
31
31
"createdAt": {
32
32
"format": "datetime",
33
33
"type": "string"
34
34
},
35
35
"description": {
36
36
"description": "Required free text describing the item being offered or requested.",
37
37
"maxGraphemes": 1500,
38
38
"maxLength": 3000,
39
39
"minGraphemes": 1,
40
40
"minLength": 1,
41
41
"type": "string"
42
42
},
43
+
"facets": {
44
+
"description": "Annotations over `description` (mentions, links) keyed by UTF-8 byte range. Reuses app.bsky.richtext.facet for atmosphere-wide interop. Author-asserted at compose time; clients MUST treat them as display hints, re-validate ranges, and never trust a facet URI over the visible text. Addresses and phone numbers are deliberately NOT faceted here — those affordances are direct-message-only.",
45
+
"items": {
46
+
"ref": "app.bsky.richtext.facet",
47
+
"type": "ref"
48
+
},
49
+
"type": "array"
50
+
},
43
51
"geohash": {
44
52
"description": "Approximate location as a geohash, precision 6 (~1.2km cell). This is a privacy floor: indexers MUST truncate any finer-precision value to 6 characters before indexing or display.",
45
53
"maxLength": 6,
46
54
"minLength": 1,
47
55
"type": "string"
48
56
},
49
57
"imageAlts": {
50
58
"description": "Alt text for images, parallel to the images array by index.",
51
59
"items": {
52
60
"maxGraphemes": 1000,
53
61
"type": "string"
54
62
},
55
63
"maxLength": 4,
56
64
"type": "array"
57
65
},
58
66
"images": {
59
67
"description": "Up to 4 images of the item, stored as blobs in the poster's repo.",
60
68
"items": {
61
69
"accept": [
62
70
"image/jpeg",
63
71
"image/png",
64
72
"image/webp"
65
73
],
66
74
"maxSize": 1000000,
67
75
"type": "blob"
68
76
},
69
77
"maxLength": 4,
70
78
"type": "array"
71
79
},
72
80
"intent": {
73
81
"description": "Whether the poster is giving away an item or looking for one.",
74
82
"enum": [
75
83
"offer",
76
84
"request"
77
85
],
78
86
"type": "string"
79
87
},
80
88
"labels": {
81
89
"description": "Self-labels set by the author. Used to flag mature/adult content (e.g. the global 'sexual' value), which the AppView gates behind an opt-in.",
82
90
"refs": [
83
91
"com.atproto.label.defs#selfLabels"
84
92
],
85
93
"type": "union"
86
94
},
87
95
"langs": {
88
96
"description": "Language(s) the content is written in, as BCP-47 language tags. Author-asserted; clients default from the composer's locale.",
89
97
"items": {
90
98
"format": "language",
91
99
"type": "string"
92
100
},
93
101
"maxLength": 3,
94
102
"type": "array"
95
103
},
96
104
"locationName": {
97
105
"description": "Optional human-readable area name. App-populated via reverse geocoding of the geohash cell. Display only; MUST NOT be used for proximity matching or filtering.",
98
106
"maxGraphemes": 100,
99
107
"maxLength": 300,
100
108
"type": "string"
101
109
},
102
110
"status": {
103
111
"description": "Current availability. Clients should treat a missing value as 'available'.",
104
112
"enum": [
105
113
"available",
106
114
"pending",
107
115
"gone"
108
116
],
109
117
"type": "string"
110
118
},
111
119
"title": {
112
120
"description": "Required short title for the item being offered or requested.",
113
121
"maxGraphemes": 100,
114
122
"maxLength": 200,
115
123
"minGraphemes": 1,
116
124
"minLength": 1,
117
125
"type": "string"
118
126
}
119
127
},
120
128
"required": [
121
129
"title",
122
130
"intent",
123
131
"description",
124
132
"geohash",
125
133
"createdAt"
126
134
],
127
135
"type": "object"
128
136
},
129
137
"type": "record"
130
138
}
131
139
},
132
140
"id": "community.gifthood.listing",
133
141
"lexicon": 1
134
142
}