Skip to content

The two pillars

OpenBody is organized around two co-equal pillars. Pillar A alone would make it just another telemetry format; Pillar B is what no incumbent provides and is the standard’s primary differentiator. Both are first-class in v1.

Pillar A — Observation (telemetry)

Pillar A models telemetry: continuous or instantaneous measurements of a subject. Its single atom is the Measurement (§4). A Measurement carries a type, exactly one value shape, a conditional unit, and a startTime/endTime.

The value is a closed one-of — exactly one of these keys appears at the record root:

ShapeUse
quantityA single number, or a fixed-point {coefficient, exponent} for lossless decimals (e.g. body mass). Also how aggregates are carried — a daily step total is a quantity whose startTime/endTime bound the window.
categoryA discrete categorical state (e.g. sleep_deep, afib). No unit.
sampleArrayA sampled series — scalar or vector, regular (frequencyHz) or irregular (offsets). The only form that scales to continuous sensor data.

A GPS route is a multi-channel sampleArray with location channels lat, lon, alt, typically irregular. Categorical series (a night of sleep stages) are carried as multiple category Measurements over adjacent intervals — not a sampleArray (which is numeric-only). Dropped samples are null.

Pillar B — Structured Training (exercise)

Pillar B models the prescription and execution of exercise through a containment hierarchy. Every level above WorkUnit is optional — the model collapses gracefully.

Program / Plan ordered sessions over time (e.g. 5/3/1, a marathon block)
└─ Session one training occurrence; planned and/or performed
└─ Block a group; MAY repeat, MAY nest, MAY carry a scoring scheme
└─ Exercise an exercise occurrence (refs an ExerciseRef + descriptors)
└─ WorkUnit the atom — strictly one set; scored by kind
└─ Rep* optional per-rep detail

The minimum viable training record is a single WorkUnit — the one required-tier element of the Training-core profile. A WorkUnit.scoring kind is one of reps|time|distance|continuous|energy.

Key ideas:

  • Planned vs performed are both first-class. A planned unit carries prescription; a performed one carries performance; a record may carry both. Separate records link via the performedFrom envelope link.
  • Targets are polymorphic. A metric may be a scalar or a Targetabsolute, range, relativeToThreshold (e.g. 80% of 1RM), stopCondition (e.g. to_failure, to_rpe), or ramp (a directional progression, e.g. a warmup ramping 50→75 %FTP; legal only on load.value and Intensity.value). See canonicalization.
  • The “how hard” axis has three distinct homes (§5.13), so a value never has two encodings: resistanceload (100 kg, 80 %1RM, a band, machine level 7); intensityintensity[] of Intensity, a target on a non-resistance dimension (power|pace|hr|speed|grade, absolute / relative-to-threshold / a named zone like z2); perceived or derived efforteffortLoad[] of EffortLoad (RPE|RIR|sRPE|TRIMP|TSS). A %1RM is a load; %FTP or a HR zone is an intensity; RPE/RIR is an effortLoad. All three are plural.
  • Block-level scoring spans multiple exercises — amrap, for_time, emom, tabata, rounds — the case no incumbent models cleanly. Per-atom scoring lives on the WorkUnit. Round structure is orthogonal to scoring: repetitions (N identical rounds) or roundScheme (laddered per-round counts, e.g. [21,15,9] for Fran) describe how the rounds are structured; scoring.scheme describes how the work is measured, and they compose.
  • Physical qualities are a first-class axis (§5.3/§5.4). A Session or Block may carry qualities (endurance|strength|power|mobility|flexibility|…) — the quality being developed, orthogonal to disciplines (the activity) and intent (the purpose).
  • Sport results. A Session (or Block) may carry an outcome — a match score, race placement, or game result — for sports whose contest is the session (§5.18).
  • Sets & roundScheme shorthands. A planned prescription may use sets: N (expands to N identical WorkUnits); a laddered block may use roundScheme (expands to enumerated rounds). Both expand during normalization; a performed record enumerates the actual sets/rounds.

Pillar B references Pillar A — it never duplicates telemetry

A structured-training record MUST NOT re-invent telemetry. Where a set or session has associated time-series data — the heart-rate trace during an interval, the barbell velocity of a rep, the GPS route of a run — Pillar B references the corresponding Pillar A Measurement through the typed measuredBy link, rather than embedding or duplicating it.