Workout-Schema
Zuletzt aktualisiert: 2026-05-29
Your Trainer ist eine Indoor-Cycling-App für mehrere Fahrer auf Android-Tablets. Smart-Trainer-Steuerung mit lokalen Daten + lokaler Kontrolle. Einmalkauf.
Die .ytw-Workout-Datei ist reines JSON — schreibe sie in einem beliebigen Texteditor, importiere sie über das Teilen-Menü und teile sie mit Freunden. Der visuelle Editor deckt die gängigen Fälle ab; das Schema ist der Notausgang, wenn du volle Kontrolle brauchst.
Wann selbst schreiben
Die meisten Fahrer brauchen diese Seite nie — der visuelle Workout-Editor und der AI Workout Coach decken alles ab, von einer 4×8-Schwellen-Einheit bis zu einem Mikroburst-Stack. Greif zum Schema, wenn:
- Du eine Struktur willst, die der Editor nicht abbildet (sehr lange Aufwärmphasen, ausgefeiltes Cue-Scripting, gemischte Trittfrequenz-Vorgaben pro Intervall).
- Du ein Workout übersetzt, das du bereits im Format eines anderen Tools hast.
- Du jemandem ein Workout als einzelne Datei schicken willst.
- Du Workouts programmatisch in großer Zahl erzeugen willst.
Minimalbeispiel
Die kürzeste gültige .ytw-Datei ist ein Programm mit einem Intervall. Speichere sie mit der Endung .ytw und teile sie in Your Trainer hinein.
{
"programId": "my-sweet-spot",
"programName": "My Sweet Spot 30",
"description": "A short sweet-spot workout.",
"totalDuration": 1800,
"workoutType": "POWER",
"primaryLocale": "en",
"intervals": [
{ "id": "warmup", "duration": 300, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Warmup", "intervalType": "WARMUP" },
{ "id": "work", "duration": 1200, "targetPowerPercent": 88, "intensityZone": "Z3", "label": "Sweet Spot", "intervalType": "INTERVAL" },
{ "id": "cooldown", "duration": 300, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Cooldown", "intervalType": "COOLDOWN" }
]
}
Felder auf oberster Ebene
Das Objekt auf oberster Ebene beschreibt ein Workout-Programm. Pflichtfelder sind markiert.
| Feld | Typ | Beschreibung |
|---|---|---|
programId erforderlich | string | Stabile Kennung. Verwende kebab-case (my-sweet-spot). Der eindeutige Schlüssel für das Workout in deiner Bibliothek — beim erneuten Import einer Datei mit derselben programId wird der vorhandene Eintrag aktualisiert, statt ein Duplikat anzulegen. |
programName erforderlich | string | Anzeigename in der primären Sprache des Fahrers. |
description erforderlich | string | Ein- oder zweisätzige Beschreibung, die auf der Workout-Karte angezeigt wird. |
totalDuration erforderlich | integer (Sekunden) | Gesamtlänge des Workouts. Die App berechnet diesen Wert beim Speichern aus den Intervallen neu, daher darf er beim Authoring ruhig inkonsistent sein. |
intervals erforderlich | array | Geordnete Liste von Intervall-Objekten oder Wiederholungsgruppen. |
workoutType | string | Workout-Familie: POWER (Standard), HR_ZONE oder ROUTE. Siehe Workout-Typen. |
variant | string | Untertyp innerhalb der Familie: STANDARD (Standard) oder RAMP_TEST. |
primaryLocale | string (BCP-47) | Sprache, in der die Strings verfasst wurden. Standard "en". Steuert die sprachübergreifende Fallback-Kette. |
category | string | Freie Text-Kategorisierung (z. B. "threshold", "endurance"). Optional. |
difficulty | integer (1–5) | Subjektiver Schwierigkeitsgrad. Wird auf der Workout-Karte angezeigt. |
isUserCreated | boolean | True für Workouts, die der Fahrer in der App selbst erstellt hat; false für importierte oder mitgelieferte Workouts. Standard false. |
isFavorite | boolean | Flag „oben angeheftet“. Fahrer schalten das in der App um; in geteilten Dateien meist weggelassen. |
routeProfile | array von { distanceMeters, elevationMeters } | Vollständiges Höhenprofil für ROUTE-Workouts. Null für POWER und HR_ZONE. |
strings | object (Sprache → LocaleStrings) | Sprachspezifische Übersetzungen von Name, Beschreibung, Intervall-Labels und Hinweisen. |
Intervall-Felder
Jedes Intervall-Objekt beschreibt einen Block des Workouts. Die Form des Blocks hängt vom workoutType des übergeordneten Programms ab — Power-Blöcke verwenden Leistungsprozente, HF-Zonen-Blöcke verwenden eine Zonen-Vorgabe.
| Feld | Typ | Beschreibung |
|---|---|---|
duration erforderlich | integer (Sekunden) | Blocklänge in Sekunden. |
targetPowerPercent power-erforderlich | integer (% der FTP) | Leistungs-Vorgabe für POWER-Workouts. Schließt sich mit targetHrZone gegenseitig aus. |
targetPowerEndPercent | integer (% der FTP) | Optionale Endleistung einer Rampe. Wenn gesetzt, interpoliert die Soll-Wattzahl linear von targetPowerPercent → targetPowerEndPercent über den Block. |
targetHrZone hr-erforderlich | integer (1–5) | HF-Zone für HR_ZONE-Workouts. Schließt sich mit targetPowerPercent gegenseitig aus. |
intensityZone erforderlich | string | Visuelles Zonen-Token: Z1–Z5. Steuert die Farbe in der Terrain-Visualisierung. Siehe Trainingszonen. |
intervalType | string | WARMUP, COOLDOWN oder INTERVAL (Standard). Aufwärm- und Auslauf-Blöcke werden aus den reinen Arbeits-Zusammenfassungen ausgeschlossen (durchschnittliche Leistung der Arbeitsblöcke, Time-in-Zone für den Arbeitsteil etc.). |
label erforderlich | string | Anzeigetext auf dem Block in der primären Sprache des Fahrers. Sprachübergreifende Varianten stehen in strings.<locale>.labels. |
id | string | Stabiler Slug — der Schlüssel, der in strings.<locale>.labels und beim Zusammensetzen von Cue-Schlüsseln verwendet wird. Empfohlen für jedes Workout, das mit Übersetzungen ausgeliefert wird. |
autoLabel | boolean | True, wenn das Label von einem Editor-Preset erzeugt wurde, statt vom Fahrer getippt zu sein. Auto-Labels werden von Your Trainer selbst lokalisiert und benötigen keine sprachspezifischen Einträge in strings. Standard false. |
cadenceTarget | integer (RPM) | Optionale Trittfrequenz-Vorgabe für den Block (z. B. 60 für Kletter-Übungen mit niedriger Trittfrequenz, 100 für Spin-up-Drills). |
cues | array von CoachingCue | Coaching-Hinweise, die während des Blocks ausgelöst werden. |
Coaching-Hinweise
Ein Coaching-Hinweis ist ein kurzes Text-Overlay, das während der Fahrt im Cockpit erscheint. Jeder Hinweis hat einen Versatz innerhalb seines übergeordneten Intervalls, den anzuzeigenden Text und eine Dauer, wie lange er sichtbar bleibt.
| Feld | Typ | Beschreibung |
|---|---|---|
offsetSec erforderlich | integer (Sekunden) | Sekunden ab Beginn des übergeordneten Intervalls, bei denen der Hinweis ausgelöst wird. |
text erforderlich | string | Hinweis-Text in der primären Sprache des Workouts. Sprachübergreifende Varianten stehen in strings.<locale>.cues, indiziert nach <intervalId>:<cueIndex>. |
durationSec | integer (Sekunden) | Wie lange der Hinweis auf dem Bildschirm bleibt. Standard 5. |
Beispiel-Intervall mit drei Hinweisen (die Schlüssel-Zusammensetzung verwendet die id des übergeordneten Intervalls + den Index des Hinweises im Array):
{
"id": "work",
"duration": 600,
"targetPowerPercent": 95,
"intensityZone": "Z4",
"label": "Threshold",
"intervalType": "INTERVAL",
"cues": [
{ "offsetSec": 0, "text": "Settle in — find your rhythm." },
{ "offsetSec": 300, "text": "Halfway. Stay smooth.", "durationSec": 8 },
{ "offsetSec": 540, "text": "One minute. Hold form." }
]
}
Lokalisierte Strings & Fallback-Kette
Der strings-Block enthält sprachspezifische Übersetzungen aller für den Fahrer sichtbaren Strings im Workout. Jeder Spracheintrag hat dieselbe Form:
"strings": {
"en": {
"name": "Sweet Spot 30",
"description": "A short sweet-spot workout.",
"labels": { "warmup": "Warmup", "work": "Sweet Spot", "cooldown": "Cooldown" },
"cues": { "work:0": "Settle in", "work:1": "Halfway" }
},
"de": {
"name": "Sweet Spot 30",
"description": "Ein kurzes Sweet-Spot-Training.",
"labels": { "warmup": "Aufwärmen", "work": "Sweet Spot", "cooldown": "Ausrollen" },
"cues": { "work:0": "Locker einrollen", "work:1": "Halbzeit" }
}
}
Hinweis-Schlüssel folgen dem Muster <intervalId>:<cueIndex> — der erste Hinweis auf dem work-Intervall hat also den Schlüssel work:0.
Für jeden vom Fahrer sichtbaren String wählt die App die am besten passende Sprache in dieser Reihenfolge:
strings[<rider-locale>]— die eigene Sprache des Fahrers.strings[primaryLocale]— die Sprache des Autors.strings["en"]— universeller Fallback.- Das Feld auf oberster Ebene (
programName, Intervall-label, Hinweis-text).
Strings, die aus einer anderen Sprache als der des Fahrers angezeigt werden, erscheinen auf Workout-Karten und im Cockpit kursiv, damit der Fahrer erkennt, welche Strings noch nicht übersetzt sind.
strings blocks for additional locales when prompted.Wiederholungsgruppen
Für sich wiederholende Strukturen beschreibt eine Wiederholungsgruppe die Einheit einmal und teilt der App mit, wie oft sie abgespielt werden soll. Wiederholungsgruppen werden beim Import in einzelne Blöcke entfaltet, sodass der Fahrer während der Fahrt jeden Block im Streifen der kommenden Intervalle sieht.
{
"intervals": [
{ "id": "warmup", "duration": 600, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Warmup", "intervalType": "WARMUP" },
{
"repeat": 4,
"intervals": [
{ "id": "on", "duration": 480, "targetPowerPercent": 95, "intensityZone": "Z4", "label": "Threshold" },
{ "id": "off", "duration": 240, "targetPowerPercent": 55, "intensityZone": "Z1", "label": "Recovery" }
]
},
{ "id": "cooldown", "duration": 600, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Cooldown", "intervalType": "COOLDOWN" }
]
}
Das obige Beispiel entfaltet sich zu 1 Aufwärmen + 4×(Schwelle + Erholung) + 1 Auslaufen = 10 Blöcke. Wiederholungsgruppen lassen sich verschachteln, aber flach ist für die Lesbarkeit zu bevorzugen.
Workout-Typen & Varianten
Das Feld workoutType wählt das Paradigma; variant wählt einen Untertyp darin.
workoutType | Was es ist | Erforderliche Intervall-Form |
|---|---|---|
POWER (Standard) | FTP-verankerte Intervalle. Der Trainer hält in ERG die Soll-Wattzahl oder folgt in SIM Widerstandskurven. | Jedes Intervall hat targetPowerPercent (und optional targetPowerEndPercent für Rampen). |
HR_ZONE | Herzfrequenz-gesteuerte Intervalle. Der Trainer passt die Wattzahl live an, um die HF des Fahrers in der Ziel-Zone zu halten — nützlich, wenn die kardiovaskuläre Belastung die Trainings-Metrik ist (Erholung, Grundlage, polarisiertes Training). | Jedes Intervall hat targetHrZone (1–5). Der START-Knopf zeigt HF-MESSER, bis der HRM verbunden ist. |
ROUTE | Steigungs-gesteuerte Simulations-Fahrten. Der Trainer folgt dem Höhenprofil aus routeProfile; der Fahrer wählt Trittfrequenz und Übersetzung. | Intervalle sind meist leer oder enthalten einen einzelnen Platzhalter über die volle Länge. Der eigentliche Fahrt-Inhalt steckt in routeProfile. |
Das Feld variant wählt einen Untertyp:
STANDARD(Standard) — gewöhnliches strukturiertes Workout.RAMP_TEST— als FTP-Test markiert. Fordert den Fahrer am Ende der Fahrt zur Aktualisierung der FTP auf und wird aus den Trainings-Last-Zusammenfassungen ausgeschlossen (damit eine maximale Anstrengung das Wochen-Last-Diagramm nicht verzerrt).
Pakete (.ytwpack)
Wenn du eine kuratierte Sammlung von Workouts auf einmal willst, bündelt das .ytwpack-Format viele .ytw-Dateien zusammen mit einem paketweiten Manifest. Eine .ytwpack ist unter der Haube ein ZIP-Archiv — benenne sie in .zip um und entpacke sie, um den Inhalt zu sehen, oder importiere sie über den Paket-Installer von Your Trainer, um alle Workouts in einem Tipp installiert zu bekommen.
Ein .ytwpack-Archiv enthält:
manifest.jsonim Wurzelverzeichnis des Archivs — die unten beschriebenen Metadaten auf Paketebene.- Eine
<slug>.ytwpro Workout im Paket, wobei jede Datei dem oben dokumentierten Schema folgt.
Das Paket-Manifest enthält genug Informationen für ein Installations-Entscheidungs-Sheet, ohne dass jedes Workout geöffnet werden muss. Felder auf oberster Ebene:
| Feld | Typ | Beschreibung |
|---|---|---|
schema_version erforderlich | integer | Aktuell immer 1. |
pack_id erforderlich | string | Stabile kebab-case-Kennung (z. B. sweet-spot). |
name erforderlich | string | Anzeigename, der im Paket-Katalog angezeigt wird. |
description erforderlich | string | Ein- oder zweisätzige Zusammenfassung, die sichtbar ist, bevor der Fahrer zum Installieren tippt. |
version erforderlich | string (SemVer) | MAJOR.MINOR.PATCH, optional -prerelease. Patch für Inhaltskorrekturen; Minor für zusätzliche Workouts; Major für brechende Schema-Änderungen. Wird im veröffentlichten Dateinamen eingebettet (v1.0.2.ytwpack). |
content_hash erforderlich | string | sha256: über die nach Slug sortierte Aneinanderreihung der Bytes jeder .ytw-Datei. Bleibt über Neu-Generierungen unveränderten Inhalts stabil; ändert sich jedes Mal, wenn sich die enthaltenen Workouts ändern. |
generated_at erforderlich | string (ISO 8601) | UTC-Zeitstempel. |
set erforderlich | string | power oder hr-zone — die Workout-Familie, zu der dieses Paket gehört. |
category erforderlich | string | Untertaxonomie innerhalb des Sets (z. B. sweet-spot). |
workout_count erforderlich | integer | Anzahl der .ytw-Einträge im Paket. |
total_ride_time_seconds erforderlich | integer | Summe der Dauer jedes Workouts im Paket. |
experience_level erforderlich | string | Berechnet aus der Schwierigkeits-Bandbreite der Inhalte — einer von beginner / intermediate / advanced / mixed. Kleinbuchstaben im Wire-Format; die App schreibt für die Anzeige groß. |
hrm_required erforderlich | boolean | True, wenn irgendein Workout im Paket HR_ZONE verwendet. |
type_mix erforderlich | object | Prozentsatz der Gesamt-Fahrtzeit pro Kategorie (summiert sich zu 100). Steuert das In-App-Type-Mix-Donut auf dem Installations-Sheet. |
duration_histogram erforderlich | object | Anzahl der Workouts pro Dauer-Bin: 0-30, 30-60, 60-90, 90+ (Minuten). Steuert das Dauer-Diagramm auf dem Installations-Sheet. |
contents erforderlich | array | Vollständige Einträge pro Workout — Obermenge der Eintragsform des Bibliotheks-Manifests; jeder trägt slug, name, duration_seconds, Zusammenfassungs-Metriken, plus ein sparkline-Array für das Thumbnail-Rendering. |
Zwei Installations-Wege für eine heruntergeladene .ytwpack:
- Ein-Tipp-Installation in Your Trainer — öffne die
.ytwpackim Teilen-Menü, Your Trainer liest das Paket-Manifest, zeigt dir, was drin ist (Type-Mix, Dauer-Histogramm, Gesamt-Fahrtzeit), und installiert alle Workouts auf einmal. Verfügbar, sobald der In-App-Paket-Installer ausgeliefert wird. - Manuelles Entpacken — in
.zipumbenennen (oder direkt mit einem beliebigen Archiv-Tool entpacken), dann jede.ytweinzeln über das Teilen-Menü in Your Trainer teilen.
Beispiel-Paket-Manifest (mit gekürztem contents zur besseren Lesbarkeit):
{
"schema_version": 1,
"pack_id": "sweet-spot",
"name": "Sweet Spot",
"description": "26 sweet-spot sessions across classic intervals, sustained stacks, and over-unders.",
"version": "1.0.2",
"content_hash": "sha256:9432a3a76015158dc71ec63…",
"generated_at": "2025-05-28T00:00:00Z",
"set": "power",
"category": "sweet-spot",
"workout_count": 26,
"total_ride_time_seconds": 119340,
"experience_level": "intermediate",
"hrm_required": false,
"type_mix": { "sweet-spot": 100 },
"duration_histogram": { "0-30": 0, "30-60": 5, "60-90": 12, "90+": 9 },
"contents": [
{ "slug": "sweet-spot-3x10min-at-88pct-ftp", "name": "Sweet Spot 3×10min @ 88% FTP", "duration_seconds": 3300, "tss": 55.8, "intensity_factor": 0.764, "sparkline": […] },
{ "slug": "sweet-spot-3x15min-at-90pct-ftp", "name": "Sweet Spot 3×15min @ 90% FTP", "duration_seconds": 4500, "tss": 81.6, "intensity_factor": 0.808, "sparkline": […] }
/* … 24 more workouts … */
]
}
Bibliotheks- & Paket-Manifeste
Zwei Manifeste werden zusammen mit den herunterladbaren Artefakten veröffentlicht. Beide sind reines JSON; beide werden durch JSON-Schema-Dokumente beschrieben, die du direkt abrufen kannst.
| URL | Was es auflistet | JSON Schema |
|---|---|---|
library/manifest.json |
Jede kuratierte .ytw in der Bibliothek — Metadaten pro Workout für Browse-/Such-/Filter-Clients. Listet außerdem die verfügbaren .ytwpack-Downloads auf (Dateipfad, Version, Content-Hash, Type-Mix-Zusammenfassung, Icon-URL). |
/schemas/workout-manifest.json |
packs/manifest.json |
Paket-Katalog-Endpunkt: jede veröffentlichte .ytwpack mit Zusammenfassungs-Metadaten. Dieselbe Eintragsform pro Paket wie das packs-Array des Bibliotheks-Manifests; die In-App-Paket-Bibliothek holt das bei einer vom Fahrer ausgelösten Aktualisierung. |
/schemas/workout-manifest.json |
(innerhalb jeder .ytwpack) |
Paket-Manifest, als manifest.json im Wurzelverzeichnis des Archivs mitgeführt — die obige Tabelle dokumentiert seine Form. |
/schemas/workout-pack-manifest.json |
Wenn du Tools baust, die die Bibliothek konsumieren — einen eigenen Workout-Browser, einen Workout-Konverter, der auf .zwo abzielt, ein Coach-Dashboard, das Pakete darstellt — sind das die Verträge, gegen die du validieren solltest. Dieselbe Eintragsform pro Workout taucht in beiden Manifesten in den contents-/workouts-Arrays auf, sodass ein Client, der das eine verarbeitet, auch das andere verarbeitet.
Ausgearbeitete Beispiele
Rampen-Intervall
Ein 5-minütiges Aufwärmen, das per linearer Interpolation von 40 % FTP auf 75 % FTP rampt:
{
"id": "rampup",
"duration": 300,
"targetPowerPercent": 40,
"targetPowerEndPercent": 75,
"intensityZone": "Z1",
"label": "Ramp up",
"intervalType": "WARMUP"
}
Over-Under
Drei Sätze à 2 Minuten bei 95 % FTP / 1 Minute bei 105 % FTP, ausgedrückt als Wiederholungsgruppe:
{
"repeat": 3,
"intervals": [
{ "id": "under", "duration": 120, "targetPowerPercent": 95, "intensityZone": "Z4", "label": "Under" },
{ "id": "over", "duration": 60, "targetPowerPercent": 105, "intensityZone": "Z5", "label": "Over" }
]
}
HF-Zonen-Workout
30-minütige Z2-Ausdauer-Fahrt mit einem 3-minütigen Z4-Push in der Mitte:
{
"programId": "hr-z2-with-surge",
"programName": "Z2 with a Z4 surge",
"description": "Steady Zone 2 with a single 3-minute Zone 4 surge.",
"totalDuration": 1800,
"workoutType": "HR_ZONE",
"primaryLocale": "en",
"intervals": [
{ "id": "warmup", "duration": 300, "targetHrZone": 1, "intensityZone": "Z1", "label": "Warmup", "intervalType": "WARMUP" },
{ "id": "endure1", "duration": 600, "targetHrZone": 2, "intensityZone": "Z2", "label": "Endurance" },
{ "id": "surge", "duration": 180, "targetHrZone": 4, "intensityZone": "Z4", "label": "Surge" },
{ "id": "endure2", "duration": 420, "targetHrZone": 2, "intensityZone": "Z2", "label": "Endurance" },
{ "id": "cooldown","duration": 300, "targetHrZone": 1, "intensityZone": "Z1", "label": "Cooldown", "intervalType": "COOLDOWN" }
]
}
Mehrsprachig
Das minimale Sweet Spot-Beispiel mit EN-, DE- und NL-strings-Blöcken. Dasselbe Workout, drei native Erlebnisse:
{
"programId": "my-sweet-spot",
"programName": "Sweet Spot 30",
"description": "A short sweet-spot workout.",
"totalDuration": 1800,
"workoutType": "POWER",
"primaryLocale": "en",
"intervals": [
{ "id": "warmup", "duration": 300, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Warmup", "intervalType": "WARMUP" },
{ "id": "work", "duration": 1200, "targetPowerPercent": 88, "intensityZone": "Z3", "label": "Sweet Spot", "intervalType": "INTERVAL",
"cues": [
{ "offsetSec": 0, "text": "Settle in" },
{ "offsetSec": 600, "text": "Halfway" }
]
},
{ "id": "cooldown", "duration": 300, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Cooldown", "intervalType": "COOLDOWN" }
],
"strings": {
"en": {
"name": "Sweet Spot 30",
"description": "A short sweet-spot workout.",
"labels": { "warmup": "Warmup", "work": "Sweet Spot", "cooldown": "Cooldown" },
"cues": { "work:0": "Settle in", "work:1": "Halfway" }
},
"de": {
"name": "Sweet Spot 30",
"description": "Ein kurzes Sweet-Spot-Training.",
"labels": { "warmup": "Aufwärmen", "work": "Sweet Spot", "cooldown": "Ausrollen" },
"cues": { "work:0": "Locker einrollen", "work:1": "Halbzeit" }
},
"nl": {
"name": "Sweet Spot 30",
"description": "Een korte sweet-spot-training.",
"labels": { "warmup": "Inrijden", "work": "Sweet Spot", "cooldown": "Uitrijden" },
"cues": { "work:0": "Rustig inrijden", "work:1": "Halverwege" }
}
}
}
Häufige Fallstricke
- Fehlende
idauf Intervallen. Die Laufzeit akzeptiert Intervalle ohneid, aber du verlierst deine Übersetzungs-Einstiegspunkte — sowohlstrings.<locale>.labelsals auch die Cue-Schlüssel-Map sind darauf angewiesen. Wenn du ein Workout mitstringsausliefern willst, gib jedem Intervall eineid. - Nicht passende Cue-Schlüssel. Das Cue-Schlüssel-Muster ist
<intervalId>:<cueIndex>— nullbasiert indiziert. Der dritte Hinweis auf demwork-Intervall istwork:2, nichtwork:3. - Sowohl
targetPowerPercentals auchtargetHrZoneauf demselben Intervall. Sie schließen sich gegenseitig aus — behalte eins von beiden, je nachworkoutTypedes übergeordneten Programms. - Vergessen von
intervalTypebei Aufwärm- und Auslauf-Blöcken. Der Standard istINTERVAL— setzeWARMUP/COOLDOWNexplizit, damit die Analytik-Schicht diese Blöcke nicht in die Arbeits-Summe einrechnet. - Aufgeblähte
totalDuration. Beim Authoring harmlos — Your Trainer berechnet sie beim Speichern ausintervalsneu. Aber vor dem Teilen lohnt es sich, sie korrekt zu setzen, weil manche externen Tools das Feld unverändert anzeigen. - Falsches
intensityZone-Token. Muss einer der WerteZ1–Z5als String sein."Z6"oder"3"rendert nicht die richtige Farbe in der Terrain-Visualisierung.
Referenz
- Der AI Workout Coach generiert gültiges
.ytw-JSON aus einer reinen Text-Beschreibung — nützlich als Ausgangspunkt, den du anschließend von Hand bearbeitest. - Für deterministische programmatische Erstellung (ohne LLM): Your Trainer MCP — Integrator-Dokumentation beschreibt
build_workout_from_intentunddecompose_workout, die nach / aus diesem Schema komponieren. - Für Workouts, die nicht importieren: Fehlerbehebung → Workout- & Routen-Importe.
- Für Zonen-Definitionen: Trainingszonen.
- Für unbekannte Begriffe: Glossar.
- Die mit Your Trainer mitgelieferten Workouts üben jede Form aus, die das Schema unterstützt — eines davon in einem Texteditor anzuschauen (Export aus dem visuellen Editor) ist eine schnelle Möglichkeit, ein echtes Beispiel für jedes Feld zu sehen.
Für programmatische Format-Spec-Lookups (Feldtabellen, Beispiele, Constraints, Glossar) ist die kanonische maschinenlesbare Quelle der Your Trainer MCP — rufe get_format_spec, get_canonical_examples, get_format_constraints oder get_format_glossary aus jedem MCP-Client. Diese Tools liefern aus derselben Wissensbasis, die diese Seite speist; weicht eine Tool-Antwort einmal von dieser Seite ab, ist der MCP kanonisch und diese Seite veraltet.
JSON-Schemas (maschinenlesbare Verträge für Clients, die auf diesen Formaten aufbauen):
/schemas/workout-manifest.json— Bibliotheks-Manifest + Eintragsform pro Paket (deckt sowohllibrary/manifest.jsonals auchpacks/manifest.jsonab)./schemas/workout-pack-manifest.json— diemanifest.json, die in jeder.ytwpackmitgeführt wird./schemas/workout-intent.json— Strukturierte-Intent-Form, die von Workout-Authoring-Tools verwendet wird, die nach.ytwkomponieren.