[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80237":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},80237,"Calibre-Web-NextGen","new-usemame\u002FCalibre-Web-NextGen","new-usemame","Community continuation of Calibre-Web-Automated. Attempting to maintain with rapid iteration. Please feel free to help out by filing Issues, Feature Requests, PRs, and chatting in our Discussion.","",null,"Python",73,14,56,22,0,7,13,17,21,65.73,"GNU General Public License v3.0",false,"main",true,[27,28,29,30,31,32],"calibre","calibre-plugin","calibre-server","calibre-web","calibre-web-automated","calibreweb","2026-06-12 04:01:27","# Calibre-Web-NextGen\n\nA bug-fix build of [Calibre-Web-Automated](https:\u002F\u002Fgithub.com\u002Fcrocodilestick\u002FCalibre-Web-Automated) (CWA). Same data layout, same configuration, same UI. The differences are listed in [`CHANGES-vs-upstream.md`](CHANGES-vs-upstream.md) and per release on the [Releases page](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Freleases).\n\nBuilt on **[Calibre-Web-Automated](https:\u002F\u002Fgithub.com\u002Fcrocodilestick\u002FCalibre-Web-Automated)** by [@crocodilestick](https:\u002F\u002Fgithub.com\u002Fcrocodilestick), which is built on **[Calibre-Web](https:\u002F\u002Fgithub.com\u002Fjaneczku\u002Fcalibre-web)** by [@janeczku](https:\u002F\u002Fgithub.com\u002Fjaneczku) and contributors, which is built on **[Calibre](https:\u002F\u002Fgithub.com\u002Fkovidgoyal\u002Fcalibre)** by [@kovidgoyal](https:\u002F\u002Fgithub.com\u002Fkovidgoyal). Original PR authors are credited by handle on every backport — see full [Credits](#credits) at the bottom.\n\n[![Latest release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fnew-usemame\u002FCalibre-Web-NextGen)](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Freleases\u002Flatest)\n[![Container](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fghcr.io-calibre--web--nextgen-blue?logo=docker)](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Fpkgs\u002Fcontainer\u002Fcalibre-web-nextgen)\n[![Open issues](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues\u002Fnew-usemame\u002FCalibre-Web-NextGen)](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Fissues)\n\n---\n\n## Switch from upstream CWA\n\n```diff\n- image: crocodilestick\u002Fcalibre-web-automated:latest\n+ image: ghcr.io\u002Fnew-usemame\u002Fcalibre-web-nextgen:latest\n```\n\n```bash\ndocker compose pull && docker compose up -d\n```\n\nLibrary, settings, users, OAuth tokens, and KOReader sync state are preserved. Switching back is the reverse one-line change.\n\n- **Bug?** [File it here.](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Fissues\u002Fnew?template=bug_report.md)\n- **Feature idea?** [Open a request.](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Fissues\u002Fnew?template=feature_request.md) Anything goes, no checklist required — even half-formed ideas are welcome and help prioritize what to look at next.\n- **New here?** See [Quick start](#quick-start) below.\n\n---\n\n## Table of contents\n\n- [Why this fork exists](#why-this-fork-exists)\n- [What's included](#whats-included)\n- [Quick start](#quick-start)\n- [Full Docker Compose setup](#full-docker-compose-setup)\n- [First run](#first-run)\n- [Migrating](#migrating)\n  - [From upstream CWA](#from-upstream-cwa)\n  - [From stock Calibre-Web](#from-stock-calibre-web)\n- [Pair with Shelfmark](#pair-with-shelfmark)\n- [Common configurations](#common-configurations)\n  - [Network shares (NFS, SMB, ZFS)](#network-shares-nfs-smb-zfs)\n  - [Reverse proxy \u002F Cloudflare Tunnel](#reverse-proxy--cloudflare-tunnel)\n  - [Hardcover metadata provider](#hardcover-metadata-provider)\n  - [KOReader sync](#koreader-sync)\n  - [Kobo sync](#kobo-sync)\n- [Troubleshooting](#troubleshooting)\n- [Differences from upstream](#differences-from-upstream)\n- [Contributing](#contributing)\n- [Credits](#credits)\n\n---\n\n## Why this fork exists\n\nCWA has an open PR queue with community-submitted bug fixes that aren't in the latest published image. This build picks the safe ones, ships them in regular releases, and adds fresh fixes for high-impact bugs that don't have an upstream PR yet. Scope is bug fixes; feature work is out of scope.\n\nThe data format and configuration are byte-compatible with upstream, so swapping images is reversible and migrations aren't needed in either direction.\n\n---\n\n## What's included\n\nEverything CWA has, plus the patches in [`CHANGES-vs-upstream.md`](CHANGES-vs-upstream.md). A representative slice of fixes that are in this build but not in `crocodilestick\u002Fcalibre-web-automated:latest`:\n\n- Cover saves from Hardcover, Google Books, iTunes, and Open Library (was returning \"not a valid image\" since 4.0.6).\n- Metadata search and the book-delete button on Safari.\n- Generate Kobo Auth Token (was returning a blank page).\n- Kobo bookmark sync no longer crashes when the client omits `Location`.\n- Auth check added to 14 admin routes (`cwa_logs`, `convert`, `epub_fixer`, and others) that previously didn't require admin.\n- Cover-enforcer shell-injection on filenames containing quotes.\n- Reverse proxy: user-profile saves honor the path prefix.\n- Docker healthcheck follows the `\u002F → \u002Flogin` 302 instead of failing on it.\n- `.cbr` and `.cbz` use IANA-registered mimetypes in OPDS feeds.\n- Higher-resolution covers from Google Books, Amazon, and an iTunes-backed fallback for high-DPI e-readers (Libra Color, etc.).\n- Translation PRs merged: ja, fr, cs, hu, zh_Hans, zh_Hant, and others.\n\n---\n\n## Quick start\n\nRequirements: Docker and Docker Compose.\n\n1. Make a folder for your library:\n\n   ```bash\n   mkdir -p ~\u002Fcalibre-web\u002F{config,library,ingest}\n   cd ~\u002Fcalibre-web\n   ```\n\n2. Save this as `docker-compose.yml`:\n\n   ```yaml\n   services:\n     calibre-web:\n       image: ghcr.io\u002Fnew-usemame\u002Fcalibre-web-nextgen:latest\n       container_name: calibre-web\n       environment:\n         - PUID=1000\n         - PGID=1000\n         - TZ=America\u002FNew_York   # change to your timezone\n       volumes:\n         - .\u002Fconfig:\u002Fconfig            # settings, user db, logs\n         - .\u002Flibrary:\u002Fcalibre-library  # books live here\n         - .\u002Fingest:\u002Fcwa-book-ingest   # drop new books here to import\n       ports:\n         - 8083:8083\n       restart: unless-stopped\n   ```\n\n3. Start it:\n\n   ```bash\n   docker compose up -d\n   ```\n\n4. Open `http:\u002F\u002Flocalhost:8083`, log in with `admin` \u002F `admin123`, change the password.\n\nDrop an `.epub` into `.\u002Fingest\u002F` and it will appear in your library within a few seconds.\n\n> Files in your library and ingest folders should be owned by your `PUID:PGID` user (1000 by default), not root. If you've copied books in as root, run once: `sudo chown -R 1000:1000 ~\u002Fcalibre-web`.\n\n---\n\n## Full Docker Compose setup\n\nA more complete compose file, with each option documented:\n\n```yaml\nservices:\n  calibre-web:\n    image: ghcr.io\u002Fnew-usemame\u002Fcalibre-web-nextgen:latest\n    container_name: calibre-web\n    environment:\n      # Match your host user\u002Fgroup so files in your library\n      # are writable from both the container and the host.\n      - PUID=1000\n      - PGID=1000\n\n      # https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FList_of_tz_database_time_zones\n      - TZ=America\u002FNew_York\n\n      # Override the in-container port if you need to.\n      # If set below 1024, also uncomment cap_add below.\n      - CWA_PORT_OVERRIDE=8083\n\n      # Set this if your \u002Fconfig or \u002Fcalibre-library volumes are\n      # on an NFS or SMB share. See \"Network shares\" below.\n      - NETWORK_SHARE_MODE=false\n\n      # If you sit behind multiple proxies (e.g. Cloudflare Tunnel\n      # then nginx then CWA), set this to the total proxy count so\n      # session protection sees the right client IP. Default 1.\n      - TRUSTED_PROXY_COUNT=1\n\n      # Optional: Hardcover API token for the Hardcover metadata\n      # provider. Free; sign up at https:\u002F\u002Fhardcover.app\u002Faccount\u002Fapi\n      # - HARDCOVER_TOKEN=eyJhbGciOiJIUzI1NiI...\n\n    volumes:\n      # Settings, user database, logs. Empty folder for new installs;\n      # for existing CWA users, point at your existing \u002Fconfig.\n      - \u002Fpath\u002Fto\u002Fconfig:\u002Fconfig\n\n      # Your Calibre library. New install? Use an empty folder and\n      # CWA will set one up. Existing user? Point at the folder\n      # containing your metadata.db.\n      - \u002Fpath\u002Fto\u002Flibrary:\u002Fcalibre-library\n\n      # Drop new books here to import them. WARNING: files in this\n      # folder are DELETED after processing. Don't point this at a\n      # folder you also use as long-term storage.\n      - \u002Fpath\u002Fto\u002Fingest:\u002Fcwa-book-ingest\n\n      # Optional: bind your existing Calibre plugins folder\n      # - \u002Fpath\u002Fto\u002Fcalibre-plugins:\u002Fconfig\u002F.config\u002Fcalibre\u002Fplugins\n\n    ports:\n      - 8083:8083\n\n    # Uncomment if CWA_PORT_OVERRIDE is below 1024.\n    # cap_add:\n    #   - NET_BIND_SERVICE\n\n    restart: unless-stopped\n```\n\n### What goes in each volume\n\n| Volume | What it is | Notes |\n|---|---|---|\n| `\u002Fconfig` | App settings, user accounts, OAuth tokens, KOReader sync state, logs | Empty folder for new installs. Carries over from CWA verbatim. |\n| `\u002Fcalibre-library` | Books and Calibre's `metadata.db` | If empty, CWA creates a fresh library. If multiple `metadata.db` files exist inside, CWA picks the largest. |\n| `\u002Fcwa-book-ingest` | Drop zone for new books | Files here are **deleted** after processing. Don't park books here long-term. |\n\n> Don't nest the binds. All three should be separate top-level folders. Putting `ingest` inside `library` produces recursive ingest behavior.\n\n---\n\n## First run\n\n1. Open the UI at `http:\u002F\u002Fyour-host:8083`.\n2. Log in with `admin` \u002F `admin123`.\n3. Change the admin password (Profile → Account).\n4. Go to Admin → Edit Basic Configuration → Feature Configuration and enable **Allow Uploads**. Without this, the metadata-fetch and cover-from-URL features can't write to your library.\n5. Drop a book into your ingest folder. It should appear in the library within a few seconds.\n\nThe Admin → Settings panel has many optional toggles (auto-convert formats, automatic backups, EPUB fixer, KOReader sync, OAuth, etc.). The [upstream wiki](https:\u002F\u002Fgithub.com\u002Fcrocodilestick\u002FCalibre-Web-Automated\u002Fwiki) is the source of truth for those; this fork doesn't change them.\n\n---\n\n## Migrating\n\n### From upstream CWA\n\nOne line. Stop the container, swap the image, start it.\n\n```diff\n- image: crocodilestick\u002Fcalibre-web-automated:latest\n+ image: ghcr.io\u002Fnew-usemame\u002Fcalibre-web-nextgen:latest\n```\n\n```bash\ndocker compose pull && docker compose up -d\n```\n\nSettings, users, OAuth tokens, and KOReader sync state are preserved. The data format is identical, so reverting is the reverse one-line change.\n\n### From stock Calibre-Web\n\n1. Stop your existing Calibre-Web container.\n2. In the new compose file, point `\u002Fconfig` at the same `\u002Fconfig` folder you used for Calibre-Web.\n3. Whatever you bound as `\u002Fbooks` in Calibre-Web should be bound as `\u002Fcalibre-library` here.\n4. Pick an empty folder for `\u002Fcwa-book-ingest` (it's CWA-specific; no equivalent in stock CW).\n5. Start the container.\n\nUsers, settings, and shelves carry over. The first launch takes a few extra seconds while CWA registers itself with the existing app database.\n\n---\n\n## Pair with Shelfmark\n\n[Shelfmark](https:\u002F\u002Fgithub.com\u002Fcalibrain\u002Fshelfmark) by @calibrain is a self-hosted book search and request interface. Users search across torrent, usenet, IRC, and direct sources from a single UI; Shelfmark hands the download to your client of choice and drops the finished file straight into the CWA ingest folder, where this build picks it up automatically. Multi-user requests are built in, so you can share an instance with household readers and approve their picks.\n\nAdd it alongside `calibre-web` in the same compose file:\n\n```yaml\n  shelfmark:\n    image: ghcr.io\u002Fcalibrain\u002Fshelfmark:latest\n    container_name: shelfmark\n    environment:\n      - PUID=1000\n      - PGID=1000\n      - TZ=America\u002FNew_York\n      - SEARCH_MODE=universal\n\n      # Point Shelfmark at CWA's app.db (read-only mount below) so users\n      # log in to Shelfmark with their existing CWA credentials.\n      - CWA_DB_PATH=\u002Fauth\u002Fcw-config\u002Fapp.db\n\n      # Optional: shows a \"Library\" button in Shelfmark's header that\n      # links back to this CWA instance.\n      - CALIBRE_WEB_URL=http:\u002F\u002Fyour-host:8083\n\n    volumes:\n      - \u002Fpath\u002Fto\u002Fshelfmark-config:\u002Fconfig\n\n      # Read-only mount of your CWA config dir for the auth integration.\n      - \u002Fpath\u002Fto\u002Fcwa-config:\u002Fauth\u002Fcw-config:ro\n\n      # Shelfmark's destination folder = CWA's ingest folder.\n      # Downloads land here and this build ingests them on the next watch tick.\n      - \u002Fpath\u002Fto\u002Fcwa-ingest:\u002Fbooks\n\n      # If you use a torrent or usenet client, mount its downloads dir\n      # at the same path you mounted in the client itself, so Shelfmark\n      # can locate the completed file.\n      - \u002Fpath\u002Fto\u002Fdownloads:\u002Fdownloads\n\n    ports:\n      - 8084:8084\n    restart: unless-stopped\n```\n\nAfter Shelfmark starts, open it and pick **Settings → Security → Authentication Method → Calibre-Web Database**, then **Sync from Calibre-Web** to import users. The [Shelfmark docs](https:\u002F\u002Fgithub.com\u002Fcalibrain\u002Fshelfmark#readme) cover Prowlarr, qBittorrent, SABnzbd, and IRC source setup.\n\n> Shelfmark went into maintenance-only status in May 2026; the v1.3.0 build is stable and the integration with CWA is settled, but new feature work upstream has paused. If you want to pin for reproducibility, use `ghcr.io\u002Fcalibrain\u002Fshelfmark:v1.3.0` instead of `:latest`.\n\n---\n\n## Common configurations\n\n### Network shares (NFS, SMB, ZFS)\n\nIf `\u002Fconfig` or `\u002Fcalibre-library` lives on a network share, set:\n\n```yaml\n- NETWORK_SHARE_MODE=true\n```\n\nThis:\n- Disables SQLite WAL mode (NFS and SMB don't reliably support it; without this you'll see \"database is locked\").\n- Skips the recursive ownership-fix at startup (slow on NFS, often fails on SMB).\n- Switches the ingest watcher from inotify to polling (network-FS inotify events are unreliable).\n\nTested and supported. Ingest is a few seconds slower; everything else behaves the same.\n\n> If files end up owned by root after a copy: this build chowns files back to your `PUID:PGID` after each metadata-change cycle, but if you've copied files in as root before upgrading, run once: `docker exec calibre-web chown -R abc:abc \u002Fcalibre-library` (replace `abc` if you've customized the user).\n\n### Reverse proxy \u002F Cloudflare Tunnel\n\nBehind multiple proxies (e.g. Cloudflare Tunnel then nginx then CWA), set the proxy count:\n\n```yaml\n- TRUSTED_PROXY_COUNT=2\n```\n\nWithout this, CWA may see different client IPs across requests and trigger Session Protection warnings, forcing re-login on every page load. Default is `1`.\n\n### Hardcover metadata provider\n\n[Hardcover](https:\u002F\u002Fhardcover.app\u002F) is a free metadata provider. To enable it:\n\n1. Sign up at https:\u002F\u002Fhardcover.app and grab an API token at https:\u002F\u002Fhardcover.app\u002Faccount\u002Fapi.\n2. Add to your compose env:\n\n   ```yaml\n   - HARDCOVER_TOKEN=eyJhbGciOiJIUzI1NiI...\n   ```\n\n   Or paste it into Admin → Edit Basic Configuration → Hardcover API Key in the UI.\n3. Restart the container.\n\nHardcover then appears in the Fetch Metadata modal.\n\n### KOReader sync\n\nCWA has built-in KOReader progress sync; no separate kosync server is needed.\n\n1. In KOReader, install the CWA plugin: visit `http:\u002F\u002Fyour-cwa:8083\u002Fkosync` for download and install instructions.\n2. Point the plugin at `http:\u002F\u002Fyour-cwa:8083` and log in with your CWA username and password.\n3. Read on any device. Progress syncs back to CWA, and from there to Kobo if Kobo sync is enabled.\n\n**Matching filenames across devices (OPDS downloads).** If you download books to KOReader over OPDS and sync progress by filename across several e-readers, turn on **Use server filenames** in KOReader's OPDS catalog settings (the checkbox when you add or edit the catalog). By default KOReader names a downloaded file `Author - Title.epub` from the catalog entry, which differs from the on-disk library name `Title - Author.epub` and forces a manual rename. CWA already sends the library name in the download's `Content-Disposition` header; with **Use server filenames** on, KOReader uses that name, so the file matches your library and your other devices without renaming.\n\n### Kobo sync\n\nRead your CWA library on a Kobo e-reader, with reading progress syncing both ways. Sync runs against your own server, so your library never leaves your network.\n\n1. In Admin → Edit Basic Configuration, turn on **Enable Kobo sync**.\n2. Open your user page (Admin → Users → your user, or your own profile) and click **Create\u002FView** next to **Kobo Sync Token**. The dialog shows the exact `api_endpoint=` line for your account.\n3. Plug the Kobo into a computer over USB and open `.kobo\u002FKobo\u002FKobo eReader.conf` in a text editor. Add or replace the `api_endpoint=` line with the one from the dialog, save, and eject the device cleanly.\n4. On the Kobo, sync. Books on your Kobo Sync shelves appear on the device, and progress flows back to CWA.\n\nTo confirm the device is reaching your server, watch the logs while you sync — you should see requests to `\u002Fkobo\u002F\u003Ctoken>\u002Fv1\u002F...`:\n\n```bash\ndocker logs -f calibre-web 2>&1 | grep \u002Fkobo\u002F\n```\n\n**Behind a reverse proxy (nginx, Nginx Proxy Manager, Caddy, Cloudflare Tunnel)**\n\nKobo devices sync over HTTPS, so the `api_endpoint` has to be your public `https:\u002F\u002F` address. Put a proxy with a valid certificate in front and point it at the container's plain HTTP port:\n\n- Proxy target is `http:\u002F\u002F\u003Ccontainer-host>:8083`. The proxy terminates TLS on 443; the connection from the proxy to CWA stays HTTP. WebSocket support is not needed for Kobo sync.\n- Generate the token while visiting CWA through the HTTPS address, so the `api_endpoint=` line the dialog shows already carries your public hostname.\n- If you stack proxies (for example Cloudflare Tunnel in front of nginx), set [`TRUSTED_PROXY_COUNT`](#reverse-proxy--cloudflare-tunnel) to the number of proxies.\n\n**nginx buffer sizes (important for Kobo sync)**\n\nKobo's `\u002Fv1\u002Flibrary\u002Fsync` response carries large headers (auth, sync tokens, library state). Nginx's default `proxy_buffer_size` (4 KB) and `proxy_buffers` (8 × 4 KB) are too small; the response is silently dropped before it reaches the device, and the Kobo shows *\"Sync failed, please try again\"* with **no error in the CWA log**. The nginx error log shows `upstream sent too big header while reading response header from upstream`. Add these to the `location \u002F` block proxying CWA:\n\n```nginx\nproxy_buffer_size       32k;\nproxy_buffers           4 32k;\nproxy_busy_buffers_size 64k;\n```\n\n(Larger libraries may need `128k \u002F 4 256k \u002F 256k`.) Reload nginx after the change. On Synology DSM, the built-in reverse-proxy GUI doesn't expose these directives — drop a custom config at `\u002Fetc\u002Fnginx\u002Fconf.d\u002Fhttp.calibre_web.conf` that mirrors the DSM entry plus the buffer lines, then disable the DSM entry. DSM rewrites `nginx.conf` on reboot, so a Task Scheduler boot-event job that runs `nginx -s reload` reapplies the custom file. Nginx Proxy Manager users: add the three lines under the proxy host's *Advanced* tab.\n\nSee [`examples\u002Fnginx-reverse-proxy.conf`](examples\u002Fnginx-reverse-proxy.conf) for a complete reference snippet.\n\n**If you keep a Kobo account signed in**\n\nSigning into a Kobo account, or doing a factory reset, can rewrite the `api_endpoint=` line back to Kobo's own server, which sends sync to Kobo instead of your library. After signing in, re-check the conf line over USB and set it back if it changed. Many sideloaded setups sign out of the Kobo account so the device stops resetting the endpoint.\n\nTo keep the Kobo Store and your library working at the same time, turn on **Proxy unknown requests to Kobo Store** in Admin → Edit Basic Configuration. With it off (the default), any request CWA doesn't recognize gets an empty response — fine for a sideload-only device, but store features won't load.\n\n---\n\n## Troubleshooting\n\n### \"Cover-file is not a valid image file, or could not be stored\"\n\nFixed in v4.0.13 and later. If you're still seeing it after upgrading, you probably have `root:root`-owned book directories from a pre-fix install. Run once:\n\n```bash\ndocker exec calibre-web chown -R abc:abc \u002Fcalibre-library\n```\n\n### \"Generate Kobo Auth Token\" returns a blank page\n\nFixed in v4.0.14 and later. Upgrade the image.\n\n### Kobo says \"Sync failed, please try again\"\n\nAlmost always one of these:\n\n1. The device isn't reaching your server. The `api_endpoint=` line in `.kobo\u002FKobo\u002FKobo eReader.conf` must point at your CWA address (not `storeapi.kobo.com`), and that address must be reachable over HTTPS. See [Kobo sync](#kobo-sync).\n2. A Kobo account is signed in and **Proxy unknown requests to Kobo Store** is off, so the device's store calls get an empty response mid-sync. Turn that setting on, or sign out of the Kobo account on the device.\n3. Behind a reverse proxy, the proxy can't reach the container. Confirm the proxy target is `http:\u002F\u002F\u003Chost>:8083` and that the certificate is valid.\n4. **nginx is silently dropping the sync response because its default buffers are too small for Kobo's library-sync headers.** The CWA log shows the request arriving but nothing else; the nginx error log shows `upstream sent too big header`. Add `proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k;` to the proxy location. See the [nginx buffer sizes](#kobo-sync) note in the Kobo sync section.\n\n### \"Database is locked\" \u002F app frozen\n\nIf your library is on a network share, set `NETWORK_SHARE_MODE=true` (see above). On local disk, this usually means a previous container shutdown was unclean: restart Docker, then the container.\n\n### Session Protection warnings, forced re-login on every page\n\nSet `TRUSTED_PROXY_COUNT` to match your proxy depth. See [Reverse proxy](#reverse-proxy--cloudflare-tunnel).\n\n### Books in `\u002Fcwa-book-ingest` aren't picked up\n\nThree common causes:\n\n1. Files owned by root. Make sure ingest files are owned by your `PUID:PGID` user.\n2. Watcher missed them. Click the **Refresh Library** button on the navbar; it does a one-shot scan.\n3. Format isn't allowed. Check Admin → CWA Settings → Ingest for your allowed formats.\n\n### Default login isn't working\n\nThe defaults are `admin` \u002F `admin123` (lowercase). If you've already changed the password and forgotten it: stop the container, delete `config\u002Fapp.db`, and restart. This resets the database. User accounts are lost; the library itself is untouched.\n\n### Something else\n\nCheck the [issue tracker](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Fissues) or [open a new issue](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Fissues\u002Fnew). Useful information:\n\n- The version: `docker exec calibre-web cat \u002Fapp\u002FCWA_STABLE_RELEASE`\n- Recent logs: `docker logs calibre-web 2>&1 | tail -50`\n- What you did and what you expected to happen\n\n---\n\n## Differences from upstream\n\n| Behavior | Upstream CWA `:latest` | This build |\n|---|---|---|\n| Cover saves from Hardcover\u002FGoogle Books\u002FiTunes\u002FOpen Library | Returns \"not a valid image\" | Saves and persists |\n| Generate Kobo Auth Token | Blank page | Works |\n| Safari metadata search | Silent 400 | Works |\n| Safari book-delete button | Broken since the Feb-4 commit | Works |\n| Kobo bookmark sync with missing `Location` | Crashes | Tolerates |\n| `\u002Fkobo_auth\u002Fgenerate_auth_token` IDOR | Open (any user can mint another user's token) | Closed |\n| Reverse-proxy user-profile updates | Drops path prefix | Honors `getPath()` |\n| Docker healthcheck on `\u002F → \u002Flogin` 302 | Trips on `curl -f` | Uses dedicated endpoint with service health checks |\n| `.cbr` \u002F `.cbz` OPDS mimetypes | Non-IANA | IANA-compliant |\n| Cover resolution on high-DPI readers | Often 290×475 (Hardcover thumbnail) | 1000×1500+ via booster |\n| Admin routes (`cwa_logs`, `convert`, `epub_fixer`, …) | 14 unauthenticated | All require admin |\n| Translations: ja, fr, cs, hu, zh_Hans, zh_Hant | Open in PRs | Merged |\n\nBackports are conservative. Anything that touches auth, schema, or dependencies gets a manual review before merging.\n\n---\n\n## Translations\n\nThe interface ships with the locales below. Completion is auto-refreshed on every push to `main` by [`scripts\u002Fgenerate_translation_status.py`](scripts\u002Fgenerate_translation_status.py); to contribute a translation, edit the `.po` file under [`cps\u002Ftranslations\u002F`](cps\u002Ftranslations\u002F) for your language and open a PR.\n\n\u003C!-- TRANSLATION_STATUS_START -->\n| Language | Completion | Strings | Fuzzy |\n|---|---|---:|---:|\n| English (source) | 100% | source | — |\n| Hungarian (`hu`) | `███████████████████░` 93% | 1615\u002F1744 | 75 |\n| German (`de`) | `██████████████████░░` 89% | 1545\u002F1744 | 97 |\n| French (`fr`) | `██████████████████░░` 88% | 1542\u002F1744 | 94 |\n| Japanese (`ja`) | `██████████████████░░` 88% | 1542\u002F1744 | 220 |\n| Spanish (`es`) | `██████████████████░░` 88% | 1541\u002F1744 | 261 |\n| Slovenian (`sl`) | `█████████████████░░░` 87% | 1512\u002F1744 | 295 |\n| Russian (`ru`) | `██████████████░░░░░░` 72% | 1259\u002F1744 | 444 |\n| Dutch (`nl`) | `██████████████░░░░░░` 71% | 1241\u002F1744 | 268 |\n| Italian (`it`) | `██████████████░░░░░░` 69% | 1203\u002F1744 | 245 |\n| Polish (`pl`) | `██████████████░░░░░░` 69% | 1203\u002F1744 | 250 |\n| Portuguese (Brazil) (`pt_BR`) | `██████████████░░░░░░` 69% | 1203\u002F1744 | 377 |\n| Korean (`ko`) | `██████████████░░░░░░` 69% | 1197\u002F1744 | 245 |\n| Chinese (Simplified, China) (`zh_Hans_CN`) | `█████████████░░░░░░░` 67% | 1169\u002F1744 | 328 |\n| Arabic (`ar`) | `████████████░░░░░░░░` 61% | 1058\u002F1744 | 265 |\n| Portuguese (`pt`) | `████████████░░░░░░░░` 60% | 1046\u002F1744 | 343 |\n| Slovak (`sk`) | `████████████░░░░░░░░` 60% | 1047\u002F1744 | 295 |\n| Indonesian (`id`) | `████████████░░░░░░░░` 59% | 1026\u002F1744 | 345 |\n| Galician (`gl`) | `████████████░░░░░░░░` 59% | 1024\u002F1744 | 344 |\n| Chinese (Traditional, Taiwan) (`zh_Hant_TW`) | `███████████░░░░░░░░░` 56% | 983\u002F1744 | 363 |\n| Swedish (`sv`) | `███████████░░░░░░░░░` 55% | 960\u002F1744 | 373 |\n| Greek (`el`) | `██████████░░░░░░░░░░` 51% | 896\u002F1744 | 387 |\n| Czech (`cs`) | `██████████░░░░░░░░░░` 50% | 876\u002F1744 | 396 |\n| Norwegian (`no`) | `██████████░░░░░░░░░░` 49% | 862\u002F1744 | 431 |\n| Vietnamese (`vi`) | `█████████░░░░░░░░░░░` 45% | 781\u002F1744 | 357 |\n| Finnish (`fi`) | `█████████░░░░░░░░░░░` 43% | 743\u002F1744 | 386 |\n| Ukrainian (`uk`) | `████████░░░░░░░░░░░░` 39% | 676\u002F1744 | 372 |\n| Turkish (`tr`) | `████████░░░░░░░░░░░░` 38% | 671\u002F1744 | 381 |\n| Khmer (`km`) | `██████░░░░░░░░░░░░░░` 32% | 552\u002F1744 | 343 |\n\u003C!-- TRANSLATION_STATUS_END -->\n\n---\n\n## Contributing\n\n- **Bug reports:** [open a bug issue](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Fissues\u002Fnew?template=bug_report.md). Reproduction steps, version tag, and a `docker logs` snippet help a lot.\n- **Feature requests:** [open a feature issue](https:\u002F\u002Fgithub.com\u002Fnew-usemame\u002FCalibre-Web-NextGen\u002Fissues\u002Fnew?template=feature_request.md). The bar is low — bug reports get prioritized for code work, but feature requests shape what gets looked at when the bug queue is quiet, and they help upstream see what users actually want. Don't worry about whether it's \"in scope\"; just file it.\n- **Pull requests:** welcome. The merge bar is \"doesn't break anything that currently works.\" Changes touching auth, schema, or dependencies get a closer review. Backports keep the original author's handle in the commit message.\n- **CWA PR authors with stalled work upstream:** if you'd like your PR shipped here too, open an issue or send the PR our way.\n\nGovernance: [`GOVERNANCE.md`](GOVERNANCE.md). Contributing details: [`CONTRIBUTING.md`](CONTRIBUTING.md).\n\n---\n\n## Credits\n\nBuilt on:\n\n- **Calibre-Web-Automated** ([@crocodilestick](https:\u002F\u002Fgithub.com\u002Fcrocodilestick) and contributors) — the core software this build is based on. Original PR authors are credited by handle in every backport commit.\n- **Calibre-Web** ([@janeczku](https:\u002F\u002Fgithub.com\u002Fjaneczku) and contributors) — the web UI underneath CWA.\n- **Calibre** ([@kovidgoyal](https:\u002F\u002Fgithub.com\u002Fkovidgoyal)) — the library underneath all of it.\n\nEvery backported patch is credited to its original author by GitHub handle in the commit message and in [`CHANGES-vs-upstream.md`](CHANGES-vs-upstream.md). To support upstream's continued development, [@crocodilestick has a Ko-fi](https:\u002F\u002Fko-fi.com\u002Fcrocodilestick).\n\n---\n\n*License: GPL-3.0-or-later. See [`LICENSE`](LICENSE).*\n","Calibre-Web-NextGen 是一个基于 Calibre-Web-Automated 的社区维护项目，旨在通过快速迭代来持续修复和改进。该项目保持了与原版相同的数据布局、配置和用户界面，并在每个版本中详细记录了变更内容。采用 JavaScript 语言开发，支持 Docker 部署，便于管理和升级。适用于个人或小型团队需要在线管理电子书库的场景，尤其是那些已经在使用 Calibre 或其衍生产品的用户，可以无缝切换到此项目以获得更稳定的体验和更多功能更新。",2,"2026-06-11 03:59:46","CREATED_QUERY"]