Find and organize
Browse by author, tag, or format; search your catalog and collect books on shelves. No need to remember where a file lives.
Open-source, self-hosted ebook library
Bring the books you already organize in Calibre to a browser. Find a title by author or tag, read supported formats, and give family members their own accounts and shelves. Run it on your computer, server, or NAS.
Meet calibre-web
Keep organizing on your desktop with Calibre, then find and read your books in a browser. Family members can use the same library from their own devices without sharing your computer or administrator account.
calibre-web reads the catalog and files in an existing Calibre library, including authors, tags, and covers. If you only have loose ebook files, import them into Calibre first.
What you can do →Features
Browse by author, tag, or format; search your catalog and collect books on shelves. No need to remember where a file lives.
Open a supported book in the browser or download its original file to your device, straight from its detail page.
Create separate accounts and shelves for family members, with per-user access and download permissions.
Ways to read
Organize on your computer, find a book on your phone, and let each family member use their own shelf. Covers, authors, and details stay in one place.
Browse and read →Add your library as an OPDS catalog in a compatible reading app to browse and download available books.
Connect via OPDS →Choose eligible books from your shelves and sync them to a Kobo device for reading away from your browser.
Set up Kobo →calibre-web downloads
Install it on a computer, use a Debian package, or run a container on a server or NAS. Choose the method that fits your setup.
Install it directly on a Windows PC. Other devices on your local network can connect while that computer is running.
Windows download →Pick the amd64 or arm64 package that matches your machine. A NAS running Linux does not necessarily need a Debian package.
Linux downloads →Run it in a virtual environment on Windows, Linux, or macOS if you prefer to manage dependencies and background services yourself. There is no separate macOS DMG.
Python download →Already use containers? The LinuxServer-maintained image keeps application settings and the Calibre library in separate mounts. You do not need a system installer.
Docker setup →As of September 30, 2026, the latest upstream release we verified was 0.6.27, published August 8, 2026. These links go straight to upstream files. Before downloading later, check the current release.
| Platform / architecture | File | Size | SHA-256 | Download |
|---|---|---|---|---|
| Windows | Calibre-Web-V0627.exe | 50,498,839 B | Download ↗ | |
| Debian / Ubuntu amd64 | calibre-web_0.6.27_amd64.deb | 73,113,812 B | Download ↗ | |
| Debian / Ubuntu arm64 | calibre-web_0.6.27_arm64.deb | 66,438,220 B | Download ↗ | |
| Python 3 any | calibreweb-0.6.27-py3-none-any.whl | 8,114,276 B | Download ↗ | |
| Source / offline | calibreweb-0.6.27.tar.gz | 7,313,353 B | Download ↗ |
These hashes come from the upstream 0.6.27 release assets. Click a shortened hash in the table to copy it, or compare the full values here:
f99fbca8aaeb63bbe2015ef47c64a2a64e7293ff60140a0589987bea7e4cdf6c4c586f53bca0584f9f76b808cbead70350d1813274b425be6ba480d4668efe93f151db89d79b05b25dcb26066b18534075106690be030d461486c25149370be4c6d4173d31a4495e09c615857f30f0d03d9f7eabc7bb50558164f67083d4f72d6978e6143aedddf59d6709a060d1320159c17b7c986bec1878a6bd75f252f629The result must match the full 64-character hash for the same file and version.
sha256sum calibre-web_0.6.27_amd64.debshasum -a 256 calibreweb-0.6.27-py3-none-any.whl(Get-FileHash .\Calibre-Web-V0627.exe -Algorithm SHA256).Hash.ToLower()Run the command in the download directory. Replace the example filename if you downloaded a different file, then compare the output with that file's full hash above. If it differs, do not install the file; delete the incomplete download and try again.
Get started
Start with a Calibre library containing metadata.db, covers, and ebook files. If you have not created one yet, import your books with Calibre on a desktop first. The machine running calibre-web needs access to the entire library directory.
http://127.0.0.1:8083 on the host computer; use its local-network address from another device.metadata.db. For the Docker example, use /books, not the host path /srv/books or the database filename. Save; your titles should appear.Search for a platform, feature, or symptom such as “Kobo,” “413,” “password,” or “empty library.”
Container installation
If you already use containers, keep the application configuration and the book library in separate mounts. Save this example as compose.yaml on your Linux host or NAS. Confirm Docker Compose is available and your library directory exists, then adjust the user IDs, time zone, and paths. After starting, you should be able to open the app and see your books.
services:
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- ./config:/config
- /srv/books:/books:ro
ports:
- "8083:8083"
restart: unless-stopped
./config holds the application database and settings. The host path /srv/books must be the Calibre library directory containing metadata.db.
Save the file as compose.yaml and run docker compose up -d beside it. Inside the container, /config must be writable and /books must show your library.
On the server, open http://127.0.0.1:8083; from another device, use the NAS's local IP address. Sign in with admin / admin123 and change the password immediately.
In calibre-web, point the library setting to /books, not the host path /srv/books.
Run these commands beside compose.yaml. A successful start appears in docker compose ps. If the container exits, inspect its logs below.
docker compose pull
docker compose up -d
docker compose psRecord the pulled image digest so you know which build to restore. If the output is empty, check that the image was pulled and confirm its actual name.
docker image inspect lscr.io/linuxserver/calibre-web:latest --format '{{json .RepoDigests}}'Run id on the Docker host to get the account's UID and GID; replace the example PUID and PGID rather than assuming every NAS uses 1000. Set TZ to your time zone. Check logs and confirm the application user can read the library and write to the config directory. If the test fails, inspect parent-directory traversal permissions and mounts; do not use chmod 777.
id
docker logs --tail=100 calibre-web
docker exec -u abc calibre-web sh -c 'test -r /books/metadata.db && test -w /config'The :ro mount suits browsing, reading, and downloading existing files. To upload, delete, edit metadata, or save converted files, back up the library first, remove :ro, and give the application user appropriate write access. Do not substitute chmod 777 for correct ownership and permissions. Run this on the Docker host to inspect the mounts; if the library is missing, check the host path.
docker exec -it calibre-web sh -c 'ls -la /config /books'ebook-convert. LinuxServer's general Calibre mod targets x86-64; do not assume it works on ARM64. Check the image architecture and available conversion tools first.System installation
Windows has an installer or Python option. On macOS, use a Python virtual environment or Docker. A manual Linux installation gives you control over Python dependencies, systemd, and rollback. Confirm the app starts before connecting the library.
.exeDebian .debPython venvmacOS venvCalibre-Web-V0627.exe.http://127.0.0.1:8083.Location of Calibre database, select the library directory directly containing metadata.db and choose Save.admin / admin123, change the password, and test a book's details, cover, and original-format download.Test on the same computer first, then allow local-network access through the firewall if needed. The initial credentials are for first sign-in only; do not expose port 8083 directly to the internet.
mkdir C:\Services\calibre-web
cd C:\Services\calibre-web
py -m venv venv
.\venv\Scripts\python.exe -m pip install --upgrade pip
.\venv\Scripts\python.exe -m pip install calibreweb==0.6.27
.\venv\Scripts\cps.exeUse these commands if Python 3 and the py launcher are installed. Closing the terminal stops the foreground process. For long-term use, configure Task Scheduler with a fixed program path, working directory, and account, then check that the app and library are available after a reboot.
sudo apt update
sudo apt install git imagemagick python3-pip python3-venv
mkdir -p ~/Services
cd ~/Services
git clone --branch 0.6.27 --depth 1 https://github.com/janeczku/calibre-web
cd calibre-web
python3 -m venv venv
./venv/bin/python3 -m pip install --upgrade pip
./venv/bin/python3 -m pip install -r requirements.txt
./venv/bin/python3 cps.pyThis checks out release 0.6.27 rather than the development branch. Start in the foreground first; then use the systemd guide below. If building cryptography fails, upgrade pip inside the venv and follow the error to check for Cargo or Rust requirements.
dpkg --print-architecture
sudo apt install ./calibre-web_0.6.27_amd64.deb
dpkg -L calibre-webRun these in the download directory. If the architecture is arm64, replace the filename with calibre-web_0.6.27_arm64.deb. Inspect the installed executable and service files before starting the package; do not use the source installation's cps.py path. We have not executed this package on Debian or Ubuntu; use the venv route above for a fully documented foreground and background startup path.
mkdir -p ~/Services/calibre-web
cd ~/Services/calibre-web
python3 -m venv venv
./venv/bin/python -m pip install --upgrade pip
./venv/bin/python -m pip install calibreweb==0.6.27
./venv/bin/cpsOn Intel and Apple Silicon machines, check that Python and any optional Calibre, ebook-convert, or kepubify binaries match your architecture.
Background service
For source or venv installations on Ubuntu or Debian. Docker is managed by Compose and does not need this additional service.
This example keeps code in /opt/calibre-web and settings in /var/lib/calibre-web. Create the account, check out 0.6.27 as that user, and install its dependencies. If you already have an installation, back it up and adapt the paths rather than overwriting it.
sudo useradd --system --user-group --home-dir /var/lib/calibre-web --shell /usr/sbin/nologin calibreweb
sudo install -d -o calibreweb -g calibreweb /opt/calibre-web /var/lib/calibre-web
sudo -u calibreweb git clone --branch 0.6.27 --depth 1 https://github.com/janeczku/calibre-web /opt/calibre-web
sudo -u calibreweb python3 -m venv /opt/calibre-web/venv
sudo -u calibreweb /opt/calibre-web/venv/bin/python3 -m pip install -r /opt/calibre-web/requirements.txtThe calibreweb user also needs read and traverse permissions on the library and every parent directory. Grant write access only when needed; do not make the whole library world-writable.
Save this as /etc/systemd/system/calibre-web.service. The -p option fixes the location of the application database so changing the working directory does not create a different account database.
[Unit]
Description=Calibre-Web library
After=network.target
[Service]
User=calibreweb
Group=calibreweb
WorkingDirectory=/opt/calibre-web
ExecStart=/opt/calibre-web/venv/bin/python3 /opt/calibre-web/cps.py -p /var/lib/calibre-web/app.db -i 127.0.0.1
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetListening on 127.0.0.1 works for a reverse proxy on the same machine. For direct local-network access, adjust the bind address and firewall rules deliberately.
sudo systemctl daemon-reload
sudo systemctl enable --now calibre-web
sudo systemctl status calibre-web --no-pager
sudo journalctl -u calibre-web -n 100 --no-pagerThe status should say active/running. Check again after reboot. If the service keeps crashing, stop it and fix the dependency, permission, or path error rather than hiding it with a shorter restart interval.
Point calibre-web at the folder containing your Calibre database. The application accounts and book files live in different places.
/books/
├── metadata.db
├── Author Name/
│ └── Book Title (123)/
│ ├── cover.jpg
│ ├── Book Title - Author Name.epub
│ └── Book Title - Author Name.pdf
└── another-author/Select the root folder directly containing metadata.db. Do not move Calibre-managed author, title, or numbered folders by hand; the relative file paths in its database may stop working.
metadata.dbBook titles, authors, tags, formats, and library metadata. Back it up together with the book directories.
app.dbUsers, permissions, shelves, and settings. In the Docker example it lives at /config/app.db; other installations may use a different config directory or the path passed with -p.
docker exec calibre-web ls -la /booksRun this on the Docker host to confirm the database and book files are present. If the app cannot read them, see library troubleshooting.
Stop the app, then back up the entire Calibre library and the application config directory. The library includes metadata.db, books, and covers; the config includes app.db and other settings. For the Docker example, back up the host paths /srv/books and ./config (relative to the Compose file), not paths inside the container.
To restore, stop the service, put both backups back at their original mount points, and restart. Check that your users, shelves, covers, and a book download still work. See titles but not files?
Everyday use
Organize books, set account permissions, and choose a way to read on each device.
In a multi-user library, a Calibre boolean custom column represents a shared value, not each reader's private read/unread status.
OPDS exposes a catalog to compatible phone apps and ebook readers. Enter credentials in the client's own authentication fields where possible; do not put password-bearing URLs in public logs, screenshots, or synced bookmarks.
https://books.example.com/opds
A shelf can also have its own OPDS endpoint: /opds/shelf/{shelf_id}, without a trailing slash. Test covers and downloads with a regular account before sharing the address.
In the administrator mail server settings, enter the SMTP host, port, encryption method, sender account, and credentials from your mail provider. Save and send a test message. Use the provider's documented port and encryption settings.
Add a recipient address to the reader's profile. For Kindle delivery, also add the SMTP sender to Amazon's approved sender list, then send a book from its detail page.
Test message fails: check the SMTP host, port, encryption, authentication error, and application log. Test succeeds but Kindle receives nothing: check the recipient, approved sender, and attachment-size limit. Give each reader their own account and destination address.
The upstream FAQ recommends a separate calibre-web instance for each Calibre library. Give each instance its own application database, port, and log, managed by separate systemd units or Compose projects.
python3 /opt/calibre-web/cps.py -p /srv/calibre-web/instance1.db -i 127.0.0.1
python3 /opt/calibre-web/cps.py -p /srv/calibre-web/instance2.db -i 127.0.0.1
Configure each instance's library path and port before routing different domains or paths through a reverse proxy. Do not let two instances write the same app.db, or let Calibre desktop and calibre-web edit the same metadata.db at the same time.
LDAP, GitHub/Google OAuth, and remote login are optional and require extra dependencies and configuration. LDAP users still need to be created or imported in calibre-web; keep a local administrator password in case the LDAP service becomes unavailable.
Before enabling external authentication, keep an active administrator session and a way to revert. Test sign-in, OPDS, and Kobo with a regular account on the local network before exposing the setup publicly.
Connect a reader after browsing works in a browser. Each integration has its own permissions, URL, and supported formats.
In a compatible reading app, add a network catalog using your deployment address plus /opds, for example:
https://books.example.com/opdsEnter a regular reader's credentials in the app and test a book that account can download. For a 401 or 403 response, follow the OPDS authentication steps.
Enable sync in administrator settings, grant the reader Downloads Allowed, and generate a personal URL with Create/View in that user's profile. Set it as the Kobo api_endpoint; use HTTPS for access over the internet.
Sync depends on formats and shelf settings. PDF does not sync through this feature. See the full setup.
Conversion tools must be available where calibre-web actually runs. Having ebook-convert on the host does not put it inside a container.
.kobo/Kobo/Kobo eReader.conf on the device. Set api_endpoint under [OneStoreServices].image_host pointing to an address the device can reach. Save the configuration, safely eject the Kobo, and start a sync on the device.[OneStoreServices]
api_endpoint=https://books.example.com/kobo/<token>
Upstream documentation notes that Kobo integration can still have issues; very large libraries may time out. Start with a small library and one or two EPUBs.
Enter the Calibre binary directory in the administrator's external-binaries settings, and check that the service's actual user can execute the tool. Installation on another host or outside the service environment is not enough.
command -v ebook-convert
ebook-convert --version
To convert EPUB to Kobo's Kepub format, install kepubify and enter its actual executable path in the corresponding setting.
The general Calibre mod is linuxserver/mods:universal-calibre, but it targets x86-64; do not copy this setup unchanged to an ARM64 NAS.
DOCKER_MODS=linuxserver/mods:universal-calibre
docker exec calibre-web /usr/bin/ebook-convert --version
Set calibre-web's Calibre Converter field to the directory /usr/bin/, not the full /usr/bin/ebook-convert path found in older guides. Check /usr/bin/kepubify separately if needed.
Remote access
First confirm the library works on the server itself. Then add the location / example to an existing HTTPS Nginx server block. Replace 127.0.0.1:8083 with the actual application address; the surrounding site configuration must provide the domain and TLS certificate.
/opds and Kobo pathsNever expose the initial account or backend port directlylocation / {
proxy_pass http://127.0.0.1:8083;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 600s;
client_max_body_size 200m;
proxy_buffer_size 1024k;
proxy_buffers 4 512k;
proxy_busy_buffers_size 1024k;
}After saving the Nginx configuration, run sudo nginx -t on the proxy host. If the syntax check passes, run sudo systemctl reload nginx. From another device, open the site by domain, download a small book, and visit the OPDS catalog. If the homepage works but downloads fail, see file access; for upload 413 errors, see proxy size limits; for Kobo sync, see device and server logs.
The client_max_body_size 200m setting is only an Nginx example. The upstream FAQ documents a default Tornado upload limit of 200 MB. Other gateways, permissions, and available disk space can also limit uploads.
Save the application config (including app.db and keys), the complete book library (including metadata.db), and your Compose, systemd, and proxy configuration. Run these commands beside the Compose file after confirming that config and /srv/books are your actual paths. Inspect the archives and test a restore before upgrading.
docker compose stop
tar -C . -czf config-$(date +%F).tar.gz config
tar -C /srv -czf books-$(date +%F).tar.gz booksKeep the code or image, Python dependencies, application database, keys, and deployment files compatible. Do not repeatedly switch versions against your only production app.db.
Use an HTTPS reverse proxy, change the initial password, and enable registration and upload only if you need them. Give family members regular accounts.
Proxy setup and fixes →Troubleshooting
Check whether the problem is in the library, account, container, or reverse proxy before changing settings.
Run these commands on the Docker host; the example container is named calibre-web. The first should list /books/metadata.db; the second should print readable:
docker exec calibre-web ls -la /books/metadata.db
docker exec -u abc calibre-web sh -c 'test -r /books/metadata.db && echo readable'If the file is missing, point the Compose host path to the full Calibre library and inspect the /books mount with docker inspect calibre-web --format '{{json .Mounts}}'. If it exists but is unreadable, correct PUID/PGID and directory read/traverse permissions. If both tests pass, enter /books under Location of Calibre database and save. You do not need to delete /config.
Titles come from metadata.db, but the actual book files must also be accessible. On the Docker host, confirm that the full library is mounted. This command should find an EPUB; use another extension if your library has no EPUBs.
docker exec -u abc calibre-web sh -c 'find /books -type f -iname "*.epub" -print -quit'No file: mount or copy the entire library, preserving Calibre's author/title directories. File exists but a regular user cannot download: check Downloads Allowed for that account. If even the administrator fails, check file permissions. If it fails only via the proxy, compare the local and public addresses, then inspect proxy logs and file-size limits.
On the Docker host, inspect the actual config mount. It should point to persistent storage at /config inside the container, with app.db in the original host directory.
docker inspect calibre-web --format '{{range .Mounts}}{{println .Source .Destination}}{{end}}'
ls -la ./configIf starting Compose from another directory created a new empty host path, stop the service, locate the original config directory or backup, restore the original mount, and start again. Do not erase the old volume. Keep the book library and app.db separately.
On the service host, request the local OPDS address as a regular reader. The command prompts for a password; do not put it in the URL or shell history. Use HTTPS when testing from another machine.
curl --user reader -o /dev/null -sS -w '%{http_code}\n' http://127.0.0.1:8083/opdsA local 401 means check the account password and the client's authentication fields; for 403, check browse and download permissions. If the local URL works but the proxy fails, confirm that the proxy preserves the /opds path and authentication, testing GET and HEAD separately. Then compare the URL saved in the client.
In a browser, sign in as the same reader and open a downloadable EPUB. Confirm Downloads Allowed and Kobo sync are enabled. If syncing selected shelves, put that book on a selected shelf and retry. If the count remains zero, temporarily increase logging under Basic configuration → Logfile configuration, sync the device once, and inspect the container log:
docker logs --tail=100 calibre-webNo Kobo request: check the device's api_endpoint, network, and HTTPS. Rejected request: check token and permissions. Catalog appears but conversion fails: check the format and conversion tools inside the container. Restore the previous log level afterward.
Check which app.db, config mount, secret key, and proxy authentication headers the service actually uses. Stop writes, restore the pre-upgrade code or image and a matching config backup in an isolated directory, then address any database migration issue.
Try the same file via the local address. If local upload succeeds but the domain fails, the proxy or gateway is the likely limit. For Nginx, inspect the active config and error log on the proxy host:
sudo nginx -T 2>/dev/null | grep -n client_max_body_size
sudo tail -n 80 /var/log/nginx/error.logIf the log says client intended to send too large body, set client_max_body_size appropriately in the correct site config, verify with sudo nginx -t, and reload. If you do not use Nginx or the local request also fails, check the actual gateway or application limit. Do not raise limits without checking permissions and disk space.
Confirm that the process uses this installation's Python environment rather than system Python. Install missing dependencies with the same venv interpreter, then retry. Avoid mixing pip environments, source checkouts, and service units.
./venv/bin/python3 -m pip install -r requirements.txtAsk another administrator to reset it in user management if possible. Otherwise stop the running instance, identify and back up the active app.db, and run the following from the source directory using the same Python environment. Replace the path with your actual application database path (the systemd example uses /var/lib/calibre-web/app.db), not your library's metadata.db. Restart and sign in afterward.
read -r -s -p 'New password: ' new_password; echo
./venv/bin/python3 cps.py -p /var/lib/calibre-web/app.db -s "admin:$new_password"
unset new_passwordThis keeps the literal password out of shell history, but the -s argument may still be visible to other processes on the same host while the command runs. Use a trusted host and private terminal. Docker and installer paths and executables differ; do not copy this source-install command unchanged.
Downloading and in-browser reading use different paths. The built-in reader unpacks EPUB content and loads its HTML, CSS, and scripts in the browser. A malformed EPUB may not display, and a file containing untrusted scripts should not be opened in the built-in reader. Test a trusted local copy first; download and use a separate reader if necessary.
Temporarily raise the log level and enable the access log under calibre-web's Basic configuration → Logfile configuration. On the Kobo, search for devmodeon and enable developer logging in the device information page. Request /kobo/<token>/v1/library/sync in a browser, inspect the returned metadata and download links, and compare the logs to isolate an account, proxy, format, or device problem. Keep the token private.
Avoid writing to the same metadata.db from both apps at once. Stop one before editing metadata, bulk importing, or maintaining the library. On a NAS, avoid multiple processes writing to the database concurrently.
Questions
For a specific error, go straight to symptom-based troubleshooting.
For browsing, searching, reading, and downloading, you need a valid Calibre library and its book files. Server-side conversion or some metadata tasks require additional Calibre tools. Reading metadata.db does not give calibre-web every Calibre desktop feature.
The LinuxServer image starts with the administrator account admin and password admin123. Windows, source, or other packages may use a different initial process. Change the password immediately and give family members and reading apps separate regular accounts.
No. The database records metadata and file locations, but the book files, covers, and directories must also be readable. Mounting only the database may show titles while details, reading, or downloads fail.
The application and container image have different maintainers. The commonly used lscr.io/linuxserver/calibre-web image is maintained by LinuxServer. Record its tag, digest, architecture, mounts, and any external mods separately from the application release.
LinuxServer associates latest with releases and nightly with master. For a predictable deployment, pin a version and record its digest. Nightly is not another name for a stable release.
It confirms that the file's bytes match the release digest shown here and can reveal an incomplete or changed download. It does not prove the software has no vulnerabilities or replace HTTPS, appropriate permissions, backups, and updates.
Separate the app code, app.db, keys, metadata.db, book files, proxy config, and backups. Removing a container or source directory is not the same as deleting a library, but removing the wrong Docker volume may erase settings. Verify a restore before deleting the service definition.
Run one instance per library, each with its own application database, port, log, and config directory. For a source install, -p selects a separate settings database. Do not share app.db between instances; route them through separate domains or ports.
Use an HTTPS reverse proxy and keep the app listening only on localhost or a controlled private network. Change the initial password and disable anonymous access, open registration, and uploads unless you need them. Kobo also requires reliable TLS and the correct external port.