Hacker News new | past | comments | ask | show | jobs | submit login
Show HN: Traindown – A language to help athletes express their training (traindown.com)
67 points by tylerscott on Jan 23, 2021 | hide | past | favorite | 42 comments



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?


Thanks for the kind words!

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.


Doh! Bad formatting. This is what I meant

    Clean: 150 2r 5s
    + Jerk: 150 5s


Hey folks! I would love to get some feedback on this project if you have a spare moment.

The 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!


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]

[1] https://vrworkout.at

[2] https://www.youtube.com/watch?v=0c-74EfrKAQ

[3] https://portal.vrworkout.at/share/944835fbb97e451395ea3d2944...


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.


Will send you a message


I love the idea. Open to try it one day.


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.


Ran out of space in the mobile app I use for HN. Wanted to make sure and thank you for the feedback!


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:

  #Unit: m
  #TimeFormat: M:S
  
  4r 100 @1:20
    1:05, 1:07, 1:11, 1:06


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!


Whoops. Another bad formatting. Lemme try this

    Squat:
      # bands: 200lb
      # box: 12 inches
      # rest: 45 seconds
      * wide and medium alternating
      225 2r 10s


It's interesting to me, because I use a custom format that I created for simplicity. I'll just share a snippet for comparison:

    # 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.


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

    @ 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!


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 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.


Just saw my bonehead mistake. This example was done before I had actually implemented the version that allowed for numeric movement names.

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.


Thanks for finding this. I will investigate this and make sure it is fixed!


Woah, this is super cool!

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.

Thanks for looking!


This is absolutely awesome. I've thought about recording sessions in markdown before and this is way better since the data will be readily parsable.

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.


So glad you find value in it! I was in the same boat and that’s why I made Traindown. Thanks for taking a look!


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.

Thanks for looking!


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".


Direct link to /guide/ page that contains samples: https://traindown.com/guide/

seems pretty nice -- ez way to keep logs, reminds me of medical shorthand


Thanks for looking! I have a number of inspirations including various shorthand syntaxes I’ve seen in my life. I’m glad this fits in!


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!


Not directly relevant to my life, but I'm extremely interested in the broader subject of highly novel domain-specific languages


You and me both. Text ftw!


Does it handle different rep amounts? e.g.

10kg load, 4 sets, 12 reps, 10 reps, 10 reps, 8 reps


Sure does! The default set count unless specified is one. So you could record your work like

    Movement Name:
      10 12r
      10 10r 2s
      10 8r




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: