app.fitsky.workout

thatsit.dev

Schema Diff

+48 -0

From

CID
bafyreiebpbicpl2...
Indexed At
2026-02-22 23:01 UTC
View this version

To

CID
bafyreieqy3x3qko...
Indexed At
2026-03-10 00:36 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

3 breaking changes, 16 non-breaking changes.

Breaking Changes (3)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.fitsky.workout#routePoint", src: "app.fitsky.workout#routePoint", tgt: "app.fitsky.workout#routePoint.lngE6", kind: "prop", name: Some("lngE6") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.fitsky.workout#routePoint", src: "app.fitsky.workout#routePoint", tgt: "app.fitsky.workout#routePoint.latE6", kind: "prop", name: Some("latE6") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.fitsky.workout#routePoint", src: "app.fitsky.workout#routePoint", tgt: "app.fitsky.workout#routePoint.timestamp", kind: "prop", name: Some("timestamp") }
Non-Breaking Changes (16)
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout#cardioDetails.routePoints" }
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout#cardioDetails.routePoints:items" }
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout#hiitSportsDetails.routePoints" }
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout#hiitSportsDetails.routePoints:items" }
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout#routePoint" }
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout#routePoint.latE6" }
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout#routePoint.lngE6" }
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout#routePoint.timestamp" }
  • AddedVertex AddedVertex { vertex_id: "app.fitsky.workout:body.ogImage" }
  • AddedEdge AddedEdge { src: "app.fitsky.workout#cardioDetails", tgt: "app.fitsky.workout#cardioDetails.routePoints", kind: "prop", name: Some("routePoints") }
  • AddedEdge AddedEdge { src: "app.fitsky.workout#cardioDetails.routePoints", tgt: "app.fitsky.workout#cardioDetails.routePoints:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "app.fitsky.workout#cardioDetails.routePoints:items", tgt: "app.fitsky.workout#routePoint", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "app.fitsky.workout#hiitSportsDetails", tgt: "app.fitsky.workout#hiitSportsDetails.routePoints", kind: "prop", name: Some("routePoints") }
  • AddedEdge AddedEdge { src: "app.fitsky.workout#hiitSportsDetails.routePoints", tgt: "app.fitsky.workout#hiitSportsDetails.routePoints:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "app.fitsky.workout#hiitSportsDetails.routePoints:items", tgt: "app.fitsky.workout#routePoint", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "app.fitsky.workout:body", tgt: "app.fitsky.workout:body.ogImage", kind: "prop", name: Some("ogImage") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "app.fitsky.workout#cardioDetails.routePoints" }
  • AddedVertex { vertex_id: "app.fitsky.workout#cardioDetails.routePoints:items" }
  • AddedVertex { vertex_id: "app.fitsky.workout#hiitSportsDetails.routePoints" }
  • AddedVertex { vertex_id: "app.fitsky.workout#hiitSportsDetails.routePoints:items" }
  • AddedVertex { vertex_id: "app.fitsky.workout#routePoint" }
  • AddedVertex { vertex_id: "app.fitsky.workout#routePoint.latE6" }
  • AddedVertex { vertex_id: "app.fitsky.workout#routePoint.lngE6" }
  • AddedVertex { vertex_id: "app.fitsky.workout#routePoint.timestamp" }
  • AddedVertex { vertex_id: "app.fitsky.workout:body.ogImage" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "app.fitsky.workout#routePoint", src: "app.fitsky.workout#routePoint", tgt: "app.fitsky.workout#routePoint.lngE6", kind: "prop", name: Some("lngE6") }
  • Breaking: RequiredEdgeAdded { vertex_id: "app.fitsky.workout#routePoint", src: "app.fitsky.workout#routePoint", tgt: "app.fitsky.workout#routePoint.latE6", kind: "prop", name: Some("latE6") }
  • Breaking: RequiredEdgeAdded { vertex_id: "app.fitsky.workout#routePoint", src: "app.fitsky.workout#routePoint", tgt: "app.fitsky.workout#routePoint.timestamp", kind: "prop", name: Some("timestamp") }
  • Non-breaking: AddedEdge { src: "app.fitsky.workout#cardioDetails", tgt: "app.fitsky.workout#cardioDetails.routePoints", kind: "prop", name: Some("routePoints") }
  • Non-breaking: AddedEdge { src: "app.fitsky.workout#cardioDetails.routePoints", tgt: "app.fitsky.workout#cardioDetails.routePoints:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "app.fitsky.workout#cardioDetails.routePoints:items", tgt: "app.fitsky.workout#routePoint", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "app.fitsky.workout#hiitSportsDetails", tgt: "app.fitsky.workout#hiitSportsDetails.routePoints", kind: "prop", name: Some("routePoints") }
  • Non-breaking: AddedEdge { src: "app.fitsky.workout#hiitSportsDetails.routePoints", tgt: "app.fitsky.workout#hiitSportsDetails.routePoints:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "app.fitsky.workout#hiitSportsDetails.routePoints:items", tgt: "app.fitsky.workout#routePoint", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "app.fitsky.workout:body", tgt: "app.fitsky.workout:body.ogImage", kind: "prop", name: Some("ogImage") }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "cardioDetails": {
5 5
      "properties": {
6 6
        "calories": {
7 7
          "type": "integer"
8 8
        },
9 9
        "cardioZones": {
10 10
          "ref": "#cardioZoneData",
11 11
          "type": "ref"
12 12
        },
13 13
        "distanceMeters": {
14 14
          "description": "Distance in meters",
15 15
          "minimum": 0,
16 16
          "type": "integer"
17 17
        },
18 18
        "elevationGainMeters": {
19 19
          "description": "Elevation gain in meters",
20 20
          "minimum": 0,
21 21
          "type": "integer"
22 22
        },
23 23
        "heartRate": {
24 24
          "ref": "#heartRateData",
25 25
          "type": "ref"
26 26
        },
27 27
        "heartRateSamples": {
28 28
          "items": {
29 29
            "ref": "#heartRateSample",
30 30
            "type": "ref"
31 31
          },
32 32
          "type": "array"
33 33
        },
34 34
        "paceSecondsPerKm": {
35 35
          "description": "Pace in seconds per kilometer",
36 36
          "minimum": 0,
37 37
          "type": "integer"
38 38
        },
39 +
        "routePoints": {
40 +
          "description": "GPS route points recorded during the workout",
41 +
          "items": {
42 +
            "ref": "#routePoint",
43 +
            "type": "ref"
44 +
          },
45 +
          "type": "array"
46 +
        },
39 47
        "steps": {
40 48
          "type": "integer"
41 49
        }
42 50
      },
43 51
      "type": "object"
44 52
    },
45 53
    "cardioZoneData": {
46 54
      "description": "Time in seconds spent in each heart rate zone",
47 55
      "properties": {
48 56
        "zone1Rest": {
49 57
          "type": "integer"
50 58
        },
51 59
        "zone2Easy": {
52 60
          "type": "integer"
53 61
        },
54 62
        "zone3Aerobic": {
55 63
          "type": "integer"
56 64
        },
57 65
        "zone4Threshold": {
58 66
          "type": "integer"
59 67
        },
60 68
        "zone5Max": {
61 69
          "type": "integer"
62 70
        }
63 71
      },
64 72
      "type": "object"
65 73
    },
66 74
    "exercise": {
67 75
      "properties": {
68 76
        "name": {
69 77
          "maxLength": 128,
70 78
          "type": "string"
71 79
        },
72 80
        "sets": {
73 81
          "items": {
74 82
            "ref": "#exerciseSet",
75 83
            "type": "ref"
76 84
          },
77 85
          "type": "array"
78 86
        }
79 87
      },
80 88
      "required": [
81 89
        "name",
82 90
        "sets"
83 91
      ],
84 92
      "type": "object"
85 93
    },
86 94
    "exerciseSet": {
87 95
      "properties": {
88 96
        "reps": {
89 97
          "type": "integer"
90 98
        },
91 99
        "weightGrams": {
92 100
          "description": "Weight in grams",
93 101
          "minimum": 0,
94 102
          "type": "integer"
95 103
        }
96 104
      },
97 105
      "type": "object"
98 106
    },
99 107
    "flexibilityDetails": {
100 108
      "properties": {
101 109
        "calories": {
102 110
          "type": "integer"
103 111
        },
104 112
        "cardioZones": {
105 113
          "ref": "#cardioZoneData",
106 114
          "type": "ref"
107 115
        },
108 116
        "heartRate": {
109 117
          "ref": "#heartRateData",
110 118
          "type": "ref"
111 119
        },
112 120
        "heartRateSamples": {
113 121
          "items": {
114 122
            "ref": "#heartRateSample",
115 123
            "type": "ref"
116 124
          },
117 125
          "type": "array"
118 126
        },
119 127
        "intensity": {
120 128
          "knownValues": [
121 129
            "light",
122 130
            "moderate",
123 131
            "intense"
124 132
          ],
125 133
          "maxLength": 64,
126 134
          "type": "string"
127 135
        },
128 136
        "movements": {
129 137
          "type": "integer"
130 138
        },
131 139
        "steps": {
132 140
          "type": "integer"
133 141
        }
134 142
      },
135 143
      "type": "object"
136 144
    },
137 145
    "heartRateData": {
138 146
      "properties": {
139 147
        "avg": {
140 148
          "type": "integer"
141 149
        },
142 150
        "max": {
143 151
          "type": "integer"
144 152
        },
145 153
        "min": {
146 154
          "type": "integer"
147 155
        },
148 156
        "resting": {
149 157
          "type": "integer"
150 158
        }
151 159
      },
152 160
      "type": "object"
153 161
    },
154 162
    "heartRateSample": {
155 163
      "properties": {
156 164
        "bpm": {
157 165
          "type": "integer"
158 166
        },
159 167
        "timestamp": {
160 168
          "format": "datetime",
161 169
          "type": "string"
162 170
        }
163 171
      },
164 172
      "required": [
165 173
        "timestamp",
166 174
        "bpm"
167 175
      ],
168 176
      "type": "object"
169 177
    },
170 178
    "hiitSportsDetails": {
171 179
      "properties": {
172 180
        "calories": {
173 181
          "type": "integer"
174 182
        },
175 183
        "cardioZones": {
176 184
          "ref": "#cardioZoneData",
177 185
          "type": "ref"
178 186
        },
179 187
        "distanceMeters": {
180 188
          "description": "Distance in meters",
181 189
          "minimum": 0,
182 190
          "type": "integer"
183 191
        },
184 192
        "heartRate": {
185 193
          "ref": "#heartRateData",
186 194
          "type": "ref"
187 195
        },
188 196
        "heartRateSamples": {
189 197
          "items": {
190 198
            "ref": "#heartRateSample",
191 199
            "type": "ref"
192 200
          },
193 201
          "type": "array"
194 202
        },
195 203
        "intensity": {
196 204
          "knownValues": [
197 205
            "light",
198 206
            "moderate",
199 207
            "intense"
200 208
          ],
201 209
          "maxLength": 64,
202 210
          "type": "string"
203 211
        },
204 212
        "paceSecondsPerKm": {
205 213
          "description": "Pace in seconds per kilometer",
206 214
          "minimum": 0,
207 215
          "type": "integer"
208 216
        },
209 217
        "rounds": {
210 218
          "type": "integer"
211 219
        },
220 +
        "routePoints": {
221 +
          "description": "GPS route points recorded during the workout",
222 +
          "items": {
223 +
            "ref": "#routePoint",
224 +
            "type": "ref"
225 +
          },
226 +
          "type": "array"
227 +
        },
212 228
        "sport": {
213 229
          "maxLength": 128,
214 230
          "type": "string"
215 231
        },
216 232
        "steps": {
217 233
          "type": "integer"
218 234
        }
219 235
      },
220 236
      "type": "object"
221 237
    },
222 238
    "main": {
223 239
      "description": "A fitness workout record",
224 240
      "key": "tid",
225 241
      "record": {
226 242
        "properties": {
227 243
          "createdAt": {
228 244
            "format": "datetime",
229 245
            "type": "string"
230 246
          },
231 247
          "details": {
232 248
            "refs": [
233 249
              "#cardioDetails",
234 250
              "#strengthDetails",
235 251
              "#flexibilityDetails",
236 252
              "#hiitSportsDetails"
237 253
            ],
238 254
            "type": "union"
239 255
          },
240 256
          "duration": {
241 257
            "description": "Duration in seconds",
242 258
            "minimum": 0,
243 259
            "type": "integer"
244 260
          },
245 261
          "endedAt": {
246 262
            "format": "datetime",
247 263
            "type": "string"
248 264
          },
249 265
          "milestones": {
250 266
            "description": "Progress milestones for linear workouts",
251 267
            "items": {
252 268
              "ref": "#milestone",
253 269
              "type": "ref"
254 270
            },
255 271
            "type": "array"
256 272
          },
257 273
          "notes": {
258 274
            "maxLength": 2048,
259 275
            "type": "string"
260 276
          },
277 +
          "ogImage": {
278 +
            "accept": [
279 +
              "image/png",
280 +
              "image/jpeg",
281 +
              "image/webp"
282 +
            ],
283 +
            "description": "Open Graph preview image for social sharing",
284 +
            "maxSize": 1000000,
285 +
            "type": "blob"
286 +
          },
261 287
          "planUri": {
262 288
            "description": "Reference to the workoutPlan used, if any",
263 289
            "format": "at-uri",
264 290
            "type": "string"
265 291
          },
266 292
          "startedAt": {
267 293
            "format": "datetime",
268 294
            "type": "string"
269 295
          },
270 296
          "status": {
271 297
            "description": "Whether the workout is in progress or finished. Omitted for legacy workouts (treat as completed).",
272 298
            "knownValues": [
273 299
              "active",
274 300
              "completed"
275 301
            ],
276 302
            "maxLength": 64,
277 303
            "type": "string"
278 304
          },
279 305
          "title": {
280 306
            "maxLength": 256,
281 307
            "type": "string"
282 308
          },
283 309
          "type": {
284 310
            "knownValues": [
285 311
              "running",
286 312
              "cycling",
287 313
              "swimming",
288 314
              "walking",
289 315
              "weightlifting",
290 316
              "bodyweight",
291 317
              "yoga",
292 318
              "hiit",
293 319
              "sports",
294 320
              "stretching",
295 321
              "hiking"
296 322
            ],
297 323
            "maxLength": 64,
298 324
            "type": "string"
299 325
          },
300 326
          "visibility": {
301 327
            "ref": "#visibilitySettings",
302 328
            "type": "ref"
303 329
          }
304 330
        },
305 331
        "required": [
306 332
          "type",
307 333
          "title",
308 334
          "startedAt",
309 335
          "duration",
310 336
          "createdAt"
311 337
        ],
312 338
        "type": "object"
313 339
      },
314 340
      "type": "record"
315 341
    },
316 342
    "milestone": {
317 343
      "properties": {
318 344
        "note": {
319 345
          "maxLength": 512,
320 346
          "type": "string"
321 347
        },
322 348
        "timestamp": {
323 349
          "format": "datetime",
324 350
          "type": "string"
325 351
        },
326 352
        "type": {
327 353
          "knownValues": [
328 354
            "distance",
329 355
            "lap",
330 356
            "note"
331 357
          ],
332 358
          "maxLength": 64,
333 359
          "type": "string"
334 360
        },
335 361
        "valueMeters": {
336 362
          "description": "Milestone value in meters",
337 363
          "minimum": 0,
338 364
          "type": "integer"
339 365
        }
340 366
      },
341 367
      "required": [
342 368
        "type",
343 369
        "timestamp"
344 370
      ],
345 371
      "type": "object"
346 372
    },
373 +
    "routePoint": {
374 +
      "properties": {
375 +
        "latE6": {
376 +
          "description": "Latitude in microdegrees (degrees * 1,000,000)",
377 +
          "type": "integer"
378 +
        },
379 +
        "lngE6": {
380 +
          "description": "Longitude in microdegrees (degrees * 1,000,000)",
381 +
          "type": "integer"
382 +
        },
383 +
        "timestamp": {
384 +
          "format": "datetime",
385 +
          "type": "string"
386 +
        }
387 +
      },
388 +
      "required": [
389 +
        "latE6",
390 +
        "lngE6",
391 +
        "timestamp"
392 +
      ],
393 +
      "type": "object"
394 +
    },
347 395
    "strengthDetails": {
348 396
      "properties": {
349 397
        "calories": {
350 398
          "type": "integer"
351 399
        },
352 400
        "cardioZones": {
353 401
          "ref": "#cardioZoneData",
354 402
          "type": "ref"
355 403
        },
356 404
        "exercises": {
357 405
          "items": {
358 406
            "ref": "#exercise",
359 407
            "type": "ref"
360 408
          },
361 409
          "type": "array"
362 410
        },
363 411
        "heartRate": {
364 412
          "ref": "#heartRateData",
365 413
          "type": "ref"
366 414
        },
367 415
        "heartRateSamples": {
368 416
          "items": {
369 417
            "ref": "#heartRateSample",
370 418
            "type": "ref"
371 419
          },
372 420
          "type": "array"
373 421
        },
374 422
        "steps": {
375 423
          "type": "integer"
376 424
        }
377 425
      },
378 426
      "type": "object"
379 427
    },
380 428
    "visibilitySettings": {
381 429
      "description": "Controls which fields are visible to other users in the Fitsky UI. Note: ATProto repos are public — this is UI-level privacy only.",
382 430
      "properties": {
383 431
        "calories": {
384 432
          "default": "public",
385 433
          "knownValues": [
386 434
            "public",
387 435
            "private"
388 436
          ],
389 437
          "maxLength": 64,
390 438
          "type": "string"
391 439
        },
392 440
        "cardioZones": {
393 441
          "default": "private",
394 442
          "knownValues": [
395 443
            "public",
396 444
            "private"
397 445
          ],
398 446
          "maxLength": 64,
399 447
          "type": "string"
400 448
        },
401 449
        "details": {
402 450
          "default": "public",
403 451
          "knownValues": [
404 452
            "public",
405 453
            "private"
406 454
          ],
407 455
          "maxLength": 64,
408 456
          "type": "string"
409 457
        },
410 458
        "heartRate": {
411 459
          "default": "private",
412 460
          "knownValues": [
413 461
            "public",
414 462
            "private"
415 463
          ],
416 464
          "maxLength": 64,
417 465
          "type": "string"
418 466
        },
419 467
        "notes": {
420 468
          "default": "public",
421 469
          "knownValues": [
422 470
            "public",
423 471
            "private"
424 472
          ],
425 473
          "maxLength": 64,
426 474
          "type": "string"
427 475
        },
428 476
        "steps": {
429 477
          "default": "public",
430 478
          "knownValues": [
431 479
            "public",
432 480
            "private"
433 481
          ],
434 482
          "maxLength": 64,
435 483
          "type": "string"
436 484
        }
437 485
      },
438 486
      "type": "object"
439 487
    }
440 488
  },
441 489
  "id": "app.fitsky.workout",
442 490
  "lexicon": 1
443 491
}

Compare Other Versions

Lexicon Garden

@