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