Introducing OpenSet: an open standard for structured training
Most training programs still move around as PDFs, screenshots, spreadsheets, or exports from one app to another.
For a human, that can be good enough. But it does not work well for software.
If an athlete changes coach, their training history is hard to move. If a coach has years of programming inside one tool, that work is not easy to reuse somewhere else. And if an AI system needs to understand a workout, it often has to guess from unstructured text.
We kept running into this problem while building Diby.
So we created OpenSet
OpenSet is an open specification for structured training programs and workouts.
It is sport-agnostic, and designed to support different types of training — from strength and endurance to conditioning and hybrid programs.
What a workout looks like
The same structure describes a gym session, a running workout, and a triathlon brick — every set just declares the dimensions it needs (reps, load, distance, pace, heart-rate zone…). Here are three examples:
{
"openset_version": "1.0",
"type": "workout",
"name": "Upper Body Strength",
"blocks": [
{
"name": "Main",
"series": [
{
"execution_mode": "SEQUENTIAL",
"exercises": [
{
"exercise_id": "barbell_bench_press",
"sets": [
{
"dimensions": ["reps", "load", "rest_after"],
"reps": { "type": "fixed", "value": 5 },
"load": { "type": "fixed", "value": 80, "unit": "kg" },
"rest_after": { "type": "fixed", "value": 180, "unit": "s" }
},
{
"dimensions": ["reps", "load"],
"reps": { "type": "amrap" },
"load": { "type": "fixed", "value": 80, "unit": "kg" }
}
]
},
{
"exercise_id": "bent_over_row",
"sets": [
{
"dimensions": ["reps", "load"],
"reps": { "type": "range", "min": 8, "max": 10 },
"load": { "type": "fixed", "value": 60, "unit": "kg" }
}
]
},
{
"exercise_id": "overhead_press",
"sets": [
{
"dimensions": ["reps", "load", "rpe"],
"reps": { "type": "range", "min": 8, "max": 12 },
"load": { "type": "fixed", "value": 35, "unit": "kg" },
"rpe": { "type": "fixed", "value": 8 }
}
]
},
{
"exercise_id": "lat_pulldown",
"sets": [
{
"dimensions": ["reps", "load"],
"reps": { "type": "range", "min": 10, "max": 12 },
"load": { "type": "fixed", "value": 55, "unit": "kg" }
}
]
},
{
"exercise_id": "dumbbell_biceps_curl",
"sets": [
{
"dimensions": ["reps", "load"],
"reps": { "type": "range", "min": 10, "max": 15 },
"load": { "type": "fixed", "value": 14, "unit": "kg" }
}
]
}
]
}
]
}
]
}Why a standard helps
- Portable training history. An athlete's record can move between coaches and tools without being flattened into a PDF.
- Reusable programming. Years of a coach's work stop being locked inside a single app.
- Machine-readable by design. AI systems can read a workout as structured data instead of guessing from free text.
We'd love your feedback
OpenSet is open, and it gets better with input from the people who actually work with training data. We would love feedback from coaches, training software builders, sport scientists, and anyone else working in this space.
Read the spec and get involved at openset.dev.