app.fitsky.workout
Schema Diff
+48 -0
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
}