<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Changelog — Loz</title><description>Everything we ship or fix in Loz, in detail.</description><link>https://lozapp.space/</link><language>en</language><item><title>New feature: Pull ingredients straight out of a recipe video</title><link>https://lozapp.space/en/changelog/video-ingredient-extraction/</link><guid isPermaLink="true">https://lozapp.space/en/changelog/video-ingredient-extraction/</guid><description>Paste a TikTok or YouTube link on an attempt and Loz reads the description, pulls out ingredient candidates, and lets you review them before anything is added.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-shipped&quot; style=&quot;scroll-margin-top:80px&quot;&gt;What shipped&lt;/h2&gt;&lt;p&gt;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&amp;#39;s gone now.&lt;/p&gt;
&lt;p&gt;On any recipe attempt, you can paste a TikTok or YouTube link and Loz will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fetch the video&amp;#39;s description and cache it, so pasting the same link twice doesn&amp;#39;t hit the source again.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Match each candidate against our ingredient dictionary using fuzzy matching, so &amp;quot;زبده&amp;quot; and &amp;quot;بترينا&amp;quot; resolve to the same ingredient family even with typos or brand names mixed in.&lt;/li&gt;
&lt;li&gt;Show you a review list before anything touches your attempt — you decide what gets added, edited, or thrown out.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nothing is added silently. The suggestions land in the same ingredient picker you already use, with quantities and units pre-filled when we&amp;#39;re confident about them.&lt;/p&gt;
&lt;h2 id=&quot;why-this-took-a-new-package&quot; style=&quot;scroll-margin-top:80px&quot;&gt;Why this took a new package&lt;/h2&gt;&lt;p&gt;The extraction and parsing logic that used to live inside &lt;code&gt;packages/core&lt;/code&gt; — 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&amp;#39;s now &lt;code&gt;@recipe/ingredients-domain&lt;/code&gt;, a standalone workspace package with no dependency on Convex or React. That&amp;#39;s not user-facing, but it&amp;#39;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.&lt;/p&gt;
&lt;h2 id=&quot;under-the-hood&quot; style=&quot;scroll-margin-top:80px&quot;&gt;Under the hood&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;New Convex functions handle the TikTok/YouTube description fetch, with a small cache layer (&lt;code&gt;video-description-cache&lt;/code&gt;) so repeated pastes of the same link are free.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;cook-vocabulary&lt;/code&gt; matcher sits between raw extracted text and the ingredient dictionary, tuned on real recipe-video phrasing rather than generic product names.&lt;/li&gt;
&lt;li&gt;Rate limiting was extended to cover the new video-ingestion path, so this can&amp;#39;t be used to hammer TikTok/YouTube on your behalf.&lt;/li&gt;
&lt;li&gt;A dish&amp;#39;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;also-in-this-release&quot; style=&quot;scroll-margin-top:80px&quot;&gt;Also in this release&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;fix:&lt;/strong&gt; insights generation now has a hard ceiling per signed-in cook, so a burst of requests can&amp;#39;t run away.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fix:&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>v0.15.0</category></item></channel></rss>