community.gifthood.listing

gifthood.community

Schema Diff

+19 -2

From

CID
bafyreicrztgvfup...
Indexed At
2026-06-19 10:29 UTC
View this version

To

CID
bafyreibsln4ltai...
Indexed At
2026-07-20 06:01 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@