world.treeline.activity.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.activity.record:body.clonedFrom" }
- AddedEdge AddedEdge { src: "world.treeline.activity.record:body", tgt: "world.treeline.activity.record:body.clonedFrom", kind: "prop", name: Some("clonedFrom") }
- AddedEdge AddedEdge { src: "world.treeline.activity.record:body.clonedFrom", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "world.treeline.activity.record:body.clonedFrom" }
Additional Notes
- Non-breaking: AddedEdge { src: "world.treeline.activity.record:body", tgt: "world.treeline.activity.record:body.clonedFrom", kind: "prop", name: Some("clonedFrom") }
- Non-breaking: AddedEdge { src: "world.treeline.activity.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
"deviceMetadata": {
5
5
"description": "Metadata about the recording hardware or sensor device.",
6
6
"properties": {
7
7
"manufacturer": {
8
8
"description": "Manufacturer name (e.g. Garmin, Wahoo, COROS, Apple).",
9
9
"maxLength": 100,
10
10
"type": "string"
11
11
},
12
12
"model": {
13
13
"description": "Device model name (e.g. Forerunner 965, ELEMNT BOLT, Apple Watch Ultra).",
14
14
"maxLength": 100,
15
15
"type": "string"
16
16
}
17
17
},
18
18
"type": "object"
19
19
},
20
20
"geometry": {
21
21
"description": "Simplified GeoJSON LineString geometry representing the activity path.",
22
22
"properties": {
23
23
"coordinates": {
24
24
"description": "RDP-simplified array of coordinate tuples [lon, lat, ele?].",
25
25
"items": {
26
26
"type": "unknown"
27
27
},
28
28
"maxLength": 500,
29
29
"type": "array"
30
30
},
31
31
"type": {
32
32
"const": "LineString",
33
33
"description": "GeoJSON geometry type specifier.",
34
34
"type": "string"
35
35
}
36
36
},
37
37
"required": [
38
38
"type",
39
39
"coordinates"
40
40
],
41
41
"type": "object"
42
42
},
43
43
"main": {
44
44
"description": "A sports activity or outdoor adventure record logged on Treeline.",
45
45
"key": "tid",
46
46
"record": {
47
47
"properties": {
48
+
"clonedFrom": {
49
+
"description": "Optional reference to the activity this record was saved from (Save as My Activity). The AppView checks the source's reuse rules at index time and hides this record's geometry and co-athlete link when they are not met.",
50
+
"ref": "com.atproto.repo.strongRef",
51
+
"type": "ref"
52
+
},
48
53
"coAthletes": {
49
54
"description": "DIDs of athletes who participated in this activity together.",
50
55
"items": {
51
56
"format": "did",
52
57
"type": "string"
53
58
},
54
59
"maxLength": 50,
55
60
"type": "array"
56
61
},
57
62
"createdAt": {
58
63
"description": "Record creation timestamp on client/PDS (ISO 8601 UTC format).",
59
64
"format": "datetime",
60
65
"type": "string"
61
66
},
62
67
"description": {
63
68
"description": "Detailed notes, trip report, weather observations, or gear notes.",
64
69
"maxGraphemes": 3000,
65
70
"maxLength": 30000,
66
71
"type": "string"
67
72
},
68
73
"deviceInfo": {
69
74
"description": "Recording hardware or sensor device metadata.",
70
75
"ref": "#deviceMetadata",
71
76
"type": "ref"
72
77
},
73
78
"endedAt": {
74
79
"description": "Timestamp when the activity finished (ISO 8601 UTC format).",
75
80
"format": "datetime",
76
81
"type": "string"
77
82
},
78
83
"gearRef": {
79
84
"description": "Optional reference to a world.treeline.gear.item used in this activity.",
80
85
"ref": "com.atproto.repo.strongRef",
81
86
"type": "ref"
82
87
},
83
88
"geometry": {
84
89
"description": "Simplified GeoJSON LineString path (recommended <= 250 points) for lightweight relay and feed distribution.",
85
90
"ref": "#geometry",
86
91
"type": "ref"
87
92
},
88
93
"hideStartEndMeters": {
89
94
"description": "Distance trimmed from each end of the public preview only. The original telemetry blob remains untrimmed and publicly retrievable.",
90
95
"maximum": 100000,
91
96
"minimum": 0,
92
97
"type": "integer"
93
98
},
94
99
"privacy": {
95
100
"default": "public",
96
101
"description": "AppView visibility, not confidentiality of the public repository or original blob. New clients publish public or unlisted; unsupported restricted values must fail closed.",
97
102
"knownValues": [
98
103
"public",
99
104
"unlisted",
100
105
"followers",
101
106
"private",
102
107
"permissioned"
103
108
],
104
109
"type": "string"
105
110
},
106
111
"rawBlob": {
107
112
"accept": [
108
113
"application/gpx+xml",
109
114
"application/vnd.ant.fit",
110
115
"application/vnd.garmin.tcx+xml",
111
116
"application/octet-stream",
112
117
"application/xml",
113
118
"text/xml"
114
119
],
115
120
"description": "Full-resolution original raw telemetry file (.fit, .gpx, .tcx) stored directly as an ATProto blob on the athlete's PDS.",
116
121
"maxSize": 52428800,
117
122
"type": "blob"
118
123
},
119
124
"route": {
120
125
"description": "Optional reference to a world.treeline.route.record course or trail guide followed.",
121
126
"ref": "com.atproto.repo.strongRef",
122
127
"type": "ref"
123
128
},
124
129
"routeRef": {
125
130
"description": "Optional reference to a world.treeline.route.record followed.",
126
131
"ref": "com.atproto.repo.strongRef",
127
132
"type": "ref"
128
133
},
129
134
"sport": {
130
135
"description": "Sport or activity type category.",
131
136
"knownValues": [
132
137
"run",
133
138
"trail_run",
134
139
"walk",
135
140
"hike",
136
141
"ride",
137
142
"mountain_bike",
138
143
"gravel_ride",
139
144
"e_bike",
140
145
"road_bike",
141
146
"handcycle",
142
147
"ski",
143
148
"snowboard",
144
149
"backcountry_ski",
145
150
"nordic_ski",
146
151
"roller_ski",
147
152
"swim",
148
153
"open_water_swim",
149
154
"kayak",
150
155
"canoe",
151
156
"rowing",
152
157
"paddleboard",
153
158
"surf",
154
159
"kitesurf",
155
160
"windsurf",
156
161
"sail",
157
162
"climb",
158
163
"boulder",
159
164
"mountaineering",
160
165
"wheelchair",
161
166
"workout",
162
167
"yoga",
163
168
"crossfit",
164
169
"weight_training",
165
170
"pilates",
166
171
"hiit",
167
172
"other"
168
173
],
169
174
"type": "string"
170
175
},
171
176
"startedAt": {
172
177
"description": "Timestamp when the activity started (ISO 8601 UTC format).",
173
178
"format": "datetime",
174
179
"type": "string"
175
180
},
176
181
"stats": {
177
182
"description": "Summary metrics and telemetry statistics for the activity.",
178
183
"ref": "#stats",
179
184
"type": "ref"
180
185
},
181
186
"tags": {
182
187
"description": "Categorization tags (e.g. race, commute, intervals, summits).",
183
188
"items": {
184
189
"maxLength": 64,
185
190
"type": "string"
186
191
},
187
192
"maxLength": 20,
188
193
"type": "array"
189
194
},
190
195
"title": {
191
196
"description": "Display title of the activity (e.g., Morning Trail Run, Grand Canyon R2R2R).",
192
197
"maxGraphemes": 300,
193
198
"maxLength": 3000,
194
199
"type": "string"
195
200
}
196
201
},
197
202
"required": [
198
203
"title",
199
204
"sport",
200
205
"startedAt",
201
206
"createdAt"
202
207
],
203
208
"type": "object"
204
209
},
205
210
"type": "record"
206
211
},
207
212
"stats": {
208
213
"description": "Summary telemetry metrics calculated from the raw activity dataset.",
209
214
"properties": {
210
215
"averageCadenceRpm": {
211
216
"description": "[Deprecated: use avgCadence] Average cadence in rpm or spm.",
212
217
"minimum": 0,
213
218
"type": "integer"
214
219
},
215
220
"averageHeartRateBpm": {
216
221
"description": "[Deprecated: use avgHeartRateBpm] Average heart rate in beats per minute.",
217
222
"maximum": 300,
218
223
"minimum": 0,
219
224
"type": "integer"
220
225
},
221
226
"averagePowerWatts": {
222
227
"description": "[Deprecated: use avgPowerWatts] Average power output in watts.",
223
228
"minimum": 0,
224
229
"type": "integer"
225
230
},
226
231
"averageSpeedMps": {
227
232
"description": "[Deprecated: use avgSpeedMps] Average moving speed in meters per second.",
228
233
"type": "unknown"
229
234
},
230
235
"avgCadence": {
231
236
"description": "Mean cadence (rpm or spm).",
232
237
"minimum": 0,
233
238
"type": "integer"
234
239
},
235
240
"avgCadenceRpm": {
236
241
"description": "Mean cadence in revolutions or steps per minute.",
237
242
"minimum": 0,
238
243
"type": "integer"
239
244
},
240
245
"avgHeartRateBpm": {
241
246
"description": "Mean heart rate in beats per minute.",
242
247
"maximum": 300,
243
248
"minimum": 0,
244
249
"type": "integer"
245
250
},
246
251
"avgPowerWatts": {
247
252
"description": "Mean power output in watts from a recorded sensor.",
248
253
"minimum": 0,
249
254
"type": "integer"
250
255
},
251
256
"avgSpeedMps": {
252
257
"description": "Calculated mean moving speed in meters per second.",
253
258
"type": "unknown"
254
259
},
255
260
"calories": {
256
261
"description": "Estimated energy expenditure in kilocalories.",
257
262
"minimum": 0,
258
263
"type": "integer"
259
264
},
260
265
"distanceMeters": {
261
266
"description": "Total distance traveled in meters.",
262
267
"minimum": 0,
263
268
"type": "integer"
264
269
},
265
270
"durationSeconds": {
266
271
"description": "[Deprecated: use elapsedDurationSeconds] Total elapsed time in seconds.",
267
272
"minimum": 0,
268
273
"type": "integer"
269
274
},
270
275
"elapsedDurationSeconds": {
271
276
"description": "Total elapsed time including pauses in seconds.",
272
277
"minimum": 0,
273
278
"type": "integer"
274
279
},
275
280
"elevationGainMeters": {
276
281
"description": "Cumulative elevation gain in meters.",
277
282
"minimum": 0,
278
283
"type": "integer"
279
284
},
280
285
"elevationLossMeters": {
281
286
"description": "Cumulative elevation loss in meters.",
282
287
"minimum": 0,
283
288
"type": "integer"
284
289
},
285
290
"energyKilojoules": {
286
291
"description": "Total mechanical work in kilojoules (session.total_work or avgPowerWatts * movingDurationSeconds / 1000).",
287
292
"minimum": 0,
288
293
"type": "integer"
289
294
},
290
295
"maxHeartRateBpm": {
291
296
"description": "Maximum recorded heart rate in beats per minute.",
292
297
"maximum": 300,
293
298
"minimum": 0,
294
299
"type": "integer"
295
300
},
296
301
"maxPowerWatts": {
297
302
"description": "Maximum power output in watts.",
298
303
"minimum": 0,
299
304
"type": "integer"
300
305
},
301
306
"maxSpeedMps": {
302
307
"description": "Maximum recorded speed in meters per second.",
303
308
"type": "unknown"
304
309
},
305
310
"movingDurationSeconds": {
306
311
"description": "Active moving duration excluding pauses in seconds.",
307
312
"minimum": 0,
308
313
"type": "integer"
309
314
},
310
315
"movingTimeSeconds": {
311
316
"description": "[Deprecated: use movingDurationSeconds] Total moving time excluding pauses in seconds.",
312
317
"minimum": 0,
313
318
"type": "integer"
314
319
},
315
320
"temperatureCelsius": {
316
321
"description": "Average ambient temperature in degrees Celsius.",
317
322
"type": "integer"
318
323
}
319
324
},
320
325
"type": "object"
321
326
}
322
327
},
323
328
"id": "world.treeline.activity.record",
324
329
"lexicon": 1
325
330
}