community.gifthood.listing
Schema Diff
+46 -0
Compatibility Analysis
Breaking Changes Detected
1 breaking change, 14 non-breaking changes.
Breaking Changes (1)
- ConstraintAdded ConstraintAdded { vertex_id: "community.gifthood.listing:body.category", sort: "enum", value: "furniture,kitchen,clothing,baby,books,instruments,electronics,tools,garden,health,pets,hobbies,food,animals,service,other" }
Non-Breaking Changes (14)
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.category" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.facets" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.facets:items" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.labels" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.labels:variant0" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.langs" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.langs:items" }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.category", kind: "prop", name: Some("category") }
- 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", tgt: "community.gifthood.listing:body.labels", kind: "prop", name: Some("labels") }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.langs", kind: "prop", name: Some("langs") }
- 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.labels", tgt: "community.gifthood.listing:body.labels:variant0", kind: "variant", name: Some("com.atproto.label.defs#selfLabels") }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body.langs", tgt: "community.gifthood.listing:body.langs:items", kind: "items", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "community.gifthood.listing:body.category" }AddedVertex { vertex_id: "community.gifthood.listing:body.facets" }AddedVertex { vertex_id: "community.gifthood.listing:body.facets:items" }AddedVertex { vertex_id: "community.gifthood.listing:body.labels" }AddedVertex { vertex_id: "community.gifthood.listing:body.labels:variant0" }AddedVertex { vertex_id: "community.gifthood.listing:body.langs" }AddedVertex { vertex_id: "community.gifthood.listing:body.langs:items" }
Constraint Changes
- ConstraintAdded ConstraintAdded { vertex_id: "community.gifthood.listing:body.category", sort: "enum", value: "furniture,kitchen,clothing,baby,books,instruments,electronics,tools,garden,health,pets,hobbies,food,animals,service,other" }
Additional Notes
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.category", kind: "prop", name: Some("category") }
- 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", tgt: "community.gifthood.listing:body.labels", kind: "prop", name: Some("labels") }
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.langs", kind: "prop", name: Some("langs") }
- 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.labels", tgt: "community.gifthood.listing:body.labels:variant0", kind: "variant", name: Some("com.atproto.label.defs#selfLabels") }
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body.langs", tgt: "community.gifthood.listing:body.langs:items", kind: "items", name: None }
1
1
{
2
2
"id": "community.gifthood.listing",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
10
"title",
11
11
"intent",
12
12
"description",
13
13
"geohash",
14
14
"createdAt"
15
15
],
16
16
"properties": {
17
+
"langs": {
18
+
"type": "array",
19
+
"items": {
20
+
"type": "string",
21
+
"format": "language"
22
+
},
23
+
"maxLength": 3,
24
+
"description": "Language(s) the content is written in, as BCP-47 language tags. Author-asserted; clients default from the composer's locale."
25
+
},
17
26
"title": {
18
27
"type": "string",
19
28
"maxLength": 200,
20
29
"minLength": 1,
21
30
"description": "Required short title for the item being offered or requested.",
22
31
"maxGraphemes": 100,
23
32
"minGraphemes": 1
24
33
},
34
+
"facets": {
35
+
"type": "array",
36
+
"items": {
37
+
"ref": "app.bsky.richtext.facet",
38
+
"type": "ref"
39
+
},
40
+
"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."
41
+
},
25
42
"images": {
26
43
"type": "array",
27
44
"items": {
28
45
"type": "blob",
29
46
"accept": [
30
47
"image/jpeg",
31
48
"image/png",
32
49
"image/webp"
33
50
],
34
51
"maxSize": 1000000
35
52
},
36
53
"maxLength": 4,
37
54
"description": "Up to 4 images of the item, stored as blobs in the poster's repo."
38
55
},
39
56
"intent": {
40
57
"enum": [
41
58
"offer",
42
59
"request"
43
60
],
44
61
"type": "string",
45
62
"description": "Whether the poster is giving away an item or looking for one."
46
63
},
64
+
"labels": {
65
+
"refs": [
66
+
"com.atproto.label.defs#selfLabels"
67
+
],
68
+
"type": "union",
69
+
"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."
70
+
},
47
71
"status": {
48
72
"enum": [
49
73
"available",
50
74
"pending",
51
75
"gone"
52
76
],
53
77
"type": "string",
54
78
"description": "Current availability. Clients should treat a missing value as 'available'."
55
79
},
56
80
"geohash": {
57
81
"type": "string",
58
82
"maxLength": 6,
59
83
"minLength": 1,
60
84
"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."
61
85
},
86
+
"category": {
87
+
"enum": [
88
+
"furniture",
89
+
"kitchen",
90
+
"clothing",
91
+
"baby",
92
+
"books",
93
+
"instruments",
94
+
"electronics",
95
+
"tools",
96
+
"garden",
97
+
"health",
98
+
"pets",
99
+
"hobbies",
100
+
"food",
101
+
"animals",
102
+
"service",
103
+
"other"
104
+
],
105
+
"type": "string",
106
+
"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."
107
+
},
62
108
"createdAt": {
63
109
"type": "string",
64
110
"format": "datetime"
65
111
},
66
112
"imageAlts": {
67
113
"type": "array",
68
114
"items": {
69
115
"type": "string",
70
116
"maxGraphemes": 1000
71
117
},
72
118
"maxLength": 4,
73
119
"description": "Alt text for images, parallel to the images array by index."
74
120
},
75
121
"description": {
76
122
"type": "string",
77
123
"maxLength": 3000,
78
124
"minLength": 1,
79
125
"description": "Required free text describing the item being offered or requested.",
80
126
"maxGraphemes": 1500,
81
127
"minGraphemes": 1
82
128
},
83
129
"locationName": {
84
130
"type": "string",
85
131
"maxLength": 300,
86
132
"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.",
87
133
"maxGraphemes": 100
88
134
}
89
135
}
90
136
},
91
137
"description": "An offer or request for a free item, discoverable by approximate location."
92
138
}
93
139
},
94
140
"$type": "com.atproto.lexicon.schema",
95
141
"lexicon": 1
96
142
}