What changed
Operators can now install their own Calibre plugins for the ingest pipeline. Closes a long-standing upstream feature request (CWA #243, 11 reactions / 15 comments going back to early 2025).
The feature is off by default. To enable, add an environment variable to your docker-compose.yml:
services:
calibre-web-automated:
environment:
- CWA_CALIBRE_USER_PLUGINS=trueWhen enabled, every Calibre subprocess (the one that runs during ingest, full-library conversion, cover enforcement, and metadata embed) loads any plugin .zip files placed under /config/.config/calibre/plugins/.
Operator workflow
# 1. Find your local Calibre plugins directory
# Linux: ~/.config/calibre/plugins/
# macOS: ~/Library/Preferences/calibre/plugins/
# Windows: %AppData%/calibre/plugins/
# 2. Copy your .zip plugins into the CWA volume
# (the dir is auto-created on first start when the env var is set)
cp ~/.config/calibre/plugins/*.zip /path/to/cwa/config/.config/calibre/plugins/
# 3. Restart the container so the bootstrap creates the directory and
# so calibre subprocess invocations pick up the new HOME setting
docker compose pull calibre-web-automated
docker compose up -d --force-recreate calibre-web-automatedThe next ingest run that triggers a format conversion uses your plugins.
Why opt-in
The previous behavior had HOME=/config hardcoded in every Calibre subprocess invocation, which meant any third-party Python in /config/.config/calibre/plugins/ was silently always loaded — regardless of operator intent. That is now opt-in deliberately. Existing deployments that didn't set the env var see no behavior change; the path is inert until you ask for it.
To get the fix
docker pull ghcr.io/new-usemame/calibre-web-nextgen:v4.0.40
Or if you pin :latest, a docker compose pull && docker compose up -d will pick it up.
Credit
Reported originally by @AllegedlyUndead. Substantial testing notes from @ErikThorsell, @etfeet, @jonasherzfeld, @pavel-pi.
Anything else off?
Open an issue — the tracker stays watched.
Full changelog: v4.0.39...v4.0.40