Show HN: Traindown – A language to help athletes express their training
traindown.com
traindown.com
I’m a weightlifter that used to be a powerlifter and have also done more bodybuilding-style programs previously too. One thing common in weightlifting programs that I’m yet to find any tools that support natively are complexes. These are typically notated like “Exercise+Exercise” or “Exercise Exercise”, with the set/rep notation normally being “3x2+1”.
For a concrete example, a program might have a complex like “Snatch Deadlift + Hang Snatch + Snatch” for “3x2+1+1”, which translates to “perform 3 sets, where one set is 2x deadlifts, 1x hang snatch, and 1x snatch”. I suppose from a data perspective it’s like nesting sets within a set.
I looked through the guide and the spec, but couldn’t figure out how I would represent complexes in this notation. Any ideas?
I also have a background in Olympic weightlifting and know exactly how convoluted complexes can get.
Currently, I model those as either supersets (when it fits) or I name the complex as the movement and then use the metadata to get at a data shape that mostly fits.
Example of supersets would be something like
Clean: 150 2r 5s + Jerk: 150 5s
For a clean double, single jerk. The named complex just captures the reps and weights per submovment in the metadata.
It feels like using supersets for these would make tracking data over time difficult. eg given your clean clean jerk example, if one wants to track volume of a particular exercise it's not clear what the volume for each of those should be applied to, and it could get rather messy (is it 2x cleans + a jerk, or 1x clean + a clean and jerk?). Everyone probably has different preferences there, but my point is that native support for complexes would probably make stuff like this easier by providing a way to properly define/separate each component of the performance at data entry time.
I don't mean to only talk about things it doesn't support, though. I honestly think this looks great even without support for complexes (it's just long been the top of my wishlist for exercise tracking tools!) and am going to try it out next week!
I will do some noodling on this. If you have ideas, I’d love to dialog on them. I hadn’t implemented anything beyond the basics just because I hadn’t been doing them lately. I definitely want to support your use case as a first class language feature.
Clean: 150 2r 5s
+ Jerk: 150 5sThe intent is to provide a common format for training data.
By training data, I mean data you'd commonly find in a workout app. Think "Squats at 500 for 10 reps" sorta thing.
Anyhow, thanks for looking!
Seems like it might be useful for lifting though. At the same time, I don't know that the "common format" problem is really a problem. When I've logged lifting workouts, I just used the app for the program I was on (Starting Strength). Maybe more serious lifters feel differently...
For the question of the usefulness of portability, let’s imagine StrongLifts uses Traindown and you have the ability to access that data directly as Traindown files.
Now imagine someone has developed an analytics package that slurps your owned data and that allows you to easily spot patterns that can improve your results. You could use that immediately and find value. You would not need to export whatever mess and try to make it work assuming they even let you do that.
That’s the idea, anyhow. I feel very strongly that YOU should own YOUR DATA and applications should provide value ON TOP of your data. This provides you true freedom of choice.
IIRC, my PT from Kaiser Permanente gave me access to a workout app, but none of the sets, reps, or durations matched with what my PT wanted me to do. It would have been nice to take the routine and import it into a better app.
It seems like it would be pretty hard to account for all the small variations though!
To avoid all of the comments from people asking about GPS tracking, I think you should make it clear that it's primarily for strength training. The format is clearly oriented around that.
An addition that could make it more useful for recording cardio workouts like swimming/track/indoor cycling would be the concept of rest intervals. For example, it's common to prescribe a part of a swimming workout in a format like this:
4 x 100 at 1:20
Meaning you have 1:20 to complete each 100m rep, where any extra time is rest. You could also add extra fields for recording the actual time taken to complete rach rep. E.g: #Unit: m
#TimeFormat: M:S
4r 100 @1:20
1:05, 1:07, 1:11, 1:06I have a bit in the FAQ in the Guide that hand waves how you could model things like cardio. I personally model my intervals like an example from today
Squat: # bands: 200lb # box: 12 inches # rest: 45 seconds * wide and medium alternating 225 2r 10s
I love how you did your metadata in your example. I intend to leave the language VERY open ended and hope folks build tools for athletes that provide functionality that is spec compliant (thus portable!) but leverages nuances for the given sport. Thanks for taking a look!
Squat:
# bands: 200lb
# box: 12 inches
# rest: 45 seconds
* wide and medium alternating
225 2r 10sHere is a video showing what I mean [2] and here is how the data is currently presented [3]
[2] https://www.youtube.com/watch?v=0c-74EfrKAQ
[3] https://portal.vrworkout.at/share/944835fbb97e451395ea3d2944...
I developed it because I didn't want to go for several hours on Beat Saber et al but wanted sonething to give me a very intense workout in a short as time as possible, think of HIIT in VR
# skip travel
2020/07/15 push 14,18,14,14,30 # hpu w3c3d1
2020/07/14 pull 5,5,5,5
2020/07/13 push 22,30,20,20,30 # hpu w3c3d3, succeeded
2020/07/12 pull 5,5,5,5
2020/07/11 push 20,25,15,15,40 # hpu w3c3d2, rests were 30sec too short
I like having a single data file (or maybe one per year), with each session on a single line. I only use it for pretty simple bodyweight exercises. @ 2020/07/15; #r:hpu; #w:3; #c:3; #d:1; push: 14; 18; 14; 14; 14; 30
@ 2020/07/14; pull: 5; 5; 5; 5
...
Definitely not as human readable as yours for your use case. Thanks for sharing!I pasted this example into the playground:
Warmup drills: 3s
60m sprints: 7.12 7.03 7.01
# Unit: seconds
Jog: 1600
# Unit: meters
And it outputted that I had an activity called "m sprints". Looks like somehow the "60" is getting dropped.In order for this to parse correctly, there needs to be an ' in front of "60m" like "'60m".
Thanks for finding this. I have updated that example on the site.
I've maintained a training log in a spreadsheet for the last two years that's become a horrible mess that never really quite matches my mental model.
This strongly reminds me of another of my favorite text projects: ledger. Similar to that project, I can imagine a bunch of immediately useful processing commands on the data for things like listing PRs, estimating current maximal effort performance, or showing a quick progress report.
Thanks for looking!
Some bodyweight examples would be cool (pullups with no weight). Also meta variables for location / time of the workout, like what Diarly (iOS) has.
Edit: I see the bw example in the FAQ now.
I use the metadata to capture partial ranges and accommodating resistance. For example
Bench:
# grip: index on smooth
# pin height: 16 inches off bench
# chains: 100lbs
135 5r
225 3r
...
And on and on. I have added pieces to the language over the two years I’ve been using it and I hope to write a better guide (maybe short book) on how you can capture different kinds of training.Thanks for looking!
seems pretty nice -- ez way to keep logs, reminds me of medical shorthand
10kg load, 4 sets, 12 reps, 10 reps, 10 reps, 8 reps
Movement Name:
10 12r
10 10r 2s
10 8r