world.treeline.route.record
Schema Diff
+5 -0
Compatibility Analysis
Backward Compatible
Backward compatible. 3 non-breaking changes.
Non-Breaking Changes (3)
- AddedVertex AddedVertex { vertex_id: "world.treeline.route.record:body.clonedFrom" }
- AddedEdge AddedEdge { src: "world.treeline.route.record:body", tgt: "world.treeline.route.record:body.clonedFrom", kind: "prop", name: Some("clonedFrom") }
- AddedEdge AddedEdge { src: "world.treeline.route.record:body.clonedFrom", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "world.treeline.route.record:body.clonedFrom" }
Additional Notes
- Non-breaking: AddedEdge { src: "world.treeline.route.record:body", tgt: "world.treeline.route.record:body.clonedFrom", kind: "prop", name: Some("clonedFrom") }
- Non-breaking: AddedEdge { src: "world.treeline.route.record:body.clonedFrom", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"externalIds": {
5
5
"description": "Cross-references to public open mapping registries.",
6
6
"properties": {
7
7
"cotrexId": {
8
8
"description": "Colorado Trail Explorer (COTREX) feature ID.",
9
9
"type": "string"
10
10
},
11
11
"openTrailsId": {
12
12
"description": "OpenTrails standard dataset feature identifier.",
13
13
"type": "string"
14
14
},
15
15
"osmRelationId": {
16
16
"description": "OpenStreetMap Relation ID.",
17
17
"type": "string"
18
18
},
19
19
"osmWayId": {
20
20
"description": "OpenStreetMap Way ID.",
21
21
"type": "string"
22
22
},
23
23
"usfsTrailNumber": {
24
24
"description": "US Forest Service official trail designation number (e.g., '514' for Hermosa Creek).",
25
25
"type": "string"
26
26
},
27
27
"wikidataId": {
28
28
"description": "Wikidata entity identifier.",
29
29
"type": "string"
30
30
}
31
31
},
32
32
"type": "object"
33
33
},
34
34
"gradeStats": {
35
35
"description": "Gradient statistics for climbs, descents, or trail segments.",
36
36
"properties": {
37
37
"averageGradePct": {
38
38
"description": "Average slope gradient percentage (e.g. '7.5' for 7.5% climb, '-6.2' for descent).",
39
39
"type": "string"
40
40
},
41
41
"climbCategory": {
42
42
"description": "[Deprecated in v0.10: Use world.treeline.segment.record for competitive climb categorization.] Standard cycling/running climb category.",
43
43
"knownValues": [
44
44
"HC",
45
45
"1",
46
46
"2",
47
47
"3",
48
48
"4",
49
49
"uncategorized"
50
50
],
51
51
"type": "string"
52
52
},
53
53
"maxGradePct": {
54
54
"description": "Maximum slope gradient percentage.",
55
55
"type": "string"
56
56
}
57
57
},
58
58
"type": "object"
59
59
},
60
60
"main": {
61
61
"description": "A curated trail guide, course, or route record published on Treeline.",
62
62
"key": "tid",
63
63
"record": {
64
64
"properties": {
65
+
"clonedFrom": {
66
+
"description": "Optional reference to the activity or route this record was saved from (Save as Route). The AppView checks the source's reuse rules and hides this route when they are not met.",
67
+
"ref": "com.atproto.repo.strongRef",
68
+
"type": "ref"
69
+
},
65
70
"constituentTrails": {
66
71
"description": "Ordered physical trails comprising this route guide.",
67
72
"items": {
68
73
"ref": "#routeTrailSegment",
69
74
"type": "ref"
70
75
},
71
76
"type": "array"
72
77
},
73
78
"courseBlob": {
74
79
"accept": [
75
80
"application/gpx+xml",
76
81
"application/vnd.ant.fit",
77
82
"application/vnd.garmin.tcx+xml",
78
83
"application/octet-stream",
79
84
"application/xml",
80
85
"text/xml"
81
86
],
82
87
"description": "Downloadable GPX/FIT course file with turn-by-turn cue sheets.",
83
88
"maxSize": 52428800,
84
89
"type": "blob"
85
90
},
86
91
"createdAt": {
87
92
"description": "Creation timestamp.",
88
93
"format": "datetime",
89
94
"type": "string"
90
95
},
91
96
"cuePoints": {
92
97
"description": "Turn-by-turn navigational cues along the course.",
93
98
"items": {
94
99
"ref": "#routeCuePoint",
95
100
"type": "ref"
96
101
},
97
102
"type": "array"
98
103
},
99
104
"description": {
100
105
"description": "Detailed guide, route directions, access notes, seasonal conditions, and water availability.",
101
106
"maxGraphemes": 5000,
102
107
"maxLength": 50000,
103
108
"type": "string"
104
109
},
105
110
"difficulty": {
106
111
"description": "Technical and physical difficulty assessment.",
107
112
"knownValues": [
108
113
"easy",
109
114
"moderate",
110
115
"hard",
111
116
"expert",
112
117
"extreme"
113
118
],
114
119
"type": "string"
115
120
},
116
121
"externalIds": {
117
122
"description": "External open mapping identifiers (OSM, COTREX, USFS, OpenTrails, Wikidata).",
118
123
"ref": "#externalIds",
119
124
"type": "ref"
120
125
},
121
126
"geometry": {
122
127
"description": "Simplified GeoJSON LineString geometry of the route path.",
123
128
"ref": "#routeGeometry",
124
129
"type": "ref"
125
130
},
126
131
"gradeStats": {
127
132
"description": "Gradient profile and climb categorization for climbs or descents.",
128
133
"ref": "#gradeStats",
129
134
"type": "ref"
130
135
},
131
136
"location": {
132
137
"description": "Geographical region or park name (e.g. White Mountains, NH).",
133
138
"maxGraphemes": 200,
134
139
"maxLength": 2000,
135
140
"type": "string"
136
141
},
137
142
"parentRoute": {
138
143
"description": "Reference to parent canonical trail or larger trail system if this route is a sub-segment or loop.",
139
144
"ref": "com.atproto.repo.strongRef",
140
145
"type": "ref"
141
146
},
142
147
"pointsOfInterest": {
143
148
"description": "Generic strongRefs to any location-based pins, check-ins, summits, water sources, or hazard records across the ATmosphere.",
144
149
"items": {
145
150
"ref": "com.atproto.repo.strongRef",
146
151
"type": "ref"
147
152
},
148
153
"type": "array"
149
154
},
150
155
"privacy": {
151
156
"default": "public",
152
157
"description": "Privacy visibility setting for this route or segment.",
153
158
"knownValues": [
154
159
"public",
155
160
"unlisted",
156
161
"followers",
157
162
"private"
158
163
],
159
164
"type": "string"
160
165
},
161
166
"rawBlob": {
162
167
"accept": [
163
168
"application/gpx+xml",
164
169
"application/vnd.ant.fit",
165
170
"application/vnd.garmin.tcx+xml",
166
171
"application/octet-stream",
167
172
"application/xml",
168
173
"text/xml"
169
174
],
170
175
"description": "High-resolution GPX/FIT course file blob.",
171
176
"maxSize": 52428800,
172
177
"type": "blob"
173
178
},
174
179
"relatedRecords": {
175
180
"description": "Generic strongRefs to related network content (e.g. Bluesky trip report posts, photo records, gear lists).",
176
181
"items": {
177
182
"ref": "com.atproto.repo.strongRef",
178
183
"type": "ref"
179
184
},
180
185
"type": "array"
181
186
},
182
187
"routeType": {
183
188
"description": "Topological structure of the route.",
184
189
"knownValues": [
185
190
"loop",
186
191
"out_and_back",
187
192
"point_to_point"
188
193
],
189
194
"type": "string"
190
195
},
191
196
"segmentType": {
192
197
"description": "[Deprecated in v0.10: Competitive segments use world.treeline.segment.record. Retained for backward compatibility.] Functional classification of the route or segment.",
193
198
"knownValues": [
194
199
"trail",
195
200
"loop",
196
201
"climb",
197
202
"descent",
198
203
"sprint",
199
204
"traverse"
200
205
],
201
206
"type": "string"
202
207
},
203
208
"segments": {
204
209
"description": "Ordered sub-segments or constituent trails that make up this composite route or loop.",
205
210
"items": {
206
211
"ref": "#routeSegmentItem",
207
212
"type": "ref"
208
213
},
209
214
"type": "array"
210
215
},
211
216
"source": {
212
217
"default": "user",
213
218
"description": "Data provenance source.",
214
219
"knownValues": [
215
220
"user",
216
221
"osm",
217
222
"cotrex",
218
223
"usfs",
219
224
"opentrails",
220
225
"community"
221
226
],
222
227
"type": "string"
223
228
},
224
229
"sourceActivity": {
225
230
"description": "StrongRef to the activity record from which this segment was extracted or initiated.",
226
231
"ref": "com.atproto.repo.strongRef",
227
232
"type": "ref"
228
233
},
229
234
"sport": {
230
235
"description": "Applicable sports or disciplines for this route (e.g., hike, trail_run, gravel_ride).",
231
236
"items": {
232
237
"type": "string"
233
238
},
234
239
"type": "array"
235
240
},
236
241
"stats": {
237
242
"description": "Route distance and elevation profile metrics.",
238
243
"ref": "#routeStats",
239
244
"type": "ref"
240
245
},
241
246
"surface": {
242
247
"description": "Surface composition types (e.g. singletrack, dirt_road, paved, rock_scramble, snow).",
243
248
"items": {
244
249
"type": "string"
245
250
},
246
251
"type": "array"
247
252
},
248
253
"title": {
249
254
"description": "Title or route name (e.g., Mount Rainier Wonderland Trail).",
250
255
"maxGraphemes": 300,
251
256
"maxLength": 3000,
252
257
"type": "string"
253
258
},
254
259
"updatedAt": {
255
260
"description": "Last updated timestamp.",
256
261
"format": "datetime",
257
262
"type": "string"
258
263
},
259
264
"waypoints": {
260
265
"description": "References to waypoint records along this route.",
261
266
"items": {
262
267
"ref": "com.atproto.repo.strongRef",
263
268
"type": "ref"
264
269
},
265
270
"type": "array"
266
271
}
267
272
},
268
273
"required": [
269
274
"title",
270
275
"createdAt"
271
276
],
272
277
"type": "object"
273
278
},
274
279
"type": "record"
275
280
},
276
281
"routeCuePoint": {
277
282
"properties": {
278
283
"coordinate": {
279
284
"description": "Optional coordinate tuple [lon, lat, ele?] of the cue point.",
280
285
"type": "unknown"
281
286
},
282
287
"distanceMeters": {
283
288
"description": "Chainage offset along the route in meters.",
284
289
"type": "integer"
285
290
},
286
291
"instruction": {
287
292
"description": "Navigation instruction (e.g. Turn left at junction onto Colorado Trail).",
288
293
"type": "string"
289
294
}
290
295
},
291
296
"required": [
292
297
"distanceMeters",
293
298
"instruction"
294
299
],
295
300
"type": "object"
296
301
},
297
302
"routeGeometry": {
298
303
"description": "GeoJSON LineString representing the route path.",
299
304
"properties": {
300
305
"coordinates": {
301
306
"description": "Simplified coordinate tuples array.",
302
307
"items": {
303
308
"type": "unknown"
304
309
},
305
310
"maxLength": 500,
306
311
"type": "array"
307
312
},
308
313
"type": {
309
314
"const": "LineString",
310
315
"description": "GeoJSON geometry type.",
311
316
"type": "string"
312
317
}
313
318
},
314
319
"required": [
315
320
"type",
316
321
"coordinates"
317
322
],
318
323
"type": "object"
319
324
},
320
325
"routeSegmentItem": {
321
326
"description": "A constituent sub-segment or trail section in a composite route.",
322
327
"properties": {
323
328
"endKm": {
324
329
"description": "Ending kilometer offset on the referenced route.",
325
330
"type": "unknown"
326
331
},
327
332
"name": {
328
333
"description": "Name or title of the constituent segment.",
329
334
"maxGraphemes": 300,
330
335
"type": "string"
331
336
},
332
337
"order": {
333
338
"description": "1-based sequence order in the route traversal.",
334
339
"minimum": 1,
335
340
"type": "integer"
336
341
},
337
342
"reverseDirection": {
338
343
"description": "True if the constituent segment is traversed in reverse direction.",
339
344
"type": "boolean"
340
345
},
341
346
"route": {
342
347
"description": "StrongRef to the route record representing this segment.",
343
348
"ref": "com.atproto.repo.strongRef",
344
349
"type": "ref"
345
350
},
346
351
"startKm": {
347
352
"description": "Starting kilometer offset on the referenced route.",
348
353
"type": "unknown"
349
354
}
350
355
},
351
356
"required": [
352
357
"order"
353
358
],
354
359
"type": "object"
355
360
},
356
361
"routeStats": {
357
362
"description": "Distance and elevation stats for the route.",
358
363
"properties": {
359
364
"distanceMeters": {
360
365
"description": "Total route distance in meters.",
361
366
"minimum": 0,
362
367
"type": "integer"
363
368
},
364
369
"elevationGainMeters": {
365
370
"description": "Total cumulative ascent in meters.",
366
371
"minimum": 0,
367
372
"type": "integer"
368
373
},
369
374
"elevationLossMeters": {
370
375
"description": "Total cumulative descent in meters.",
371
376
"minimum": 0,
372
377
"type": "integer"
373
378
},
374
379
"estimatedDurationSeconds": {
375
380
"description": "Estimated moving duration in seconds for an average pace.",
376
381
"minimum": 0,
377
382
"type": "integer"
378
383
},
379
384
"highestPointMeters": {
380
385
"description": "Maximum elevation on the route in meters.",
381
386
"type": "integer"
382
387
},
383
388
"lowestPointMeters": {
384
389
"description": "Minimum elevation on the route in meters.",
385
390
"type": "integer"
386
391
}
387
392
},
388
393
"type": "object"
389
394
},
390
395
"routeTrailSegment": {
391
396
"properties": {
392
397
"reverseDirection": {
393
398
"default": false,
394
399
"description": "Whether the trail is traversed in reverse direction.",
395
400
"type": "boolean"
396
401
},
397
402
"sequenceOrder": {
398
403
"description": "1-based order in traversal sequence.",
399
404
"type": "integer"
400
405
},
401
406
"trailId": {
402
407
"description": "Identifier of underlying physical trail.",
403
408
"type": "string"
404
409
}
405
410
},
406
411
"required": [
407
412
"trailId"
408
413
],
409
414
"type": "object"
410
415
}
411
416
},
412
417
"id": "world.treeline.route.record",
413
418
"lexicon": 1
414
419
}