Skills sparky
SparkyFitness CLI for food diary, exercise tracking, biometric check-ins, and health summaries.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/aronjanosch/sparky" ~/.claude/skills/openclaw-skills-sparky && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/aronjanosch/sparky" ~/.openclaw/skills/openclaw-skills-sparky && rm -rf "$T"
manifest:
skills/aronjanosch/sparky/SKILL.mdsource content
sparky
Use
sparky to interact with a self-hosted SparkyFitness server — log food, exercise, weight, steps, and mood.
Install
- Homebrew (macOS/Linux):
brew tap aronjanosch/tap && brew install sparky-cli - Build from source (requires Go 1.21+):
git clone https://github.com/aronjanosch/sparky-cli cd sparky-cli go build -o sparky . sudo mv sparky /usr/local/bin/ - Pre-built binaries: https://github.com/aronjanosch/sparky-cli/releases (Linux, macOS, Windows — amd64/arm64)
Setup (once)
— e.g.sparky config set-url <url>sparky config set-url https://sparky.example.comsparky config set-key <key>sparky config show
— verify connectionsparky ping
Food
- Search:
— local DB first, falls back to Open Food Facts; shows Brand columnsparky food search "chicken breast" [-l 10] - Search by barcode:
— exact product lookup, no ambiguitysparky food search --barcode 4061458284547 - Log by name:
sparky food log "chicken breast" -m lunch -q 150 -u g [-d YYYY-MM-DD] - Log by barcode:
— most reliable, no brand guessingsparky food log --barcode 4061458284547 -m lunch -q 113 -u g - Log by ID:
— skips search, unambiguoussparky food log --id <uuid> -m lunch -q 150 -u g - Pick result:
— select Nth search result instead of promptingsparky food log "Hähnchenbrust" --pick 2 - Create custom:
— adds a custom food to your library; defaults to 100g serving; optional: --fiber, --sugar, --sodium, --saturated-fat, --brand, --serving-size, --serving-unitsparky food create "My Meal" --calories 450 --protein 28 --carbs 42 --fat 16 - Diary:
sparky food diary [-d YYYY-MM-DD] - Delete entry:
— removes a diary entrysparky food delete <uuid> - Remove from library:
— purge a food from your local library (get UUID viasparky food remove <uuid>
)sparky -j food search
Exercise
- Search:
— local DB first, falls back to Free Exercise DBsparky exercise search "bench press" [-l 10] - Search external only:
— bypasses local cachesparky exercise search --external "pushup" - Log by name:
sparky exercise log "Pushups" [--duration 45] [--calories 400] [-d YYYY-MM-DD] - Log by ID:
— skips search, unambiguoussparky exercise log --id <uuid> --set 10x80@8 --set 10x80@9 - Sets format:
— e.g.REPS[xWEIGHT][@RPE]
= 10 reps, 80 kg, RPE 8;10x80@8
or10x80
also valid10@8 - Notes:
sparky exercise log "Pushups" --notes "felt strong" - Diary:
sparky exercise diary [-d YYYY-MM-DD] - Delete:
sparky exercise delete <uuid>
Check-ins
- Weight:
sparky checkin weight 75.5 [-u kg|lbs] [-d YYYY-MM-DD] - Steps:
sparky checkin steps 9500 [-d YYYY-MM-DD] - Mood:
sparky checkin mood 8 [-n "notes"] [-d YYYY-MM-DD] - Diary:
— shows biometrics + mood togethersparky checkin diary [-d YYYY-MM-DD]
Summary & trends
— nutrition/exercise/wellbeing totals (default: last 7 days)sparky summary [-s YYYY-MM-DD] [-e YYYY-MM-DD]
— day-by-day nutrition tablesparky trends [-n 30]
Agentic workflow (always prefer --id to avoid ambiguity)
Exercise — search first, then log by ID:
# 1. Find candidates; use --external to bypass local cache if needed sparky -j exercise search --external "pushup" # Each result has is_local: true/false # is_local: true → id is a UUID → use --id directly # is_local: false → id is a source string → log by exact name to import first, # then search again to get the UUID # 2a. Local exercise sparky -j exercise log --id <uuid> --set 3x10@8 # 2b. External exercise (import on first log, then switch to --id) sparky -j exercise log "Pushups" --set 3x10 sparky -j exercise search "Pushups" # now is_local: true sparky -j exercise log --id <uuid> --set 3x10
Food — preferred agentic workflow:
# Option A: barcode (most reliable) sparky food log --barcode 4061458284547 -q 113 -u g -m lunch # Option B: search → inspect brand+macros → log by --id sparky -j food search "Hähnchenbrust" # check brand + calories in results; pick the right one sparky food log --id <uuid> -q 400 -u g -m dinner # Option C: search with --pick N (when brand column shows the right one) sparky food log "Hähnchenbrust" --pick 3 -q 400 -u g -m dinner # Remove a bad import from local library sparky -j food search "bad product" # get the food's id (UUID) sparky food remove <uuid>
Custom food (when you have nutrition facts and it's not in the DB):
# Ingredients/beverages — nutrition per 100g/ml (default) sparky -j food create "Craft Beer" --calories 43 --protein 0.5 --carbs 3.6 --fat 0 --serving-unit ml sparky -j food log --id <uuid> -q 330 -m dinner # Meals (Cookidoo, Chefkoch, etc.) — nutrition per serving, specify explicitly sparky -j food create "Lasagna" --calories 450 --protein 28 --carbs 42 --fat 16 --serving-size 1 --serving-unit serving sparky -j food log --id <uuid> -q 1 -m dinner
Notes
/-j
is a root-level flag:--json
, notsparky -j food diarysparky food diary -j- Always verify brand in search results before logging — Open Food Facts has many products with identical names
is the most reliable option when the product has a scannable barcode--barcode
selects the Nth result (1-based); exact local name match bypasses--pick N
entirely--pick- In JSON mode with ambiguous results, the CLI always picks
— useresults[0]
in scripts to be safe--id - Both search commands fall back to online providers automatically; matches are added to your library on first log
- Weight is stored in kg; lbs are auto-converted (
)166 lbs → 75.30 kg - Full UUIDs for delete:
sparky -j food diary | jq '.[0].id' - Meal options:
,breakfast
,lunch
,dinner
(default:snacks
)snacks