app.placita.place

placita.app

Schema Diff

+104 -0

From

CID
bafyreibnvdik34e...
Indexed At
2026-10-09 13:08 UTC
View this version

To

CID
bafyreign73spk6l...
Indexed At
2026-10-13 19:20 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

2 breaking changes, 36 non-breaking changes.

Breaking Changes (2)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.placita.place#osmTag", src: "app.placita.place#osmTag", tgt: "app.placita.place#osmTag.key", kind: "prop", name: Some("key") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.placita.place#osmTag", src: "app.placita.place#osmTag", tgt: "app.placita.place#osmTag.value", kind: "prop", name: Some("value") }
Non-Breaking Changes (36)
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.city" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.country" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.countryCode" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.houseNumber" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.postcode" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.state" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.street" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmAddress.suburb" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.address" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.checkedAt" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.tags" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.tags:items" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmTag" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmTag.key" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmTag.value" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place:body.osm" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place:body.rating" }
  • AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.city", kind: "prop", name: Some("city") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.country", kind: "prop", name: Some("country") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.countryCode", kind: "prop", name: Some("countryCode") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.houseNumber", kind: "prop", name: Some("houseNumber") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.postcode", kind: "prop", name: Some("postcode") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.state", kind: "prop", name: Some("state") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.street", kind: "prop", name: Some("street") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.suburb", kind: "prop", name: Some("suburb") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.address", kind: "prop", name: Some("address") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.checkedAt", kind: "prop", name: Some("checkedAt") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.tags", kind: "prop", name: Some("tags") }
  • AddedEdge AddedEdge { src: "app.placita.place#osmDetails.address", tgt: "app.placita.place#osmAddress", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "app.placita.place#osmDetails.tags", tgt: "app.placita.place#osmDetails.tags:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "app.placita.place#osmDetails.tags:items", tgt: "app.placita.place#osmTag", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.osm", kind: "prop", name: Some("osm") }
  • AddedEdge AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.rating", kind: "prop", name: Some("rating") }
  • AddedEdge AddedEdge { src: "app.placita.place:body.osm", tgt: "app.placita.place#osmDetails", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "app.placita.place#osmAddress" }
  • AddedVertex { vertex_id: "app.placita.place#osmAddress.city" }
  • AddedVertex { vertex_id: "app.placita.place#osmAddress.country" }
  • AddedVertex { vertex_id: "app.placita.place#osmAddress.countryCode" }
  • AddedVertex { vertex_id: "app.placita.place#osmAddress.houseNumber" }
  • AddedVertex { vertex_id: "app.placita.place#osmAddress.postcode" }
  • AddedVertex { vertex_id: "app.placita.place#osmAddress.state" }
  • AddedVertex { vertex_id: "app.placita.place#osmAddress.street" }
  • AddedVertex { vertex_id: "app.placita.place#osmAddress.suburb" }
  • AddedVertex { vertex_id: "app.placita.place#osmDetails" }
  • AddedVertex { vertex_id: "app.placita.place#osmDetails.address" }
  • AddedVertex { vertex_id: "app.placita.place#osmDetails.checkedAt" }
  • AddedVertex { vertex_id: "app.placita.place#osmDetails.tags" }
  • AddedVertex { vertex_id: "app.placita.place#osmDetails.tags:items" }
  • AddedVertex { vertex_id: "app.placita.place#osmTag" }
  • AddedVertex { vertex_id: "app.placita.place#osmTag.key" }
  • AddedVertex { vertex_id: "app.placita.place#osmTag.value" }
  • AddedVertex { vertex_id: "app.placita.place:body.osm" }
  • AddedVertex { vertex_id: "app.placita.place:body.rating" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "app.placita.place#osmTag", src: "app.placita.place#osmTag", tgt: "app.placita.place#osmTag.key", kind: "prop", name: Some("key") }
  • Breaking: RequiredEdgeAdded { vertex_id: "app.placita.place#osmTag", src: "app.placita.place#osmTag", tgt: "app.placita.place#osmTag.value", kind: "prop", name: Some("value") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.city", kind: "prop", name: Some("city") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.country", kind: "prop", name: Some("country") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.countryCode", kind: "prop", name: Some("countryCode") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.houseNumber", kind: "prop", name: Some("houseNumber") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.postcode", kind: "prop", name: Some("postcode") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.state", kind: "prop", name: Some("state") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.street", kind: "prop", name: Some("street") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmAddress", tgt: "app.placita.place#osmAddress.suburb", kind: "prop", name: Some("suburb") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.address", kind: "prop", name: Some("address") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.checkedAt", kind: "prop", name: Some("checkedAt") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.tags", kind: "prop", name: Some("tags") }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmDetails.address", tgt: "app.placita.place#osmAddress", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmDetails.tags", tgt: "app.placita.place#osmDetails.tags:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "app.placita.place#osmDetails.tags:items", tgt: "app.placita.place#osmTag", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.osm", kind: "prop", name: Some("osm") }
  • Non-breaking: AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.rating", kind: "prop", name: Some("rating") }
  • Non-breaking: AddedEdge { src: "app.placita.place:body.osm", tgt: "app.placita.place#osmDetails", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "main": {
5 5
      "description": "A place saved by a user. The primary entity of Placita: one record per place, stored in the user's own repository.",
6 6
      "key": "tid",
7 7
      "record": {
8 8
        "properties": {
9 9
          "category": {
10 10
            "description": "Place type from Placita's fixed list, for example restaurant, cafe or museum. Missing or unknown means generic.",
11 11
            "knownValues": [
12 12
              "generic",
13 13
              "restaurant",
14 14
              "fastfood",
15 15
              "cafe",
16 16
              "bar",
17 17
              "beer",
18 18
              "wine",
19 19
              "nightclub",
20 20
              "bakery",
21 21
              "grocery",
22 22
              "clothing",
23 23
              "shopping",
24 24
              "lodging",
25 25
              "campsite",
26 26
              "museum",
27 27
              "attraction",
28 28
              "viewpoint",
29 29
              "worship",
30 30
              "park",
31 31
              "playground",
32 32
              "sports",
33 33
              "swimming",
34 34
              "zoo",
35 35
              "cinema",
36 36
              "theatre",
37 37
              "library",
38 38
              "school",
39 39
              "college",
40 40
              "hospital",
41 41
              "pharmacy",
42 42
              "doctor",
43 43
              "dentist",
44 44
              "bank",
45 45
              "atm",
46 46
              "post",
47 47
              "police",
48 48
              "fuel",
49 49
              "parking",
50 50
              "bus",
51 51
              "rail",
52 52
              "airport",
53 53
              "ferry"
54 54
            ],
55 55
            "maxLength": 32,
56 56
            "type": "string"
57 57
          },
58 58
          "createdAt": {
59 59
            "description": "When the place was saved.",
60 60
            "format": "datetime",
61 61
            "type": "string"
62 62
          },
63 63
          "location": {
64 64
            "description": "Where the place is. Normally community.lexicon.location.geo: coordinates as strings, with the street address in its name field when known.",
65 65
            "refs": [
66 66
              "community.lexicon.location.geo",
67 67
              "community.lexicon.location.address"
68 68
            ],
69 69
            "type": "union"
70 70
          },
71 71
          "name": {
72 72
            "description": "Name of the place as the user saved it.",
73 73
            "maxGraphemes": 100,
74 74
            "maxLength": 300,
75 75
            "type": "string"
76 76
          },
77 77
          "note": {
78 78
            "description": "The user's own note about the place.",
79 79
            "maxGraphemes": 1000,
80 80
            "maxLength": 3000,
81 81
            "type": "string"
82 82
          },
83 83
          "noteTitle": {
84 84
            "description": "Optional short title for the note.",
85 85
            "maxGraphemes": 100,
86 86
            "maxLength": 100,
87 87
            "type": "string"
88 88
          },
89 89
          "openingHours": {
90 90
            "description": "Opening hours in OpenStreetMap opening_hours syntax, for example Mo-Su 09:00-18:00.",
91 91
            "maxLength": 512,
92 92
            "type": "string"
93 93
          },
94 +
          "osm": {
95 +
            "description": "Details copied from OpenStreetMap when the place was linked. Only set together with osmType and osmId. A copy made at a point in time: it is not kept up to date.",
96 +
            "ref": "#osmDetails",
97 +
            "type": "ref"
98 +
          },
94 99
          "osmId": {
95 100
            "description": "ID of the linked OpenStreetMap feature as a decimal string. Used together with osmType.",
96 101
            "maxLength": 32,
97 102
            "type": "string"
98 103
          },
99 104
          "osmType": {
100 105
            "description": "Type of the linked OpenStreetMap feature. Set only when the user confirmed the match. Used together with osmId.",
101 106
            "knownValues": [
102 107
              "node",
103 108
              "way",
104 109
              "relation"
105 110
            ],
106 111
            "type": "string"
107 112
          },
108 113
          "phone": {
109 114
            "description": "The place's phone number, as entered or taken from OpenStreetMap.",
110 115
            "maxLength": 64,
111 116
            "type": "string"
112 117
          },
113 118
          "photo": {
114 119
            "accept": [
115 120
              "image/png",
116 121
              "image/jpeg",
117 122
              "image/webp"
118 123
            ],
119 124
            "description": "Legacy single photo. Only older records have it. New records use photos.",
120 125
            "maxSize": 2000000,
121 126
            "type": "blob"
122 127
          },
123 128
          "photos": {
124 129
            "description": "Photos the user uploaded for this place. Up to 4.",
125 130
            "items": {
126 131
              "accept": [
127 132
                "image/png",
128 133
                "image/jpeg",
129 134
                "image/webp"
130 135
              ],
131 136
              "maxSize": 2000000,
132 137
              "type": "blob"
133 138
            },
134 139
            "maxItems": 4,
135 140
            "type": "array"
136 141
          },
142 +
          "rating": {
143 +
            "description": "The user's own rating of the place, from 1 (poor) to 5 (excellent). Only set when status is been. Absent means not rated.",
144 +
            "maximum": 5,
145 +
            "minimum": 1,
146 +
            "type": "integer"
147 +
          },
137 148
          "source": {
138 149
            "description": "Where the place came from: a map or review link the user pasted, an OpenStreetMap search result, or manual entry.",
139 150
            "knownValues": [
140 151
              "google",
141 152
              "foursquare",
142 153
              "osm",
143 154
              "apple",
144 155
              "tripadvisor",
145 156
              "manual"
146 157
            ],
147 158
            "type": "string"
148 159
          },
149 160
          "sourcePhotoAuthor": {
150 161
            "description": "Creator or credit text returned by Wikimedia Commons for sourcePhotoUrl.",
151 162
            "maxLength": 500,
152 163
            "type": "string"
153 164
          },
154 165
          "sourcePhotoLicense": {
155 166
            "description": "License of sourcePhotoUrl, e.g. CC BY-SA 4.0. Attribution duty applies when shown.",
156 167
            "maxLength": 64,
157 168
            "type": "string"
158 169
          },
159 170
          "sourcePhotoLicenseUrl": {
160 171
            "description": "License details URL returned by Wikimedia Commons.",
161 172
            "maxLength": 2048,
162 173
            "type": "string"
163 174
          },
164 175
          "sourcePhotoPageUrl": {
165 176
            "description": "Source file page URL for attribution and reuse details.",
166 177
            "maxLength": 2048,
167 178
            "type": "string"
168 179
          },
169 180
          "sourcePhotoSourceName": {
170 181
            "description": "Origin label for the source photo suggestion.",
171 182
            "maxLength": 128,
172 183
            "type": "string"
173 184
          },
174 185
          "sourcePhotoUrl": {
175 186
            "description": "URL of a free-licensed photo found for this place (Wikimedia Commons, OSM image tag, Wikidata P18). Not a blob - it is a reference to an external image, with attribution.",
176 187
            "maxLength": 2048,
177 188
            "type": "string"
178 189
          },
179 190
          "sourceUrl": {
180 191
            "description": "The link the place was created from, when there was one.",
181 192
            "maxLength": 2048,
182 193
            "type": "string"
183 194
          },
184 195
          "status": {
185 196
            "default": "want",
186 197
            "description": "want means the user wants to go there. been means the user has been there.",
187 198
            "knownValues": [
188 199
              "want",
189 200
              "been"
190 201
            ],
191 202
            "type": "string"
192 203
          },
193 204
          "tags": {
194 205
            "description": "The user's tags for this place, as strong references to app.placita.tag records.",
195 206
            "items": {
196 207
              "ref": "com.atproto.repo.strongRef",
197 208
              "type": "ref"
198 209
            },
199 210
            "maxLength": 50,
200 211
            "type": "array"
201 212
          },
202 213
          "visibility": {
203 214
            "default": "hidden",
204 215
            "description": "Whether Placita shows this place in public discovery. This is a display hint only: every record in an AT Protocol repository can be read by anyone, including hidden ones.",
205 216
            "knownValues": [
206 217
              "hidden",
207 218
              "public"
208 219
            ],
209 220
            "type": "string"
210 221
          },
211 222
          "website": {
212 223
            "description": "The place's website.",
213 224
            "maxLength": 2048,
214 225
            "type": "string"
215 226
          }
216 227
        },
217 228
        "required": [
218 229
          "name",
219 230
          "status",
220 231
          "visibility",
221 232
          "location",
222 233
          "createdAt"
223 234
        ],
224 235
        "type": "object"
225 236
      },
226 237
      "type": "record"
238 +
    },
239 +
    "osmAddress": {
240 +
      "description": "A structured address, as OpenStreetMap returns it. Every part is optional.",
241 +
      "properties": {
242 +
        "city": {
243 +
          "description": "City, town or village.",
244 +
          "maxLength": 200,
245 +
          "type": "string"
246 +
        },
247 +
        "country": {
248 +
          "description": "Country name.",
249 +
          "maxLength": 200,
250 +
          "type": "string"
251 +
        },
252 +
        "countryCode": {
253 +
          "description": "Two-letter ISO 3166-1 country code, upper case.",
254 +
          "maxLength": 2,
255 +
          "minLength": 2,
256 +
          "type": "string"
257 +
        },
258 +
        "houseNumber": {
259 +
          "description": "House or building number.",
260 +
          "maxLength": 32,
261 +
          "type": "string"
262 +
        },
263 +
        "postcode": {
264 +
          "description": "Postal code.",
265 +
          "maxLength": 32,
266 +
          "type": "string"
267 +
        },
268 +
        "state": {
269 +
          "description": "Region or state.",
270 +
          "maxLength": 200,
271 +
          "type": "string"
272 +
        },
273 +
        "street": {
274 +
          "description": "Street or road name.",
275 +
          "maxLength": 200,
276 +
          "type": "string"
277 +
        },
278 +
        "suburb": {
279 +
          "description": "Neighbourhood, quarter or suburb.",
280 +
          "maxLength": 200,
281 +
          "type": "string"
282 +
        }
283 +
      },
284 +
      "type": "object"
285 +
    },
286 +
    "osmDetails": {
287 +
      "description": "A copy of what OpenStreetMap knew about the linked feature at checkedAt. Data (c) OpenStreetMap contributors, available under the Open Database Licence (ODbL). Treat the values as suggestions: they can be wrong or out of date, and the user's own fields always win.",
288 +
      "properties": {
289 +
        "address": {
290 +
          "description": "The structured address OpenStreetMap has for the feature.",
291 +
          "ref": "#osmAddress",
292 +
          "type": "ref"
293 +
        },
294 +
        "checkedAt": {
295 +
          "description": "When the details were copied from OpenStreetMap.",
296 +
          "format": "datetime",
297 +
          "type": "string"
298 +
        },
299 +
        "tags": {
300 +
          "description": "Raw OpenStreetMap tags (key and value) of the feature, such as cuisine, wheelchair or wikidata. Tags already stored in other fields (name, website, phone, opening hours) and OpenStreetMap-internal tags (source, note, fixme) are left out. At most 60.",
301 +
          "items": {
302 +
            "ref": "#osmTag",
303 +
            "type": "ref"
304 +
          },
305 +
          "maxLength": 60,
306 +
          "type": "array"
307 +
        }
308 +
      },
309 +
      "type": "object"
310 +
    },
311 +
    "osmTag": {
312 +
      "description": "One OpenStreetMap tag.",
313 +
      "properties": {
314 +
        "key": {
315 +
          "description": "The tag key, for example cuisine.",
316 +
          "maxLength": 64,
317 +
          "type": "string"
318 +
        },
319 +
        "value": {
320 +
          "description": "The tag value, for example italian;pizza. Values over 255 characters are not stored.",
321 +
          "maxGraphemes": 255,
322 +
          "maxLength": 1024,
323 +
          "type": "string"
324 +
        }
325 +
      },
326 +
      "required": [
327 +
        "key",
328 +
        "value"
329 +
      ],
330 +
      "type": "object"
227 331
    }
228 332
  },
229 333
  "id": "app.placita.place",
230 334
  "lexicon": 1
231 335
}

Compare Other Versions

Lexicon Garden

@