Calibre-Web but Automated and with tons of New Features! Fully automate and simplify your eBook set up!
6,227
stars
1,610
commits
JavaScript
primary language
Aug 7, 2026
updated

CWA is and always will be free and open source. If it makes your library life easier and you're able to support development, contributions go directly to:
Calibre, while a fantastic tool for its age, has several problems when containerised, including its reliance on a KasmVNC server instance for the UI, which is near impossible to use on mobile and is relatively resource-heavy if you're running a small, lower power server like I am.
For many, Calibre-Web has really swooped in to save the day, offering an alternative to a containerised Calibre instance that's resource-light and with a much more modern UI to boot.
However, when compared to full-fat Calibre, it unfortunately lacks a few core features leading many to run both services in parallel, each serving to fill in where the other lacks, resulting in an often clunky, imperfect solution.
Calibre-Web Automated aims to be an all-in-one solution, combining the modern lightweight web UI from Calibre-Web with the robust, versatile feature set of Calibre, with a slew of extra features and automations thrown in on top.

CWA allows you to keep your ebook library accessible & organised and looks good while doing it 😎🦚
[!IMPORTANT]
CWA does not approve of or support piracy of copyrighted materials and is not responsible for user behaviour
I want to say a big thanks 🙏 to all the members of this community that have taken the time to participate in the testing and development of this project and we encourage anyone who would like to to contribute in some way. Anyone of any level is welcome and every little helps!
For anyone that wish to contribute to this project in some way, please reach out on our Discord Server and see how you can best get involved:
Or alternatively make your own companion project, come hang out and or come get help if you're facing issues :)
NETWORK_SHARE_MODE=true
metadata.db and app.db to prevent locking issuesCWA optimizes SQLite concurrency by enabling Write-Ahead Logging (WAL) on local disks.
Some network filesystems (NFS/SMB) do not fully support WAL or reliable file locking, which can cause intermittent "database is locked" errors or corruption risks.
If you are deploying on a network share, set the following environment variable to disable WAL:
NETWORK_SHARE_MODE=trueThis tells CWA to avoid enabling WAL on the Calibre metadata.db and the app.db settings database. It also disables recursive ownership changes (chown) performed by init/maintenance scripts to avoid permission issues on network filesystems. Default is false (WAL enabled) for better performance on local disks.
inotify (via inotifywait) to detect new files in the ingest folder with minimal latency and overhead.NETWORK_SHARE_MODE=true is set, CWA switches the ingest and metadata watcher services to a polling-based watcher that periodically scans for changes. This improves reliability on NAS/network mounts at the cost of slightly higher I/O and up to a few seconds of latency.inotify events reliably. CWA auto-detects Docker Desktop at startup and prefers the same polling watcher for reliability.CWA_WATCH_MODE=poll.CWA uses Werkzeug's ProxyFix middleware to properly handle X-Forwarded-For, X-Forwarded-Proto, and other proxy headers.
By default, it trusts 1 proxy in the chain. If you have multiple proxies (e.g., Cloudflare Tunnel → nginx → CWA), set:
TRUSTED_PROXY_COUNT=2 (or the total number of proxies in your chain)Why this matters: Session protection validates requests based on the client's IP address. If ProxyFix doesn't trust enough proxies, it may see different IPs between requests, causing "Session protection triggered" warnings and forcing re-login.
Troubleshooting: If you see frequent session protection warnings in logs, check your proxy chain depth and adjust this variable accordingly.
| Modern & responsive Bootstrap 3 HTML5 interface | Comprehensive user management with per-user permissions | OPDS feed for ereader apps |
| eBook metadata editing and deletion support | Metadata download from various sources (extensible via plugins) | eBook download restriction to logged-in users |
| Public user registration support | Send eBooks to E-Readers with a single click | Sync Kobo devices with your Calibre library |
| In-browser eBook reading support for multiple formats | Content hiding based on categories and Custom Column content per user | "Magic Link" login for easy access on eReaders |
| Enhanced OAuth 2.0/OIDC authentication with auto-discovery | Advanced search and filtering options | Multilingual user interface supporting 20+ languages |
/config/processed_books though this can be toggled in the CWA Settings panel



Ever had it where you're super excited to start reading your next book but for some reason, Amazon's Send-to-Kindle service just keeps rejecting it? Well no more!
Originally developed by innocenat, this tool corrects the following potential issues for every EPUB processed by CWA:
<body> with ID hash.<img> tags with no source field.This ensures maximum comparability for each EPUB file with the Amazon Send-to-Kindle service and for those who don't use Amazon devices, has the side benefit of cleaning up your lower quality files!
Enabled by default, with per-run backups in /config/processed_books
Bulk processing of whole library with progress tracking available in the Admin Panel

/config/processed_books or to trust the process and have CWA simply convert and replace those files (not recommended)Built-in KOReader progress sync with automatic book identification:
/kosync endpoint on your CWA instancemetadata.db files and point to their location in the Web UI, CWA will now automatically detect the lack of Library in your given bind and automatically create a new one for you! It will even automatically register it with the Web UI so you can really hit the ground runningRefresh Library button on the navbar of the Web UI and anything still sitting in the ingest folder will be automatically ingested!Books Listpage on the left hand side of the Web UI, select the books you wish to edit/ delete and use the buttons either above the table or within the headers to do whatever you need!
Please suggest any ideas or wishes you might have! we're open to anything!
curl -OL https://raw.githubusercontent.com/crocodilestick/calibre-web-automated/main/docker-compose.yml
Move the compose file to an empty folder (e.g. ~/docker/calibre-web-automated/docker-compose.yml). This will be used to store the server data and library
Edit the compose file using the comments to help, filling in your Timezone (optional) and desired binds
Navigate to where you downloaded the Compose file using cd and run:
docker compose up -d
And that's you off to the races! 🥳 HOWEVER to avoid potential problems and ensure maximum functionality, we recommend carrying out these Post-Install Tasks Here.
---
services:
calibre-web-automated:
image: crocodilestick/calibre-web-automated:latest
container_name: calibre-web-automated
environment:
# Only change these if you know what you're doing
- PUID=1000
- PGID=1000
# Edit to match your current timezone e.g. Europe/London, America/New_York - https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
- TZ=Europe/London
# Hardcover API Key required for Hardcover as a Metadata Provider, get one here: https://docs.hardcover.app/api/getting-started/
- HARDCOVER_TOKEN=your_hardcover_api_key_here
# If your library is on a network share (e.g., NFS/SMB), disable WAL to reduce locking issues
# Accepts: true/false (default: false)
- NETWORK_SHARE_MODE=false
# Override the default port (8083) for the web server.
# Accepts any valid port number.
- CWA_PORT_OVERRIDE=8083
volumes:
# CW users migrating should stop their existing CW instance, make a copy of the config folder, and bind that here to carry over all of their user settings ect.
- /path/to/config/folder:/config
# This is an ingest dir, NOT a library one. Anything added here will be automatically added to your library according to the settings you have configured in CWA Settings page. All files placed here are REMOVED AFTER PROCESSING
- /path/to/the/folder/you/want/to/use/for/book/ingest:/cwa-book-ingest
# If you don't have an existing library, CWA will automatically create one at the bind provided here
- /path/to/your/calibre/library:/calibre-library
# If you use calibre plugins, you can bind your plugins folder here to have CWA attempt to add them to its workflow (WIP)
# If you are starting with a fresh install, you also need to copy customize.py.json to the Calibre config volume above, in /path/to/config/folder/.config/calibre/customize.py.json, see the note below for more info
- /path/to/your/calibre/plugins/folder:/config/.config/calibre/plugins
ports:
# Change the first number to change the port you want to access the Web UI, not the second
- 8083:8083
# If you set CWA_PORT_OVERRIDE to a port below 1024, you may need to uncomment the following line:
# cap_add:
# - NET_BIND_SERVICE
restart: unless-stopped
Please make sure all 3 of the main volume bindings are separate directories, errors can occur when binds are made within other binds.
/config - This is used to store logs and other miscellaneous files that keep CWA running
root:root in your main os)/config directory containing app.db to ensure settings and users are pulled in/cwa-book-ingest - ATTENTION ⚠️ - All files within this folder will be DELETED after being processed. This folder should only be used to dump new books into for import and automatic conversion/calibre-library - This should be bound to your Calibre library folder where the metadata.db & book(s) files reside.
root:root in your main os)metadata.db was utilised/config/.config/calibre/plugins - This should be bound to a directory containing a copy of your existing Calibre plugins. Configuration will be retained. (There is currently no way to configure plugins via CWA.)
customize.py.json file from the Calibre plugins' parent directory to the correct config folder above, e.g. /path/to/config/folder/.config/calibre/customize.py.json. See the section below if you don't know where to find this file./app/calibre-web-automated/gmail.json (Optional) - This is used to setup Calibre-Web and/or CWA with your gmail account for sending books via email. Follow the guide here if this is something you're interested in but be warned it can be a very fiddly process, I would personally recommend a simple SMTP Servercustomize.py.json:~/Library/Preferences/calibre/customize.py.json.~/.config/calibre/customize.py.json.%APPDATA%\calibre\customize.py.json (typically C:\Users\<YourUsername>\AppData\Roaming\calibre\customize.py.json). Older installations might have it in C:\Program Files\Calibre\customize.py.json or C:\Program Files\Calibre2\customize.py.json.Note: If you can't find this file, it means you haven't configured any Calibre plugins yet. You can skip the plugins volume binding if you don't use Calibre plugins.
And just like that, Calibre-Web Automated should be up and running! HOWEVER to avoid potential problems and ensure maximum functionality,we recommend carrying out these Post-Install Tasks Here.
/books bind was in Calibre-Web, should be your /calibre-library bind for CWA/config folder in your Docker Compose that you were using for CW (or a copy of it to be extra safe)/books by default)Enable Uploads is enabled in Settings -> Basic Configuration -> Feature ConfigurationUsername: admin
Password: admin123
/cwa-book-ingest/cwa-book-ingest is not supported. It can cause duplicate imports and potentially a corrupt database. It is recommended to first download the books completely, then transfer them to /cwa-book-ingest to avoid any issues/cwa-book-ingest are owned by your user rather than root. Otherwise, permission errors may occur and may result in incomplete importing.CWA now includes built-in KOReader syncing functionality, allowing you to sync your reading progress across devices using KOReader. This feature provides a modern, secure alternative to traditional KOReader sync servers. Navigate to http://your-cwa-instance:8083/kosync in your browser where you'll find download links and installation instructions for the CWA KOReader plugin.
Build the image
Edit and run build.sh to build a local Docker image of Calibre-Web-Automated. See the script itself for usage details.
Edit docker-compose.yml.dev
Update at minimum:
image: → your image tag from step 1volumes mounts → paths for config, ingest, library, pluginsTo have the app refresh dynamically in response to code changes, see comments in the docker-compose.yml.dev** for details and examples on "live-edit" mounts.
$ docker compose -f docker-compose.yml.dev up -d
CWA is and always will be free and open source. If it makes your library life easier and you're able to support development, contributions go directly to:
(top 30 of 123)
JavaScript
47.8%
Python
28.0%
Fluent
13.6%
HTML
7.6%
CSS
1.9%
Calibre-Web but Automated and with tons of New Features! Fully automate and simplify your eBook set up!
6,227
stars
1,610
commits
JavaScript
primary language
Aug 7, 2026
updated

CWA is and always will be free and open source. If it makes your library life easier and you're able to support development, contributions go directly to:
Calibre, while a fantastic tool for its age, has several problems when containerised, including its reliance on a KasmVNC server instance for the UI, which is near impossible to use on mobile and is relatively resource-heavy if you're running a small, lower power server like I am.
For many, Calibre-Web has really swooped in to save the day, offering an alternative to a containerised Calibre instance that's resource-light and with a much more modern UI to boot.
However, when compared to full-fat Calibre, it unfortunately lacks a few core features leading many to run both services in parallel, each serving to fill in where the other lacks, resulting in an often clunky, imperfect solution.
Calibre-Web Automated aims to be an all-in-one solution, combining the modern lightweight web UI from Calibre-Web with the robust, versatile feature set of Calibre, with a slew of extra features and automations thrown in on top.

CWA allows you to keep your ebook library accessible & organised and looks good while doing it 😎🦚
[!IMPORTANT]
CWA does not approve of or support piracy of copyrighted materials and is not responsible for user behaviour
I want to say a big thanks 🙏 to all the members of this community that have taken the time to participate in the testing and development of this project and we encourage anyone who would like to to contribute in some way. Anyone of any level is welcome and every little helps!
For anyone that wish to contribute to this project in some way, please reach out on our Discord Server and see how you can best get involved:
Or alternatively make your own companion project, come hang out and or come get help if you're facing issues :)
NETWORK_SHARE_MODE=true
metadata.db and app.db to prevent locking issuesCWA optimizes SQLite concurrency by enabling Write-Ahead Logging (WAL) on local disks.
Some network filesystems (NFS/SMB) do not fully support WAL or reliable file locking, which can cause intermittent "database is locked" errors or corruption risks.
If you are deploying on a network share, set the following environment variable to disable WAL:
NETWORK_SHARE_MODE=trueThis tells CWA to avoid enabling WAL on the Calibre metadata.db and the app.db settings database. It also disables recursive ownership changes (chown) performed by init/maintenance scripts to avoid permission issues on network filesystems. Default is false (WAL enabled) for better performance on local disks.
inotify (via inotifywait) to detect new files in the ingest folder with minimal latency and overhead.NETWORK_SHARE_MODE=true is set, CWA switches the ingest and metadata watcher services to a polling-based watcher that periodically scans for changes. This improves reliability on NAS/network mounts at the cost of slightly higher I/O and up to a few seconds of latency.inotify events reliably. CWA auto-detects Docker Desktop at startup and prefers the same polling watcher for reliability.CWA_WATCH_MODE=poll.CWA uses Werkzeug's ProxyFix middleware to properly handle X-Forwarded-For, X-Forwarded-Proto, and other proxy headers.
By default, it trusts 1 proxy in the chain. If you have multiple proxies (e.g., Cloudflare Tunnel → nginx → CWA), set:
TRUSTED_PROXY_COUNT=2 (or the total number of proxies in your chain)Why this matters: Session protection validates requests based on the client's IP address. If ProxyFix doesn't trust enough proxies, it may see different IPs between requests, causing "Session protection triggered" warnings and forcing re-login.
Troubleshooting: If you see frequent session protection warnings in logs, check your proxy chain depth and adjust this variable accordingly.
| Modern & responsive Bootstrap 3 HTML5 interface | Comprehensive user management with per-user permissions | OPDS feed for ereader apps |
| eBook metadata editing and deletion support | Metadata download from various sources (extensible via plugins) | eBook download restriction to logged-in users |
| Public user registration support | Send eBooks to E-Readers with a single click | Sync Kobo devices with your Calibre library |
| In-browser eBook reading support for multiple formats | Content hiding based on categories and Custom Column content per user | "Magic Link" login for easy access on eReaders |
| Enhanced OAuth 2.0/OIDC authentication with auto-discovery | Advanced search and filtering options | Multilingual user interface supporting 20+ languages |
/config/processed_books though this can be toggled in the CWA Settings panel



Ever had it where you're super excited to start reading your next book but for some reason, Amazon's Send-to-Kindle service just keeps rejecting it? Well no more!
Originally developed by innocenat, this tool corrects the following potential issues for every EPUB processed by CWA:
<body> with ID hash.<img> tags with no source field.This ensures maximum comparability for each EPUB file with the Amazon Send-to-Kindle service and for those who don't use Amazon devices, has the side benefit of cleaning up your lower quality files!
Enabled by default, with per-run backups in /config/processed_books
Bulk processing of whole library with progress tracking available in the Admin Panel

/config/processed_books or to trust the process and have CWA simply convert and replace those files (not recommended)Built-in KOReader progress sync with automatic book identification:
/kosync endpoint on your CWA instancemetadata.db files and point to their location in the Web UI, CWA will now automatically detect the lack of Library in your given bind and automatically create a new one for you! It will even automatically register it with the Web UI so you can really hit the ground runningRefresh Library button on the navbar of the Web UI and anything still sitting in the ingest folder will be automatically ingested!Books Listpage on the left hand side of the Web UI, select the books you wish to edit/ delete and use the buttons either above the table or within the headers to do whatever you need!
Please suggest any ideas or wishes you might have! we're open to anything!
curl -OL https://raw.githubusercontent.com/crocodilestick/calibre-web-automated/main/docker-compose.yml
Move the compose file to an empty folder (e.g. ~/docker/calibre-web-automated/docker-compose.yml). This will be used to store the server data and library
Edit the compose file using the comments to help, filling in your Timezone (optional) and desired binds
Navigate to where you downloaded the Compose file using cd and run:
docker compose up -d
And that's you off to the races! 🥳 HOWEVER to avoid potential problems and ensure maximum functionality, we recommend carrying out these Post-Install Tasks Here.
---
services:
calibre-web-automated:
image: crocodilestick/calibre-web-automated:latest
container_name: calibre-web-automated
environment:
# Only change these if you know what you're doing
- PUID=1000
- PGID=1000
# Edit to match your current timezone e.g. Europe/London, America/New_York - https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
- TZ=Europe/London
# Hardcover API Key required for Hardcover as a Metadata Provider, get one here: https://docs.hardcover.app/api/getting-started/
- HARDCOVER_TOKEN=your_hardcover_api_key_here
# If your library is on a network share (e.g., NFS/SMB), disable WAL to reduce locking issues
# Accepts: true/false (default: false)
- NETWORK_SHARE_MODE=false
# Override the default port (8083) for the web server.
# Accepts any valid port number.
- CWA_PORT_OVERRIDE=8083
volumes:
# CW users migrating should stop their existing CW instance, make a copy of the config folder, and bind that here to carry over all of their user settings ect.
- /path/to/config/folder:/config
# This is an ingest dir, NOT a library one. Anything added here will be automatically added to your library according to the settings you have configured in CWA Settings page. All files placed here are REMOVED AFTER PROCESSING
- /path/to/the/folder/you/want/to/use/for/book/ingest:/cwa-book-ingest
# If you don't have an existing library, CWA will automatically create one at the bind provided here
- /path/to/your/calibre/library:/calibre-library
# If you use calibre plugins, you can bind your plugins folder here to have CWA attempt to add them to its workflow (WIP)
# If you are starting with a fresh install, you also need to copy customize.py.json to the Calibre config volume above, in /path/to/config/folder/.config/calibre/customize.py.json, see the note below for more info
- /path/to/your/calibre/plugins/folder:/config/.config/calibre/plugins
ports:
# Change the first number to change the port you want to access the Web UI, not the second
- 8083:8083
# If you set CWA_PORT_OVERRIDE to a port below 1024, you may need to uncomment the following line:
# cap_add:
# - NET_BIND_SERVICE
restart: unless-stopped
Please make sure all 3 of the main volume bindings are separate directories, errors can occur when binds are made within other binds.
/config - This is used to store logs and other miscellaneous files that keep CWA running
root:root in your main os)/config directory containing app.db to ensure settings and users are pulled in/cwa-book-ingest - ATTENTION ⚠️ - All files within this folder will be DELETED after being processed. This folder should only be used to dump new books into for import and automatic conversion/calibre-library - This should be bound to your Calibre library folder where the metadata.db & book(s) files reside.
root:root in your main os)metadata.db was utilised/config/.config/calibre/plugins - This should be bound to a directory containing a copy of your existing Calibre plugins. Configuration will be retained. (There is currently no way to configure plugins via CWA.)
customize.py.json file from the Calibre plugins' parent directory to the correct config folder above, e.g. /path/to/config/folder/.config/calibre/customize.py.json. See the section below if you don't know where to find this file./app/calibre-web-automated/gmail.json (Optional) - This is used to setup Calibre-Web and/or CWA with your gmail account for sending books via email. Follow the guide here if this is something you're interested in but be warned it can be a very fiddly process, I would personally recommend a simple SMTP Servercustomize.py.json:~/Library/Preferences/calibre/customize.py.json.~/.config/calibre/customize.py.json.%APPDATA%\calibre\customize.py.json (typically C:\Users\<YourUsername>\AppData\Roaming\calibre\customize.py.json). Older installations might have it in C:\Program Files\Calibre\customize.py.json or C:\Program Files\Calibre2\customize.py.json.Note: If you can't find this file, it means you haven't configured any Calibre plugins yet. You can skip the plugins volume binding if you don't use Calibre plugins.
And just like that, Calibre-Web Automated should be up and running! HOWEVER to avoid potential problems and ensure maximum functionality,we recommend carrying out these Post-Install Tasks Here.
/books bind was in Calibre-Web, should be your /calibre-library bind for CWA/config folder in your Docker Compose that you were using for CW (or a copy of it to be extra safe)/books by default)Enable Uploads is enabled in Settings -> Basic Configuration -> Feature ConfigurationUsername: admin
Password: admin123
/cwa-book-ingest/cwa-book-ingest is not supported. It can cause duplicate imports and potentially a corrupt database. It is recommended to first download the books completely, then transfer them to /cwa-book-ingest to avoid any issues/cwa-book-ingest are owned by your user rather than root. Otherwise, permission errors may occur and may result in incomplete importing.CWA now includes built-in KOReader syncing functionality, allowing you to sync your reading progress across devices using KOReader. This feature provides a modern, secure alternative to traditional KOReader sync servers. Navigate to http://your-cwa-instance:8083/kosync in your browser where you'll find download links and installation instructions for the CWA KOReader plugin.
Build the image
Edit and run build.sh to build a local Docker image of Calibre-Web-Automated. See the script itself for usage details.
Edit docker-compose.yml.dev
Update at minimum:
image: → your image tag from step 1volumes mounts → paths for config, ingest, library, pluginsTo have the app refresh dynamically in response to code changes, see comments in the docker-compose.yml.dev** for details and examples on "live-edit" mounts.
$ docker compose -f docker-compose.yml.dev up -d
CWA is and always will be free and open source. If it makes your library life easier and you're able to support development, contributions go directly to:
(top 30 of 123)
JavaScript
47.8%
Python
28.0%
Fluent
13.6%
HTML
7.6%
CSS
1.9%