Install
openclaw skills install nutrition-cliUse this skill for anything related to food, nutrition, calories, macros, protein, fat, carbohydrates, fiber, vitamins, meal tracking, diet goals, weight man...
openclaw skills install nutrition-cliLook up nutrition data for any food, log meals, track daily intake against your goals, compare foods, estimate calorie burn, and view trends — all from the command line.
On the very first message that triggers this skill, check if nutrition tracking is configured:
Run: nutrition config status
If output is "Not configured":
Read and follow skill/ONBOARDING.md exactly.
If output is "Configured": Continue normally. Do not re-run onboarding.
Triggers: "I had X", "I ate X", "just had X", "log X", "add X to my food log", any food mentioned in passing.
Steps:
Extract food name and optional grams from the message. Examples: "200g chicken" → food="chicken breast", grams=200 "a big mac" → food="big mac", grams=null (use default 100g) "2 eggs" → food="eggs", grams=null (use default)
Run: nutrition search "{FOOD}" --grams {GRAMS} --format json
Show the result summary (name, kcal, protein, fat, carbs).
Ask: "Should I log this?" — wait for confirmation before writing.
On confirmation: Run: nutrition log "{FOOD}" --grams {GRAMS}
After logging, append one line to today's daily memory note (memory/YYYY-MM-DD.md):
Format: - {TIME} · {FOOD_NAME} · {KCAL} kcal (P:{P}g F:{F}g C:{C}g)
Then append running total: **Running total: {TOTAL_KCAL} / {TARGET} kcal**
This write is mandatory — it's what makes "what have I eaten today?" instant.
Check for patterns (see Learning section below).
Memory note: Only write nutrition data to MEMORY.md and memory/ files in private/DM sessions. In group contexts, skip the memory write step and log only to log.json.
Use the cheapest source that can answer the question. Check in order:
nutrition log --check-todaymemory_search "{phrase}" across memory/ daily notes — do NOT call the CLInutrition summary --days 30nutrition summary --weeknutrition trend --days 14nutrition top-foods --days 90nutrition summary --date YYYY-MM-DDnutrition summary --weeknutrition search "{FOOD}" --grams {GRAMS} --format jsonnutrition barcode {CODE}Never jump to step 3 or 4 if step 1 or 2 can answer it.
Write silently — do not announce "I've updated your memory." Update memory when you observe patterns. Do not wait to be asked.
Trigger: user declines a suggested food, expresses dislike, or asks for an alternative ("I don't eat X", "I'm not a fan of Y", "can I have Z instead")
Action: append to "Learned food preferences" in MEMORY.md:
- Dislikes: {FOOD} (noted {DATE})
or - Prefers {FOOD_A} over {FOOD_B} (noted {DATE})
Trigger: user asks for the same food 3+ times across different days
Action: append: - Frequently eats: {FOOD} (logged {N} times)
Trigger: after 7 days of tracking, actual meal times differ from stated times by >45 min on average
Action: update meal times in MEMORY.md "Nutrition profile" to match observed times. Say: "I've updated your meal times in my memory to match when you actually eat."
Trigger: user consistently goes over or under target by >15% for 5+ days
Action: append to MEMORY.md "Health context":
Over: - Tends to exceed calorie target (observed {DATE})
Under: - Often under-eats on {DAY_PATTERN} (observed {DATE})
Do NOT suggest changing the target without being asked.
Trigger: user mentions health conditions, fitness goals, or medications ("I'm trying to lose weight", "I have diabetes", "I'm training for a marathon")
Action: append to MEMORY.md "Health context":
- {HEALTH_NOTE} (mentioned {DATE})
Only write what the user explicitly stated. Never infer diagnoses.
Trigger: every time a meal is logged
Action: Run: nutrition log --update-streak
Trigger: user misses a full day (no meals by 10pm)
Action: reset streak next morning. Do not mention it unless the user asks.
Triggers: "set up reminders", "remind me to log meals", "set up daily tracking", or during onboarding step 6.
Ask the user which reminders they want and at what times before running any commands. Do not assume default times. Only create the cron jobs for the reminders they selected.
Available reminders:
Morning summary: Ask: "What time do you want your morning summary?" (e.g. 7am, 8:30am) Parse to hour H and minute M. Then run:
openclaw cron add \
--name "nutrition-morning" \
--cron "{M} {H} * * *" \
--tz "{TIMEZONE}" \
--session nutrition-tracker \
--message "Run: nutrition summary --yesterday and present it clearly. \
Compare totals to target from MEMORY.md. \
If they hit their calorie goal yesterday, say so specifically. \
If they're on a streak of 3+ days, mention it." \
--announce
Evening check-in: Ask: "What time do you want your evening check-in?" (e.g. 7pm, 9pm) Parse to hour H and minute M (24h). Then run:
openclaw cron add \
--name "nutrition-evening" \
--cron "{M} {H} * * *" \
--tz "{TIMEZONE}" \
--session nutrition-tracker \
--system-event "Evening nutrition check-in. Ask the user what they ate today. \
For each food they mention, run: nutrition search '{food}' to get calories, \
confirm with user, then run: nutrition log '{food}'. \
After all meals logged, run: nutrition summary --today and show the result." \
--wake now
Weekly report (always Monday): Ask: "What time on Monday do you want your weekly report?" (e.g. 9am) Parse to hour H and minute M. Then run:
openclaw cron add \
--name "nutrition-weekly" \
--cron "{M} {H} * * 1" \
--tz "{TIMEZONE}" \
--session nutrition-tracker \
--message "Run: nutrition summary --week and nutrition top-foods --days 7. \
Present a weekly report: average daily calories, best day, worst day, \
protein compliance, current streak. Format as a short readable summary." \
--announce
After setup: confirm which jobs were created and when they'll fire next.
To view: openclaw cron list
To disable a specific job: openclaw cron disable nutrition-evening (or -morning, -weekly)
When to use: User asks about nutrition info, calories, macros for a specific food.
nutrition search "chicken breast" --grams 200
nutrition search "brown rice" --grams 150 --format json
nutrition search "avocado" --rda --sex female --age 25
--grams (default 100): serving size--format summary|json: json when processing programmatically--rda: show percentage of daily recommended intake--sex male|female and --age: adjust RDA targetsWhen to use: User provides a barcode (8-13 digits) or wants to scan a product.
nutrition barcode 3017624010701
nutrition barcode 5000159459228 --grams 50
Returns Nutri-Score, NOVA group, allergens, and vegan/vegetarian status.
When to use: User confirms logging a food after seeing search results.
nutrition log "chicken breast" --grams 200
nutrition log --check-today # returns meal count (integer)
nutrition log --update-streak # updates and returns streak
nutrition log --check-yesterday # returns true/false
When to use: User asks what they've eaten, daily totals, or trends.
nutrition summary # today
nutrition summary --yesterday
nutrition summary --week
nutrition summary --date 2026-04-01
nutrition summary --days 14
When to use: User asks about their progress over time.
nutrition trend --days 7
nutrition top-foods --days 30
When to use: User wants to compare nutrients side by side.
nutrition compare "chicken breast" "tofu" "salmon"
nutrition compare "white rice" "brown rice" --grams 200
When to use: User describes a multi-food meal.
nutrition meal "200g chicken breast" "150g brown rice" "1 avocado"
nutrition meal "200g chicken" "100g rice" --rda --sex female
When to use: User asks how many calories an activity burns.
nutrition burn running 30
nutrition burn cycling 45 --weight 80
Activities: running, jogging, cycling, walking, swimming, hiking, rowing, jump rope, dancing, yoga, pilates, weightlifting, climbing, tennis, basketball, soccer, volleyball, skiing, skateboarding, elliptical
When to use: User asks what their daily intake should be.
nutrition daily --sex female --age 25 --weight 60 --height 165 --activity moderate
nutrition config set --kcal 2000 --protein 150
nutrition config set --usda-key YOUR_KEY
nutrition config set --default-grams 150
nutrition config set --timezone America/New_York --start-date 2026-04-01
nutrition config status # returns "Configured" or "Not configured"
nutrition config show # full profile display
When you see a rate limit error from the CLI, surface it to the user exactly as printed — do not paraphrase or retry silently. The error contains the URL and steps needed.
Also append to today's daily note: - [RATE LIMIT HIT - {TIME}]
Always mention whether data came from USDA or Open Food Facts when presenting
results. The source is in the summary output and the source field of json output.