v3.10.0

mealie-recipes/mealiev3.10.0Feb 2, 2026by github-actions[bot]

AI Summary

Major release with significant new features including recipe category import, custom OpenAI prompts, OpenAI structured outputs migration, and date range shopping list from meal planner.

Key Highlights

  • Import original URL categories during recipe import
  • Custom OpenAI prompts support
  • Migrated OpenAI implementation to use structured outputs
  • Add full range of dates from meal planner to shopping list
  • Toggle button for switching any/all mode for search filters

Breaking Changes

  • GET requests to /api/households/invitations now locked to admins only

New Features

  • Toggle button for switching any/all mode for search filters
  • Discard confirmation dialog for recipe editor
  • Added 'sprig' as a unit
  • Option to Import Recipe Category During Recipe Import
  • Customizable OpenAI prompts
  • Improve recipe assets preview
  • Migrate OpenAI implementation to use structured outputs
  • Add range of dates to shopping list from meal planner
  • Query relative dates

Full Release Notes

# 🍴🍴🍴🍴🍴🍴

This version of Mealie contains a whole bunch of new features and bug fixes, including first-time contributions from 9 users (and a new bot)! Check out the highlights below 👇 

## 🎉 Highlights

- When importing a recipe, you can now import the original URL's categories (similar to how you can import tags) (#6523)

- You can now use custom OpenAI prompts to overwrite the ones included with Mealie. [Check out the docs](https://docs.mealie.io/documentation/getting-started/installation/backend-config/#openai) for more info on how to do this (#6588)

- We've migrated our OpenAI implementation to use [structured outputs](https://platform.openai.com/docs/guides/structured-outputs). This means much better support for modern models, which previously didn't support the legacy JSON mode (#6964)

- You can now add a full range of dates from the meal planner to your shopping list, instead of adding one day at a time (#6981):
<img width="905" height="118" alt="image" src="https://github.com/user-attachments/assets/fe27fcd9-75c7-41ff-a082-bee048b6a397" />

## 🚨 Breaking changes

There is a minor breaking change in #6781: `GET` requests to `/api/households/invitations` are now locked to admins only. This doesn't change the invitation flow for users, as requests using a particular invitation are unaffected. Check out the PR for more details.

- fix: disable invitations when password login is disabled @p0lycarpio (#6781)

## ✨ New features

- feat: Use toggle button for switching any/all mode for search filters @lehnerpat (#6833)
- feat: add discard confirmation dialog for recipe editor @hay-kot (#6941)
- feat: Add "sprig" as a unit. @Fjodor42 (#6934)
- feat: Added Option to Import Recipe Category During Recipe Import @Gtt1229 (#6523)
- feat: Customizable OpenAI prompts (#5146) @ImanuelBertrand (#6588)
- feat: Improve recipe assets preview @p0lycarpio (#6602)
- feat: Migrate OpenAI implementation to use structured outputs @michael-genson (#6964)
- feat: Add range of dates to shopping list from meal planner @michael-genson (#6981)
- feat: Query relative dates @michael-genson (#6984)

## 🐛 Bug fixes

- fix: Tags can't be renamed @lehnerpat (#6835)
- fix: Coerce null servings into 0 servings @michael-genson (#6839)
- fix: prevent XSS via javascript: URIs in recipe actions @hay-kot (#6885)
- fix: Make 'auto-search' toggle change color to indicate state @lehnerpat (#6809)
- fix: correct global scroll strategy to prevent menu fixation @jeromer-dev (#6577)
- fix: use GITHUB_TOKEN for auto-merge to respect CI checks @hay-kot (#6953)
- fix: Keep ingredient headers in cook mode @codefaux (#6946)
- fix: dispose AlchemyExporter engine after restore completes @hay-kot (#6942)
- fix: Seed data - en-US only - correct [some] plural names and add [some] accented characters @stvhwrd (#6405)
- fix: sub-recipes in multi group setup (#6652) @ImanuelBertrand (#6663)
- fix: disable invitations when password login is disabled @p0lycarpio (#6781)
- fix: recipe context menu @p0lycarpio (#6782)
- fix: Disable context hover @michael-genson (#6962)
- fix: Remove deprecated warning from shopping list editor @michael-genson (#6963)
- fix: service-worker precache manifest entries not generated correctly @morgan-dgk (#6815)
- fix: Re-enable some style tags @michael-genson (#6982)
- fix: Flaky $NOW tests @michael-genson (#6990)

## 🧰 Maintenance

<details>
<summary>40 changes</summary>

- chore(l10n): Crowdin locale sync @github-actions (#6825)
- chore(l10n): New Crowdin updates @hay-kot (#6806)
- chore(l10n): New Crowdin updates @hay-kot (#6827)
- chore(l10n): New Crowdin updates @hay-kot (#6832)
- chore(l10n): New Crowdin updates @hay-kot (#6840)
- chore(l10n): New Crowdin updates @hay-kot (#6843)
- chore(l10n): New Crowdin updates @hay-kot (#6861)
- chore(l10n): New Crowdin updates @hay-kot (#6863)
- chore(l10n): New Crowdin updates @hay-kot (#6864)
- chore(l10n): Crowdin locale sync @github-actions (#6862)
- chore(auto): Update pre-commit hooks @github-actions (#6866)
- chore(l10n): New Crowdin updates @hay-kot (#6867)
- chore(l10n): New Crowdin updates @hay-kot (#6870)
- chore(l10n): New Crowdin updates @hay-kot (#6886)
- chore(auto): Update pre-commit hooks @github-actions (#6895)
- chore(l10n): New Crowdin updates @hay-kot (#6888)
- chore(l10n): Crowdin locale sync @github-actions (#6891)
- chore(l10n): New Crowdin updates @hay-kot (#6905)
- chore(l10n): New Crowdin updates @hay-kot (#6908)
- chore(l10n): New Crowdin updates @hay-kot (#6911)
- chore(l10n): New Crowdin updates @hay-kot (#6912)
- chore(l10n): New Crowdin updates @hay-kot (#6922)
- chore(l10n): New Crowdin updates @hay-kot (#6925)
- chore(l10n): Crowdin locale sync @github-actions (#6924)
- chore(l10n): New Crowdin updates @hay-kot (#6929)
- chore(l10n): New Crowdin updates @hay-kot (#6933)
- chore(auto): Update pre-commit hooks @github-actions (#6932)
- chore(l10n): New Crowdin updates @hay-kot (#6935)
- chore(l10n): New Crowdin updates @hay-kot (#6936)
- chore(l10n): New Crowdin updates @hay-kot (#6938)
- chore(l10n): New Crowdin updates @hay-kot (#6944)
- chore: add workflow to auto-merge l10n PRs @hay-kot (#6948)
- chore(l10n): New Crowdin updates @hay-kot (#6949)
- chore(l10n): New Crowdin updates @hay-kot (#6954)
- chore(l10n): New Crowdin updates @hay-kot (#6959)
- chore(l10n): New Crowdin updates @hay-kot (#6960)
- chore(l10n): New Crowdin updates @hay-kot (#6967)
- chore(l10n): Crowdin locale sync @mealie-actions (#6977)
- chore(l10n): New Crowdin updates @hay-kot (#6979)
- chore(l10n): New Crowdin updates @hay-kot (#6983)
- chore(l10n): New Crowdin updates @hay-kot (#6987)
</details>

## 📚 Documentation

- docs: Fix typo and remove unused tip @michael-genson (#6849)
- docs: fix authentik oidc link @Darwiner (#6851)
- docs: Add an info callout about client-side cookies. @alexandreeberhardt (#6830)
- docs: Misc. cleanup @michael-genson (#6988)

## 🔨 Internal development

- dev: Enable CI on merge queues @michael-genson (#6955)
- dev: Bunch of GH workflow fixes @michael-genson (#6956)
- dev: Skip Trivy on merge queue @michael-genson (#6957)
- dev: Add tasks for e2e tests @lehnerpat (#6797)
- dev: Improve caching in taskfile @lehnerpat (#6798)
- dev: Switch to bot token for locale sync @michael-genson (#6969)
- dev: Fix token vars @michael-genson (#6970)
- dev: Increase locale merge limit to 300 and allow PRs from Mealie bot @michael-genson (#6972)
- dev: Allow locale sync path in auto merge @michael-genson (#6974)
- dev: Switch approver for automated i18n merges @michael-genson (#6976)
- dev: Switch to Mealie bot for auto-merging @michael-genson (#6978)

## ⬆️ Dependency updates

<details>
<summary>27 changes</summary>

- fix(deps): update dependency pillow to v12.1.0 @renovate (#6816)
- chore(deps): update dependency types-requests to v2.32.4.20260107 @renovate (#6846)
- chore(deps): update dependency ruff to v0.14.11 @renovate (#6852)
- fix(deps): update dependency alembic to v1.18.0 @renovate (#6858)
- fix(deps): update dependency openai to v2.15.0 @renovate (#6859)
- chore(deps): update node.js to 0ab63ca @renovate (#6872)
- chore(deps): update dependency ruff to v0.14.13 @renovate (#6881)
- fix(deps): update dependency alembic to v1.18.1 @renovate (#6878)
- fix(deps): update dependency apprise to v1.9.7 @renovate (#6898)
- chore(deps): update node.js to b2b2184 @renovate (#6879)
- chore(deps): update dependency setuptools to v80.10.1 @renovate (#6901)
- fix(deps): update dependency sqlalchemy to v2.0.46 @renovate (#6903)
- chore(deps): update dependency ruff to v0.14.14 @renovate (#6909)
- fix(deps): update dependency pillow-heif to v1.2.0 @renovate (#6910)
- chore(deps): update dependency types-python-dateutil to v2.9.0.20260124 @renovate (#6913)
- chore(deps): update dependency rich to v14.3.0 @renovate (#6919)
- chore(deps): update dependency rich to v14.3.1 @renovate (#6923)
- fix(deps): update dependency python-multipart to v0.0.22 @renovate (#6926)
- fix(deps): update dependency openai to v2.16.0 @renovate (#6937)
- chore(deps): update dependency coverage to v7.13.2 @renovate (#6927)
- fix(deps): update dependency orjson to v3.11.6 @renovate (#6952)
- chore(deps): update dependency setuptools to v80.10.2 @renovate (#6930)
- fix(deps): update dependency alembic to v1.18.3 @renovate (#6945)
- fix(deps): update dependency pyjwt to v2.11.0 @renovate (#6958)
- fix(deps): update dependency ingredient-parser-nlp to v2.5.0 @renovate (#6961)
- chore(deps): update dependency rich to v14.3.2 @renovate (#6980)
- fix(deps): update dependency orjson to v3.11.7 @renovate (#6989)
- chore(deps): pin dependency freezegun to ==1.5.5 (#6991)
</details>

## 🙏 New Contributors

* @Darwiner made their first contribution in https://github.com/mealie-recipes/mealie/pull/6851
* @alexandreeberhardt made their first contribution in https://github.com/mealie-recipes/mealie/pull/6830
* @jeromer-dev made their first contribution in https://github.com/mealie-recipes/mealie/pull/6577
* @codefaux made their first contribution in https://github.com/mealie-recipes/mealie/pull/6946
* @Fjodor42 made their first contribution in https://github.com/mealie-recipes/mealie/pull/6934
* @stvhwrd made their first contribution in https://github.com/mealie-recipes/mealie/pull/6405
* @Gtt1229 made their first contribution in https://github.com/mealie-recipes/mealie/pull/6523
* @ImanuelBertrand made their first contribution in https://github.com/mealie-recipes/mealie/pull/6588
* @morgan-dgk made their first contribution in https://github.com/mealie-recipes/mealie/pull/6815
* @mealie-actions[bot] made their first contribution in https://github.com/mealie-recipes/mealie/pull/6977

# 🍴🍴🍴🍴🍴🍴