Skip to main content

Extract structured recipes from YouTube cooking videos with Claude, stored in local SQLite.

Project description

Mise En Place (mep)

A personal CLI that turns YouTube cooking videos into a searchable recipe database. It pulls a video's transcript, extracts a structured recipe with Claude, and stores it in local SQLite. Everything stays on your machine.

Install

git clone <this-repo> mep && cd mep
python -m venv .venv && source .venv/bin/activate
pip install -e .

Setup

mep init

This creates ~/.mep/, prompts for two API keys, and builds the database at ~/.mep/mep.db.

  • Anthropic API key (required): https://console.anthropic.com/ → API Keys.
  • YouTube Data API v3 key (only needed for --channel ingestion): see below.

Keys are stored in ~/.mep/config.json. You can also set ANTHROPIC_API_KEY or YOUTUBE_API_KEY as environment variables, which override the config file.

Getting a YouTube Data API v3 key

  1. Go to the Google Cloud Console.
  2. Create a project (top bar → project dropdown → New Project).
  3. In the search bar, open YouTube Data API v3 and click Enable.
  4. Go to APIs & Services → Credentials → Create Credentials → API key.
  5. Copy the key. (Optional: Edit API key → Restrict key → YouTube Data API v3.)

Single-video adds use YouTube's public oEmbed endpoint and do not need this key. It is only required to walk a channel's uploads.

Usage

mep add https://www.youtube.com/watch?v=VIDEO_ID    # one video
mep add --channel @JKenjiLopezAlt --limit 10        # latest 10 from a channel
mep add --channel @JKenjiLopezAlt                    # whole channel

mep search "garlic confit"                           # full-text search
mep list                                             # browse, newest first
mep list --tag italian --limit 20                    # filter by tag
mep show 42                                           # full recipe
mep show 42 --servings 8                              # scale ingredient amounts

mep plan 42                                          # AI cooking timeline (experimental)
mep plan 42 --servings 8                             # ...scaled to 8 servings
mep cook 42                                          # step-by-step walkthrough (experimental)

mep show 42 --parts                                  # what each ingredient is for
mep adapt 42                                         # rewrite around what you have (interactive)
mep adapt 42 --have pita --sub "yogurt=sour cream"   # ...or state it directly
mep cook 42 --have pita                              # adapt just for this cook

plan makes one Claude call to reorder a recipe's steps into an efficient timeline and caches it. Each step is tagged hands-on or hands-off, with the ingredients and equipment it uses, a named timer for waits, and a "prep this during the wait" hint. The summary shows realistic wall-clock time (hands-off waits run in the background, not added end to end). Re-run plan --regenerate to rebuild.

cook walks that timeline live: it opens with a mise en place gather + equipment list, then one step at a time. On a hands-off step, pressing Enter starts a named background timer that keeps counting while you move on to the next step (like a real kitchen timer); it rings when done. It also nudges you to preheat the oven a couple steps ahead. Ctrl-C stops cleanly and reports any timers still running.

--servings N (on show, plan, cook) scales ingredient amounts to N servings. It is best-effort and display-only: only leading quantities are scaled, vague amounts like "a handful" pass through untouched, and nothing is saved. If the recipe's serving count can't be read, amounts are shown unscaled with a note.

Both plan and cook are experimental: the timings are AI estimates.

show --parts breaks a recipe into its components (marinade, pita, sauce…) so you can see what each ingredient is for. adapt rewrites the recipe around what you already have: pick the parts you bought or made ahead and it drops the steps and ingredients needed only to make those (keeping the steps that use them), and applies any ingredient swaps. It then offers to save the result as a new copy, overwrite the original, or discard it. cook --have/--sub does the same rewrite in memory for a single cook without saving anything. These are experimental and use Claude; the rewrite is intentionally light (it shifts and trims the recipe, it doesn't reinvent it).

Channel ingestion is idempotent: videos already stored are skipped, so you can re-run it to pick up only what's new. Non-recipe videos and videos without transcripts are stored as empty entries (not errors) so they aren't re-fetched.

Channels to try

Recipe-forward channels that work well (most videos are real walkthroughs with transcripts). Single-video adds need no key; the --channel walk needs a YouTube Data API key (see above).

Channel Handle
Babish Culinary Universe @babishculinaryuniverse
J. Kenji López-Alt @JKenjiLopezAlt
Joshua Weissman @joshuaweissman
Adam Ragusea @aragusea
Ethan Chlebowski @EthanChlebowski
Brian Lagerstrom @brianlagerstrom
Food Wishes (Chef John) @foodwishes
mep add https://www.youtube.com/watch?v=iErqWGwso7o   # a single Babish video, no key needed
mep add --channel @aragusea --limit 5                 # latest 5 from Adam Ragusea

How it works

url → transcript (youtube-transcript-api) → Claude (claude-sonnet-4-20250514) → JSON → SQLite. Search uses SQLite FTS5 over dish name, ingredients, and channel. Vague quantities like "a handful" are stored verbatim — nothing is normalized. See docs/plans/ for the full design.

Develop

pip install -e '.[dev]'
pytest

The test suite is fully offline (no network, no API keys).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mise_en_place-0.1.0.tar.gz (36.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mise_en_place-0.1.0-py3-none-any.whl (35.4 kB view details)

Uploaded Python 3

File details

Details for the file mise_en_place-0.1.0.tar.gz.

File metadata

  • Download URL: mise_en_place-0.1.0.tar.gz
  • Upload date:
  • Size: 36.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mise_en_place-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2d5745d6175240f3f583dcb37fefb22c240c895032a5c96d0dfeb731177fc4d9
MD5 1fd4b0b0b3ebf254f01659b934e659fb
BLAKE2b-256 717f42b3672e43cb3a4616b9939184611a303385d520de2f454bfb86f4063a3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for mise_en_place-0.1.0.tar.gz:

Publisher: release.yml on AveryClapp/MiseEnPlace

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mise_en_place-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: mise_en_place-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 35.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mise_en_place-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 acda80dbddfd2062b3124c0179381ed9ee1a3e364561c878c4e9709529607502
MD5 a1bc08f142420b3753536ddd36321a77
BLAKE2b-256 201f2ee9fa75457355624dcbb70d6a5206ec6250f72a6e5db6ea41afb4a837be

See more details on using hashes here.

Provenance

The following attestation bundles were made for mise_en_place-0.1.0-py3-none-any.whl:

Publisher: release.yml on AveryClapp/MiseEnPlace

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page