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

Compare Other Versions

Lexicon Garden

@