app.placita.place

placita.app

Schema Diff

+19 -3

From

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

To

CID
bafyreievruefhj3...
Indexed At
2026-10-14 01:10 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 6 non-breaking changes.

Non-Breaking Changes (6)
  • AddedVertex AddedVertex { vertex_id: "app.placita.place#osmDetails.editedAt" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place:body.photoCredit" }
  • AddedVertex AddedVertex { vertex_id: "app.placita.place:body.placeCode" }
  • AddedEdge AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.editedAt", kind: "prop", name: Some("editedAt") }
  • AddedEdge AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.photoCredit", kind: "prop", name: Some("photoCredit") }
  • AddedEdge AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.placeCode", kind: "prop", name: Some("placeCode") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "app.placita.place#osmDetails.editedAt" }
  • AddedVertex { vertex_id: "app.placita.place:body.photoCredit" }
  • AddedVertex { vertex_id: "app.placita.place:body.placeCode" }

Additional Notes

  • Non-breaking: AddedEdge { src: "app.placita.place#osmDetails", tgt: "app.placita.place#osmDetails.editedAt", kind: "prop", name: Some("editedAt") }
  • Non-breaking: AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.photoCredit", kind: "prop", name: Some("photoCredit") }
  • Non-breaking: AddedEdge { src: "app.placita.place:body", tgt: "app.placita.place:body.placeCode", kind: "prop", name: Some("placeCode") }
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 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.",
95 +
            "description": "Details in OpenStreetMap's own words (structured address, tags). Copied from OpenStreetMap when the place is linked (see checkedAt), and editable by the person (see editedAt). May also hold details typed for a place with no link. A copy made at a point in time: it is not kept up to date.",
96 96
            "ref": "#osmDetails",
97 97
            "type": "ref"
98 98
          },
99 99
          "osmId": {
100 100
            "description": "ID of the linked OpenStreetMap feature as a decimal string. Used together with osmType.",
101 101
            "maxLength": 32,
102 102
            "type": "string"
103 103
          },
104 104
          "osmType": {
105 105
            "description": "Type of the linked OpenStreetMap feature. Set only when the user confirmed the match. Used together with osmId.",
106 106
            "knownValues": [
107 107
              "node",
108 108
              "way",
109 109
              "relation"
110 110
            ],
111 111
            "type": "string"
112 112
          },
113 113
          "phone": {
114 114
            "description": "The place's phone number, as entered or taken from OpenStreetMap.",
115 115
            "maxLength": 64,
116 116
            "type": "string"
117 117
          },
118 118
          "photo": {
119 119
            "accept": [
120 120
              "image/png",
121 121
              "image/jpeg",
122 122
              "image/webp"
123 123
            ],
124 124
            "description": "Legacy single photo. Only older records have it. New records use photos.",
125 125
            "maxSize": 2000000,
126 126
            "type": "blob"
127 127
          },
128 +
          "photoCredit": {
129 +
            "description": "Who took the photos in photos, when they are not the person who owns this record, for example because they were copied from a public place of another person. Free text such as Photos by @alice.example. Only set together with photos.",
130 +
            "maxGraphemes": 100,
131 +
            "maxLength": 300,
132 +
            "type": "string"
133 +
          },
128 134
          "photos": {
129 135
            "description": "Photos the user uploaded for this place. Up to 4.",
130 136
            "items": {
131 137
              "accept": [
132 138
                "image/png",
133 139
                "image/jpeg",
134 140
                "image/webp"
135 141
              ],
136 142
              "maxSize": 2000000,
137 143
              "type": "blob"
138 144
            },
139 145
            "maxItems": 4,
140 146
            "type": "array"
141 147
          },
148 +
          "placeCode": {
149 +
            "description": "An opaque random code that names the place itself, for a place with no confirmed OpenStreetMap link. The person who first saves such a place makes it; every copy another person saves keeps it unchanged, so copies of one place can be found together. Not set when the place has an OpenStreetMap link, which names the place instead. Lowercase letters and the digits 2 to 7.",
150 +
            "maxLength": 64,
151 +
            "type": "string"
152 +
          },
142 153
          "rating": {
143 154
            "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 155
            "maximum": 5,
145 156
            "minimum": 1,
146 157
            "type": "integer"
147 158
          },
148 159
          "source": {
149 160
            "description": "Where the place came from: a map or review link the user pasted, an OpenStreetMap search result, or manual entry.",
150 161
            "knownValues": [
151 162
              "google",
152 163
              "foursquare",
153 164
              "osm",
154 165
              "apple",
155 166
              "tripadvisor",
156 167
              "manual"
157 168
            ],
158 169
            "type": "string"
159 170
          },
160 171
          "sourcePhotoAuthor": {
161 172
            "description": "Creator or credit text returned by Wikimedia Commons for sourcePhotoUrl.",
162 173
            "maxLength": 500,
163 174
            "type": "string"
164 175
          },
165 176
          "sourcePhotoLicense": {
166 177
            "description": "License of sourcePhotoUrl, e.g. CC BY-SA 4.0. Attribution duty applies when shown.",
167 178
            "maxLength": 64,
168 179
            "type": "string"
169 180
          },
170 181
          "sourcePhotoLicenseUrl": {
171 182
            "description": "License details URL returned by Wikimedia Commons.",
172 183
            "maxLength": 2048,
173 184
            "type": "string"
174 185
          },
175 186
          "sourcePhotoPageUrl": {
176 187
            "description": "Source file page URL for attribution and reuse details.",
177 188
            "maxLength": 2048,
178 189
            "type": "string"
179 190
          },
180 191
          "sourcePhotoSourceName": {
181 192
            "description": "Origin label for the source photo suggestion.",
182 193
            "maxLength": 128,
183 194
            "type": "string"
184 195
          },
185 196
          "sourcePhotoUrl": {
186 197
            "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.",
187 198
            "maxLength": 2048,
188 199
            "type": "string"
189 200
          },
190 201
          "sourceUrl": {
191 202
            "description": "The link the place was created from, when there was one.",
192 203
            "maxLength": 2048,
193 204
            "type": "string"
194 205
          },
195 206
          "status": {
196 207
            "default": "want",
197 208
            "description": "want means the user wants to go there. been means the user has been there.",
198 209
            "knownValues": [
199 210
              "want",
200 211
              "been"
201 212
            ],
202 213
            "type": "string"
203 214
          },
204 215
          "tags": {
205 216
            "description": "The user's tags for this place, as strong references to app.placita.tag records.",
206 217
            "items": {
207 218
              "ref": "com.atproto.repo.strongRef",
208 219
              "type": "ref"
209 220
            },
210 221
            "maxLength": 50,
211 222
            "type": "array"
212 223
          },
213 224
          "visibility": {
214 225
            "default": "hidden",
215 226
            "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.",
216 227
            "knownValues": [
217 228
              "hidden",
218 229
              "public"
219 230
            ],
220 231
            "type": "string"
221 232
          },
222 233
          "website": {
223 234
            "description": "The place's website.",
224 235
            "maxLength": 2048,
225 236
            "type": "string"
226 237
          }
227 238
        },
228 239
        "required": [
229 240
          "name",
230 241
          "status",
231 242
          "visibility",
232 243
          "location",
233 244
          "createdAt"
234 245
        ],
235 246
        "type": "object"
236 247
      },
237 248
      "type": "record"
238 249
    },
239 250
    "osmAddress": {
240 251
      "description": "A structured address, as OpenStreetMap returns it. Every part is optional.",
241 252
      "properties": {
242 253
        "city": {
243 254
          "description": "City, town or village.",
244 255
          "maxLength": 200,
245 256
          "type": "string"
246 257
        },
247 258
        "country": {
248 259
          "description": "Country name.",
249 260
          "maxLength": 200,
250 261
          "type": "string"
251 262
        },
252 263
        "countryCode": {
253 264
          "description": "Two-letter ISO 3166-1 country code, upper case.",
254 265
          "maxLength": 2,
255 266
          "minLength": 2,
256 267
          "type": "string"
257 268
        },
258 269
        "houseNumber": {
259 270
          "description": "House or building number.",
260 271
          "maxLength": 32,
261 272
          "type": "string"
262 273
        },
263 274
        "postcode": {
264 275
          "description": "Postal code.",
265 276
          "maxLength": 32,
266 277
          "type": "string"
267 278
        },
268 279
        "state": {
269 280
          "description": "Region or state.",
270 281
          "maxLength": 200,
271 282
          "type": "string"
272 283
        },
273 284
        "street": {
274 285
          "description": "Street or road name.",
275 286
          "maxLength": 200,
276 287
          "type": "string"
277 288
        },
278 289
        "suburb": {
279 290
          "description": "Neighbourhood, quarter or suburb.",
280 291
          "maxLength": 200,
281 292
          "type": "string"
282 293
        }
283 294
      },
284 295
      "type": "object"
285 296
    },
286 297
    "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.",
298 +
      "description": "Address and tags in OpenStreetMap's vocabulary: a copy of what OpenStreetMap knew about the linked feature at checkedAt, and/or what the person typed (editedAt). Data copied from OpenStreetMap is (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 299
      "properties": {
289 300
        "address": {
290 301
          "description": "The structured address OpenStreetMap has for the feature.",
291 302
          "ref": "#osmAddress",
292 303
          "type": "ref"
293 304
        },
294 305
        "checkedAt": {
295 -
          "description": "When the details were copied from OpenStreetMap.",
306 +
          "description": "When the details were copied from OpenStreetMap. Absent for details that were only typed.",
307 +
          "format": "datetime",
308 +
          "type": "string"
309 +
        },
310 +
        "editedAt": {
311 +
          "description": "When the person last changed these details by hand, or typed them. Details with no checkedAt were never copied from OpenStreetMap.",
296 312
          "format": "datetime",
297 313
          "type": "string"
298 314
        },
299 315
        "tags": {
300 316
          "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 317
          "items": {
302 318
            "ref": "#osmTag",
303 319
            "type": "ref"
304 320
          },
305 321
          "maxLength": 60,
306 322
          "type": "array"
307 323
        }
308 324
      },
309 325
      "type": "object"
310 326
    },
311 327
    "osmTag": {
312 328
      "description": "One OpenStreetMap tag.",
313 329
      "properties": {
314 330
        "key": {
315 331
          "description": "The tag key, for example cuisine.",
316 332
          "maxLength": 64,
317 333
          "type": "string"
318 334
        },
319 335
        "value": {
320 336
          "description": "The tag value, for example italian;pizza. Values over 255 characters are not stored.",
321 337
          "maxGraphemes": 255,
322 338
          "maxLength": 1024,
323 339
          "type": "string"
324 340
        }
325 341
      },
326 342
      "required": [
327 343
        "key",
328 344
        "value"
329 345
      ],
330 346
      "type": "object"
331 347
    }
332 348
  },
333 349
  "id": "app.placita.place",
334 350
  "lexicon": 1
335 351
}

Compare Other Versions

Lexicon Garden

@