mealfWiki
On this page

Configuration

Mealf has two kinds of settings: container environment values controlled by the operator, and household/integration settings saved through the application. Changing the container time zone or an environment default does not overwrite saved household settings.

Container settings

Variable Default Configure it for
DATA_DIR /data Persistent local state; keep the Docker volume mounted here
BASE_URL https://localhost Exact public HTTPS origin, with no application path
TZ Image setting Process time zone; household planning has its own saved IANA time zone
TRUSTED_PROXY_CIDRS Empty Actual ingress proxy peers; never universal trust
LOG_LEVEL info Server logging; avoid third-party debug logs that can disclose content
LOG_SETUP_TOKEN true Whether an unconfigured startup prints its one-time token

The installation guide’s compose.yml sets backend values directly under the service’s environment: section. Edit BASE_URL, TZ and any verified TRUSTED_PROXY_CIDRS there. An .env file is not required for this configuration. Its image uses the moving :preview tag with pull_policy: always; run docker compose up -d to fetch updates. The explicit command and healthcheck both use port 5152.

For the source-build compose.yaml, edit the literal environment values in that file or use an explicit Compose override. After changes, use docker compose ... up -d with the same files/project to recreate the container. A plain restart does not load changed environment values. Preserve the volume and keep only one backend process.

Household and account

At the administration console (/):

  • Household saves the name, IANA time zone and default language.
  • Account lists device sessions and lets you revoke sessions or change the password.
  • AI saves optional provider profiles and the selected default model.
  • Bring! connects credentials and selects an existing list.
  • Data downloads portable exports and imports compatible JSON/ZIP files.

The console is available in English and German. Its display-language selector is separate from the saved household language. The shared household account has access to these settings; there is no separate administrator-role system.

In the PWA (/app/), Settings also contains AI configuration, device display choices, storage/sync recovery, household meal-suggestion preferences and per-device reminders. Save shared preferences while connected. Reminder drafts remain local until explicitly saved. See PWA and offline use and Meal reminders.

AI settings and precedence

The application can save Gemini, OpenAI, OpenRouter and custom OpenAI-compatible profiles. Legacy text adapters for Anthropic, Ollama and OpenWebUI remain available. Model names are administrator-supplied; no model version is guessed. Capabilities must be enabled for the selected model. See AI recipe import.

Saved encrypted settings override AI environment settings. A saved disabled state also overrides them. Changing AI_MODEL in Compose will therefore not replace a saved profile. Inspect the reported configuration origin and edit the application setting.

Optional AI variable Default / meaning
AI_PROVIDER Unset: disabled; supported provider identifier
AI_BASE_URL Provider default; required for a custom compatible API
AI_MODEL Required when AI is enabled; exact supported model ID
AI_API_KEY_FILE Private regular key file readable by the backend; no group/world permissions or symlink
AI_INPUT_FORMATS text; comma-separated supported capabilities, without spaces
AI_TIMEOUT 30; valid range 1–120 seconds
AI_MAX_CONTENT 50000; valid range 100–100000 UTF-8 bytes for text
AI_REQUESTS_PER_HOUR 20; valid range 1–1000, shared by imports and probes
AI_STRUCTURED_OUTPUT 0; set 1 only after verifying model/API JSON support
AI_ALLOW_LOCAL_HTTP 0; explicit opt-in for a trusted self-hosted HTTP API

For key-file deployments, mount the file read-only with restrictive permissions that permit UID 10001 to read it. Standard secret-file defaults may be too permissive for this check. Do not put keys in an endpoint URL or recipe, and do not disable public TLS verification. Application-managed keys are encrypted server-side and never returned to the browser.

Persistent state

Path under /data Purpose
database/aircooker.sqlite3 and WAL/SHM Household records, sync history and durable jobs
media/ Recipe photos
jobs/ Protected temporary export/restore files
backups/ Operator-created local snapshots
config/setup-token One-time bootstrap token, removed after setup
config/integrations.key Installation encryption key; required to decrypt saved integrations
config/ai-provider.enc Saved encrypted AI settings and profiles
config/bring.enc Encrypted Bring! connection settings
config/webpush-vapid.enc Encrypted installation Web Push private key

Some files exist only after their feature is configured. Raw AI import sources are private server state, separate from recipe photos, with bounded retention. Back up the whole volume for disaster recovery; a household export intentionally excludes credentials. Never delete encryption keys as a configuration-reset technique.

Source: deployment, administration and AI configuration implementation.

Adapted to this site’s installation · Updated 22 October 2026

Repository reference