ClawdBites
by @kylelol
Extract recipes from Instagram reels. Use when a user sends an Instagram reel link and wants to get the recipe from the caption. Parses ingredients, instructions, and macros into a clean format.
clawhub install clawdbitesπ About This Skill
name: clawdbites description: Extract recipes from Instagram reels. Use when a user sends an Instagram reel link and wants to get the recipe from the caption. Parses ingredients, instructions, and macros into a clean format. homepage: https://github.com/kylelol/ClawdBites metadata: {"clawdbot":{"emoji":"π¦","os":["darwin","linux"],"requires":{"bins":["yt-dlp","ffmpeg","whisper"]},"install":[{"id":"yt-dlp","kind":"brew","formula":"yt-dlp","bins":["yt-dlp"],"label":"Install yt-dlp via Homebrew"},{"id":"ffmpeg","kind":"brew","formula":"ffmpeg","bins":["ffmpeg"],"label":"Install ffmpeg via Homebrew"},{"id":"whisper","kind":"shell","command":"pip3 install --user openai-whisper","label":"Install Whisper (local, no API key)"}]}}
Instagram Recipe Extractor
Extract recipes from Instagram reels using a multi-layered approach: 1. Caption parsing β Instant, check description first 2. Audio transcription β Whisper (local, no API key) 3. Frame analysis β Vision model for on-screen text
No Instagram login required. Works on public reels.
When to Use
How It Works (MANDATORY FLOW)
ALWAYS follow this complete flow β do not stop after caption if instructions are missing:
1. User sends Instagram reel URL
2. Extract metadata using yt-dlp (--dump-json)
3. Parse the caption for recipe details
4. Check completeness: Does caption have BOTH ingredients AND instructions?
- β
YES: Present the recipe
- β NO (missing instructions or incomplete): Automatically proceed to audio transcription β do NOT stop or ask the user
5. If audio transcription needed:
- Download video: yt-dlp -o "/tmp/reel.mp4" "URL"
- Extract audio: ffmpeg -y -i /tmp/reel.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 /tmp/reel.wav
- Transcribe: whisper /tmp/reel.wav --model base --output_format txt --output_dir /tmp
- Merge caption ingredients with audio instructions
6. Present clean, formatted recipe (combining caption + audio as needed)
7. User decides what to do (save to notes, add to wishlist, etc.)
Completeness check heuristics:
Extraction Command
yt-dlp --dump-json "https://www.instagram.com/reel/SHORTCODE/" 2>/dev/null
Key fields from JSON output:
description β The caption containing the recipeuploader β Creator's namechannel β Creator's handlewebpage_url β Original URLlike_count β Popularity indicatorRecipe Parsing
Look for these patterns in the caption:
Macros:
Ingredients:
Sections:
Output Format
Present extracted recipe cleanly:
## [Recipe Name]
*From @[handle]*Macros (per serving): X cal | Xg P | Xg C | Xg F
Ingredients
[ingredient 1]
[ingredient 2]
...Instructions
1. [step 1]
2. [step 2]
...
Source: [original URL]
User Actions After Extraction
Let the user decide what to do:
memory/recipe-wishlist.jsonWishlist Storage
Optional storage for recipes user wants to try later:
memory/recipe-wishlist.json:
{
"recipes": [
{
"name": "Recipe Name",
"source": "instagram",
"sourceUrl": "https://instagram.com/reel/...",
"handle": "@creator",
"addedDate": "2026-01-26",
"tried": false,
"macros": {
"calories": 585,
"protein": 56,
"carbs": 25,
"fat": 28,
"servings": 3
},
"ingredients": [...],
"instructions": [...]
}
]
}
Error Handling
If yt-dlp fails:
If no recipe found in caption (IMPORTANT):
After extracting, scan the caption for recipe indicators:
If none found, tell the user clearly:
> "I pulled the caption but it doesn't look like the recipe is there β it might just be a teaser or the recipe is only shown in the video itself. Here's what the caption says: > > [show caption] > > A few options: > 1. Check the comments β sometimes creators post recipes there > 2. Check their bio link β might lead to the full recipe > 3. Describe what you saw in the video and I can help find a similar recipe"
Recipe detection heuristics:
HAS_RECIPE if caption contains:
3+ ingredient-like patterns (quantity + food item)
OR "recipe" + ingredient list
OR macro breakdown + ingredients
OR numbered/bulleted instructions NO_RECIPE if caption is:
Mostly hashtags
Just a description/teaser
Under 100 characters
No quantities or measurements
Integration with meal-planner
The meal-planner skill can reference this skill:
Audio Transcription (V2) β MANDATORY FALLBACK
When caption is missing instructions, ALWAYS transcribe the audio automatically. Do not stop and ask the user β just do it. This is the most common case since creators often put ingredients in captions but speak the instructions.
Step 1: Download video
yt-dlp -o "/tmp/reel.mp4" "https://instagram.com/reel/XXX"
Step 2: Extract audio
ffmpeg -i /tmp/reel.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 /tmp/reel.wav
Step 3: Transcribe with Whisper
/Users/kylekirkland/Library/Python/3.14/bin/whisper /tmp/reel.wav --model base --output_format txt --output_dir /tmp
Step 4: Parse transcript for recipe Look for cooking instructions, ingredients mentioned verbally.
Inference for Missing Measurements
ALWAYS infer quantities when not provided. Never present a recipe without amounts β estimate based on context and standard package sizes.
Vague Language β Specific Amounts
| What they say | Infer | |--------------|-------| | "some chicken" | ~1 lb | | "a bit of garlic" | 2-3 cloves | | "handful of spinach" | ~2 cups | | "drizzle of oil" | 1-2 tbsp | | "season to taste" | Β½ tsp salt, ΒΌ tsp pepper | | "splash of soy sauce" | 1-2 tbsp | | "a few tablespoons" | 2-3 tbsp | | "some rice" | 1 cup dry | | "cheese on top" | Β½ - 1 cup shredded | | "diced onion" | 1 medium onion | | "bell peppers" | 2 peppers |
Standard Package Sizes (when item mentioned without amount)
| Ingredient | Standard Package | Infer | |------------|------------------|-------| | Puff pastry | 17oz sheet | 1 sheet | | Ground beef/turkey | 1 lb pack | 1 lb | | Chicken breast | ~1.5 lb pack | 1.5 lbs | | Sausage links | 14oz / 4-5 links | 1 package | | Bacon | 12oz / 12 slices | Β½ package (6 slices) | | Shredded cheese | 8oz bag | 1-2 cups | | Tortillas | 8-10 count | 1 package | | Canned beans | 15oz can | 1 can | | Broth/stock | 32oz carton | 1-2 cups | | Pasta | 16oz box | 8oz (half box) | | Rice | 2 lb bag | 1-2 cups dry |
Context-Aware Scaling
By recipe type:
By servings mentioned:
By protein target (if user has macro goals):
Output Format
Always present inferred amounts clearly:
### Ingredients
1 lb ground turkey *(estimated)*
1 medium onion, diced *(estimated)*
2 cups broth *(estimated based on typical soup)*
Mark inferred quantities with *(estimated)* so user knows what came from the source vs inference.
Combined Extraction Flow
1. TRY CAPTION (instant)
βββ yt-dlp --dump-json β parse description
βββ Recipe found? β DONE β
βββ Check for "pinned" / "in comments" / "check comments" β FLAG
2. IF FLAGGED: CHECK FOR CREATOR COMMENT
βββ Look through comments for creator's username
βββ If creator comment found with recipe β DONE β
βββ If not found β continue + notify user3. TRY AUDIO (30-60 sec)
βββ Download video
βββ Extract audio with ffmpeg
βββ Transcribe with Whisper (base model)
βββ Parse transcript for recipe
βββ Infer missing measurements
βββ Recipe found? β DONE β
4. PRESENT RESULTS + PROMPT IF NEEDED
βββ Show what was extracted from audio
βββ If "pinned" was flagged, tell user:
"The creator mentioned the full recipe is pinned in the comments.
I extracted what I could from the audio, but if you want the
exact measurements, paste the pinned comment here and I'll
merge it with what I found."
5. TRY FRAME ANALYSIS (if audio incomplete)
βββ Extract 5-8 key frames with ffmpeg
βββ Send to Claude vision
βββ Ask: "Extract any recipe text, ingredients, or measurements shown"
βββ Merge findings with audio transcript
6. FALLBACK (nothing found)
βββ Inform user: "Recipe wasn't in caption or audio/video"
βββ Offer: search for similar recipe based on video title/description
Frame Analysis
Extract key frames and analyze with vision model.
Extract frames:
# Extract 1 frame every 5 seconds
ffmpeg -i /tmp/reel.mp4 -vf "fps=1/5" /tmp/frame_%02d.jpgOr extract specific number of frames evenly distributed
ffmpeg -i /tmp/reel.mp4 -vf "select='not(mod(n,30))'" -vsync vfr /tmp/frame_%02d.jpg
Send to vision model: Use Claude's image analysis to read each frame:
Vision prompt:
Analyze this frame from a cooking video. Extract any:
Recipe name or title
Ingredients with quantities
Cooking instructions
Nutritional information / macros
Any other recipe-related text shown If no recipe text is visible, respond with "No recipe text found."
Merge strategy:
Pinned Comment Detection
Scan caption for these phrases (case-insensitive):
If detected, flag and notify user after extraction:
> "Heads up β the creator said the recipe is pinned in the comments. > I got what I could from the audio, but yt-dlp can't access pinned comments > without login. If you want the exact recipe, copy the pinned comment and > send it to me β I'll format it properly."
Requirements
yt-dlp β brew install yt-dlpffmpeg β brew install ffmpegwhisper β pip3 install openai-whisper (runs locally, no API key)