world.treeline.activity.record

treeline.world

Schema Diff

+5 -0

From

CID
bafyreigorvbwt34...
Indexed At
2026-10-03 15:08 UTC
View this version

To

CID
bafyreihbulb2qe5...
Indexed At
2026-10-04 16:30 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@