Use it when your goal in extending the agent is clear and you can limit it to the data and actions it actually needs.
Fitness Nutrition
Workout planning, macros, and body metrics via wger/USDA
What does it add to Hermes?
Workout planning, macros, and body metrics via wger/USDA
Fitness Nutrition is a skill related to extending the agent. It adds a capability or workflow to Hermes. The publisher description explains the intent, while granted permissions determine what it can actually do.
This plain-language explanation is based on the publisher description. The original text remains visible for verification.
Do not add it merely to experiment when Hermes already has a simpler path, or when you cannot review its source and permissions.
Best for users who want a repeatable way of working inside Hermes.
Start with non-sensitive data and a small task whose result can be verified and reversed.
Workout planning, macros, and body metrics via wger/USDA
This entry was indexed from Hermes Optional Skills. Our explanation interprets the type and domain without inventing a capability not present upstream.
The source is official or editorially reviewed, but you still need to review permissions and version compatibility.
Inspect, install, then test.
- 01Open the source
Match the publisher, license, and description to your need. Check the real update history.
- 02Review permissions and secrets
Never paste a secret value into this site. Use environment-variable names and grant the smallest scope.
- 03Copy setup only after review
The controls below copy text. They do not execute commands on your device.
- 04Test with a non-sensitive task
Inspect the visible tools, then exclude write or delete tools you do not need.
Review the command, then copy it.
hermes skills install fitness-nutritionHermes Belarabi does not execute this command. Installation happens on your device and remains subject to Hermes scanning and your review.
Exactly what Hermes loads when this skill runs.
Reproduced from the official documentation. Read it before enabling the skill: this text becomes the agent's instructions.
Workout planning, macros, and body metrics via wger/USDA.
Skill metadata
A lookup table. Do not read it all; find the row that applies to you.
| Source | Optional — install with hermes skills install official/health/fitness-nutrition |
| Path | optional-skills/health/fitness-nutrition |
| Version | 1.0.0 |
| Author | Hailey Marshall (haileymarshall), Hermes Agent |
| License | MIT |
| Platforms | linux, macos, windows |
| Tags | health, fitness, nutrition, gym, workout, diet, exercise |
Reference: full SKILL.md
Settings you configure once. Change one at a time so you can see what each does. Set DEMO_KEY in your environment, not in the chat.
Expert fitness coach and sports nutritionist skill. Two data sources plus offline calculators — everything a gym-goer needs in one place.
Data sources (all free, no pip dependencies):
- wger (https://wger.de/api/v2/) — open exercise database, 690+ exercises with muscles, equipment, images. Public endpoints need zero authentication.
- USDA FoodData Central (https://api.nal.usda.gov/fdc/v1/) — US government nutrition database, 380,000+ foods.
DEMO_KEYworks instantly; free signup for higher limits.
Offline calculators (pure stdlib Python):
- BMI, TDEE (Mifflin-St Jeor), one-rep max (Epley/Brzycki/Lombardi), macro splits, body fat % (US Navy method)
---
When to Use
Explains the idea itself. Read it slowly; the later sections build on it.
Trigger this skill when the user asks about:
- Exercises, workouts, gym routines, muscle groups, workout splits
- Food macros, calories, protein content, meal planning, calorie counting
- Body composition: BMI, body fat, TDEE, caloric surplus/deficit
- One-rep max estimates, training percentages, progressive overload
- Macro ratios for cutting, bulking, or maintenance
---
Procedure
A lookup table. Do not read it all; find the row that applies to you.
Exercise Lookup (wger API)
All wger public endpoints return JSON and require no auth. Always add
format=json and language=2 (English) to exercise queries.
Step 1 — Identify what the user wants:
- By muscle → use
/api/v2/exercise/?muscles={id}&language=2&status=2&format=json - By category → use
/api/v2/exercise/?category={id}&language=2&status=2&format=json - By equipment → use
/api/v2/exercise/?equipment={id}&language=2&status=2&format=json - By name → use
/api/v2/exercise/search/?term={query}&language=english&format=json - Full details → use
/api/v2/exerciseinfo/{exercise_id}/?format=json
Step 2 — Reference IDs (so you don't need extra API calls):
Exercise categories:
| ID | Category |
|---|---|
| 8 | Arms |
| 9 | Legs |
| 10 | Abs |
| 11 | Chest |
| 12 | Back |
| 13 | Shoulders |
| 14 | Calves |
| 15 | Cardio |
Muscles:
| ID | Muscle | ID | Muscle |
|---|---|---|---|
| 1 | Biceps brachii | 2 | Anterior deltoid |
| 3 | Serratus anterior | 4 | Pectoralis major |
| 5 | Obliquus externus | 6 | Gastrocnemius |
| 7 | Rectus abdominis | 8 | Gluteus maximus |
| 9 | Trapezius | 10 | Quadriceps femoris |
| 11 | Biceps femoris | 12 | Latissimus dorsi |
| 13 | Brachialis | 14 | Triceps brachii |
| 15 | Soleus |
Equipment:
| ID | Equipment |
|---|---|
| 1 | Barbell |
| 3 | Dumbbell |
| 4 | Gym mat |
| 5 | Swiss Ball |
| 6 | Pull-up bar |
| 7 | none (bodyweight) |
| 8 | Bench |
| 9 | Incline bench |
| 10 | Kettlebell |
Step 3 — Fetch and present results:
# Search exercises by name
QUERY="$1"
ENCODED=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$QUERY")
curl -s "https://wger.de/api/v2/exercise/search/?term=${ENCODED}&language=english&format=json" \
| python3 -c "
data=json.load(sys.stdin)
for s in data.get('suggestions',[])[:10]:
d=s.get('data',{})
print(f\" ID {d.get('id','?'):>4} | {d.get('name','N/A'):<35} | Category: {d.get('category','N/A')}\")
"# Get full details for a specific exercise
EXERCISE_ID="$1"
curl -s "https://wger.de/api/v2/exerciseinfo/${EXERCISE_ID}/?format=json" \
| python3 -c "
data=json.load(sys.stdin)
trans=[t for t in data.get('translations',[]) if t.get('language')==2]
t=trans[0] if trans else data.get('translations',[{}])[0]
desc=re.sub('<[^>]+>','',html.unescape(t.get('description','N/A')))
print(f\"Exercise : {t.get('name','N/A')}\")
print(f\"Category : {data.get('category',{}).get('name','N/A')}\")
print(f\"Primary : {', '.join(m.get('name_en','') for m in data.get('muscles',[])) or 'N/A'}\")
print(f\"Secondary : {', '.join(m.get('name_en','') for m in data.get('muscles_secondary',[])) or 'none'}\")
print(f\"Equipment : {', '.join(e.get('name','') for e in data.get('equipment',[])) or 'bodyweight'}\")
print(f\"How to : {desc[:500]}\")
imgs=data.get('images',[])
if imgs: print(f\"Image : {imgs[0].get('image','')}\")
"# List exercises filtering by muscle, category, or equipment
# Combine filters as needed: ?muscles=4&equipment=1&language=2&status=2
FILTER="$1" # e.g. "muscles=4" or "category=11" or "equipment=3"
curl -s "https://wger.de/api/v2/exercise/?${FILTER}&language=2&status=2&limit=20&format=json" \
| python3 -c "
data=json.load(sys.stdin)
print(f'Found {data.get(\"count\",0)} exercises.')
for ex in data.get('results',[]):
print(f\" ID {ex['id']:>4} | muscles: {ex.get('muscles',[])} | equipment: {ex.get('equipment',[])}\")
"Nutrition Lookup (USDA FoodData Central)
Uses USDA_API_KEY env var if set, otherwise falls back to DEMO_KEY.
DEMO_KEY = 30 requests/hour. Free signup key = 1,000 requests/hour.
# Search foods by name
FOOD="$1"
API_KEY="${USDA_API_KEY:-DEMO_KEY}"
ENCODED=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$FOOD")
curl -s "https://api.nal.usda.gov/fdc/v1/foods/search?api_key=${API_KEY}&query=${ENCODED}&pageSize=5&dataType=Foundation,SR%20Legacy" \
| python3 -c "
data=json.load(sys.stdin)
foods=data.get('foods',[])
if not foods: print('No foods found.'); sys.exit()
for f in foods:
n={x['nutrientName']:x.get('value','?') for x in f.get('foodNutrients',[])}
cal=n.get('Energy','?'); prot=n.get('Protein','?')
fat=n.get('Total lipid (fat)','?'); carb=n.get('Carbohydrate, by difference','?')
print(f\"{f.get('description','N/A')}\")
print(f\" Per 100g: {cal} kcal | {prot}g protein | {fat}g fat | {carb}g carbs\")
print(f\" FDC ID: {f.get('fdcId','N/A')}\")
print()
"# Detailed nutrient profile by FDC ID
FDC_ID="$1"
API_KEY="${USDA_API_KEY:-DEMO_KEY}"
curl -s "https://api.nal.usda.gov/fdc/v1/food/${FDC_ID}?api_key=${API_KEY}" \
| python3 -c "
d=json.load(sys.stdin)
print(f\"Food: {d.get('description','N/A')}\")
print(f\"{'Nutrient':<40} {'Amount':>8} {'Unit'}\")
print('-'*56)
for x in sorted(d.get('foodNutrients',[]),key=lambda x:x.get('nutrient',{}).get('rank',9999)):
nut=x.get('nutrient',{}); amt=x.get('amount',0)
if amt and float(amt)>0:
print(f\" {nut.get('name',''):<38} {amt:>8} {nut.get('unitName','')}\")
"Offline Calculators
Use the helper scripts in scripts/ for batch operations,
or run inline for single calculations:
python3 scripts/body_calc.py bmi <weight_kg> <height_cm>python3 scripts/body_calc.py tdee <weight_kg> <height_cm> <age> <M|F> <activity 1-5>python3 scripts/body_calc.py 1rm <weight> <reps>python3 scripts/body_calc.py macros <tdee_kcal> <cut|maintain|bulk>python3 scripts/body_calc.py bodyfat <M|F> <neck_cm> <waist_cm> [hip_cm] <height_cm>
See references/FORMULAS.md for the science behind each formula.
---
Pitfalls
Settings you configure once. Change one at a time so you can see what each does. Set DEMO_KEY in your environment, not in the chat.
- wger exercise endpoint returns all languages by default — always add
language=2for English - wger includes unverified user submissions — add
status=2to only get approved exercises - USDA
DEMO_KEYhas 30 req/hour — addsleep 2between batch requests or get a free key - USDA data is per 100g — remind users to scale to their actual portion size
- BMI does not distinguish muscle from fat — high BMI in muscular people is not necessarily unhealthy
- Body fat formulas are estimates (±3-5%) — recommend DEXA scans for precision
- 1RM formulas lose accuracy above 10 reps — use sets of 3-5 for best estimates
- wger's
exercise/searchendpoint usestermnotqueryas the parameter name
---
Verification
Explains the idea itself. Read it slowly; the later sections build on it.
After running exercise search: confirm results include exercise names, muscle groups, and equipment. After nutrition lookup: confirm per-100g macros are returned with kcal, protein, fat, carbs. After calculators: sanity-check outputs (e.g. TDEE should be 1500-3500 for most adults).
---
Quick Reference
A lookup table. Do not read it all; find the row that applies to you.
| Task | Source | Endpoint |
|---|---|---|
| Search exercises by name | wger | GET /api/v2/exercise/search/?term=&language=english |
| Exercise details | wger | GET /api/v2/exerciseinfo/{id}/ |
| Filter by muscle | wger | GET /api/v2/exercise/?muscles={id}&language=2&status=2 |
| Filter by equipment | wger | GET /api/v2/exercise/?equipment={id}&language=2&status=2 |
| List categories | wger | GET /api/v2/exercisecategory/ |
| List muscles | wger | GET /api/v2/muscle/ |
| Search foods | USDA | GET /fdc/v1/foods/search?query=&dataType=Foundation,SR Legacy |
| Food details | USDA | GET /fdc/v1/food/{fdcId} |
| BMI / TDEE / 1RM / macros | offline | python3 scripts/body_calc.py |