Skills recipe-to-list
Turn recipes into a Todoist Shopping list. Extract ingredients from recipe photos (Gemini Flash vision) or recipe web pages (search + fetch), then compare against the existing Shopping project with conservative synonym/overlap rules, skip pantry staples (salt/pepper), and sum quantities when units match. Also saves each cooked recipe into the workspace cookbook (recipes/).
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/borahm/recipe-to-list" ~/.claude/skills/clawdbot-skills-recipe-to-list && rm -rf "$T"
manifest:
skills/borahm/recipe-to-list/SKILL.mdsource content
Create Shopping List (Gemini Flash + Todoist)
Target flow:
- Input is either a photo or a recipe web search
- Extract ingredients (Gemini Flash for photos; web_fetch text → Gemini for websites)
- Pull current Todoist Shopping list
- Compare using overlap + synonym mapping (kept conservative; only merge high-confidence equivalents like coriander↔cilantro, panko↔breadcrumbs)
- Update Shopping (default: add only missing items; skip salt/pepper)
Use the bundled script to handle the photo → ingredients → Shopping update part.
It also automatically saves a markdown entry into
recipes/ (your cookbook knowledge base) and appends to recipes/index.md.
For recipe-name → web search, do it confirm-first using
web_search + web_fetch, then feed the ingredients into the same update logic (and save the recipe).
Prereqs
- Env:
(orGEMINI_API_KEY
) for GeminiGOOGLE_API_KEY - Env:
for TodoistTODOIST_API_TOKEN - Bin:
(todoist-ts-cli)todoist
Output formatting
- Items are reformatted to start with the ingredient name, followed by a parenthetical quantity.
- The Shopping list is kept flat (no Todoist sections/groups).
Run
python3 skills/recipe-to-list/scripts/recipe_to_list.py \ --image /path/to/photo.jpg \ --title "<optional title>" \ --source "photo:/path/to/photo.jpg"
Optional flags
(default; falls back automatically) or any compatible Gemini vision model--model gemini-2.0-flash
to print extracted items without creating tasks--dry-run
to prefix each created task--prefix "[Recipe] "
to skip checking your existing Shopping list--no-overlap-check
to include salt/pepper--include-pantry
to skip saving into--no-saverecipes/
What to send to the model
The script prompts Gemini to return strict JSON:
{ "items": ["2 large globe eggplants", "kosher salt", "..."], "notes": "optional" }
If parsing fails, rerun with a clearer crop (ingredients list only) or provide a manual list.