This looks really cool. I currently track my workouts with the Strong ios app but I’ve been thinking lately about a few things it lacks. One example is missed reps (which Traindown looks like it supports!)
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.
I suppose the perfectionist in me just doesn't like having N different combinations of exercises saved. I do currently follow a similar model to what you describe when recording complexes in Strong, using the name to hold the rep data, it just feels like "Clean + Clean and Jerk" for "2+1" is nicer than "Clean + Clean + Clean and Jerk" or "Clean double + Clean and Jerk" etc.
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!
Totally get it and I agree there should be a more intuitive handling of complexes that aligns with the goal of being able to convey the “training story.”
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.
I am developing an open-source full-body VR fitness game [1]
It's mainly for body-weight exercises, but if it makes sense to use Traindown for showing the results in a readable manner and having it in an interchangeable format I would be interested to add support for that.
Here is a video showing what I mean
[2]
and here is how the data is currently presented
[3]
That is SO RAD! I’m always around if you need to spitball some ideas on how to use Traindown. tyler at greaterscott dot com. Thanks for looking and actually considering using it.
If you have SideQuest you can check it out. It's already pretty stable and people seem to mostl enjoy it, at least if you accept that it's a workout first and a game second, but for quite a few people that's even more compelling.
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
As a runner/triathlete, this is pretty useless to me. As another commenter describes - we prefer real-time time series data. TrainingPeaks captures everything I could think of.
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...
Yeah, for things that are measured solely in time, Traindown isn’t a good fit.
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.
As someone who used to log lifting in plain text files (copied from a notebook) I think this is a really good idea.
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:
Yeah, for sure the first use cases were strength oriented (I like heavy things).
I 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!
I love the simplicity of this. For you, Traindown may not offer much over what you have come up with. Here is what it would look like using the inline syntax
Can you quickly explain how this meshes with existing data formats such as gpx or fit? Will there be converters? Can traindown express time series or is it more of a high level log (I did x of y at parameters w and z) thing?
Definitely more of a high level logging primarily of strength based training. I built it for myself and I have run the gamut of powerlifting to strongman to Olympic weightlifting and back again. Traindown is geared toward those efforts including “meta” sports like CrossFit. Thanks for looking!
One use case might be for the routines prescribed by physical therapists.
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!
Devil is in the details, for sure! I hope one day that Traindown could support such cases. For prescriptive training, I am working on a template syntax to express what you WILL DO in addition to the currently support what you HAVE DONE. I hope to wrap that up the first quarter of this year. Thanks for looking!
Very neat -- I was playing with the non-weight stuff in the /guide/ section, and putting it into the playground to get a better sense of it, and noticed this slight parser bug:
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.
You totally get it and I also LOVE ledger. I hope Traindown helps you like it has helped me. I would love to get some folks working software that lets you do exactly what you describe. I will but I am slow. I would be over the moon if someone built what you described because it would both save me the effort and I would have helped contribute in some small way.
I've never seen one of these that could handle accommodating resistance (bands and chains) or partial range of motion. This would I think have then be different movements, same as using Strong on iOS.
So I do that very thing with it! I train Westside style lately coming back to it after 15 years.
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.
ohhhhh this is so rad then. You can definitely go from this to looking at total bench volume in a given span of time, which is an annoying thing other systems lack. Cool!
Yeah buddy! I love it because it allows for me to mark the "color" of a volume. As I build out the analytics tools I want to use, I want to have 1) what is my PR for this EXACT configuration 2) graph or otherwise detail volume with an axis for this "color".
Did you consider having first-class support for rest between sets? It's certainly possible to model it with metadata, but I imagine it's a very common thing to want to include.
I hadn’t yet considered it just because the metadata solves my use case of uniform rest across all sets. For varying rest periods, I can see how metadata would be suboptimal. I’ll do some noodling on this and see if there is an elegant way to make this first class. Thanks for the feedback!
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?