Mealie with Docker: a self-hosted recipe manager and meal planner (Linux, Windows, Mac)
Before you start
- 20 min read
Boxes marked Run in terminal are what you type; plain text explains why. Check what you need first

What you get in one minute#
Mealie is a free, self-hosted recipe manager: paste the address of a recipe page and it saves the ingredients and steps in your own database, then helps you plan meals and build shopping lists for the whole family.

Logo: the official Mealie project (github.com/mealie-recipes/mealie, frontend/public/icon.png at the v3.30.0 tag)
Your recipes stop living in bookmarks, ad-filled pages and screenshots. They sit on a server you control. The project is active and has not been archived or renamed: v3.30.0 came out on 31 October 2026. Everything runs in one container, with SQLite as the default database.
| What | Value (official docs, read November 2026) |
|---|---|
| Current version | Mealie v3.30.0, released October 2026 (latest stable) |
| Image to pin | ghcr.io/mealie-recipes/mealie:v3.30.0 (tag checked) |
| Time needed | About 15 minutes (our estimate, not measured) |
| RAM and size | The docs advise a 1000 MB memory limit; they publish no idle figure and no image size |
| Port | 9000 inside the container; the docs publish it as 9925 on the host |
| Licence | AGPL-3.0 (LICENSE at the release tag) |
| Platforms | linux/amd64 and linux/arm64; 32-bit ARM is not supported |
| Official docs | docs.mealie.io and the repository |
At a glance:
- What it does: imports recipes from a URL, keeps cookbooks, plans meals, and makes shopping lists sorted by supermarket section.
- Default login:
[email protected]with passwordMyPassword. Change it in Step 3, before anything else. - BASE_URL: set it to the address your family really uses. It feeds notifications and the OIDC login callback.
- AI is optional and off until you set a provider. You configure it inside the app, not with environment variables. A later section lists what each feature sends out.
- Backups: built into the app as zip files, plus a plain copy of one data folder. You must keep a copy off the server.
- Database: SQLite is fine for 1 to 20 users. Postgres is for many concurrent users, and never put SQLite on network storage.
How it fits together#
Your devices talk to one container; the data folder holds everything. Imports fetch pages from the web, and only the optional AI step talks to an AI provider.
Drawn for this guide from the official docs. The HTTPS front door and the AI provider (dashed) are optional.
Before you start#
You need Docker with Compose on the machine that will run Mealie, plus a browser.
| System | What the docs and our checks say |
|---|---|
| Linux | Any distribution with Docker Engine and Compose; x86_64 or arm64. The best home for a family server |
| Windows | Docker Desktop. The container is Linux; the commands below use PowerShell |
| Mac | Docker Desktop. Same container, commands in Terminal |
Check Docker on each system (curl.exe ships with Windows 10 and 11):
docker --version docker compose version
Checklist:
- [ ] Docker and Compose answer both commands above
- [ ] Port 9925 is free (or choose another host port in Step 2)
- [ ] You know your own user and group ID on Linux or Mac (
id -uandid -g) - [ ] You have a place for off-server backups: another disk, a NAS share for the zip files, or a cloud folder
- [ ] For the HTTPS section only: a domain with a DNS record for the server, and ports 80 and 443 free
Tested by DIY Lab Hub: not yet. Every command comes from the official docs, Dockerfile and release files read in November 2026. We did not run them.
Step 1: Create the data folder#
Mealie keeps its database, images and backups under /app/data in the container. We map that to ~/docker_volumes/mealie/data.
Linux#
mkdir -p ~/docker_volumes/mealie/{data,backups}
cd ~/docker_volumes/mealie
Windows (PowerShell)#
New-Item -ItemType Directory -Force "$HOME\docker_volumes\mealie\data","$HOME\docker_volumes\mealie\backups" | Out-Null Set-Location "$HOME\docker_volumes\mealie"
Mac (Terminal)#
Same commands as Linux:
mkdir -p ~/docker_volumes/mealie/{data,backups}
cd ~/docker_volumes/mealie
Check it worked. The folder exists: ls ~/docker_volumes/mealie (Linux, Mac) or Get-ChildItem "$HOME\docker_volumes\mealie" (Windows) lists data and backups.
Tip: The official docs use a Docker named volume (
mealie-data:/app/data/). We use a folder so onetaror zip copies everything. If a Windows or Mac bind mount ever givesdatabase is locked, switch to the docs' named volume. The docs do not cover that case; it is our caution.
Step 2: Write the Compose file and start Mealie#
This is the official SQLite file with four changes: the image is pinned to v3.30.0, data lives in ./data, the restart policy is unless-stopped, and the timezone is yours to set. Set PUID and PGID to the numbers from id -u and id -g (the docs use 1000). The container starts as root, switches to that user, and fixes the ownership of /app itself.
Linux#
cd ~/docker_volumes/mealie
cat > docker-compose.yml << 'EOF'
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v3.30.0
container_name: mealie
restart: unless-stopped
ports:
- "9925:9000"
deploy:
resources:
limits:
memory: 1000M
volumes:
- ./data:/app/data
environment:
ALLOW_SIGNUP: "false"
PUID: 1000
PGID: 1000
TZ: Etc/UTC
BASE_URL: http://localhost:9925
EOF
docker compose up -d
docker compose ps
Change TZ to your timezone name (for example Europe/London). The memory limit is the docs' own advice: Python can reserve more memory than it needs, and a limit keeps idle use down. BASE_URL is a placeholder for local testing; Step 4 changes it.
Windows (PowerShell)#
Set-Location "$HOME\docker_volumes\mealie"
@'
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v3.30.0
container_name: mealie
restart: unless-stopped
ports:
- "9925:9000"
deploy:
resources:
limits:
memory: 1000M
volumes:
- ./data:/app/data
environment:
ALLOW_SIGNUP: "false"
PUID: 1000
PGID: 1000
TZ: Etc/UTC
BASE_URL: http://localhost:9925
'@ | Set-Content -Encoding ascii docker-compose.yml
docker compose up -d
docker compose ps
Mac (Terminal)#
Same commands as Linux. Use your own IDs from id -u and id -g (macOS usually gives 501 and 20).
Check it worked. docker compose ps shows mealie running; the image's own health check calls /api/app/about and the status turns healthy after a short wait. This prints 200:
curl -fsS -o /dev/null -w "%{http_code}\n" http://localhost:9925/api/app/about
On Windows run the same line with curl.exe. The docs show no sample output, so read docker compose logs --tail=50 mealie for errors.
Tip: Keep the tag
v3.30.0. The docs say alatesttag exists, but the team advises a specific version so you update when you have read the release notes.
Step 3: Log in and replace the default account#
Open Mealie in a browser. From another computer use the server's address and port 9925.
Linux#
xdg-open http://localhost:9925
Windows (PowerShell)#
Start-Process http://localhost:9925
Mac (Terminal)#
open http://localhost:9925
The docs give the default credentials: username [email protected], password MyPassword.
- Log in and go to
/admin/site-settings. The docs say this page summarises your configuration and warns about anything wrong. - Open your user profile and use the Change Password button (the docs FAQ names it).
- Open
/admin/manage/users(the docs: administrators manage users and permissions there) to add accounts for your family.
The docs do not describe renaming the default email. If you want your own address as the admin, create your own user there and make it an administrator, but test that on a fresh install before you delete the default user. We have not tested it.
Check it worked. You are logged in, the site-settings page shows no errors, and the old password no longer works in a private browser window.
Tip: The default password is in the public docs, so anyone who finds your port can use it. Do this step before you open the site to anyone else.
Step 4: Set BASE_URL and add your first recipe#
BASE_URL (default http://localhost:8080) is "used for notifications and the OIDC callback url". Set it to the exact address people type in the browser, including https:// and any port. If you reach Mealie as http://<your-server-address>:9925, edit the Compose file, then apply it.
Linux#
cd ~/docker_volumes/mealie sed -i 's#^\(\s*BASE_URL:\).*#\1 http://<your-server-address>:9925#' docker-compose.yml docker compose up -d
Windows (PowerShell)#
Set-Location "$HOME\docker_volumes\mealie" notepad docker-compose.yml docker compose up -d
Edit the BASE_URL line in Notepad, save, then run the last line.
Mac (Terminal)#
cd ~/docker_volumes/mealie nano docker-compose.yml docker compose up -d
Edit the BASE_URL line, save, then start again.
Now create a recipe: use the Create menu and import from a URL (the README lists "importing from a URL" as a key feature), or type one in by hand with the editor.
Check it worked. The recipe appears in the list with its ingredients and steps. If a site refuses the import, see the Troubleshooting table.
Tip: For scaling and shopping lists to work, seed your foods and units once (docs FAQ): open your name in the upper left, choose Manage Data, then Foods and Units and click Seed once each. Seeding twice creates duplicates.
Tip: Make your first backup now: open
/admin/backups(Settings, Admin Settings, Backups), create one and download it. The Updates and backups section has the folder copy and a restore test.
Put it behind HTTPS (with or without Traefik)#
Plain HTTP is fine on a trusted home network. Add HTTPS when the site is reachable from outside, or when you want the "Keep Screen Alive" button, which the docs say needs HTTPS. Both routes need a DNS name such as mealie.<your-domain> and drop the host port, so only the proxy faces the network.
With Traefik#
On a server that already runs Traefik v3 with the Docker provider, add labels and remove the host port. This assumes an external Docker network called proxy and an entrypoint called https (use your own names). Create the network once:
docker network create proxy
Replace docker-compose.yml with this file, then run docker compose up -d:
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v3.30.0
container_name: mealie
restart: unless-stopped
deploy:
resources:
limits:
memory: 1000M
volumes:
- ./data:/app/data
environment:
ALLOW_SIGNUP: "false"
PUID: 1000
PGID: 1000
TZ: Etc/UTC
BASE_URL: https://mealie.<your-domain>
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.http.routers.mealie.rule=Host(`mealie.<your-domain>`)"
- "traefik.http.routers.mealie.entrypoints=https"
- "traefik.http.routers.mealie.tls=true"
- "traefik.http.services.mealie.loadbalancer.server.port=9000"
networks:
proxy:
external: true
Check it worked. curl -I https://mealie.<your-domain>/ returns an HTTP status line over HTTPS and the login page opens with a valid certificate.
Without Traefik: Caddy#
Choose this if you have no Traefik. Caddy gets and renews certificates for a public domain, or signs its own for a home-only name. Our Caddy guide covers it in depth. We mount the conf folder, not a single Caddyfile, because Caddy's Docker docs warn that editors which replace a single file break reloads.
docker network create proxy
mkdir -p ~/docker_volumes/caddy/{conf,data,config}
cd ~/docker_volumes/caddy
cat > docker-compose.yml << 'EOF'
services:
caddy:
image: caddy:2.11.8
container_name: caddy
restart: unless-stopped
ports:
- "80:80/tcp"
- "443:443/tcp"
- "443:443/udp"
volumes:
- ./conf:/etc/caddy
- ./data:/data
- ./config:/config
networks:
- proxy
networks:
proxy:
external: true
EOF
The image tag 2.11.8 is the newest Caddy tag on Docker Hub as of 5 November 2026; Caddy v2.11.9 was released the same day on GitHub but had no image tag yet when we checked. Save this as ~/docker_volumes/caddy/conf/Caddyfile for a public domain:
mealie.example.com {
reverse_proxy mealie:9000
}
For a home-only name use tls internal, Caddy's own local certificate:
mealie.home.arpa {
tls internal
reverse_proxy mealie:9000
}
In ~/docker_volumes/mealie/docker-compose.yml use the file from the Traefik route without the labels: block (keep the proxy network), and set BASE_URL to the https:// address. Start both stacks:
cd ~/docker_volumes/caddy && docker compose up -d cd ~/docker_volumes/mealie && docker compose up -d
For tls internal, each device must trust Caddy's root certificate. Copy it from the Caddy folder, then install it; the commands are explained in our Caddy guide:
cd ~/docker_volumes/caddy docker compose cp caddy:/data/caddy/pki/authorities/local/root.crt ./caddy-root.crt
Windows (PowerShell, as administrator): certutil -addstore -f "ROOT" caddy-root.crt. Mac (Terminal): sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain caddy-root.crt. Linux: copy it to /usr/local/share/ca-certificates/ and run sudo update-ca-certificates.
Check it worked. curl -I https://mealie.example.com/ returns an HTTP status line over HTTPS. For a home-only name the browser shows a padlock only after the root is trusted on that device.
Tip: The name in
BASE_URL, the DNS record and the Caddyfile or Traefik rule must all be the same name. A mismatch breaks certificates or login redirects.
Optional: AI features and what they send#
Mealie works fully without AI. Nothing leaves your server for AI until you add a provider: the docs say a default provider is required to enable AI at all.
Where to set it up. Open your group settings and add a provider there. The configuration page of the docs lists no OPENAI_* variables, and a maintainer in issue #7957 states that environment variables are ignored: use the in-app settings. Version 3.30.0 removed the old OPENAI_CUSTOM_PROMPT_DIR variable; prompts are now customised in the app and old files are imported automatically.
| Provider slot | What it is for |
|---|---|
Default provider (for example gpt-5) | Required for any AI feature |
| Image provider | Creating a recipe from photos (needs a model that reads images) |
Audio provider (for example whisper-1) | Importing a recipe from a video by transcribing it |
Mealie works with any OpenAI-compatible API. The docs say OpenAI's free tier is not capable enough and that a $5 deposit moves your account to Tier 1, which is enough.
What each feature sends to your provider (from the AI page of the docs):
| Feature | What goes out |
|---|---|
| AI ingredient parser (choose it while parsing ingredients) | The ingredient text, plus data the task needs such as your list of units |
| URL import fallback | If the normal scraper cannot read a page, the contents of that web page |
| Import with AI | The page behind a URL, any text or HTML you paste, photos you upload, or the audio of a video link |
| Translation (optional on import) | The recipe being imported |
| Your custom prompts | Your own instructions, added to every prompt that makes recipe data |
The docs do not list the exact requests, so read each row as "the content you gave that feature". A hosted provider sees your recipes and photos; a local one does not.
Run it locally with Ollama. The docs say to set the base_url to http://localhost:11434/v1 (your Ollama address plus /v1) and that you must still enter an API key, which Ollama ignores. Issue #8503 confirms the key field is required. Our reasoning, not the docs: from inside the Mealie container localhost is the container itself, so use the Docker host's address instead. See our Ollama guide.
Tip: Give the provider a key that has a spending limit and delete it if you stop using AI. The key is stored in your Mealie settings, so treat the database and every backup as holding a secret.
Security and testing#
| Control | How |
|---|---|
| Default login | Change the password in Step 3 |
| Sign-up | ALLOW_SIGNUP defaults to false since v1.4.0. Keep it that way and invite people |
| Rate limits | The API is not rate limited by default. The docs say the URL, AI and image routes can be abused for denial of service, and ask you to limit them at the proxy. Traefik has a rate-limit middleware; the docs link a Caddy module for it that the stock image may not include, so check before relying on it |
| Server-side requests | Anyone who can import can make your server fetch URLs. The docs advise isolating the container from your internal network |
| Forwarded headers | HOST_IP defaults to *, which trusts forwarded headers from every source. Behind a proxy, set it to the proxy's address range |
| Single sign-on | OIDC and LDAP are supported; see Authentik and Pocket ID for an identity provider |
To limit HOST_IP, find the proxy network's range and add it to environment: (our suggestion; the docs only describe the variable):
docker network inspect proxy --format '{{(index .IPAM.Config 0).Subnet}}'
Quick tests:
cd ~/docker_volumes/mealie
docker compose ps
docker compose logs --tail=100 mealie
curl -fsS -o /dev/null -w "%{http_code}\n" http://localhost:9925/api/app/about
With HTTPS and no host port, run the curl against https://mealie.<your-domain>/api/app/about instead. Windows and Mac use the same commands (curl.exe in PowerShell). Logs also go to /app/data/mealie.log; LOG_LEVEL sets the detail.
Common mistakes#
These come from the official docs' warnings, the issue tracker, and common AI assistant answers.
| Mistake | Why it happens | Do this instead |
|---|---|---|
| Keeping the default login | It is printed in the docs, so anyone can try it | Change the password in Step 3 before sharing the address |
A wrong BASE_URL | Issue #7435: a reporter set the full domain instead of the subdomain and OIDC redirects broke. The maintainer said Mealie prints its settings at startup | Set it to the exact browser address; read the first lines of docker compose logs mealie |
| SQLite on NFS, SMB or Ceph | Issues #5944 (Stale file handle) and #6045 (database is locked). The docs warn against it | Keep /app/data on a local disk, or switch to Postgres |
| Blaming the password when a proxy is in the way | Issue #4663: the default login was "not accepted" and the log showed a 401 on /api/users/self; the cause was how the proxy was set up | Test on http://<server>:9925 first, then add the proxy |
| Restoring a backup casually | The docs: restore deletes all data and cannot be undone. Issue #7219 reports no login after a restore | Back up first, restore only a backup from the same version, restart the container if login fails |
| Keeping backups on the same server | The docs say backups must be stored outside the server | Copy the archive to another disk or machine |
| Expecting a recipe to be public because the household is | Public access needs a non-private group, a non-private household and a public recipe. Issue #8946 (open) shows the confusion | Check all three, as the docs FAQ lists |
| Running with an unusual user ID | Issue #5296: after an upgrade to 2.8.0, an instance with a custom UID and GID failed at start with a permission error (closed) | Set PUID and PGID instead of a Compose user: line (the entry script switches user and fixes ownership of /app), and read the first error in the logs |
AI assistants: setting OPENAI_API_KEY or OPENAI_BASE_URL in Compose | Older tutorials used them; issue #7957: environment variables are ignored | Add the provider in the group settings |
AI assistants: pasting a v0 or early v1 file with two containers (frontend and api) or mealie:latest | The docs list those split tags as "no longer updated"; current Mealie is one container on port 9000 | Use the single-container file with a pinned v3.30.0 tag |
Tip: Read the first 30 lines of
docker compose logs mealieafter every change. Mealie prints its settings at startup, and most mistakes (wrongBASE_URL, bad variable) show there.
Tip: The docs checklist mentions
DEFAULT_EMAIL, but the configuration table in the same release lists onlyDEFAULT_GROUPandDEFAULT_HOUSEHOLD. This guide leavesDEFAULT_EMAILout; do not trust a tutorial that sets it.
Tip: Never run
docker compose up -dwith a new image tag before taking a backup. Issue #7383 shows users who updated, hit a "500 Network error" with a custom domain, and found that going back to the older version gave errors and a container that exited.
Troubleshooting#
| Problem | Solution |
|---|---|
| Container will not start; Docker's default AppArmor profile is on | Issue #7565 (closed): the profile blocked syscalls the web server needs. The reporter's security_opt: ["apparmor=unconfined"] was called the right fix, but it weakens isolation, so use it only on a trusted host |
database is locked | SQLite on network storage. Move /app/data to a local disk or use Postgres. The docs also offer SQLITE_MIGRATE_JOURNAL_WAL=true (WAL mode, more concurrent access) |
OSError: [Errno 116] Stale file handle | /app/data is on NFS (issue #5944). Use a local disk or a Postgres database |
| Cannot log in after a restore | Restart the container and try again (docs tip). Read docker compose logs mealie for restore errors |
| Locked account | An administrator can unlock it in the app. Or run docker exec -it mealie bash, then python /opt/mealie/lib64/python3.14/site-packages/mealie/scripts/reset_locked_users.py (docs FAQ) |
| Lost the password or admin rights | Profile page, Change Password. Or inside the container (docker exec -it mealie bash) run change_password.py or make_admin.py from /opt/mealie/lib64/python3.14/site-packages/mealie/scripts/ (docs FAQ) |
| "500 Network error" or a blank page on your own domain | Issue #7383: some reporters fixed it by clearing cookies. Check BASE_URL, the proxy target (port 9000) and the logs |
| A recipe site refuses the import | Bot protection. The docs offer opt-in SCRAPER_PROXY_URL and a FlareSolverr sidecar via SCRAPER_FLARESOLVERR_URL; the default install uses neither |
| AI settings missing in an old group | Issue #8915 (closed): a maintainer added a no-op migration. Update to the latest 3.x or create a new group |
Known bugs (open, November 2026)#
- Issue #8946: public access redirects to the login page even with the household set to public.
- Issue #8551: audio transcription with some Gemini models fails; a fix is proposed in #8843.
- Issue #8797: with reverse proxy authentication and public access both on, the login button does not trigger proxy auth.
Updates and backups#
Update. The docs say you must read the release notes and back up first. Then change the tag in docker-compose.yml:
Linux#
cd ~/docker_volumes/mealie docker compose down docker compose pull docker compose up -d docker compose logs --tail=100 mealie
Windows (PowerShell)#
Set-Location "$HOME\docker_volumes\mealie" docker compose down docker compose pull docker compose up -d docker compose logs --tail=100 mealie
Mac (Terminal)#
Same commands as Linux.
Back up on a schedule. The docs say backups must be stored somewhere safe outside the server, so copy each archive to another machine. Save this as ~/docker_volumes/mealie/backup.sh, and run chmod 700 on it. Our restic guide shows an encrypted route:
#!/bin/bash cd ~/docker_volumes/mealie || exit 1 docker compose down tar -czf "backups/mealie-$(date +%F).tar.gz" data chmod 600 backups/mealie-*.tar.gz docker compose up -d
On Linux or Mac add a nightly 03:00 entry with crontab -e: 0 3 * * * $HOME/docker_volumes/mealie/backup.sh. The site is offline for a few seconds each night.
On Windows, save this as backup.ps1 and schedule it:
Set-Location "$HOME\docker_volumes\mealie" docker compose down Compress-Archive -Path data -DestinationPath "backups\mealie-$(Get-Date -Format yyyy-MM-dd).zip" -Force docker compose up -d
schtasks /Create /SC DAILY /ST 03:00 /TN "Mealie backup" /TR "powershell.exe -NoProfile -File $HOME\docker_volumes\mealie\backup.ps1"
Restore test. Unpack one archive into a new folder and start a spare copy on another port, never over the live data (our test pattern):
mkdir -p /tmp/mealie-restore && tar -xzf backups/mealie-<date>.tar.gz -C /tmp/mealie-restore docker run --rm -d --name mealie-restore -p 9926:9000 -e PUID=1000 -e PGID=1000 \ -v /tmp/mealie-restore/data:/app/data ghcr.io/mealie-recipes/mealie:v3.30.0
Open http://localhost:9926, log in with your own account and check a recipe. Then docker stop mealie-restore. On Windows use a folder under $HOME in place of /tmp. The in-app restore from /admin/backups is the other route; the docs say it is destructive.
If you use Postgres, the docs say an in-app restore needs the Mealie database user to be a superuser temporarily, and that upgrading Postgres major versions needs manual steps.
Performance and resources#
The docs publish no idle RAM, CPU or disk figures, so this guide gives none. Measure your own machine:
- Resources:
docker stats mealieshows live CPU and memory. Keep the 1000 MB limit unless you see out-of-memory kills. - Users: SQLite suits 1 to 20 users; for many concurrent users or fuzzy search ("brocolli" finds broccoli) the docs say to use Postgres. The docs' Postgres example uses
postgres:17. - Workers:
UVICORN_WORKERSdefaults to 1. The docs warn that changing it may cause memory leaks; leave it alone. - Old photos: since v3.7.0 new images are smaller; the docs give a
reprocess_images.pyscript (same folder as above, option--workers 2) to convert older recipes.
FAQ#
Is Mealie free to use? Yes, under AGPL-3.0. If you change it and offer it to others over a network, the licence asks you to share your changes.
Is the project still maintained? Yes. It is the active mealie-recipes/mealie repository, with v3.30.0 released on 31 October 2026. It is not archived and we found no rename.
Can I run it on a Raspberry Pi? On a 64-bit operating system, yes (arm64). The docs say 32-bit ARM is not supported, so a Pi needs a 64-bit OS.
Does it send my data to the project? The docs list no analytics or telemetry setting. Recipe imports fetch the pages you ask for, and AI features send content to the provider you configure; nothing is sent to an AI provider until you add one.
SQLite or Postgres? Start with SQLite on a local disk. Move to Postgres for many concurrent users, fuzzy search, or if your data must live on network storage. The docs say backups let you move between them.
Sources#
- Mealie release v3.30.0, README, LICENSE, Dockerfile and entry.sh - read November 2026
- Docs at v3.30.0: installation checklist, SQLite, PostgreSQL, backend configuration, AI providers, security, backups and restoring, updating and FAQ, rendered at docs.mealie.io - read November 2026
- Mealie image on GitHub Container Registry (tag
v3.30.0checked) - November 2026 - Caddy release v2.11.9 and Caddy Docker image (tag
2.11.8checked) - November 2026 - GitHub issues #4663, #5296, #5944, #6045, #7219, #7383, #7435, #7565, #7957, #8503, #8551, #8797, #8915 and #8946 - read November 2026
Checked against the official docs on 2026-11-05.