diff --git a/.github/ISSUE_TEMPLATE/task.yaml b/.github/ISSUE_TEMPLATE/task.yaml
index fca4f26e3a7..a1ed11f6e06 100644
--- a/.github/ISSUE_TEMPLATE/task.yaml
+++ b/.github/ISSUE_TEMPLATE/task.yaml
@@ -4,7 +4,7 @@ description: "CONTRIBUTORS ONLY: Submit a Task that needs to be completed"
title: "[Task] - TASK DESCRIPTION"
labels:
- task
- - v1
+ - v2
body:
- type: markdown
attributes:
diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml
new file mode 100644
index 00000000000..dfbb3bd1050
--- /dev/null
+++ b/.github/release-drafter.yml
@@ -0,0 +1,71 @@
+---
+name-template: "v$RESOLVED_VERSION"
+tag-template: "v$RESOLVED_VERSION"
+change-template: "- $TITLE @$AUTHOR (#$NUMBER)"
+sort-direction: ascending
+
+categories:
+ - title: "🚨 Breaking changes"
+ labels:
+ - "breaking-change"
+ - "major"
+ - title: "✨ New features"
+ labels:
+ - "feature"
+ - "minor"
+ - title: "🐛 Bug fixes"
+ labels:
+ - "bugfix"
+ - title: "🧰 Maintenance"
+ collapse-after: 3
+ labels:
+ - "ci"
+ - "chore"
+ - "l10n"
+ - title: "📚 Documentation"
+ labels:
+ - "documentation"
+ - title: "⬆️ Dependency updates"
+ collapse-after: 3
+ labels:
+ - "dependencies"
+
+version-resolver:
+ major:
+ labels:
+ - "major"
+ - "breaking-change"
+ minor:
+ labels:
+ - "minor"
+ - "feature"
+ patch:
+ labels:
+ - "bugfix"
+ - "chore"
+ - "ci"
+ - "dependencies"
+ - "documentation"
+ - "l10n"
+ default: patch
+
+template: |
+ # 🍴🍴🍴🍴🍴🍴
+
+ $CHANGES
+
+ # 🍴🍴🍴🍴🍴🍴
+
+autolabeler:
+ - label: 'feature'
+ title:
+ - '/feat/i'
+ - label: 'bugfix'
+ title:
+ - '/fix:/i'
+ - label: 'documentation'
+ title:
+ - '/docs:/i'
+ - label: 'chore'
+ title:
+ - '/chore:/i'
diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml
new file mode 100644
index 00000000000..10fd8a7285e
--- /dev/null
+++ b/.github/workflows/release-drafter.yml
@@ -0,0 +1,30 @@
+---
+name: Release Drafter
+
+on:
+ push:
+ branches:
+ - mealie-next
+ # pull_request event is required for autolabeler
+ pull_request:
+ types: [opened, labeled, unlabeled, reopened, synchronize]
+ # pull_request_target event is required for autolabeler to support PRs from forks
+ pull_request_target:
+ types: [opened, labeled, unlabeled, reopened, synchronize]
+ workflow_dispatch:
+
+jobs:
+ update_release_draft:
+ permissions:
+ # write permission is required to create a github release
+ contents: write
+ # write permission is required for autolabeler
+ # otherwise, read permission is required at least
+ pull-requests: write
+ name: ✏️ Draft release
+ runs-on: ubuntu-latest
+ steps:
+ - name: 🚀 Run Release Drafter
+ uses: release-drafter/release-drafter@v6.0.0
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 5290fea0535..9fbb398cc75 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -66,6 +66,7 @@ jobs:
- name: Modify version strings
run: |
+ sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/installation-checklist.md
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/sqlite.md
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/postgres.md
sed -i 's/^version = "[^"]*"/version = "${{ env.VERSION_NUM }}"/' pyproject.toml
@@ -79,6 +80,8 @@ jobs:
with:
commit-message: "Update image tag, for release ${{ github.event.release.tag_name }}"
branch: "docs/newrelease-update-version-${{ github.event.release.tag_name }}"
+ labels: |
+ documentation
delete-branch: true
base: mealie-next
title: "docs(auto): Update image tag, for release ${{ github.event.release.tag_name }}"
diff --git a/.github/workflows/scheduled-checks.yml b/.github/workflows/scheduled-checks.yml
index af30b83c362..afd458a0f5d 100644
--- a/.github/workflows/scheduled-checks.yml
+++ b/.github/workflows/scheduled-checks.yml
@@ -26,7 +26,9 @@ jobs:
with:
commit-message: "Update pre-commit hooks"
branch: "fix/update-pre-commit-hooks"
+ labels: |
+ chore
delete-branch: true
base: mealie-next
- title: "fix(auto): Update pre-commit hooks"
+ title: "chore(auto): Update pre-commit hooks"
body: "Auto-generated by `.github/workflows/scheduled-checks.yml`"
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index b967fe05e21..6413e3b0562 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -12,7 +12,7 @@ repos:
exclude: ^tests/data/
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
- rev: v0.6.1
+ rev: v0.6.5
hooks:
- id: ruff
- id: ruff-format
diff --git a/README.md b/README.md
index e7c312efbfe..9e91e04e1d0 100644
--- a/README.md
+++ b/README.md
@@ -90,7 +90,7 @@ Thanks to Depot for providing build instances for our Docker image builds.
[contributors-shield]: https://img.shields.io/github/contributors/mealie-recipes/mealie.svg?style=flat-square
[docker-pull]: https://img.shields.io/docker/pulls/hkotel/mealie?style=flat-square
[docker-url]: https://hub.docker.com/r/hkotel/mealie
-[ghcr-pulls]: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fipitio%2Fghcr-pulls%2Fmaster%2Findex.json&query=%24%5B%3F(%40.owner%3D%3D%22mealie-recipes%22%20%26%26%20%40.repo%3D%3D%22mealie%22%20%26%26%20%40.image%3D%3D%22mealie%22)%5D.pulls&style=flat-square&label=ghcr%20pulls
+[ghcr-pulls]: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fipitio.github.io%2Fbackage%2Fmealie-recipes%2Fmealie%2Fmealie.json&query=%24.downloads&style=flat-square&label=ghcr%20pulls
[ghcr-url]: https://github.com/mealie-recipes/mealie/pkgs/container/mealie
[contributors-url]: https://github.com/mealie-recipes/mealie/graphs/contributors
[stars-shield]: https://img.shields.io/github/stars/mealie-recipes/mealie.svg?style=flat-square
diff --git a/alembic/env.py b/alembic/env.py
index 34e05757a09..4b38d2830e8 100644
--- a/alembic/env.py
+++ b/alembic/env.py
@@ -1,4 +1,6 @@
-from sqlalchemy import engine_from_config, pool
+from typing import Any
+
+import sqlalchemy as sa
import mealie.db.models._all_models # noqa: F401
from alembic import context
@@ -29,6 +31,28 @@
config.set_main_option("sqlalchemy.url", settings.DB_URL.replace("%", "%%"))
+def include_object(object: Any, name: str, type_: str, reflected: bool, compare_to: Any):
+ # skip dropping food/unit unique constraints; they are defined manually so alembic doesn't see them
+ # see: revision dded3119c1fe
+ if type_ == "unique_constraint" and name == "ingredient_foods_name_group_id_key" and compare_to is None:
+ return False
+ if type_ == "unique_constraint" and name == "ingredient_units_name_group_id_key" and compare_to is None:
+ return False
+
+ # skip changing the quantity column in recipes_ingredients; it's a float on postgres, but an integer on sqlite
+ # see: revision 263dd6707191
+ if (
+ type_ == "column"
+ and name == "quantity"
+ and object.table.name == "recipes_ingredients"
+ and hasattr(compare_to, "type")
+ and isinstance(compare_to.type, sa.Integer)
+ ):
+ return False
+
+ return True
+
+
def run_migrations_offline():
"""Run migrations in 'offline' mode.
@@ -60,15 +84,19 @@ def run_migrations_online():
and associate a connection with the context.
"""
- connectable = engine_from_config(
+ connectable = sa.engine_from_config(
config.get_section(config.config_ini_section),
prefix="sqlalchemy.",
- poolclass=pool.NullPool,
+ poolclass=sa.pool.NullPool,
)
with connectable.connect() as connection:
context.configure(
- connection=connection, target_metadata=target_metadata, user_module_prefix="mealie.db.migration_types."
+ connection=connection,
+ target_metadata=target_metadata,
+ user_module_prefix="mealie.db.migration_types.",
+ render_as_batch=True,
+ include_object=include_object,
)
with context.begin_transaction():
diff --git a/alembic/script.py.mako b/alembic/script.py.mako
index 881fa315681..3bf7e9e4d13 100644
--- a/alembic/script.py.mako
+++ b/alembic/script.py.mako
@@ -9,13 +9,15 @@ import sqlalchemy as sa
import mealie.db.migration_types
from alembic import op
-${imports if imports else ""}
+% if imports:
+${imports}
+% endif
# revision identifiers, used by Alembic.
revision = ${repr(up_revision)}
-down_revision = ${repr(down_revision)}
-branch_labels = ${repr(branch_labels)}
-depends_on = ${repr(depends_on)}
+down_revision: str | None = ${repr(down_revision)}
+branch_labels: str | tuple[str, ...] | None = ${repr(branch_labels)}
+depends_on: str | tuple[str, ...] | None = ${repr(depends_on)}
def upgrade():
diff --git a/alembic/versions/2022-02-21-19.56.24_6b0f5f32d602_initial_tables.py b/alembic/versions/2022-02-21-19.56.24_6b0f5f32d602_initial_tables.py
index 8ebd1b395c1..7619aee92e2 100644
--- a/alembic/versions/2022-02-21-19.56.24_6b0f5f32d602_initial_tables.py
+++ b/alembic/versions/2022-02-21-19.56.24_6b0f5f32d602_initial_tables.py
@@ -14,9 +14,9 @@
# revision identifiers, used by Alembic.
revision = "6b0f5f32d602"
-down_revision = None
-branch_labels = None
-depends_on = None
+down_revision: str | None = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
# Adapted from https://improveandrepeat.com/2021/09/python-friday-87-handling-pre-existing-tables-with-alembic-and-sqlalchemy/
diff --git a/alembic/versions/2022-03-23-17.43.34_263dd6707191_convert_quantity_from_integer_to_float.py b/alembic/versions/2022-03-23-17.43.34_263dd6707191_convert_quantity_from_integer_to_float.py
index b9de7e23d69..85f85fc983e 100644
--- a/alembic/versions/2022-03-23-17.43.34_263dd6707191_convert_quantity_from_integer_to_float.py
+++ b/alembic/versions/2022-03-23-17.43.34_263dd6707191_convert_quantity_from_integer_to_float.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "263dd6707191"
down_revision = "6b0f5f32d602"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def is_postgres():
diff --git a/alembic/versions/2022-03-27-19.30.28_f1a2dbee5fe9_add_original_text_column_to_recipes_.py b/alembic/versions/2022-03-27-19.30.28_f1a2dbee5fe9_add_original_text_column_to_recipes_.py
index fc62f3517e4..50ac6f27275 100644
--- a/alembic/versions/2022-03-27-19.30.28_f1a2dbee5fe9_add_original_text_column_to_recipes_.py
+++ b/alembic/versions/2022-03-27-19.30.28_f1a2dbee5fe9_add_original_text_column_to_recipes_.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "f1a2dbee5fe9"
down_revision = "263dd6707191"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-03-31-19.19.55_59eb59135381_add_tags_to_cookbooks.py b/alembic/versions/2022-03-31-19.19.55_59eb59135381_add_tags_to_cookbooks.py
index ed751d9df75..794f6209614 100644
--- a/alembic/versions/2022-03-31-19.19.55_59eb59135381_add_tags_to_cookbooks.py
+++ b/alembic/versions/2022-03-31-19.19.55_59eb59135381_add_tags_to_cookbooks.py
@@ -14,8 +14,8 @@
# revision identifiers, used by Alembic.
revision = "59eb59135381"
down_revision = "f1a2dbee5fe9"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-04-03-10.48.51_09dfc897ad62_add_require_all_for_cookbook_filters.py b/alembic/versions/2022-04-03-10.48.51_09dfc897ad62_add_require_all_for_cookbook_filters.py
index 19cd08c855c..613d8c5f259 100644
--- a/alembic/versions/2022-04-03-10.48.51_09dfc897ad62_add_require_all_for_cookbook_filters.py
+++ b/alembic/versions/2022-04-03-10.48.51_09dfc897ad62_add_require_all_for_cookbook_filters.py
@@ -14,8 +14,8 @@
# revision identifiers, used by Alembic.
revision = "09dfc897ad62"
down_revision = "59eb59135381"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-06-01-11.12.06_ab0bae02578f_add_use_abbreviation_column_to_.py b/alembic/versions/2022-06-01-11.12.06_ab0bae02578f_add_use_abbreviation_column_to_.py
index ed46e40b67e..0faa32c74ec 100644
--- a/alembic/versions/2022-06-01-11.12.06_ab0bae02578f_add_use_abbreviation_column_to_.py
+++ b/alembic/versions/2022-06-01-11.12.06_ab0bae02578f_add_use_abbreviation_column_to_.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "ab0bae02578f"
down_revision = "09dfc897ad62"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-06-15-21.05.34_f30cf048c228_add_new_webhook_fields.py b/alembic/versions/2022-06-15-21.05.34_f30cf048c228_add_new_webhook_fields.py
index 085b9b29c4d..a2edf37131f 100644
--- a/alembic/versions/2022-06-15-21.05.34_f30cf048c228_add_new_webhook_fields.py
+++ b/alembic/versions/2022-06-15-21.05.34_f30cf048c228_add_new_webhook_fields.py
@@ -14,8 +14,8 @@
# revision identifiers, used by Alembic.
revision = "f30cf048c228"
down_revision = "ab0bae02578f"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-08-12-19.05.59_188374910655_add_login_attemps_and_locked_at_field_.py b/alembic/versions/2022-08-12-19.05.59_188374910655_add_login_attemps_and_locked_at_field_.py
index 45fedc02616..beba5659baf 100644
--- a/alembic/versions/2022-08-12-19.05.59_188374910655_add_login_attemps_and_locked_at_field_.py
+++ b/alembic/versions/2022-08-12-19.05.59_188374910655_add_login_attemps_and_locked_at_field_.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "188374910655"
down_revision = "f30cf048c228"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-08-13-17.07.07_089bfa50d0ed_add_is_ocr_recipe_column_to_recipes.py b/alembic/versions/2022-08-13-17.07.07_089bfa50d0ed_add_is_ocr_recipe_column_to_recipes.py
index ba1595486e8..fe730b1f6a2 100644
--- a/alembic/versions/2022-08-13-17.07.07_089bfa50d0ed_add_is_ocr_recipe_column_to_recipes.py
+++ b/alembic/versions/2022-08-13-17.07.07_089bfa50d0ed_add_is_ocr_recipe_column_to_recipes.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "089bfa50d0ed"
down_revision = "188374910655"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-08-29-13.57.40_44e8d670719d_add_extras_to_shopping_lists_list_items_.py b/alembic/versions/2022-08-29-13.57.40_44e8d670719d_add_extras_to_shopping_lists_list_items_.py
index c688c0e603a..abb60a05857 100644
--- a/alembic/versions/2022-08-29-13.57.40_44e8d670719d_add_extras_to_shopping_lists_list_items_.py
+++ b/alembic/versions/2022-08-29-13.57.40_44e8d670719d_add_extras_to_shopping_lists_list_items_.py
@@ -14,8 +14,8 @@
# revision identifiers, used by Alembic.
revision = "44e8d670719d"
down_revision = "089bfa50d0ed"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-09-27-14.53.14_2ea7a807915c_add_recipe_timeline_events_table.py b/alembic/versions/2022-09-27-14.53.14_2ea7a807915c_add_recipe_timeline_events_table.py
index 57edfe315b2..dfa66f34f76 100644
--- a/alembic/versions/2022-09-27-14.53.14_2ea7a807915c_add_recipe_timeline_events_table.py
+++ b/alembic/versions/2022-09-27-14.53.14_2ea7a807915c_add_recipe_timeline_events_table.py
@@ -14,8 +14,8 @@
# revision identifiers, used by Alembic.
revision = "2ea7a807915c"
down_revision = "44e8d670719d"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-11-03-13.10.24_1923519381ad_renamed_timeline_event_message_and_.py b/alembic/versions/2022-11-03-13.10.24_1923519381ad_renamed_timeline_event_message_and_.py
index e68c5bcf873..a858033768e 100644
--- a/alembic/versions/2022-11-03-13.10.24_1923519381ad_renamed_timeline_event_message_and_.py
+++ b/alembic/versions/2022-11-03-13.10.24_1923519381ad_renamed_timeline_event_message_and_.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "1923519381ad"
down_revision = "2ea7a807915c"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2022-11-22-03.42.45_167eb69066ad_add_recipe_scale_to_shopping_list_item_.py b/alembic/versions/2022-11-22-03.42.45_167eb69066ad_add_recipe_scale_to_shopping_list_item_.py
index dc83ca47d50..4f16c1b74c6 100644
--- a/alembic/versions/2022-11-22-03.42.45_167eb69066ad_add_recipe_scale_to_shopping_list_item_.py
+++ b/alembic/versions/2022-11-22-03.42.45_167eb69066ad_add_recipe_scale_to_shopping_list_item_.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "167eb69066ad"
down_revision = "1923519381ad"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2023-01-21-16.54.44_165d943c64ee_add_related_user_to_mealplan.py b/alembic/versions/2023-01-21-16.54.44_165d943c64ee_add_related_user_to_mealplan.py
index 10303956343..c936d1ebb2a 100644
--- a/alembic/versions/2023-01-21-16.54.44_165d943c64ee_add_related_user_to_mealplan.py
+++ b/alembic/versions/2023-01-21-16.54.44_165d943c64ee_add_related_user_to_mealplan.py
@@ -14,8 +14,8 @@
# revision identifiers, used by Alembic.
revision = "165d943c64ee"
down_revision = "167eb69066ad"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2023-02-07-20.57.21_ff5f73b01a7a_add_missing_foreign_key_and_order_.py b/alembic/versions/2023-02-07-20.57.21_ff5f73b01a7a_add_missing_foreign_key_and_order_.py
index 3ae1cd9dcdd..a86c94322db 100644
--- a/alembic/versions/2023-02-07-20.57.21_ff5f73b01a7a_add_missing_foreign_key_and_order_.py
+++ b/alembic/versions/2023-02-07-20.57.21_ff5f73b01a7a_add_missing_foreign_key_and_order_.py
@@ -11,8 +11,8 @@
# revision identifiers, used by Alembic.
revision = "ff5f73b01a7a"
down_revision = "165d943c64ee"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2023-02-10-21.18.32_16160bf731a0_add_more_indices_necessary_for_search.py b/alembic/versions/2023-02-10-21.18.32_16160bf731a0_add_more_indices_necessary_for_search.py
index 3372091fd7e..bc5d9b7dd62 100644
--- a/alembic/versions/2023-02-10-21.18.32_16160bf731a0_add_more_indices_necessary_for_search.py
+++ b/alembic/versions/2023-02-10-21.18.32_16160bf731a0_add_more_indices_necessary_for_search.py
@@ -11,8 +11,8 @@
# revision identifiers, used by Alembic.
revision = "16160bf731a0"
down_revision = "ff5f73b01a7a"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2023-02-14-20.45.41_5ab195a474eb_add_normalized_search_properties.py b/alembic/versions/2023-02-14-20.45.41_5ab195a474eb_add_normalized_search_properties.py
index 676dd21f9db..ce52f6da3c0 100644
--- a/alembic/versions/2023-02-14-20.45.41_5ab195a474eb_add_normalized_search_properties.py
+++ b/alembic/versions/2023-02-14-20.45.41_5ab195a474eb_add_normalized_search_properties.py
@@ -17,8 +17,8 @@
# revision identifiers, used by Alembic.
revision = "5ab195a474eb"
down_revision = "16160bf731a0"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
class SqlAlchemyBase(DeclarativeBase):
diff --git a/alembic/versions/2023-02-21-22.03.19_b04a08da2108_added_shopping_list_label_settings.py b/alembic/versions/2023-02-21-22.03.19_b04a08da2108_added_shopping_list_label_settings.py
index cdb5ca86a65..0e5a35b483d 100644
--- a/alembic/versions/2023-02-21-22.03.19_b04a08da2108_added_shopping_list_label_settings.py
+++ b/alembic/versions/2023-02-21-22.03.19_b04a08da2108_added_shopping_list_label_settings.py
@@ -18,8 +18,8 @@
# revision identifiers, used by Alembic.
revision = "b04a08da2108"
down_revision = "5ab195a474eb"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
# Intermediate table definitions
diff --git a/alembic/versions/2023-02-22-21.45.52_38514b39a824_add_auth_method_to_user_table.py b/alembic/versions/2023-02-22-21.45.52_38514b39a824_add_auth_method_to_user_table.py
index 5e9a3f48691..6882950ef0c 100644
--- a/alembic/versions/2023-02-22-21.45.52_38514b39a824_add_auth_method_to_user_table.py
+++ b/alembic/versions/2023-02-22-21.45.52_38514b39a824_add_auth_method_to_user_table.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "38514b39a824"
down_revision = "b04a08da2108"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def is_postgres():
diff --git a/alembic/versions/2023-04-13-06.47.04_b3dbb554ba53_postgres_fuzzy_search.py b/alembic/versions/2023-04-13-06.47.04_b3dbb554ba53_postgres_fuzzy_search.py
index cf3d632ad1b..0b198226233 100644
--- a/alembic/versions/2023-04-13-06.47.04_b3dbb554ba53_postgres_fuzzy_search.py
+++ b/alembic/versions/2023-04-13-06.47.04_b3dbb554ba53_postgres_fuzzy_search.py
@@ -11,8 +11,8 @@
# revision identifiers, used by Alembic.
revision = "b3dbb554ba53"
down_revision = "38514b39a824"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def get_db_type():
diff --git a/alembic/versions/2023-08-06-21.00.34_04ac51cbe9a4_added_group_slug.py b/alembic/versions/2023-08-06-21.00.34_04ac51cbe9a4_added_group_slug.py
index 50748f94276..ac62b0a6398 100644
--- a/alembic/versions/2023-08-06-21.00.34_04ac51cbe9a4_added_group_slug.py
+++ b/alembic/versions/2023-08-06-21.00.34_04ac51cbe9a4_added_group_slug.py
@@ -16,8 +16,8 @@
# revision identifiers, used by Alembic.
revision = "04ac51cbe9a4"
down_revision = "b3dbb554ba53"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def populate_group_slugs(session: Session):
diff --git a/alembic/versions/2023-08-14-19.30.49_1825b5225403_added_recipe_note_to_shopping_list_.py b/alembic/versions/2023-08-14-19.30.49_1825b5225403_added_recipe_note_to_shopping_list_.py
index a095a8a5b8b..438f6d349c1 100644
--- a/alembic/versions/2023-08-14-19.30.49_1825b5225403_added_recipe_note_to_shopping_list_.py
+++ b/alembic/versions/2023-08-14-19.30.49_1825b5225403_added_recipe_note_to_shopping_list_.py
@@ -13,8 +13,8 @@
# revision identifiers, used by Alembic.
revision = "1825b5225403"
down_revision = "04ac51cbe9a4"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2023-08-15-16.25.07_bcfdad6b7355_remove_tool_name_and_slug_unique_.py b/alembic/versions/2023-08-15-16.25.07_bcfdad6b7355_remove_tool_name_and_slug_unique_.py
index 822202d6959..3b0f601d8a9 100644
--- a/alembic/versions/2023-08-15-16.25.07_bcfdad6b7355_remove_tool_name_and_slug_unique_.py
+++ b/alembic/versions/2023-08-15-16.25.07_bcfdad6b7355_remove_tool_name_and_slug_unique_.py
@@ -11,8 +11,8 @@
# revision identifiers, used by Alembic.
revision = "bcfdad6b7355"
down_revision = "1825b5225403"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2023-09-01-14.55.42_0341b154f79a_added_normalized_unit_and_food_names.py b/alembic/versions/2023-09-01-14.55.42_0341b154f79a_added_normalized_unit_and_food_names.py
index 1cbf60a7ec8..e6b2107184e 100644
--- a/alembic/versions/2023-09-01-14.55.42_0341b154f79a_added_normalized_unit_and_food_names.py
+++ b/alembic/versions/2023-09-01-14.55.42_0341b154f79a_added_normalized_unit_and_food_names.py
@@ -15,8 +15,8 @@
# revision identifiers, used by Alembic.
revision = "0341b154f79a"
down_revision = "bcfdad6b7355"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def populate_normalized_fields():
diff --git a/alembic/versions/2023-10-04-14.29.26_dded3119c1fe_added_unique_constraints.py b/alembic/versions/2023-10-04-14.29.26_dded3119c1fe_added_unique_constraints.py
index 5fc44eee66c..38c4bba6fa7 100644
--- a/alembic/versions/2023-10-04-14.29.26_dded3119c1fe_added_unique_constraints.py
+++ b/alembic/versions/2023-10-04-14.29.26_dded3119c1fe_added_unique_constraints.py
@@ -23,8 +23,8 @@
# revision identifiers, used by Alembic.
revision = "dded3119c1fe"
down_revision = "0341b154f79a"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
# Intermediate table definitions
diff --git a/alembic/versions/2023-10-19-19.22.55_ba1e4a6cfe99_added_plural_names_and_alias_tables_for_.py b/alembic/versions/2023-10-19-19.22.55_ba1e4a6cfe99_added_plural_names_and_alias_tables_for_.py
index d7d3762f45b..11bf958ad08 100644
--- a/alembic/versions/2023-10-19-19.22.55_ba1e4a6cfe99_added_plural_names_and_alias_tables_for_.py
+++ b/alembic/versions/2023-10-19-19.22.55_ba1e4a6cfe99_added_plural_names_and_alias_tables_for_.py
@@ -14,8 +14,8 @@
# revision identifiers, used by Alembic.
revision = "ba1e4a6cfe99"
down_revision = "dded3119c1fe"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2024-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py b/alembic/versions/2024-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py
index 1cbbbb3a882..d9afe0beda1 100644
--- a/alembic/versions/2024-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py
+++ b/alembic/versions/2024-02-23-16.15.07_2298bb460ffd_added_user_to_shopping_list.py
@@ -20,8 +20,8 @@
# revision identifiers, used by Alembic.
revision = "2298bb460ffd"
down_revision = "ba1e4a6cfe99"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def is_postgres():
diff --git a/alembic/versions/2024-03-10-05.08.32_09aba125b57a_add_oidc_auth_method.py b/alembic/versions/2024-03-10-05.08.32_09aba125b57a_add_oidc_auth_method.py
index 4af7377356c..60f34f90dbd 100644
--- a/alembic/versions/2024-03-10-05.08.32_09aba125b57a_add_oidc_auth_method.py
+++ b/alembic/versions/2024-03-10-05.08.32_09aba125b57a_add_oidc_auth_method.py
@@ -11,8 +11,8 @@
# revision identifiers, used by Alembic.
revision = "09aba125b57a"
down_revision = "2298bb460ffd"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def is_postgres():
diff --git a/alembic/versions/2024-03-18-02.28.15_d7c6efd2de42_migrate_favorites_and_ratings_to_user_.py b/alembic/versions/2024-03-18-02.28.15_d7c6efd2de42_migrate_favorites_and_ratings_to_user_.py
index 91c1113bcfa..357f660f50a 100644
--- a/alembic/versions/2024-03-18-02.28.15_d7c6efd2de42_migrate_favorites_and_ratings_to_user_.py
+++ b/alembic/versions/2024-03-18-02.28.15_d7c6efd2de42_migrate_favorites_and_ratings_to_user_.py
@@ -20,8 +20,8 @@
# revision identifiers, used by Alembic.
revision = "d7c6efd2de42"
down_revision = "09aba125b57a"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def is_postgres():
@@ -202,8 +202,6 @@ def downgrade():
)
op.drop_index(op.f("ix_recipes_rating"), table_name="recipes")
op.alter_column("recipes", "rating", existing_type=sa.Float(), type_=sa.INTEGER(), existing_nullable=True)
- op.create_unique_constraint("ingredient_units_name_group_id_key", "ingredient_units", ["name", "group_id"])
- op.create_unique_constraint("ingredient_foods_name_group_id_key", "ingredient_foods", ["name", "group_id"])
op.create_table(
"users_to_favorites",
sa.Column("user_id", sa.CHAR(length=32), nullable=True),
diff --git a/alembic/versions/2024-04-07-01.05.20_7788478a0338_add_group_recipe_actions.py b/alembic/versions/2024-04-07-01.05.20_7788478a0338_add_group_recipe_actions.py
index 1a7162c39a9..39810210b67 100644
--- a/alembic/versions/2024-04-07-01.05.20_7788478a0338_add_group_recipe_actions.py
+++ b/alembic/versions/2024-04-07-01.05.20_7788478a0338_add_group_recipe_actions.py
@@ -14,8 +14,8 @@
# revision identifiers, used by Alembic.
revision = "7788478a0338"
down_revision = "d7c6efd2de42"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def upgrade():
diff --git a/alembic/versions/2024-06-22-10.17.03_32d69327997b_add_staple_flag_to_foods.py b/alembic/versions/2024-06-22-10.17.03_32d69327997b_add_staple_flag_to_foods.py
index 65e2d4e02f0..bd8cf64f545 100644
--- a/alembic/versions/2024-06-22-10.17.03_32d69327997b_add_staple_flag_to_foods.py
+++ b/alembic/versions/2024-06-22-10.17.03_32d69327997b_add_staple_flag_to_foods.py
@@ -11,12 +11,11 @@
from alembic import op
-
# revision identifiers, used by Alembic.
revision = "32d69327997b"
down_revision = "7788478a0338"
-branch_labels = None
-depends_on = None
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
def is_postgres():
diff --git a/alembic/versions/2024-07-12-16.16.29_feecc8ffb956_add_households.py b/alembic/versions/2024-07-12-16.16.29_feecc8ffb956_add_households.py
index 9436f730172..2ad26f093e6 100644
--- a/alembic/versions/2024-07-12-16.16.29_feecc8ffb956_add_households.py
+++ b/alembic/versions/2024-07-12-16.16.29_feecc8ffb956_add_households.py
@@ -22,8 +22,8 @@
# revision identifiers, used by Alembic.
revision = "feecc8ffb956"
down_revision = "32d69327997b"
-branch_labels = None # type: ignore
-depends_on = None # type: ignore
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
settings = get_app_settings()
diff --git a/alembic/versions/2024-09-02-21.39.49_be568e39ffdf_added_household_recipe_lock_setting_and_.py b/alembic/versions/2024-09-02-21.39.49_be568e39ffdf_added_household_recipe_lock_setting_and_.py
new file mode 100644
index 00000000000..83f2e55186a
--- /dev/null
+++ b/alembic/versions/2024-09-02-21.39.49_be568e39ffdf_added_household_recipe_lock_setting_and_.py
@@ -0,0 +1,75 @@
+"""added household recipe lock setting and household management user permission
+
+Revision ID: be568e39ffdf
+Revises: feecc8ffb956
+Create Date: 2024-09-02 21:39:49.210355
+
+"""
+
+from textwrap import dedent
+
+import sqlalchemy as sa
+
+from alembic import op
+
+# revision identifiers, used by Alembic.
+revision = "be568e39ffdf"
+down_revision = "feecc8ffb956"
+branch_labels: str | tuple[str, ...] | None = None
+depends_on: str | tuple[str, ...] | None = None
+
+
+def populate_defaults():
+ if op.get_context().dialect.name == "postgresql":
+ TRUE = "TRUE"
+ FALSE = "FALSE"
+ else:
+ TRUE = "1"
+ FALSE = "0"
+
+ op.execute(
+ dedent(
+ f"""
+ UPDATE household_preferences
+ SET lock_recipe_edits_from_other_households = {TRUE}
+ WHERE lock_recipe_edits_from_other_households IS NULL
+ """
+ )
+ )
+ op.execute(
+ dedent(
+ f"""
+ UPDATE users
+ SET can_manage_household = {FALSE}
+ WHERE can_manage_household IS NULL AND admin = {FALSE}
+ """
+ )
+ )
+ op.execute(
+ dedent(
+ f"""
+ UPDATE users
+ SET can_manage_household = {TRUE}
+ WHERE can_manage_household IS NULL AND admin = {TRUE}
+ """
+ )
+ )
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.add_column(
+ "household_preferences",
+ sa.Column("lock_recipe_edits_from_other_households", sa.Boolean(), nullable=True),
+ )
+ op.add_column("users", sa.Column("can_manage_household", sa.Boolean(), nullable=True))
+ # ### end Alembic commands ###
+
+ populate_defaults()
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column("users", "can_manage_household")
+ op.drop_column("household_preferences", "lock_recipe_edits_from_other_households")
+ # ### end Alembic commands ###
diff --git a/docs/docs/contributors/developers-guide/database-changes.md b/docs/docs/contributors/developers-guide/database-changes.md
index cd51c55162c..0eccc614c2c 100644
--- a/docs/docs/contributors/developers-guide/database-changes.md
+++ b/docs/docs/contributors/developers-guide/database-changes.md
@@ -11,75 +11,5 @@ How exactly you need to modify it is of course highly contextual to the change y
In your dev container you can run something like (change the message) `task py:migrate -- "Add creation tag to group preferences"` to have Alembic generate an upgrade script for you.
-The script Alembic generates, will be limited! (Perhaps there's a way to resolve that? Haven't looked into it yet)
-For example, Alembic generated a script _similar_ to this (it has been modified already to have accurate foreign key names, for instance):
-
-```Python
-"""Add creation tag to group preferences
-
-Revision ID: 0ea6eb8eaa44
-Revises: ba1e4a6cfe99
-Create Date: 2024-01-04 12:40:03.062671
-
-"""
-import sqlalchemy as sa
-
-import mealie.db.migration_types
-from alembic import op
-
-# revision identifiers, used by Alembic.
-revision = "0ea6eb8eaa44"
-down_revision = "ba1e4a6cfe99"
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- ### commands auto generated by Alembic - please adjust! ###
- op.add_column(
- "group_preferences", sa.Column("recipe_creation_tag", mealie.db.migration_types.GUID(), nullable=True)
- )
- op.create_foreign_key("fk_groupprefs_tags", "group_preferences", "tags", ["recipe_creation_tag"], ["id"])
- ### end Alembic commands ###
-
-
-def downgrade():
- ### commands auto generated by Alembic - please adjust! ###
- op.drop_constraint("fk_groupprefs_tags", "group_preferences", type_="foreignkey")
- op.drop_column("group_preferences", "recipe_creation_tag")
- ### end Alembic commands ###
-```
-
-But when trying to actually use that upgrade script, it becomes clear that our SQLite database doesn't like them. The minor modification needed looks like:
-
-```Python
-"""Add creation tag to group preferences
-
-Revision ID: 0ea6eb8eaa44
-Revises: ba1e4a6cfe99
-Create Date: 2024-01-04 12:40:03.062671
-
-"""
-import sqlalchemy as sa
-
-import mealie.db.migration_types
-from alembic import op
-
-# revision identifiers, used by Alembic.
-revision = "0ea6eb8eaa44"
-down_revision = "ba1e4a6cfe99"
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- with op.batch_alter_table("group_preferences", schema=None) as batch_op:
- batch_op.add_column(sa.Column("recipe_creation_tag", mealie.db.migration_types.GUID(), nullable=True))
- batch_op.create_foreign_key("fk_groupprefs_tags", "tags", ["recipe_creation_tag"], ["id"])
-
-
-def downgrade():
- with op.batch_alter_table("group_preferences", schema=None) as batch_op:
- batch_op.drop_constraint("fk_groupprefs_tags", type_="foreignkey")
- batch_op.drop_column("recipe_creation_tag")
-```
+Alembic's script migration isn't perfect, so you will need to review which changes are generated. You will also need to make sure any custom operations work on both SQLite and Postgres.
+There are some known limitations with our migrations and Alembic's auto-generation, which is accounted for in `/alembic/env.py`. If any of your migrations overlap with the columns in `include_object`, you may need to manually adjust the migration.
diff --git a/docs/docs/documentation/getting-started/faq.md b/docs/docs/documentation/getting-started/faq.md
index 9da52d40351..78473d3cba2 100644
--- a/docs/docs/documentation/getting-started/faq.md
+++ b/docs/docs/documentation/getting-started/faq.md
@@ -149,3 +149,11 @@ As to why we need a database?
- **Developer Experience:** Without a database, a lot of the work to maintain your data is taken on by the developer instead of a battle-tested platform for storing data.
- **Multi User Support:** With a solid database as backend storage for your data, Mealie can better support multi-user sites and avoid read/write access errors when multiple actions are taken at the same time.
+
+## Why is there no "Keep Screen Alive" button when I access a recipe?
+You've perhaps visited the Mealie Demo and noticed that it had a "Keep Screen Alive" button, but it doesn't show up in your own Mealie instance.
+There are typically two possible reasons for this:
+1. You're accessing your Mealie instance without using HTTPS. The Wake Lock API is only available if HTTPS is used. Read more here: https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API
+2. You're accessing your Mealie instance on a browser which doesn't support the API. You can test this here: https://vueuse.org/core/useWakeLock/#demo
+
+Solving the above points will most likely resolve your issues. However, if you're still having problems, you are welcome to create an issue. Just remember to add that you've tried the above two options first in your description.
diff --git a/docs/docs/documentation/getting-started/features.md b/docs/docs/documentation/getting-started/features.md
index b9ee0cebd67..797c4d0d083 100644
--- a/docs/docs/documentation/getting-started/features.md
+++ b/docs/docs/documentation/getting-started/features.md
@@ -117,10 +117,10 @@ Unlike notifiers, which are event-driven notifications, Webhooks allow you to se
Recipe Actions are custom actions you can add to all recipes in Mealie. This is a great way to add custom integrations that are fired manually. There are two types of recipe actions:
-1. link - these actions will take you directly to an external page
+1. link - these actions will take you directly to an external page. Merge fields can be used to customize the URL for each recipe
2. post - these actions will send a `POST` request to the specified URL, with the recipe JSON in the request body. These can be used, for instance, to manually trigger a webhook in Home Assistant
-Recipe Action URLs can include merge fields to inject the current recipe's data. For instance, you can use the following URL to include a Google search with the recipe's slug:
+When using the "link" action type, Recipe Action URLs can include merge fields to inject the current recipe's data. For instance, you can use the following URL to include a Google search with the recipe's slug:
```
https://www.google.com/search?q=${slug}
```
diff --git a/docs/docs/documentation/getting-started/installation/backend-config.md b/docs/docs/documentation/getting-started/installation/backend-config.md
index 8dd913dc5c3..5ad9fc3ba44 100644
--- a/docs/docs/documentation/getting-started/installation/backend-config.md
+++ b/docs/docs/documentation/getting-started/installation/backend-config.md
@@ -58,7 +58,7 @@ Changing the webworker settings may cause unforeseen memory leak issues with Mea
| Variables | Default | Description |
| --------------- | :-----: | ----------------------------------------------------------------------------- |
-| UVICORN_WORKERS | 1 | Sets the number of works for the web server [more info here][unicorn_workers] |
+| UVICORN_WORKERS | 1 | Sets the number of workers for the web server. [More info here][unicorn_workers] |
### LDAP
@@ -104,7 +104,7 @@ For usage, see [Usage - OpenID Connect](../authentication/oidc.md)
:octicons-tag-24: v1.7.0
-Mealie supports various integrations using OpenAI. To enable OpenAI, [you must provide your OpenAI API key](https://platform.openai.com/api-keys). You can tweak how OpenAI is used using these backend settings. Please note that while OpenAI usage is optimized to reduce API costs, you're unlikely to be able to use OpenAI features with the free tier limits.
+Mealie supports various integrations using OpenAI. For more information, check out our [OpenAI documentation](./open-ai.md).
| Variables | Default | Description |
| ---------------------------- | :-----: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
diff --git a/docs/docs/documentation/getting-started/installation/installation-checklist.md b/docs/docs/documentation/getting-started/installation/installation-checklist.md
index 7185503f6f1..202f48ae741 100644
--- a/docs/docs/documentation/getting-started/installation/installation-checklist.md
+++ b/docs/docs/documentation/getting-started/installation/installation-checklist.md
@@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
1. Take a backup just in case!
-2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v1.0.0-RC1.1`
+2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v1.12.0`
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
4. Restart the container
@@ -101,7 +101,7 @@ These backups are just plain .zip files that you can download from the UI or acc
### Docker Tags
-See all available tags on [GitHub](https://github.com/mealie-recipes/mealie/pkgs/container/mealie). We do not currently publish new images to Dockerhub.
+See all available tags on [GitHub](https://github.com/mealie-recipes/mealie/pkgs/container/mealie).
`ghcr.io/mealie-recipes/mealie:nightly`
diff --git a/docs/docs/documentation/getting-started/installation/open-ai.md b/docs/docs/documentation/getting-started/installation/open-ai.md
new file mode 100644
index 00000000000..740064c5220
--- /dev/null
+++ b/docs/docs/documentation/getting-started/installation/open-ai.md
@@ -0,0 +1,18 @@
+# OpenAI Integration
+
+:octicons-tag-24: v1.7.0
+
+Mealie's OpenAI integration enables several features and enhancements throughout the application. To enable OpenAI features, you must have an account with OpenAI and configure Mealie to use the OpenAI API key (for more information, check out the [backend configuration](./backend-config.md#openai)).
+
+## Configuration
+
+For most users, supplying the OpenAI API key is all you need to do; you will use the regular OpenAI service with the default language model. Note that while OpenAI has a free tier, it's not sufficiently capable for Mealie (or most other production use cases). For more information, check out [OpenAI's rate limits](https://platform.openai.com/docs/guides/rate-limits). If you deposit $5 into your OpenAI account, you will be permanently bumped up to Tier 1, which is sufficient for Mealie. Cost per-request is dependant on many factors, but Mealie tries to keep token counts conservative.
+
+Alternatively, if you have another service you'd like to use in-place of OpenAI, you can configure Mealie to use that instead, as long as it has an OpenAI-compatible API. For instance, a common self-hosted alternative to OpenAI is [Ollama](https://ollama.com/). To use Ollama with Mealie, change your `OPENAI_BASE_URL` to `http://localhost:11434/v1` (where `http://localhost:11434` is wherever you're hosting Ollama, and `/v1` enables the OpenAI-compatible endpoints). Note that you *must* provide an API key, even though it is ultimately ignored by Ollama.
+
+If you wish to disable image recognition features (to save costs, or because your custom model doesn't support them) you can set `OPENAI_ENABLE_IMAGE_SERVICES` to `False`. For more information on what configuration options are available, check out the [backend configuration](./backend-config.md#openai).
+
+## OpenAI Features
+- The OpenAI Ingredient Parser can be used as an alternative to the NLP and Brute Force parsers. Simply choose the OpenAI parser while parsing ingredients (:octicons-tag-24: v1.7.0)
+- When importing a recipe via URL, if the default recipe scraper is unable to read the recipe data from a webpage, the webpage contents will be parsed by OpenAI (:octicons-tag-24: v1.9.0)
+- You can import an image of a written recipe, which is sent to OpenAI and imported into Mealie. The recipe can be hand-written or typed, as long as the text is in the picture. You can also optionally have OpenAI translate the recipe into your own language (:octicons-tag-24: v1.12.0)
diff --git a/docs/docs/documentation/getting-started/installation/postgres.md b/docs/docs/documentation/getting-started/installation/postgres.md
index 27473d23491..cb5dda152e1 100644
--- a/docs/docs/documentation/getting-started/installation/postgres.md
+++ b/docs/docs/documentation/getting-started/installation/postgres.md
@@ -20,7 +20,7 @@ services:
- mealie-data:/app/data/
environment:
# Set Backend ENV Variables Here
- ALLOW_SIGNUP: false
+ ALLOW_SIGNUP: "false"
PUID: 1000
PGID: 1000
TZ: America/Anchorage
diff --git a/docs/docs/documentation/getting-started/installation/sqlite.md b/docs/docs/documentation/getting-started/installation/sqlite.md
index 129974fc63c..2b38280c834 100644
--- a/docs/docs/documentation/getting-started/installation/sqlite.md
+++ b/docs/docs/documentation/getting-started/installation/sqlite.md
@@ -24,7 +24,7 @@ services:
- mealie-data:/app/data/
environment:
# Set Backend ENV Variables Here
- ALLOW_SIGNUP: false
+ ALLOW_SIGNUP: "false"
PUID: 1000
PGID: 1000
TZ: America/Anchorage
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index d1d881a2b24..2369a9a89e8 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -74,6 +74,7 @@ nav:
- Backend Configuration: "documentation/getting-started/installation/backend-config.md"
- Security: "documentation/getting-started/installation/security.md"
- Logs: "documentation/getting-started/installation/logs.md"
+ - OpenAI: "documentation/getting-started/installation/open-ai.md"
- Usage:
- Backup and Restoring: "documentation/getting-started/usage/backups-and-restoring.md"
- Permissions and Public Access: "documentation/getting-started/usage/permissions-and-public-access.md"
diff --git a/frontend/components/Domain/Household/HouseholdPreferencesEditor.vue b/frontend/components/Domain/Household/HouseholdPreferencesEditor.vue
index ab6b8833f5b..e5c8899384d 100644
--- a/frontend/components/Domain/Household/HouseholdPreferencesEditor.vue
+++ b/frontend/components/Domain/Household/HouseholdPreferencesEditor.vue
@@ -1,7 +1,33 @@
+ {{ $t("household.private-household-description") }}
+
+ {{ $t("household.lock-recipe-edits-from-other-households-description") }}
+
+ {{ p.description }}
+