community.gifthood.listing

gifthood.community

Schema Diff

+8 -0

From

CID
bafyreicoqhd377v...
Indexed At
2026-06-18 12:16 UTC
View this version

To

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

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
}

Compare Other Versions

Lexicon Garden

@