Pull ingredients straight out of a recipe video
Published on September 22, 2026
What shipped
If you cook from videos, you already know the ritual: pause, scroll to the description, squint at a wall of hashtags and emoji looking for the ingredient list, then re-type all of it into your log by hand. That's gone now.
On any recipe attempt, you can paste a TikTok or YouTube link and Loz will:
- Fetch the video's description and cache it, so pasting the same link twice doesn't hit the source again.
- Run it through a dedicated extraction pipeline that separates real ingredient lines from captions, hashtags, calls-to-action, and creator boilerplate — in Arabic and English, including Arabic quantity words and numerals.
- Match each candidate against our ingredient dictionary using fuzzy matching, so "زبده" and "بترينا" resolve to the same ingredient family even with typos or brand names mixed in.
- Show you a review list before anything touches your attempt — you decide what gets added, edited, or thrown out.
Nothing is added silently. The suggestions land in the same ingredient picker you already use, with quantities and units pre-filled when we're confident about them.
Why this took a new package
The extraction and parsing logic that used to live inside packages/core — the ingredient parser, the section classifier, the Arabic quantity normalizer — grew enough surface area (and enough of its own test suite) that it deserved to stand on its own. It's now @recipe/ingredients-domain, a standalone workspace package with no dependency on Convex or React. That's not user-facing, but it's why this release also touches a lot of files that have nothing to do with video: imports moved, nothing behaviorally changed for existing ingredient parsing.
Under the hood
- New Convex functions handle the TikTok/YouTube description fetch, with a small cache layer (
video-description-cache) so repeated pastes of the same link are free. - A
cook-vocabularymatcher sits between raw extracted text and the ingredient dictionary, tuned on real recipe-video phrasing rather than generic product names. - Rate limiting was extended to cover the new video-ingestion path, so this can't be used to hammer TikTok/YouTube on your behalf.
- A dish's ingredient count is now computed directly from its attempts instead of asking a model to guess it — a small correctness fix that shipped alongside this.
Also in this release
- fix: insights generation now has a hard ceiling per signed-in cook, so a burst of requests can't run away.
- fix: ingredient extraction no longer treats an entire free-text description as one giant ingredient list when the source has no real structure — it backs off instead of guessing.