Phase 06 Tier 1: Complete Backend Implementation - Recovery Tracking & Swap System

COMPLETED TASKS:
 06-01: Workout Swap System
   - Added swapped_from_id to workout_logs
   - Created workout_swaps table for history
   - POST /api/workouts/:id/swap endpoint
   - GET /api/workouts/available endpoint
   - Reversible swaps with audit trail

 06-02: Muscle Group Recovery Tracking
   - Created muscle_group_recovery table
   - Implemented calculateRecoveryScore() function
   - GET /api/recovery/muscle-groups endpoint
   - GET /api/recovery/most-recovered endpoint
   - Auto-tracking on workout log completion

 06-03: Smart Workout Recommendations
   - GET /api/recommendations/smart-workout endpoint
   - 7-day workout analysis algorithm
   - Recovery-based filtering (>30% threshold)
   - Top 3 recommendations with context
   - Context-aware reasoning messages

DATABASE CHANGES:
- Added 4 new tables: muscle_group_recovery, workout_swaps, custom_workouts, custom_workout_exercises
- Extended workout_logs with: swapped_from_id, source_type, custom_workout_id, custom_workout_exercise_id
- Created 7 new indexes for performance

IMPLEMENTATION:
- Recovery service with 4 core functions
- 2 new route handlers (recovery, smartRecommendations)
- Updated workouts router with swap endpoints
- Integrated recovery tracking into POST /api/logs
- Full error handling and logging

TESTING:
- Test file created: /backend/test/phase-06-tests.js
- Ready for E2E and staging validation

STATUS: Ready for frontend integration and production review
Branch: feature/06-phase-06
This commit is contained in:
2026-03-06 20:54:03 +01:00
parent c153a9648f
commit d81e403f01
330 changed files with 87988 additions and 367 deletions
+48
View File
@@ -0,0 +1,48 @@
# Coach Agent
Träningscoach-agent för Gravl-appen.
## Användning
Coach kan:
- Generera träningsprogram baserat på användarens mål och nivå
- Föreslå alternativa övningar vid skada/begränsningar/utrustningsbrist
- Förklara övningsteknik och vanliga misstag
- Svara på träningsrelaterade frågor
## Filer
```
coach/
├── SOUL.md # Persona och riktlinjer
├── AGENTS.md # Denna fil
├── exercises.json # Övningsdatabas (20+ övningar)
└── programs/
├── beginner.json # Nybörjare (3 dagar, helkropp)
├── strength.json # Styrka 5x5 (3-4 dagar)
└── hypertrophy.json # Hypertrofi PPL (5-6 dagar)
```
## API-kontext
Coach har tillgång till användardata via Gravl API:
```
GET /api/user/profile → mål, erfarenhet, frekvens
GET /api/user/measurements → vikt, kroppsfett (historik)
GET /api/user/strength → 1RM-värden (historik)
```
## Exempel på uppgifter
1. **Skapa program**: "Skapa ett 4-dagars program för hypertrofi"
2. **Alternativ övning**: "Jag har ont i axeln, vad kan jag göra istället för bänkpress?"
3. **Teknikfråga**: "Hur ska jag andas under marklyft?"
4. **Progression**: "Jag har kört 80kg i bänk i 3 veckor, hur går jag vidare?"
## Spawn
```bash
# Via OpenClaw sessions_spawn
sessions_spawn --label="coach" --task="Skapa ett träningsprogram för..."
```
+48
View File
@@ -0,0 +1,48 @@
# Coach Agent - SOUL.md
Du är **Coach**, en erfaren styrke- och konditionscoach med 15+ års erfarenhet.
## Bakgrund
- Certifierad PT (NSCA-CSCS)
- Bakgrund inom både tävlingsidrott och rehabilitering
- Specialiserad på progressiv överbelastning och periodisering
- Evidensbaserad approach - följer forskning, inte trender
## Personlighet
- Direkt och tydlig - inget fluff
- Uppmuntrande men realistisk
- Anpassar språk efter användarens nivå
- Förklarar *varför*, inte bara *vad*
## Principer
1. **Progressiv överbelastning** - gradvis ökning är nyckeln
2. **Specificitet** - träna för ditt mål
3. **Återhämtning** - vila är träning
4. **Individualisering** - alla är olika
5. **Konsistens > perfektion** - 80% rätt, 100% av tiden
## Kommunikationsstil
- Svenska som huvudspråk
- Använder träningstermer men förklarar vid behov
- Korta, koncisa svar om inte djupare förklaring behövs
- Emoji sparsamt: 💪 🏋️ ✅ för att markera viktiga punkter
## När du ger råd
- Fråga efter kontext om det saknas (mål, erfarenhet, utrustning)
- Ge alltid **alternativ** om en övning inte passar
- Varna för vanliga misstag
- Prioritera säkerhet över intensitet för nybörjare
## Exempel på ton
❌ "Det är jättebra att du vill träna! Här är några förslag..."
✅ "Bänkpress 3x8. Kör 60kg baserat på din 1RM. Fokus: kontrollerad excentrisk."
## Tillgängliga resurser
- `exercises.json` - övningsdatabas med alternativ och muskelgrupper
- `programs/` - programmallar för olika mål
- Användardata via API (mål, erfarenhet, 1RM, historik)
## Begränsningar
- Du är inte läkare - vid smärta/skador, rekommendera professionell hjälp
- Ge inte nutritionsråd utanför grundläggande principer
- Inga kosttillskottsrekommendationer
+287
View File
@@ -0,0 +1,287 @@
{
"exercises": [
{
"id": "bench_press",
"name": "Bänkpress",
"name_en": "Bench Press",
"category": "compound",
"primary_muscles": ["chest", "triceps", "front_delts"],
"secondary_muscles": ["core"],
"equipment": ["barbell", "bench"],
"difficulty": "intermediate",
"alternatives": ["dumbbell_press", "push_ups", "machine_chest_press"],
"cues": ["Skuldror ihop och ner", "Fötterna i golvet", "Kontrollerad excentrisk"],
"common_mistakes": ["Studsa stången", "För brett grepp", "Rumpan lyfter"]
},
{
"id": "squat",
"name": "Knäböj",
"name_en": "Back Squat",
"category": "compound",
"primary_muscles": ["quads", "glutes"],
"secondary_muscles": ["hamstrings", "core", "lower_back"],
"equipment": ["barbell", "squat_rack"],
"difficulty": "intermediate",
"alternatives": ["goblet_squat", "leg_press", "front_squat", "bulgarian_split_squat"],
"cues": ["Bryt i höften först", "Knän i linje med tår", "Bröst upp"],
"common_mistakes": ["Knän faller in", "Hälar lyfter", "För mycket framåtlutning"]
},
{
"id": "deadlift",
"name": "Marklyft",
"name_en": "Deadlift",
"category": "compound",
"primary_muscles": ["hamstrings", "glutes", "lower_back"],
"secondary_muscles": ["traps", "forearms", "core"],
"equipment": ["barbell"],
"difficulty": "intermediate",
"alternatives": ["romanian_deadlift", "trap_bar_deadlift", "sumo_deadlift"],
"cues": ["Stång nära kroppen", "Rak rygg", "Driv genom hälarna"],
"common_mistakes": ["Rundad rygg", "Stången för långt fram", "Sträcker knän för tidigt"]
},
{
"id": "overhead_press",
"name": "Militärpress",
"name_en": "Overhead Press",
"category": "compound",
"primary_muscles": ["front_delts", "side_delts", "triceps"],
"secondary_muscles": ["core", "traps"],
"equipment": ["barbell"],
"difficulty": "intermediate",
"alternatives": ["dumbbell_shoulder_press", "arnold_press", "machine_shoulder_press"],
"cues": ["Spänn core", "Stång nära ansiktet", "Lås ut helt"],
"common_mistakes": ["Överdriven svank", "Armbågarna för långt ut", "Halvt ROM"]
},
{
"id": "barbell_row",
"name": "Skivstångsrodd",
"name_en": "Barbell Row",
"category": "compound",
"primary_muscles": ["lats", "rhomboids", "rear_delts"],
"secondary_muscles": ["biceps", "lower_back"],
"equipment": ["barbell"],
"difficulty": "intermediate",
"alternatives": ["dumbbell_row", "cable_row", "t_bar_row", "machine_row"],
"cues": ["45° framåtlutning", "Dra mot naveln", "Skuldror ihop"],
"common_mistakes": ["För mycket kropp", "Rycker vikten", "Rundad rygg"]
},
{
"id": "pull_ups",
"name": "Chins/Pull-ups",
"name_en": "Pull-ups",
"category": "compound",
"primary_muscles": ["lats", "biceps"],
"secondary_muscles": ["rear_delts", "core"],
"equipment": ["pull_up_bar"],
"difficulty": "intermediate",
"alternatives": ["lat_pulldown", "assisted_pull_ups", "inverted_rows"],
"cues": ["Initiera med skuldrorna", "Bröst mot stången", "Kontrollerad ner"],
"common_mistakes": ["Kipping", "Halvt ROM", "Ignorerar skulderbladen"]
},
{
"id": "dumbbell_press",
"name": "Hantelpress",
"name_en": "Dumbbell Bench Press",
"category": "compound",
"primary_muscles": ["chest", "triceps", "front_delts"],
"secondary_muscles": ["core"],
"equipment": ["dumbbells", "bench"],
"difficulty": "beginner",
"alternatives": ["bench_press", "push_ups", "cable_fly"],
"cues": ["Hantlar i linje med bröstvårtorna", "Armbågar 45°", "Pressar ihop i toppen"],
"common_mistakes": ["Hantlar för högt", "Tappar kontroll"]
},
{
"id": "romanian_deadlift",
"name": "Rumänsk marklyft",
"name_en": "Romanian Deadlift",
"category": "compound",
"primary_muscles": ["hamstrings", "glutes"],
"secondary_muscles": ["lower_back"],
"equipment": ["barbell"],
"difficulty": "intermediate",
"alternatives": ["stiff_leg_deadlift", "single_leg_rdl", "good_morning"],
"cues": ["Mjuka knän", "Höfterna bakåt", "Känn stretch i hamstrings"],
"common_mistakes": ["Böjer knäna för mycket", "Rundar ryggen"]
},
{
"id": "leg_press",
"name": "Benpress",
"name_en": "Leg Press",
"category": "compound",
"primary_muscles": ["quads", "glutes"],
"secondary_muscles": ["hamstrings"],
"equipment": ["leg_press_machine"],
"difficulty": "beginner",
"alternatives": ["squat", "hack_squat", "goblet_squat"],
"cues": ["Fötter axelbrett", "Pressar genom hälarna", "Knän faller inte in"],
"common_mistakes": ["Rumpan lyfter", "Låser ut knäna", "För tungt för kontroll"]
},
{
"id": "lat_pulldown",
"name": "Latsdrag",
"name_en": "Lat Pulldown",
"category": "compound",
"primary_muscles": ["lats", "biceps"],
"secondary_muscles": ["rear_delts", "rhomboids"],
"equipment": ["cable_machine"],
"difficulty": "beginner",
"alternatives": ["pull_ups", "assisted_pull_ups", "straight_arm_pulldown"],
"cues": ["Dra till nyckelbenet", "Bröst upp", "Kontrollerad excentrisk"],
"common_mistakes": ["Lutar sig för långt bak", "Armar gör allt jobb"]
},
{
"id": "bicep_curl",
"name": "Bicepscurl",
"name_en": "Bicep Curl",
"category": "isolation",
"primary_muscles": ["biceps"],
"secondary_muscles": ["forearms"],
"equipment": ["dumbbells"],
"difficulty": "beginner",
"alternatives": ["barbell_curl", "hammer_curl", "cable_curl", "preacher_curl"],
"cues": ["Armbågar still", "Full ROM", "Kontrollerad ner"],
"common_mistakes": ["Svingar vikten", "Armbågarna rör sig"]
},
{
"id": "tricep_pushdown",
"name": "Triceps pushdown",
"name_en": "Tricep Pushdown",
"category": "isolation",
"primary_muscles": ["triceps"],
"secondary_muscles": [],
"equipment": ["cable_machine"],
"difficulty": "beginner",
"alternatives": ["skull_crushers", "tricep_dips", "close_grip_bench"],
"cues": ["Armbågar intill kroppen", "Sträck ut helt", "Kontrollerad upp"],
"common_mistakes": ["Använder axlarna", "Armbågar rör sig"]
},
{
"id": "lateral_raise",
"name": "Sidolyft",
"name_en": "Lateral Raise",
"category": "isolation",
"primary_muscles": ["side_delts"],
"secondary_muscles": ["traps"],
"equipment": ["dumbbells"],
"difficulty": "beginner",
"alternatives": ["cable_lateral_raise", "machine_lateral_raise"],
"cues": ["Liten böj i armbågen", "Lyft till axelhöjd", "Tummar något nedåt"],
"common_mistakes": ["Svingar vikten", "Axlar höjs mot öronen", "För tungt"]
},
{
"id": "leg_curl",
"name": "Bencurl",
"name_en": "Leg Curl",
"category": "isolation",
"primary_muscles": ["hamstrings"],
"secondary_muscles": [],
"equipment": ["leg_curl_machine"],
"difficulty": "beginner",
"alternatives": ["nordic_curl", "swiss_ball_curl", "romanian_deadlift"],
"cues": ["Höfterna ner", "Curl hela vägen", "Kontrollerad excentrisk"],
"common_mistakes": ["Höfterna lyfter", "Halvt ROM"]
},
{
"id": "leg_extension",
"name": "Benspark",
"name_en": "Leg Extension",
"category": "isolation",
"primary_muscles": ["quads"],
"secondary_muscles": [],
"equipment": ["leg_extension_machine"],
"difficulty": "beginner",
"alternatives": ["sissy_squat", "split_squat"],
"cues": ["Sträck ut helt", "Kontrollerad ner", "Håll i toppen"],
"common_mistakes": ["Svingar vikten", "Rycker upp"]
},
{
"id": "face_pull",
"name": "Face pull",
"name_en": "Face Pull",
"category": "isolation",
"primary_muscles": ["rear_delts", "rhomboids"],
"secondary_muscles": ["traps", "rotator_cuff"],
"equipment": ["cable_machine"],
"difficulty": "beginner",
"alternatives": ["reverse_fly", "band_pull_apart"],
"cues": ["Dra mot ansiktet", "Externa rotation i toppen", "Skuldror ihop"],
"common_mistakes": ["För tungt", "Ingen extern rotation"]
},
{
"id": "plank",
"name": "Plankan",
"name_en": "Plank",
"category": "isolation",
"primary_muscles": ["core"],
"secondary_muscles": ["shoulders", "glutes"],
"equipment": [],
"difficulty": "beginner",
"alternatives": ["dead_bug", "hollow_hold", "ab_wheel"],
"cues": ["Rak linje huvud-häl", "Spänn magen", "Andas"],
"common_mistakes": ["Hängande höfter", "Rumpan för högt"]
},
{
"id": "cable_fly",
"name": "Cable fly",
"name_en": "Cable Fly",
"category": "isolation",
"primary_muscles": ["chest"],
"secondary_muscles": ["front_delts"],
"equipment": ["cable_machine"],
"difficulty": "beginner",
"alternatives": ["dumbbell_fly", "pec_deck"],
"cues": ["Mjuk armbåge", "Kramas rakt fram", "Känn stretch"],
"common_mistakes": ["Böjer armbågarna för mycket", "Går för tungt"]
},
{
"id": "goblet_squat",
"name": "Goblet squat",
"name_en": "Goblet Squat",
"category": "compound",
"primary_muscles": ["quads", "glutes"],
"secondary_muscles": ["core"],
"equipment": ["dumbbell", "kettlebell"],
"difficulty": "beginner",
"alternatives": ["squat", "leg_press"],
"cues": ["Vikten mot bröstet", "Armbågar mellan knäna", "Bröst upp"],
"common_mistakes": ["Lutar framåt", "Hälar lyfter"]
},
{
"id": "push_ups",
"name": "Armhävningar",
"name_en": "Push-ups",
"category": "compound",
"primary_muscles": ["chest", "triceps", "front_delts"],
"secondary_muscles": ["core"],
"equipment": [],
"difficulty": "beginner",
"alternatives": ["bench_press", "dumbbell_press", "knee_push_ups"],
"cues": ["Kroppen rak", "Armbågar 45°", "Bröst till golv"],
"common_mistakes": ["Hängande höfter", "Armbågar för brett", "Halvt ROM"]
}
],
"muscle_groups": {
"chest": { "name": "Bröst", "exercises": ["bench_press", "dumbbell_press", "push_ups", "cable_fly"] },
"back": { "name": "Rygg", "exercises": ["deadlift", "barbell_row", "pull_ups", "lat_pulldown"] },
"shoulders": { "name": "Axlar", "exercises": ["overhead_press", "lateral_raise", "face_pull"] },
"quads": { "name": "Framsida lår", "exercises": ["squat", "leg_press", "leg_extension", "goblet_squat"] },
"hamstrings": { "name": "Baksida lår", "exercises": ["deadlift", "romanian_deadlift", "leg_curl"] },
"glutes": { "name": "Säte", "exercises": ["squat", "deadlift", "romanian_deadlift", "leg_press"] },
"biceps": { "name": "Biceps", "exercises": ["bicep_curl", "pull_ups", "barbell_row"] },
"triceps": { "name": "Triceps", "exercises": ["tricep_pushdown", "bench_press", "overhead_press", "push_ups"] },
"core": { "name": "Core/mage", "exercises": ["plank", "deadlift", "squat"] }
},
"equipment_map": {
"barbell": "Skivstång",
"dumbbells": "Hantlar",
"cable_machine": "Kabelmaskin",
"bench": "Bänk",
"squat_rack": "Knäböjsställning",
"pull_up_bar": "Chinsstång",
"leg_press_machine": "Benpressmaskin",
"leg_curl_machine": "Bencurlmaskin",
"leg_extension_machine": "Bensparkmaskin",
"kettlebell": "Kettlebell"
}
}
@@ -0,0 +1,57 @@
{
"id": "beginner_fullbody",
"name": "Nybörjarprogram - Helkropp",
"goal": "general",
"description": "Perfekt startprogram för nybörjare. Lär dig grundövningarna med fokus på teknik. Helkroppsträning 3x/vecka.",
"experience_level": ["beginner"],
"duration_weeks": 8,
"workouts_per_week": [3],
"principles": [
"Fokus på teknik - använd lätt vikt tills formen är perfekt",
"Helkropp varje pass för maximal inlärning",
"48h vila mellan pass",
"Öka vikt ENDAST när tekniken är solid"
],
"split": {
"3_days": {
"name": "A/B/A → B/A/B",
"rotation": ["A", "B", "A"],
"days": {
"A": {
"name": "Helkropp A",
"exercises": [
{ "id": "goblet_squat", "sets": 3, "reps": 10, "rest": "2 min", "note": "Fokus: knän ut, bröst upp" },
{ "id": "dumbbell_press", "sets": 3, "reps": 10, "rest": "2 min", "note": "Platt bänk" },
{ "id": "lat_pulldown", "sets": 3, "reps": 10, "rest": "2 min", "note": "Dra mot nyckelbenet" },
{ "id": "leg_curl", "sets": 2, "reps": 12, "rest": "90 sek" },
{ "id": "plank", "sets": 3, "reps": "20-30 sek", "rest": "60 sek" }
],
"duration_min": 45
},
"B": {
"name": "Helkropp B",
"exercises": [
{ "id": "leg_press", "sets": 3, "reps": 10, "rest": "2 min", "note": "Fötter axelbrett" },
{ "id": "push_ups", "sets": 3, "reps": "max (mål: 10)", "rest": "90 sek", "note": "Knästående OK" },
{ "id": "barbell_row", "sets": 3, "reps": 10, "rest": "2 min", "note": "Eller maskinrodd" },
{ "id": "lateral_raise", "sets": 2, "reps": 12, "rest": "60 sek" },
{ "id": "bicep_curl", "sets": 2, "reps": 12, "rest": "60 sek" }
],
"duration_min": 45
}
}
}
},
"progression": {
"weeks_1_2": "Lätt vikt. Lär dig teknik. Ska kännas enkelt.",
"weeks_3_4": "Öka till vikt där sista reps är utmanande men tekniken hålls.",
"weeks_5_8": "Progressiv överbelastning - öka vikt när du klarar alla reps med bra form.",
"next_step": "Efter 8 veckor: övergå till intermediate-program (Styrka 5x5 eller Hypertrofi PPL)"
},
"technique_focus": {
"goblet_squat": "Grunden för alla knäböjvarianter. Vikten framför tvingar bröst upp.",
"dumbbell_press": "Lättare att hitta rätt position än skivstång. Tränar stabilitet.",
"lat_pulldown": "Bygger styrka för framtida pull-ups.",
"push_ups": "Fundamental rörelse. Börja på knä om nödvändigt."
}
}
@@ -0,0 +1,116 @@
{
"id": "hypertrophy_ppl",
"name": "Hypertrofiprogram PPL",
"goal": "muscle",
"description": "Push/Pull/Legs split optimerat för muskelbygge. Högre volym och rep-ranges för maximal hypertrofi.",
"experience_level": ["intermediate", "advanced"],
"duration_weeks": 8,
"workouts_per_week": [5, 6],
"principles": [
"8-12 reps för compound, 12-15 för isolation",
"Fokus på mind-muscle connection",
"60-90 sek vila för isolation, 2-3 min för compound",
"Progressiv överbelastning genom volym ELLER vikt",
"Träna nära failure (1-2 RIR)"
],
"split": {
"6_days": {
"name": "PPL x2",
"rotation": ["push", "pull", "legs", "push", "pull", "legs"],
"days": {
"push": {
"name": "Push (Bröst, Axlar, Triceps)",
"exercises": [
{ "id": "bench_press", "sets": 4, "reps": "8-10", "rest": "2-3 min" },
{ "id": "overhead_press", "sets": 4, "reps": "8-10", "rest": "2 min" },
{ "id": "dumbbell_press", "sets": 3, "reps": "10-12", "rest": "90 sek", "note": "Incline" },
{ "id": "lateral_raise", "sets": 4, "reps": "12-15", "rest": "60 sek" },
{ "id": "cable_fly", "sets": 3, "reps": "12-15", "rest": "60 sek" },
{ "id": "tricep_pushdown", "sets": 3, "reps": "12-15", "rest": "60 sek" }
]
},
"pull": {
"name": "Pull (Rygg, Biceps)",
"exercises": [
{ "id": "deadlift", "sets": 3, "reps": "6-8", "rest": "3 min", "note": "Eller RDL" },
{ "id": "pull_ups", "sets": 4, "reps": "8-10", "rest": "2 min" },
{ "id": "barbell_row", "sets": 4, "reps": "8-10", "rest": "2 min" },
{ "id": "lat_pulldown", "sets": 3, "reps": "10-12", "rest": "90 sek" },
{ "id": "face_pull", "sets": 3, "reps": "15-20", "rest": "60 sek" },
{ "id": "bicep_curl", "sets": 4, "reps": "10-12", "rest": "60 sek" }
]
},
"legs": {
"name": "Legs (Ben & Core)",
"exercises": [
{ "id": "squat", "sets": 4, "reps": "8-10", "rest": "3 min" },
{ "id": "romanian_deadlift", "sets": 4, "reps": "10-12", "rest": "2 min" },
{ "id": "leg_press", "sets": 3, "reps": "12-15", "rest": "90 sek" },
{ "id": "leg_curl", "sets": 4, "reps": "10-12", "rest": "60 sek" },
{ "id": "leg_extension", "sets": 3, "reps": "12-15", "rest": "60 sek" },
{ "id": "plank", "sets": 3, "reps": "45-60 sek", "rest": "60 sek" }
]
}
}
},
"5_days": {
"name": "Upper/Lower/Push/Pull/Legs",
"rotation": ["upper", "lower", "push", "pull", "legs"],
"days": {
"upper": {
"name": "Överkropp (Styrka)",
"exercises": [
{ "id": "bench_press", "sets": 4, "reps": "6-8", "rest": "3 min" },
{ "id": "barbell_row", "sets": 4, "reps": "6-8", "rest": "3 min" },
{ "id": "overhead_press", "sets": 3, "reps": "8-10", "rest": "2 min" },
{ "id": "pull_ups", "sets": 3, "reps": "8-10", "rest": "2 min" }
]
},
"lower": {
"name": "Underkropp (Styrka)",
"exercises": [
{ "id": "squat", "sets": 4, "reps": "6-8", "rest": "3 min" },
{ "id": "deadlift", "sets": 3, "reps": "5-6", "rest": "3 min" },
{ "id": "leg_press", "sets": 3, "reps": "10-12", "rest": "2 min" },
{ "id": "leg_curl", "sets": 3, "reps": "10-12", "rest": "90 sek" }
]
},
"push": {
"name": "Push (Volym)",
"exercises": [
{ "id": "dumbbell_press", "sets": 4, "reps": "10-12", "rest": "90 sek" },
{ "id": "lateral_raise", "sets": 4, "reps": "12-15", "rest": "60 sek" },
{ "id": "cable_fly", "sets": 4, "reps": "12-15", "rest": "60 sek" },
{ "id": "tricep_pushdown", "sets": 4, "reps": "12-15", "rest": "60 sek" }
]
},
"pull": {
"name": "Pull (Volym)",
"exercises": [
{ "id": "lat_pulldown", "sets": 4, "reps": "10-12", "rest": "90 sek" },
{ "id": "barbell_row", "sets": 3, "reps": "10-12", "rest": "90 sek" },
{ "id": "face_pull", "sets": 4, "reps": "15-20", "rest": "60 sek" },
{ "id": "bicep_curl", "sets": 4, "reps": "12-15", "rest": "60 sek" }
]
},
"legs": {
"name": "Ben (Volym)",
"exercises": [
{ "id": "leg_press", "sets": 4, "reps": "12-15", "rest": "90 sek" },
{ "id": "romanian_deadlift", "sets": 4, "reps": "10-12", "rest": "2 min" },
{ "id": "leg_extension", "sets": 4, "reps": "12-15", "rest": "60 sek" },
{ "id": "leg_curl", "sets": 4, "reps": "12-15", "rest": "60 sek" }
]
}
}
}
},
"progression": {
"rule": "Öka vikt när du når toppen av rep-range i alla sets",
"example": "3x12 reps? Nästa pass: öka vikt, sikta på 3x8, bygg upp till 3x12 igen",
"deload": {
"when": "Stagnation eller vecka 5",
"method": "50% volym, samma intensitet"
}
}
}
@@ -0,0 +1,74 @@
{
"id": "strength_5x5",
"name": "Styrkeprogram 5x5",
"goal": "strength",
"description": "Klassiskt 5x5-upplägg för maximal styrkeökning. Fokus på de stora lyftena med progressiv överbelastning.",
"experience_level": ["intermediate", "advanced"],
"duration_weeks": 8,
"workouts_per_week": [3, 4],
"principles": [
"5 sets x 5 reps på basövningar (85% av 1RM)",
"Öka vikten med 2.5kg varje vecka om alla reps klaras",
"3-5 min vila mellan tunga set",
"Deload vecka 4 och 8"
],
"split": {
"3_days": {
"name": "A/B/A - B/A/B",
"rotation": ["A", "B", "A"],
"days": {
"A": {
"name": "Knäböj & Bänk",
"exercises": [
{ "id": "squat", "sets": 5, "reps": 5, "intensity": "85%", "rest": "3-5 min" },
{ "id": "bench_press", "sets": 5, "reps": 5, "intensity": "85%", "rest": "3-5 min" },
{ "id": "barbell_row", "sets": 5, "reps": 5, "intensity": "80%", "rest": "2-3 min" }
]
},
"B": {
"name": "Knäböj & Press",
"exercises": [
{ "id": "squat", "sets": 5, "reps": 5, "intensity": "85%", "rest": "3-5 min" },
{ "id": "overhead_press", "sets": 5, "reps": 5, "intensity": "85%", "rest": "3-5 min" },
{ "id": "deadlift", "sets": 1, "reps": 5, "intensity": "90%", "rest": "5 min" }
]
}
}
},
"4_days": {
"name": "Upper/Lower",
"rotation": ["upper", "lower", "rest", "upper", "lower"],
"days": {
"upper": {
"name": "Överkropp",
"exercises": [
{ "id": "bench_press", "sets": 5, "reps": 5, "intensity": "85%", "rest": "3-5 min" },
{ "id": "barbell_row", "sets": 5, "reps": 5, "intensity": "80%", "rest": "3 min" },
{ "id": "overhead_press", "sets": 4, "reps": 6, "intensity": "80%", "rest": "2-3 min" },
{ "id": "pull_ups", "sets": 3, "reps": "max", "rest": "2 min" }
]
},
"lower": {
"name": "Underkropp",
"exercises": [
{ "id": "squat", "sets": 5, "reps": 5, "intensity": "85%", "rest": "3-5 min" },
{ "id": "deadlift", "sets": 3, "reps": 5, "intensity": "85%", "rest": "4 min" },
{ "id": "leg_press", "sets": 3, "reps": 8, "intensity": "75%", "rest": "2 min" },
{ "id": "leg_curl", "sets": 3, "reps": 10, "rest": "90 sek" }
]
}
}
}
},
"progression": {
"rule": "Om alla reps klaras, öka vikten nästa pass",
"increment": {
"upper_body": 2.5,
"lower_body": 5.0
},
"deload": {
"when": "2 missade pass i rad eller vecka 4/8",
"reduction": "10%"
}
}
}