v0.20.0-beta
Summaryโ
This release is focused on making the web app work offline, introduces recipe provenance and improves on several (AI) workflows.
Featuresโ
AI recipe enrichmentโ
๐ Recipe enrichment
- Every recipe now enters the same 'enrichment' flow after it is saved. Previously what you got depended on how the recipe entered Norish: a link import that AI had to read skipped the background work entirely, pasted recipes got two of the four, image imports got none, and a recipe you typed in got nothing at all.
- Speed over completeness in this case, first we create a recipe that is useable. Enrichment is enrolled separately and cannot delay a save, undo one, or turn a successful import into a failure.
- Six switches under Settings => Admin => AI: auto-tagging, allergy detection, auto-categorization, nutrition estimation, recipe provenance and ingredient linking. When a switch is turned on, the option runs automatically when a recipe is imported. Manually running them is possible even when the feature is off.
- Enrich All Recipes: an action under Settings => Admin => AI & Processing queues every enabled enrichment kind for every recipe on the server, so a library imported before you switched things on can catch up. It replaces the old Categorize All Recipes button.
Recipe provenanceโ
๐ Recipe provenance
- Norish can now work out where a recipe originates from.
- The country's name and the explanation are written in the language the recipe itself is written in
- When several countries claim a dish, inference picks the single strongest claim and acknowledges the rivals in the note.
- Provenance you or your import source already provided is never replaced: automatic inference fills in only the missing parts. Only a manual Work Out Provenance replaces the whole group.
Ingredients in cooking stepsโ
๐ Step ingredients ยท Creating and editing recipes
- A step can now carry the ingredients it uses, shown beneath the step. "add half the water" reads 25 ml water when the line is 50 ml, so the arithmetic is never yours to do.
- Amounts are computed at the moment you read them, from the live ingredient line: they follow every edit, the active measurement system, and the servings control. A line with no amount shows its name only.
- In the recipe form, every step has a chips row: type
@to mention an ingredient. - An entered amount is kept as the equivalent share of its line, so it scales.
- The old render-time
@-token linking in step text has been deprecated in its favour. Legacy@tokens in stored recipes now read as the literal text they always were; nothing is migrated or rewritten. - In the admin settings Settings => Admin => AI it is possible to turn on automatic inference of steps so that they are automatically linked as a background job using AI. ๐ Letting AI fill the gaps
AI Prompts adjustableโ
๐ AI provider, Prompts
- Three more prompts are administrator-editable, auto-categorization, allergy detection, and image extraction. listed under Settings => Admin => AI & Processing => Prompts.
Web app works offlineโ
๐ Use Norish offline
- The web app now keeps a guaranteed offline set on your device, this set includes:
- your 50 most recent recipes.
- All groceries per store
- This weeks planned recipes
- A Live/Offline indicator in the user menu opens a status view showing the connection state, what is cached, and any queued changes, with retry and discard controls.
- Syncing should be duplicate safe as every queued change carries an operation id, so a change is applied at most once even if it has to be resent.
Fixes and Improvementsโ
- A nutrition estimate is complete or it is rejected. An estimate must carry all four values, calories, fat, carbs, and protein; zero counts as a value, a gap does not. A model answer missing any of them is retried and, if it keeps failing, the run fails instead of half-filling the group.
- Adding a recipe to the calendar from its own page works again. (#511).
- Choosing a store while adding or editing a grocery works again, and a grocery that merges into an item already on the list no longer loses the store you picked for it. Thanks to @jankosk (#519).
- Deleting a store works again. The confirmation dialog opened above the Manage Stores panel but swallowed every click, so neither Delete nor Cancel did anything.
- A video import with AI disabled is refused immediately.
- Transcription requests now time out. Previously a lot of the providers would ignore the timout. Transcription now runs under the same
AI_TIMEOUT_MSvariabele. - More video platforms import as videos. Pinterest(
pin.it), regional Pinterest domains, X (Twitter), Threads, Snapchat, Vimeo, Dailymotion, Douyin, Bilibili, and RedNote join YouTube, Instagram, TikTok, and Facebook. - Instagram reels are no longer mistaken for photo posts. (#513).
- Extraction works on models that reject
temperature. Newer models, Anthropic'sclaude-sonnet-5among them, answer any request carrying a temperature with an error instead of ignoring it. (#514) - The yt-dlp version on the admin screen is now a live report, and read-only.
- The AI temperature slider in Settings => Admin => AI renders its track and handle again, so the value can be adjusted. Thanks to @pannal (#499).
- The language selector now default new languages to disabled. Thanks to @AfoxDesignz
- ๐ง๐ฌ Bulgarian language support. Thanks to @coldkubernetes (#502).
Up nextโ
For the next few updates I have the following planned:
- Import and export functionallity this has been long overdue and I've promised it multiple times.
- Making ingredients 'first class citizens', meaning each ingredient gets its own nutritional values: kcal, fats, protein, carbohydrates. The idea is that When your database gets large enough it should be easy to estimate full recipes based on their ingredients alone and thus we no longer need AI to do the estimations.#469
- Dedicated print layout.#313
- When multiple cookies have been set for the same domain rotate the accounts. #515
- Crowdin to make translating easier.
- The mobile apps need to get some focus again so I will do that after the above has been shipped.
note
Currently I am very busy at work and can't always find the motivation work at Norish after hours so releases have been a bit slow. To keep the cadence up I am planning to make the big releases (0.x.x) smaller. E.g. import/export will be it's own version. Previously I would've grouped all 4 of the up next items together.
Upgrade notesโ
- API change:
POST /recipes/import/urlnow returns an object. It used to answer with a bare recipe id, and with409 Conflictwhen you already had the recipe. It now returns{ "recipeId": "โฆ", "status": "queued" | "exists" },existscarrying the id of the recipe you already hold, so a client can open it instead of reporting a failure. A409now means only that an import of that URL is already in flight. - Recipe enrichment: We tried to migrate automatically but please check in the admin settings whether your old settings still apply. New enrichment modes are turned off by default.
- The Categorize All Recipes admin button is replaced by Enrich All Recipes.
- Automatic nutrition estimation now runs on incomplete groups.
- Inline
@-token linking in step text is retired. - The
LEGACY_RECIPE_PARSER_ROLLBACKsetting has been removed. The structured recipe parser has been the default since its rollout.
Contributorsโ
- @pannal for the AI temperature slider fix and several more!
- @jankosk for the grocery store selector fixes.
- @coldkubernetes for the Bulgarian translation.
- @AfoxDesignz for the language selector.