community.gifthood.listing
Schema Diff
+19 -2
Compatibility Analysis
Breaking Changes Detected
1 breaking change, 6 non-breaking changes.
Breaking Changes (1)
- ConstraintTightened ConstraintTightened { vertex_id: "community.gifthood.listing:body.category", sort: "enum", old_value: "furniture,kitchen,clothing,baby,books,instruments,electronics,tools,garden,health,pets,hobbies,food,animals,service,other", new_value: "furniture,kitchen,clothing,baby,books,instruments,electronics,tools,garden,health,pets,hobbies,food,animals,service,office,other" }
Non-Breaking Changes (6)
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.mode" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.paused" }
- AddedVertex AddedVertex { vertex_id: "community.gifthood.listing:body.standing" }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.mode", kind: "prop", name: Some("mode") }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.paused", kind: "prop", name: Some("paused") }
- AddedEdge AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.standing", kind: "prop", name: Some("standing") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "community.gifthood.listing:body.mode" }AddedVertex { vertex_id: "community.gifthood.listing:body.paused" }AddedVertex { vertex_id: "community.gifthood.listing:body.standing" }
Constraint Changes
- ConstraintTightened ConstraintTightened { vertex_id: "community.gifthood.listing:body.category", sort: "enum", old_value: "furniture,kitchen,clothing,baby,books,instruments,electronics,tools,garden,health,pets,hobbies,food,animals,service,other", new_value: "furniture,kitchen,clothing,baby,books,instruments,electronics,tools,garden,health,pets,hobbies,food,animals,service,office,other" }
Additional Notes
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.mode", kind: "prop", name: Some("mode") }
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.paused", kind: "prop", name: Some("paused") }
- Non-breaking: AddedEdge { src: "community.gifthood.listing:body", tgt: "community.gifthood.listing:body.standing", kind: "prop", name: Some("standing") }
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
-
"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.",
10
+
"description": "Optional single-level category for opt-out feed filtering. Additive-only enum (values may be inserted, never removed or renamed); 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
+
"office",
27
28
"other"
28
29
],
29
30
"type": "string"
30
31
},
31
32
"createdAt": {
32
33
"format": "datetime",
33
34
"type": "string"
34
35
},
35
36
"description": {
36
37
"description": "Required free text describing the item being offered or requested.",
37
38
"maxGraphemes": 1500,
38
39
"maxLength": 3000,
39
40
"minGraphemes": 1,
40
41
"minLength": 1,
41
42
"type": "string"
42
43
},
43
44
"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
+
"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 private-message-only.",
45
46
"items": {
46
47
"ref": "app.bsky.richtext.facet",
47
48
"type": "ref"
48
49
},
49
50
"type": "array"
50
51
},
51
52
"geohash": {
52
53
"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.",
53
54
"maxLength": 6,
54
55
"minLength": 1,
55
56
"type": "string"
56
57
},
57
58
"imageAlts": {
58
59
"description": "Alt text for images, parallel to the images array by index.",
59
60
"items": {
60
61
"maxGraphemes": 1000,
61
62
"type": "string"
62
63
},
63
64
"maxLength": 4,
64
65
"type": "array"
65
66
},
66
67
"images": {
67
68
"description": "Up to 4 images of the item, stored as blobs in the poster's repo.",
68
69
"items": {
69
70
"accept": [
70
71
"image/jpeg",
71
72
"image/png",
72
73
"image/webp"
73
74
],
74
75
"maxSize": 1000000,
75
76
"type": "blob"
76
77
},
77
78
"maxLength": 4,
78
79
"type": "array"
79
80
},
80
81
"intent": {
81
82
"description": "Whether the poster is giving away an item or looking for one.",
82
83
"enum": [
83
84
"offer",
84
85
"request"
85
86
],
86
87
"type": "string"
87
88
},
88
89
"labels": {
89
90
"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.",
90
91
"refs": [
91
92
"com.atproto.label.defs#selfLabels"
92
93
],
93
94
"type": "union"
94
95
},
95
96
"langs": {
96
97
"description": "Language(s) the content is written in, as BCP-47 language tags. Author-asserted; clients default from the composer's locale.",
97
98
"items": {
98
99
"format": "language",
99
100
"type": "string"
100
101
},
101
102
"maxLength": 3,
102
103
"type": "array"
103
104
},
104
105
"locationName": {
105
106
"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.",
106
107
"maxGraphemes": 100,
107
108
"maxLength": 300,
108
109
"type": "string"
109
110
},
111
+
"mode": {
112
+
"description": "How the item changes hands. 'gift' (the default when absent) transfers ownership; 'lend' expects the item back — the listing behaves as a standing offer and each exchange gains a return leg (see exchange.returnedAt). Readers MUST treat unknown or missing values as 'gift'.",
113
+
"enum": [
114
+
"gift",
115
+
"lend"
116
+
],
117
+
"type": "string"
118
+
},
119
+
"paused": {
120
+
"description": "Owner-set temporary unavailability (using the item themselves, away for a while). AppViews hide paused listings from feeds but keep the detail view reachable with interest disabled. Absent means active. Orthogonal to status; 'gone' still wins.",
121
+
"type": "boolean"
122
+
},
123
+
"standing": {
124
+
"description": "Standing (renewing) offer: the owner can run exchange chains with multiple neighbors over time. Absent or false means the listing is exhausted by a single exchange. AppViews keep a standing listing available while chains run; only the owner's manual 'gone' ends it.",
125
+
"type": "boolean"
126
+
},
110
127
"status": {
111
128
"description": "Current availability. Clients should treat a missing value as 'available'.",
112
129
"enum": [
113
130
"available",
114
131
"pending",
115
132
"gone"
116
133
],
117
134
"type": "string"
118
135
},
119
136
"title": {
120
137
"description": "Required short title for the item being offered or requested.",
121
138
"maxGraphemes": 100,
122
139
"maxLength": 200,
123
140
"minGraphemes": 1,
124
141
"minLength": 1,
125
142
"type": "string"
126
143
}
127
144
},
128
145
"required": [
129
146
"title",
130
147
"intent",
131
148
"description",
132
149
"geohash",
133
150
"createdAt"
134
151
],
135
152
"type": "object"
136
153
},
137
154
"type": "record"
138
155
}
139
156
},
140
157
"id": "community.gifthood.listing",
141
158
"lexicon": 1
142
159
}