world.treeline.activity.record

treeline.world

Schema Diff

+9 -0

From

CID
bafyreifukhicyam...
Indexed At
2026-09-25 14:12 UTC
View this version

To

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

Compatibility Analysis

Backward Compatible

Backward compatible. 4 non-breaking changes.

Non-Breaking Changes (4)
  • AddedVertex AddedVertex { vertex_id: "world.treeline.activity.record:body.coAthletes" }
  • AddedVertex AddedVertex { vertex_id: "world.treeline.activity.record:body.coAthletes:items" }
  • AddedEdge AddedEdge { src: "world.treeline.activity.record:body", tgt: "world.treeline.activity.record:body.coAthletes", kind: "prop", name: Some("coAthletes") }
  • AddedEdge AddedEdge { src: "world.treeline.activity.record:body.coAthletes", tgt: "world.treeline.activity.record:body.coAthletes:items", kind: "items", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "world.treeline.activity.record:body.coAthletes" }
  • AddedVertex { vertex_id: "world.treeline.activity.record:body.coAthletes:items" }

Additional Notes

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

Compare Other Versions

Lexicon Garden

@