Files
gravl/.planning/research/09-exercise-databases.md
T
clawd 403a16c137 Add exercise database research
Comprehensive analysis of exercise data sources:
- ExerciseDB API (1,300+ exercises with GIFs)
- wger (open source, self-hostable)
- free-exercise-db (public domain)
- MusclesWorked, API Ninjas

Includes:
- Data structure recommendations
- Exercise substitution patterns
- Import script examples
- License summary
2026-02-15 22:21:38 +01:00

11 KiB

Övningsdatabaser & APIs — Research för Gravl

Sammanfattning

Det finns flera högkvalitativa, gratis och open source övningsdatabaser tillgängliga. De bästa alternativen är:

Databas Övningar Media Licens API
ExerciseDB 1,300-11,000 GIF Open Source REST
wger 800+ Bilder AGPL REST
free-exercise-db 800+ Bilder Public Domain JSON
MusclesWorked 856 Commercial REST + MCP
API Ninjas 3,000+ Freemium REST

Rekommendation: Kombinera ExerciseDB (GIF-demos, omfattande) med wger (open source, self-hosted möjligt).


Top Picks

1. ExerciseDB API (Rekommenderat)

URL: https://exercisedb.dev / https://github.com/cyberboyanmol/exercisedb-api

Styrkor:

  • 1,300+ övningar (v1) eller 11,000+ (v2)
  • GIF-demonstrationer för varje övning
  • Detaljerad metadata
  • Open source (self-hostable)
  • Aktiv utveckling

Data per övning:

{
  "id": "0001",
  "name": "3/4 sit-up",
  "target": "abs",
  "bodyPart": "waist",
  "equipment": "body weight",
  "gifUrl": "https://...",
  "secondaryMuscles": ["hip flexors"],
  "instructions": [
    "Lie flat on your back with your knees bent...",
    "Place your hands behind your head...",
    "..."
  ]
}

Endpoints:

GET /exercises                    - Alla övningar
GET /exercises/bodyPart/{part}    - Filter på kroppsdel
GET /exercises/equipment/{equip}  - Filter på utrustning
GET /exercises/target/{muscle}    - Filter på målmuskel
GET /exercises/{id}               - Specifik övning

Bodyparts:

  • back, cardio, chest, lower arms, lower legs
  • neck, shoulders, upper arms, upper legs, waist

Equipment:

  • assisted, band, barbell, body weight, bosu ball
  • cable, dumbbell, elliptical machine, ez barbell
  • hammer, kettlebell, leverage machine, medicine ball
  • olympic barbell, resistance band, roller, rope
  • skierg machine, sled machine, smith machine
  • stability ball, stationary bike, stepmill machine
  • tire, trap bar, upper body ergometer, weighted
  • wheel roller

2. wger (Open Source, Self-Hosted)

URL: https://wger.de / https://github.com/wger-project/wger

Styrkor:

  • Helt open source (AGPL)
  • Self-hosted möjligt (Docker)
  • 800+ övningar
  • Stöd för flera språk (inkl. svenska möjligt)
  • Workout manager ingår
  • Nutrition tracking ingår
  • REST API

Data per övning:

{
  "id": 9,
  "uuid": "1b020b3a-3732-4c7e-92fd-a0cec90ed69b",
  "category": 10,
  "muscles": [1, 2],
  "muscles_secondary": [3],
  "equipment": [10],
  "license": 2,
  "license_author": "wger.de"
}

API Endpoints:

GET /api/v2/exercise/           - Lista övningar
GET /api/v2/muscle/             - Lista muskler
GET /api/v2/equipment/          - Lista utrustning
GET /api/v2/exerciseimage/      - Övningsbilder
GET /api/v2/exercisevideo/      - Övningsvideor

Self-hosting:

git clone https://github.com/wger-project/wger
cd wger
docker compose up -d

3. free-exercise-db (Public Domain)

URL: https://github.com/yuhonas/free-exercise-db

Styrkor:

Data format:

{
  "name": "Barbell Bench Press",
  "force": "push",
  "level": "intermediate",
  "mechanic": "compound",
  "equipment": "barbell",
  "primaryMuscles": ["chest"],
  "secondaryMuscles": ["shoulders", "triceps"],
  "instructions": ["..."],
  "category": "strength",
  "images": ["Barbell-Bench-Press/0.jpg", "Barbell-Bench-Press/1.jpg"]
}

GitHub stats: 1,100+ stars, aktivt community


4. MusclesWorked API

URL: https://musclesworked.com

Styrkor:

  • 856 övningar, 63 muskler, 7,310+ mappings
  • REST API + MCP server (för AI-agenter)
  • Detaljerad muskel-mapping

Begränsningar:

  • Kommersiell (API key krävs)
  • Ingen media (bilder/video)

Endpoints:

GET /api/v1/exercises
GET /api/v1/muscles
GET /api/v1/exercise/{id}/muscles

5. API Ninjas Exercises

URL: https://api-ninjas.com/api/exercises

Styrkor:

  • 3,000+ övningar
  • Enkel att använda
  • Filter på namn, typ, muskel, svårighetsgrad

Begränsningar:

  • Freemium (gratis tier har limits)
  • Ingen media

Endpoint:

GET https://api.api-ninjas.com/v1/exercises?muscle=biceps&difficulty=beginner

Exercise Substitution (Alternativa övningar)

Problemet

"The bench is taken, what do I do instead?"

Användare vill kunna byta övning till en som tränar samma muskelgrupp.

Lösningar

1. Muskelgrupp-baserad substitution

def get_alternatives(exercise_id):
    exercise = get_exercise(exercise_id)
    target_muscle = exercise.target
    
    alternatives = db.query("""
        SELECT * FROM exercises
        WHERE target = %s
        AND id != %s
        ORDER BY popularity DESC
        LIMIT 5
    """, [target_muscle, exercise_id])
    
    return alternatives

2. Utrustnings-baserad substitution

def get_alternatives_for_equipment(exercise_id, available_equipment):
    exercise = get_exercise(exercise_id)
    target_muscle = exercise.target
    
    alternatives = db.query("""
        SELECT * FROM exercises
        WHERE target = %s
        AND equipment = ANY(%s)
        AND id != %s
    """, [target_muscle, available_equipment, exercise_id])
    
    return alternatives

3. Sweat App-approach

Sweat har built-in substitution:

  • Samma muskelgrupp
  • Liknande rörelse-pattern (push/pull/hinge)
  • Utrustning användaren har

4. Tonal's Movement Replacements

280+ movement substitutes kategoriserade efter:

  • Target muscle
  • Movement pattern
  • Equipment required
  • Difficulty level

Substitution-data

Fitness Volt Substitute Finder: https://fitnessvolt.com/substitute-exercises/

Manuellt kurerad lista av alternativ för varje övning.


Video/GIF Sources

Gratis/Open Source

Källa Format Kvalitet Licens
ExerciseDB GIF Bra Open
wger Video/Bild Varierar AGPL
free-exercise-db Bild Bra Public Domain

Kommersiella

Källa Format Övningar Pris
Gym Visual GIF/Video 1000+ $$
Central Athlete Video 2,800+ $$$
Exercise.com Video Omfattande $$$
JEFIT GIF 1,400+ I appen

Skapa egna

GIPHY: Sök "exercise" för community-uploads (osäker licens)

AI-genererade: Modeller som kan generera exercise-demos utvecklas, men kvaliteten är ännu inte där.


Datastruktur för Gravl

Rekommenderad schema

CREATE TABLE exercises (
    id SERIAL PRIMARY KEY,
    external_id VARCHAR(50),        -- ID från extern källa
    source VARCHAR(50),             -- 'exercisedb', 'wger', 'custom'
    
    -- Basic info
    name VARCHAR(255) NOT NULL,
    name_sv VARCHAR(255),           -- Svenskt namn
    description TEXT,
    instructions TEXT[],
    
    -- Categorization
    body_part VARCHAR(50),          -- 'chest', 'back', etc.
    target_muscle VARCHAR(50),      -- Primary muscle
    secondary_muscles VARCHAR(50)[], -- Secondary muscles
    equipment VARCHAR(50),
    
    -- Metadata
    difficulty VARCHAR(20),         -- 'beginner', 'intermediate', 'advanced'
    force_type VARCHAR(20),         -- 'push', 'pull', 'static'
    mechanic VARCHAR(20),           -- 'compound', 'isolation'
    
    -- Media
    gif_url VARCHAR(500),
    image_urls TEXT[],
    video_url VARCHAR(500),
    
    -- Gravl-specific
    is_active BOOLEAN DEFAULT true,
    popularity_score INT DEFAULT 0,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    updated_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE exercise_alternatives (
    exercise_id INT REFERENCES exercises(id),
    alternative_id INT REFERENCES exercises(id),
    similarity_score DECIMAL(3,2),  -- 0.0 - 1.0
    reason VARCHAR(100),            -- 'same_muscle', 'same_equipment', etc.
    PRIMARY KEY (exercise_id, alternative_id)
);

-- Index för snabb lookup
CREATE INDEX idx_exercises_target ON exercises(target_muscle);
CREATE INDEX idx_exercises_equipment ON exercises(equipment);
CREATE INDEX idx_exercises_body_part ON exercises(body_part);

Import-script

import requests
import json

def import_exercisedb():
    """Import exercises from ExerciseDB API"""
    
    response = requests.get("https://exercisedb.p.rapidapi.com/exercises", 
        headers={"X-RapidAPI-Key": API_KEY})
    
    exercises = response.json()
    
    for ex in exercises:
        db.execute("""
            INSERT INTO exercises (
                external_id, source, name, body_part, 
                target_muscle, equipment, gif_url, instructions
            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
            ON CONFLICT (external_id, source) DO UPDATE
            SET gif_url = EXCLUDED.gif_url,
                updated_at = NOW()
        """, [
            ex['id'], 'exercisedb', ex['name'], ex['bodyPart'],
            ex['target'], ex['equipment'], ex['gifUrl'], 
            ex.get('instructions', [])
        ])

Rekommendationer för Gravl

Phase 1: MVP

  1. Använd ExerciseDB som primär källa

    • 1,300+ övningar med GIF
    • Gratis, open source
    • Bra API
  2. Importera till lokal databas

    • Cache för performance
    • Möjlighet att lägga till custom övningar
    • Offline-stöd
  3. Basic substitution

    • Samma target muscle = alternativ
    • Visa 3-5 alternativ per övning

Phase 2: Enhanced

  1. Lägg till svenska namn

    • Manuellt eller via översättning
    • Community contributions
  2. Smarter substitution

    • Equipment-aware
    • Difficulty-matching
    • Movement pattern-matching
  3. Custom exercises

    • Användare kan lägga till egna
    • Upload egen GIF/video

Phase 3: Advanced

  1. AI-driven substitution

    • "Axeln gör ont" → undvik overhead press
    • "Bänken upptagen" → DB press istället
  2. Video tutorials

    • Licens commercial content
    • Eller skapa egna
  3. Form analysis

    • Pose estimation
    • Jämför mot ideal form

Licens-sammanfattning

Källa Kan använda kommersiellt Attribution krävs
ExerciseDB (open) Rekommenderas
wger (AGPL) Ja, och dela ändringar
free-exercise-db (Unlicense) Nej
API Ninjas ⚠️ Check terms Ja
MusclesWorked 💰 Betala Enligt avtal

Säkraste valet: free-exercise-db (Public Domain) + ExerciseDB (Open Source)


Källa: GitHub, ExerciseDB, wger, Reddit, Exa AI Search — 2023-2026