Self-hosted service
crocodilestick/Calibre-Web-Automated avatar
crocodilestick/Calibre-Web-Automated

Calibre-Web-Automated: An Ingest Pipeline Bolted Onto a Reading Interface

Calibre-Web but Automated and with tons of New Features! Fully automate and simplify your eBook set up!

6,285 stars517 forksJavaScriptGPL-3.0

At a glance

What is it?
CWA wraps Calibre-Web with file watchers, format conversion and a Calibre binary, so dropped files land in the library without a manual import step. The trade is a heavier container and a fork you now have to keep current.
Who is it for?
Adopt CWA if you run Calibre-Web today and the manual import step is the thing that keeps your library stale, or if you want KOSync and OAuth without patching Calibre-Web yourself. Do not adopt it if you already have a working Calibre plus Calibre-Web split that you maintain deliberately, or if you run on a low-power host where the extra container weight matters.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 40 days ago.
What is it written in?
Mainly JavaScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The gap CWA fills: Calibre-Web without the manual import

Calibre-Web gives you a browser interface over a Calibre library. What it does not give you is Calibre's ingest machinery. In stock Calibre-Web, a file sitting in a watch folder stays there until someone triggers an import, and format conversion is a separate concern. The README frames the problem as one of running two services in parallel: Calibre for its feature set, Calibre-Web for its interface, each covering what the other lacks, which the author calls a clunky and imperfect solution. CWA's stated goal is to collapse that pair into one container by keeping the Calibre-Web UI and adding the automation layer on top. The target user is specific: someone self-hosting on modest hardware who wants a drop folder that behaves like a drop folder. If you already enjoy running two services and scripting the handoff, this project is solving a problem you have already solved.

What actually runs inside the container

The mechanism visible in the README is a set of watchers. CWA watches an ingest location and a metadata location, and when files appear it processes them into the Calibre library. On local disks those watchers use filesystem events; when NETWORK_SHARE_MODE is set they switch to a polling-based watcher, which the README describes as a reliability trade rather than a speed one. The container carries a Calibre binary alongside the Calibre-Web application, which is why conversion and library writes can happen in-process rather than by shelling out to a second service. Two SQLite databases are in play: metadata.db, which belongs to the Calibre library, and app.db, which holds Calibre-Web settings. The README states that CWA enables Write-Ahead Logging on both for concurrency on local storage. That is the whole architecture as documented: watchers feeding a Calibre-backed library, with a web UI reading the result. Anything beyond that, such as how the ingest queue is ordered or what happens when two files arrive with the same title, is not something the supplied material spells out. The v4.0.6 release notes do advertise automatic duplicate handling and resolution, but the README text here does not describe the algorithm.

Installation: compose file, volumes, and the env vars that matter

The README recommends Docker Compose and lists a Quick Install path plus a section for users migrating from stock Calibre-Web. The one environment variable documented in full is NETWORK_SHARE_MODE. Setting NETWORK_SHARE_MODE=true does three things according to the README: it disables WAL on metadata.db and app.db, it skips recursive chown operations that tend to fail on NFS and SMB, and it moves the ingest and metadata watchers to polling. The default is false, which means WAL enabled and recursive ownership changes performed. That default is correct for a local disk and wrong for a share, and the failure mode is not subtle: the README names intermittent database is locked errors and corruption risk on filesystems that do not implement WAL or file locking properly. So the first decision you make at install time is whether your library path is local or remote, and that decision determines the value of one variable. The README also documents default admin login credentials under Post-Install Tasks, which means a fresh container is reachable with known credentials until you change them. Treat that as a step in the install, not an afterthought.

Network shares: the mode that makes NFS work and makes it slower

The README's warning block on NFS and SMB is the most concrete engineering content in the document, and it deserves to be read as a limitation rather than a feature. SQLite's WAL mode depends on shared-memory and locking behaviour that some network filesystems do not implement faithfully. CWA's answer is to turn WAL off entirely when NETWORK_SHARE_MODE=true. That removes the corruption risk the README describes, and it also removes the concurrency benefit WAL was there to provide. On top of that, polling watchers mean the container notices new files on a schedule rather than immediately, and every poll is a directory traversal over a network mount. The README says network shares are fully supported with the mode enabled and are still slower than local disks. Both halves of that sentence are true and they point in opposite directions. If your library lives on a NAS and you cannot move it, you are choosing correctness over responsiveness. If you can keep the library on local storage and back it up elsewhere, do that instead.

Where CWA is the wrong tool

Three cases stand out. First, a library you curate by hand. Automatic ingest is a liability if every book is supposed to pass through a metadata review before it enters the library, because the whole point of the watcher is to skip that step. Second, a host where the Calibre binary is unwelcome. CWA is heavier than stock Calibre-Web by construction, and the README's own motivation section is about running on a small, lower-power server, so the project is aware of the tension even as it adds weight. Third, anyone who needs a stable, slow-moving dependency. The release history supplied here shows v4.0.4, v4.0.5 and v4.0.6 landing within four days of each other in early February 2026, all carrying the same release title. That cadence is normal for an actively developed fork and it is also the reason you should not point a production library at a moving tag. The README's community section thanks members for participating in testing, which is a fair description of what running the latest release entails. Pin a version and read the notes before you move.

The alternative: stock Calibre-Web plus your own glue

The real comparison is not against Calibre itself but against the arrangement CWA was built to replace: stock Calibre-Web with a separate process doing the import. In that setup you keep upstream Calibre-Web, which tracks its own release cycle and has a larger install base to draw on for troubleshooting, and you write or install a watcher that calls calibredb to add files. The difference in approach is where the automation lives. CWA puts it inside the same container as the web application, which is why a single compose file gets you a working pipeline and why you inherit CWA's release cadence for the whole stack. The split approach keeps the UI upgradeable independently of the automation, at the cost of maintaining the glue yourself and accepting that the two halves can drift. CWA also adds features that stock Calibre-Web does not have, including KOSync for KOReader progress syncing and OAuth 2.0 with OIDC, both documented in the README's usage section. If those two features are what you actually want, the fork is the shorter path. If you only want automatic import, a small script against upstream Calibre-Web is less to own.

Licensing and the cost of tracking a fork

CWA is GPL-3.0. That matters in two directions. If you modify and distribute the container, the copyleft terms apply to what you distribute, and the README's For Developers section describes building a custom Docker image, which is exactly the path that produces a modified artifact. Running it privately on your own server does not trigger distribution obligations, but this is a description of the licence, not legal advice, and anyone redistributing a modified image should read the licence text themselves. The maintenance cost is the more practical concern. You are depending on a fork of Calibre-Web, so upstream changes have to be merged by the CWA maintainer before you see them. When Calibre-Web ships a security fix, your exposure window is however long that merge takes. The mitigation available to you is version pinning plus a habit of reading release notes before upgrading, because the supplied release titles are long and cover several unrelated changes at once, which makes it hard to tell from the title alone whether a given release touches ingest, authentication or the database layer. Check the notes, then upgrade.

Editorial conclusion

Adopt CWA if you run Calibre-Web today and the manual import step is the thing that keeps your library stale, or if you want KOSync and OAuth without patching Calibre-Web yourself. Do not adopt it if you already have a working Calibre plus Calibre-Web split that you maintain deliberately, or if you run on a low-power host where the extra container weight matters. Before you migrate, verify three things: that your existing app.db survives the upgrade path described in the migration section, that your storage is local unless you are prepared to set NETWORK_SHARE_MODE=true, and that the default admin credentials are changed on first login. The project's own README is explicit that the community does the testing, so treat a fresh release as something to schedule rather than something to apply the hour it appears.

Official sources

  1. crocodilestick/Calibre-Web-Automated on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
Community notes

Community notes