# Environment Variables This document lists all configuration options that can be set via environment variables. > **Auto-generated** - Do not edit manually. Run `python scripts/generate_env_docs.py` to regenerate. ## Table of Contents - [Bootstrap Configuration](#bootstrap-configuration) - [Egress / VPN Routing](#egress--vpn-routing) - [General](#general) - [Search Mode](#search-mode) - [Downloads](#downloads) - [Security](#security) - [Hardcover Sync](#hardcover-sync) - [Network](#network) - [Advanced](#advanced) - [Prowlarr](#prowlarr) - [Jackett](#jackett) - [Newznab](#newznab) - [Soulseek (slskd)](#soulseek-slskd) - [AudiobookBay](#audiobookbay) - [Libgen Search](#libgen-search) - [Webshare.cz](#websharecz) - [IRC](#irc) - [Download Clients](#download-clients) - [Metadata Providers](#metadata-providers) - [Hardcover](#metadata-providers-hardcover) - [Open Library](#metadata-providers-open-library) - [Google Books](#metadata-providers-google-books) - [Moly.hu](#metadata-providers-molyhu) - [Databáze knih](#metadata-providers-databáze-knih) - [DNB](#metadata-providers-dnb) - [Direct Download](#direct-download) - [Download Sources](#direct-download-download-sources) - [Cloudflare Bypass](#direct-download-cloudflare-bypass) - [Mirrors](#direct-download-mirrors) --- ## Bootstrap Configuration These environment variables are used at startup before the settings system loads. They typically configure paths, server settings, and authentication startup behavior. | Variable | Description | Type | Default | |----------|-------------|------|---------| | `CONFIG_DIR` | Directory for storing configuration files and plugin settings. | string (path) | `/config` | | `LOG_ROOT` | Root directory for log files. | string (path) | `/var/log/` | | `TMP_DIR` | Staging directory for downloads before moving to destination. | string (path) | `/tmp/shelfmark` | | `ENABLE_LOGGING` | Enable file logging under LOG_ROOT/shelfmark/ (including shelfmark.log and startup logs). | boolean | `true` | | `FLASK_HOST` | Host address for the Flask web server. | string | `0.0.0.0` | | `FLASK_PORT` | Port number for the Flask web server. | number | `8084` | | `SOCKETIO_ALLOWED_ORIGINS` | Extra origins allowed to open the live-update websocket, comma separated (e.g. https://books.example.com). The app's own origin is always allowed, including behind a proxy that sends X-Forwarded-Host and X-Forwarded-Proto. Only needed if your proxy changes Host without sending those headers. | string | `unset` | | `SESSION_COOKIE_SECURE` | Enable secure cookies (requires HTTPS). | boolean | `false` | | `CWA_DB_PATH` | Path to the Calibre-Web database for authentication integration. | string (path) | `/auth/app.db` | | `HIDE_LOCAL_AUTH` | Hide the username/password login form when OIDC is active. | boolean | `false` | | `DISABLE_LOCAL_AUTH` | Disable username/password login and remove the local-admin prerequisite for OIDC. Implies HIDE_LOCAL_AUTH; with AUTH_METHOD=builtin, everyone is locked out until auth env vars are changed. | boolean | `false` | | `SHELFMARK_API_KEY` | Optional static API key. When set, requests carrying it as 'Authorization: Bearer ' (or X-Api-Key) are authenticated as an admin; browser sessions keep working. Unset = off. | string | `unset` | | `SHELFMARK_API_KEY_READONLY` | Optional second API key for dashboards and monitors. Send it like SHELFMARK_API_KEY. It can only GET /api/stats (counters only, no titles or user names). Every other request, and any write, is refused with 403, and it never gets a session. Unset = off. | string | `unset` | | `OIDC_AUTO_REDIRECT` | Automatically redirect to the OIDC provider instead of showing the login page. | boolean | `false` | | `UMASK` | File creation mask for the app process, read by entrypoint.sh. The default 0022 gives files 644 and directories 755. | string (octal) | `0022` | | `DOCKERMODE` | Indicates the application is running inside a Docker container. | boolean | `false` | | `ONBOARDING` | Show the onboarding wizard on first run. Set to false to skip (useful for ephemeral storage). | boolean | `true` |
Detailed descriptions #### `CONFIG_DIR` Directory for storing configuration files and plugin settings. - **Type:** string (path) - **Default:** `/config` #### `LOG_ROOT` Root directory for log files. - **Type:** string (path) - **Default:** `/var/log/` #### `TMP_DIR` Staging directory for downloads before moving to destination. - **Type:** string (path) - **Default:** `/tmp/shelfmark` #### `ENABLE_LOGGING` Enable file logging under LOG_ROOT/shelfmark/ (including shelfmark.log and startup logs). - **Type:** boolean - **Default:** `true` #### `FLASK_HOST` Host address for the Flask web server. - **Type:** string - **Default:** `0.0.0.0` #### `FLASK_PORT` Port number for the Flask web server. - **Type:** number - **Default:** `8084` #### `SOCKETIO_ALLOWED_ORIGINS` Extra origins allowed to open the live-update websocket, comma separated (e.g. https://books.example.com). The app's own origin is always allowed, including behind a proxy that sends X-Forwarded-Host and X-Forwarded-Proto. Only needed if your proxy changes Host without sending those headers. - **Type:** string - **Default:** `unset` #### `SESSION_COOKIE_SECURE` Enable secure cookies (requires HTTPS). - **Type:** boolean - **Default:** `false` #### `CWA_DB_PATH` Path to the Calibre-Web database for authentication integration. - **Type:** string (path) - **Default:** `/auth/app.db` #### `HIDE_LOCAL_AUTH` Hide the username/password login form when OIDC is active. - **Type:** boolean - **Default:** `false` #### `DISABLE_LOCAL_AUTH` Disable username/password login and remove the local-admin prerequisite for OIDC. Implies HIDE_LOCAL_AUTH; with AUTH_METHOD=builtin, everyone is locked out until auth env vars are changed. - **Type:** boolean - **Default:** `false` #### `SHELFMARK_API_KEY` Optional static API key. When set, requests carrying it as 'Authorization: Bearer ' (or X-Api-Key) are authenticated as an admin; browser sessions keep working. Unset = off. - **Type:** string - **Default:** `unset` #### `SHELFMARK_API_KEY_READONLY` Optional second API key for dashboards and monitors. Send it like SHELFMARK_API_KEY. It can only GET /api/stats (counters only, no titles or user names). Every other request, and any write, is refused with 403, and it never gets a session. Unset = off. - **Type:** string - **Default:** `unset` #### `OIDC_AUTO_REDIRECT` Automatically redirect to the OIDC provider instead of showing the login page. - **Type:** boolean - **Default:** `false` #### `UMASK` File creation mask for the app process, read by entrypoint.sh. The default 0022 gives files 644 and directories 755. - **Type:** string (octal) - **Default:** `0022` #### `DOCKERMODE` Indicates the application is running inside a Docker container. - **Type:** boolean - **Default:** `false` #### `ONBOARDING` Show the onboarding wizard on first run. Set to false to skip (useful for ephemeral storage). - **Type:** boolean - **Default:** `true`
## Egress / VPN Routing These startup-only variables are consumed by `entrypoint.sh` / `wireguard.sh` to select and configure the WireGuard transparent-egress kill-switch. `USING_WIREGUARD` and [`USING_TOR`](#using_tor) (documented under Network) are mutually exclusive; both require root startup. `TOR_CHECK_INTERVAL` and `TOR_MAX_FAILURES` tune the Tor watchdog in `tor.sh`. | Variable | Description | Type | Default | |----------|-------------|------|---------| | `USING_WIREGUARD` | Route all traffic through a WireGuard VPN tunnel with a fail-closed iptables kill-switch (non-tunnel egress is dropped). Requires root startup and NET_ADMIN (plus NET_RAW). Mutually exclusive with USING_TOR. | boolean | `false` | | `WIREGUARD_CONFIG` | Path to the mounted wg-quick configuration file. | string (path) | `/config/wg0.conf` | | `WIREGUARD_INTERFACE` | WireGuard interface name brought up by wg-quick. | string | `wg0` | | `LAN_NETWORK` | Comma-separated CIDRs kept off the tunnel so the WebUI and internal download clients (Prowlarr, qBittorrent) stay reachable. | string (comma-separated) | `127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16` | | `WIREGUARD_ENFORCE_DNS` | Pin the container's resolver so DNS cannot silently fall back to an off-tunnel path. The resolver used is WIREGUARD_DNS if set, else the tunnel config's DNS = line. This does NOT force queries through the tunnel: it is designed for a trusted LAN resolver kept reachable off-tunnel via LAN_NETWORK (the query leaves over the LAN; the resolver encrypts upstream while the download still egresses via the tunnel). Special case: when Docker's embedded resolver (nameserver 127.0.0.11) is present, it is PRESERVED so container-name resolution (e.g. prowlarr, qbittorrent) keeps working, and the embedded resolver's upstream must be pinned via the container's compose dns: list. Fails closed (refuses to start) only when no embedded resolver is present AND no resolver is defined, or /etc/resolv.conf is not writable. | boolean | `true` | | `WIREGUARD_DNS` | Explicit resolver(s) (comma/space separated) to pin when WIREGUARD_ENFORCE_DNS is true and Docker's embedded resolver is NOT in use. Use when the VPN's pushed DNS filters domains you need; point it at a resolver reachable via the tunnel or an allowed LAN resolver. NOTE: when the embedded resolver (127.0.0.11) is present it is preserved and this value cannot repoint its upstream from inside the container — set the container's compose dns: list to the trusted resolver instead. | string (comma-separated) | `unset (uses config DNS = line)` | | `WIREGUARD_DISABLE_IPV6` | Strip IPv6 Address/AllowedIPs/DNS from the tunnel config before wg-quick (many container kernels lack the ip6tables raw table wg-quick needs) and remove IPv6 as a leak surface. | boolean | `true` | | `WIREGUARD_ALLOW_IPV6_LEAK` | Escape hatch: continue startup even when an IPv6 kill-switch cannot be installed AND IPv6 cannot be disabled. Only set when the container has no IPv6 connectivity, as IPv6 egress may otherwise bypass the tunnel. | boolean | `false` | | `WIREGUARD_ALLOW_WEBUI_OFFTUNNEL` | When false (default) the kill-switch is strictly fail-closed: the only off-tunnel egress permitted is loopback, the tunnel device and the LAN allowlist. Set true only if a NON-LAN client (e.g. a public reverse proxy on a different segment) must reach the WebUI; it permits app-server REPLY packets (--sport FLASK_PORT, conntrack REPLY) to leave off-tunnel. Server replies only, never client-initiated egress, so it cannot leak outbound browsing/downloads or the real IP for outbound requests, but it is still an off-tunnel path while the tunnel is down, hence opt-in. LAN WebUI clients never need it (covered by LAN_NETWORK). | boolean | `false` | | `WIREGUARD_STALE_AFTER` | Seconds since the last WireGuard handshake before the healthcheck bounces the tunnel. | number | `180` | | `TOR_CHECK_INTERVAL` | Seconds between Tor watchdog probes. The watchdog resets the container when Tor stops being usable, so the restart policy rebuilds the Tor setup. | integer (seconds) | `30` | | `TOR_MAX_FAILURES` | Consecutive failed Tor watchdog probes before the container is reset. 2 tolerates one failed probe. | integer | `2` |
Detailed descriptions #### `USING_WIREGUARD` Route all traffic through a WireGuard VPN tunnel with a fail-closed iptables kill-switch (non-tunnel egress is dropped). Requires root startup and NET_ADMIN (plus NET_RAW). Mutually exclusive with USING_TOR. - **Type:** boolean - **Default:** `false` #### `WIREGUARD_CONFIG` Path to the mounted wg-quick configuration file. - **Type:** string (path) - **Default:** `/config/wg0.conf` #### `WIREGUARD_INTERFACE` WireGuard interface name brought up by wg-quick. - **Type:** string - **Default:** `wg0` #### `LAN_NETWORK` Comma-separated CIDRs kept off the tunnel so the WebUI and internal download clients (Prowlarr, qBittorrent) stay reachable. - **Type:** string (comma-separated) - **Default:** `127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16` #### `WIREGUARD_ENFORCE_DNS` Pin the container's resolver so DNS cannot silently fall back to an off-tunnel path. The resolver used is WIREGUARD_DNS if set, else the tunnel config's DNS = line. This does NOT force queries through the tunnel: it is designed for a trusted LAN resolver kept reachable off-tunnel via LAN_NETWORK (the query leaves over the LAN; the resolver encrypts upstream while the download still egresses via the tunnel). Special case: when Docker's embedded resolver (nameserver 127.0.0.11) is present, it is PRESERVED so container-name resolution (e.g. prowlarr, qbittorrent) keeps working, and the embedded resolver's upstream must be pinned via the container's compose dns: list. Fails closed (refuses to start) only when no embedded resolver is present AND no resolver is defined, or /etc/resolv.conf is not writable. - **Type:** boolean - **Default:** `true` #### `WIREGUARD_DNS` Explicit resolver(s) (comma/space separated) to pin when WIREGUARD_ENFORCE_DNS is true and Docker's embedded resolver is NOT in use. Use when the VPN's pushed DNS filters domains you need; point it at a resolver reachable via the tunnel or an allowed LAN resolver. NOTE: when the embedded resolver (127.0.0.11) is present it is preserved and this value cannot repoint its upstream from inside the container — set the container's compose dns: list to the trusted resolver instead. - **Type:** string (comma-separated) - **Default:** `unset (uses config DNS = line)` #### `WIREGUARD_DISABLE_IPV6` Strip IPv6 Address/AllowedIPs/DNS from the tunnel config before wg-quick (many container kernels lack the ip6tables raw table wg-quick needs) and remove IPv6 as a leak surface. - **Type:** boolean - **Default:** `true` #### `WIREGUARD_ALLOW_IPV6_LEAK` Escape hatch: continue startup even when an IPv6 kill-switch cannot be installed AND IPv6 cannot be disabled. Only set when the container has no IPv6 connectivity, as IPv6 egress may otherwise bypass the tunnel. - **Type:** boolean - **Default:** `false` #### `WIREGUARD_ALLOW_WEBUI_OFFTUNNEL` When false (default) the kill-switch is strictly fail-closed: the only off-tunnel egress permitted is loopback, the tunnel device and the LAN allowlist. Set true only if a NON-LAN client (e.g. a public reverse proxy on a different segment) must reach the WebUI; it permits app-server REPLY packets (--sport FLASK_PORT, conntrack REPLY) to leave off-tunnel. Server replies only, never client-initiated egress, so it cannot leak outbound browsing/downloads or the real IP for outbound requests, but it is still an off-tunnel path while the tunnel is down, hence opt-in. LAN WebUI clients never need it (covered by LAN_NETWORK). - **Type:** boolean - **Default:** `false` #### `WIREGUARD_STALE_AFTER` Seconds since the last WireGuard handshake before the healthcheck bounces the tunnel. - **Type:** number - **Default:** `180` #### `TOR_CHECK_INTERVAL` Seconds between Tor watchdog probes. The watchdog resets the container when Tor stops being usable, so the restart policy rebuilds the Tor setup. - **Type:** integer (seconds) - **Default:** `30` #### `TOR_MAX_FAILURES` Consecutive failed Tor watchdog probes before the container is reset. 2 tolerates one failed probe. - **Type:** integer - **Default:** `2`
## General | Variable | Description | Type | Default | |----------|-------------|------|---------| | `SEARCH_PAGE_TITLE` | Title shown above the main search box on the homepage. | string | `Shelfmark` | | `CALIBRE_WEB_URL` | Adds a navigation button to your book library (Calibre-Web Automated, Grimmory, etc). | string | _none_ | | `AUDIOBOOK_LIBRARY_URL` | Adds a separate navigation button for your audiobook library (Audiobookshelf, Plex, etc). When both URLs are set, icons are shown instead of text. | string | _none_ | | `LIBRARY_CHECK_CALIBRE_ENABLED` | Read the Calibre metadata.db and mark search results you already own, so you do not download a second copy. Read only, nothing is written to the library. | boolean | `false` | | `CALIBRE_LIBRARY_DB_PATH` | Path to metadata.db as seen from inside the Shelfmark container. Mount the Calibre library folder read-only, e.g. /path/to/calibre-library:/calibre-library:ro. | string | `/calibre-library/metadata.db` | | `LIBRARY_CHECK_AUDIOBOOKSHELF_ENABLED` | Ask your Audiobookshelf server which audiobooks you already own, so synced and automatic downloads skip them. Read only, nothing is written to Audiobookshelf. | boolean | `false` | | `AUDIOBOOKSHELF_URL` | Base URL reachable from the Shelfmark container (not the public URL). Often the host LAN IP, e.g. http://10.0.0.91:13378. | string | _none_ | | `AUDIOBOOKSHELF_TOKEN` | API token from Audiobookshelf (Settings > Users > your user > API Token). | string (secret) | _none_ | | `AUDIOBOOKSHELF_LIBRARY_IDS` | Comma-separated library IDs to check. Leave blank for all book libraries. | string | _none_ | | `SUPPORTED_FORMATS` | Book formats to include in search results. ZIP/RAR archives are extracted automatically and book files are used if found. | string (comma-separated) | `epub,mobi,azw3,fb2,djvu,cbz,cbr` | | `SUPPORTED_AUDIOBOOK_FORMATS` | Audiobook formats to include in search results. ZIP/RAR archives are extracted automatically and audiobook files are used if found. | string (comma-separated) | `m4b,mp3,m4a,mp4,flac,ogg,wma,aac,wav,opus,zip,rar` |
Detailed descriptions #### `SEARCH_PAGE_TITLE` **Search Page Title** Title shown above the main search box on the homepage. - **Type:** string - **Default:** `Shelfmark` #### `CALIBRE_WEB_URL` **Library URL** Adds a navigation button to your book library (Calibre-Web Automated, Grimmory, etc). - **Type:** string - **Default:** _none_ #### `AUDIOBOOK_LIBRARY_URL` **Audiobook Library URL** Adds a separate navigation button for your audiobook library (Audiobookshelf, Plex, etc). When both URLs are set, icons are shown instead of text. - **Type:** string - **Default:** _none_ #### `LIBRARY_CHECK_CALIBRE_ENABLED` **Mark books already in your Calibre library** Read the Calibre metadata.db and mark search results you already own, so you do not download a second copy. Read only, nothing is written to the library. - **Type:** boolean - **Default:** `false` #### `CALIBRE_LIBRARY_DB_PATH` **Calibre metadata.db path** Path to metadata.db as seen from inside the Shelfmark container. Mount the Calibre library folder read-only, e.g. /path/to/calibre-library:/calibre-library:ro. - **Type:** string - **Default:** `/calibre-library/metadata.db` #### `LIBRARY_CHECK_AUDIOBOOKSHELF_ENABLED` **Mark audiobooks already in your Audiobookshelf library** Ask your Audiobookshelf server which audiobooks you already own, so synced and automatic downloads skip them. Read only, nothing is written to Audiobookshelf. - **Type:** boolean - **Default:** `false` #### `AUDIOBOOKSHELF_URL` **Audiobookshelf URL** Base URL reachable from the Shelfmark container (not the public URL). Often the host LAN IP, e.g. http://10.0.0.91:13378. - **Type:** string - **Default:** _none_ #### `AUDIOBOOKSHELF_TOKEN` **Audiobookshelf API Token** API token from Audiobookshelf (Settings > Users > your user > API Token). - **Type:** string (secret) - **Default:** _none_ #### `AUDIOBOOKSHELF_LIBRARY_IDS` **Audiobookshelf Library IDs (optional)** Comma-separated library IDs to check. Leave blank for all book libraries. - **Type:** string - **Default:** _none_ #### `SUPPORTED_FORMATS` **Supported Book Formats** Book formats to include in search results. ZIP/RAR archives are extracted automatically and book files are used if found. - **Type:** string (comma-separated) - **Default:** `epub,mobi,azw3,fb2,djvu,cbz,cbr` #### `SUPPORTED_AUDIOBOOK_FORMATS` **Supported Audiobook Formats** Audiobook formats to include in search results. ZIP/RAR archives are extracted automatically and audiobook files are used if found. - **Type:** string (comma-separated) - **Default:** `m4b,mp3,m4a,mp4,flac,ogg,wma,aac,wav,opus,zip,rar`
## Search Mode | Variable | Description | Type | Default | |----------|-------------|------|---------| | `SEARCH_MODE` | How you want to search for and download books. | string (choice) | `universal` | | `BOOK_LANGUAGE` | Default language filter for searches. Users can override this for their own account. | string (comma-separated) | `en` | | `DEFAULT_CONTENT_TYPE` | Which tab the search page opens on. Users can override this for their own account, and a browser that has already picked a tab keeps its choice. | string (choice) | `ebook` | | `AA_DEFAULT_SORT` | Default sort order for search results. | string (choice) | _empty string_ | | `SHOW_RELEASE_SOURCE_LINKS` | Show clickable release-source links in release and details modals. Metadata provider links stay enabled. | boolean | `true` | | `SHOW_COMBINED_SELECTOR` | Show the option to search for and download both a book and audiobook together. | boolean | `true` | | `FORCE_COMBINED_SEARCH` | Force combined search whenever it's available. Locks the combined toggle on. | boolean | `false` | | `METADATA_PROVIDER` | Choose which metadata provider to use for book searches. | string (choice) | `openlibrary` | | `METADATA_PROVIDER_AUDIOBOOK` | Metadata provider for audiobook searches. Uses the book provider if not set. | string (choice) | _empty string_ | | `METADATA_PROVIDER_COMBINED` | Metadata provider for combined mode searches. Uses the book provider if not set. | string (choice) | _empty string_ | | `DEFAULT_RELEASE_SOURCE` | The release source tab to open by default in the release modal for books. Leave unset to use the first available source. | string (choice) | _empty string_ | | `DEFAULT_RELEASE_SOURCE_AUDIOBOOK` | The release source tab to open by default in the release modal for audiobooks. Uses the book release source if not set. | string (choice) | _empty string_ | | `SHOW_SERIES_COLUMN` | Series name and number, for books and audiobooks. Filled in for MyAnonamouse results from Prowlarr when a MAM session ID is set in the Prowlarr settings. | boolean | `true` | | `SHOW_NARRATOR_COLUMN` | Audiobooks only. Filled in for MyAnonamouse results from Prowlarr when a MAM session ID is set in the Prowlarr settings. | boolean | `true` | | `SHOW_BITRATE_COLUMN` | Audiobooks only. AudiobookBay lists it for most releases. In Prowlarr results it needs a MAM session ID and is read from the MyAnonamouse uploader's tags, so some releases won't have one. Other Prowlarr indexers fill it only if they report a bitrate attribute, which most don't. | boolean | `true` |
Detailed descriptions #### `SEARCH_MODE` **Search Mode** How you want to search for and download books. - **Type:** string (choice) - **Default:** `universal` - **Options:** `direct` (Direct), `universal` (Universal) #### `BOOK_LANGUAGE` **Default Book Languages** Default language filter for searches. Users can override this for their own account. - **Type:** string (comma-separated) - **Default:** `en` #### `DEFAULT_CONTENT_TYPE` **Default Content Type** Which tab the search page opens on. Users can override this for their own account, and a browser that has already picked a tab keeps its choice. - **Type:** string (choice) - **Default:** `ebook` - **Options:** `ebook` (Ebook), `audiobook` (Audiobook) #### `AA_DEFAULT_SORT` **Default Sort Order** Default sort order for search results. - **Type:** string (choice) - **Default:** _empty string_ - **Options:** `""` (Most downloads), `relevance` (Most relevant), `newest` (Newest (publication year)), `oldest` (Oldest (publication year)), `largest` (Largest (filesize)), `smallest` (Smallest (filesize)), `newest_added` (Newest (open sourced)), `oldest_added` (Oldest (open sourced)) #### `SHOW_RELEASE_SOURCE_LINKS` **Show Release Source Links** Show clickable release-source links in release and details modals. Metadata provider links stay enabled. - **Type:** boolean - **Default:** `true` #### `SHOW_COMBINED_SELECTOR` **Show Combined Download Selector** Show the option to search for and download both a book and audiobook together. - **Type:** boolean - **Default:** `true` #### `FORCE_COMBINED_SEARCH` **Always Use Combined Search** Force combined search whenever it's available. Locks the combined toggle on. - **Type:** boolean - **Default:** `false` #### `METADATA_PROVIDER` **Book Metadata Provider** Choose which metadata provider to use for book searches. - **Type:** string (choice) - **Default:** `openlibrary` - **Options:** `""` (No providers enabled) #### `METADATA_PROVIDER_AUDIOBOOK` **Audiobook Metadata Provider** Metadata provider for audiobook searches. Uses the book provider if not set. - **Type:** string (choice) - **Default:** _empty string_ - **Options:** `""` (Use book provider), `""` (No providers enabled) #### `METADATA_PROVIDER_COMBINED` **Combined Mode Metadata Provider** Metadata provider for combined mode searches. Uses the book provider if not set. - **Type:** string (choice) - **Default:** _empty string_ - **Options:** `""` (Use book provider), `""` (No providers enabled) #### `DEFAULT_RELEASE_SOURCE` **Default Book Release Source** The release source tab to open by default in the release modal for books. Leave unset to use the first available source. - **Type:** string (choice) - **Default:** _empty string_ - **Options:** `""` (Use first available source) #### `DEFAULT_RELEASE_SOURCE_AUDIOBOOK` **Default Audiobook Release Source** The release source tab to open by default in the release modal for audiobooks. Uses the book release source if not set. - **Type:** string (choice) - **Default:** _empty string_ - **Options:** `""` (Use book release source) #### `SHOW_SERIES_COLUMN` **Show Series Column** Series name and number, for books and audiobooks. Filled in for MyAnonamouse results from Prowlarr when a MAM session ID is set in the Prowlarr settings. - **Type:** boolean - **Default:** `true` #### `SHOW_NARRATOR_COLUMN` **Show Narrator Column** Audiobooks only. Filled in for MyAnonamouse results from Prowlarr when a MAM session ID is set in the Prowlarr settings. - **Type:** boolean - **Default:** `true` #### `SHOW_BITRATE_COLUMN` **Show Bitrate Column** Audiobooks only. AudiobookBay lists it for most releases. In Prowlarr results it needs a MAM session ID and is read from the MyAnonamouse uploader's tags, so some releases won't have one. Other Prowlarr indexers fill it only if they report a bitrate attribute, which most don't. - **Type:** boolean - **Default:** `true`
## Downloads | Variable | Description | Type | Default | |----------|-------------|------|---------| | `BOOKS_OUTPUT_MODE` | Choose where completed book files are sent. | string (choice) | `folder` | | `INGEST_DIR` | Directory where downloaded files are saved. Use {User} for per-user folders (e.g. /books/{User}). | string | `/books` | | `FILE_ORGANIZATION` | Choose how downloaded book files are named and organized. | string (choice) | `rename` | | `NAMING_WORD_SEPARATOR` | Replaces spaces inside naming template values (e.g. 'Conan Doyle' -> 'Conan.Doyle' with '.'). Applies to books and audiobooks, rename and organize templates alike. Literal characters typed into a template (like the '-' in '{Author} - {Title}') are left as-is. Leave empty to keep spaces as-is. | string | _empty string_ | | `TEMPLATE_RENAME` | Variables: {Author}, {FirstAuthor} (first of several authors), {AuthorSort} (first author, surname first), {Title}, {Year}, {Language}, {User}, {OriginalName} (source filename without extension). Universal adds: {Series}, {SeriesPosition}, {Subtitle}, {PrimaryTitle}. Use arbitrary prefix/suffix: {Vol. SeriesPosition - } outputs 'Vol. 2 - ' when set, nothing when empty. Rename templates are filename-only (no '/' or '\'); use Organize for folders. Applies to single-file downloads. | string | `{Author} - {Title} ({Year})` | | `TEMPLATE_ORGANIZE` | Use / to create folders. Variables: {Author}, {FirstAuthor} (first of several authors), {AuthorSort} (first author, surname first), {Title}, {Year}, {Language}, {User}, {OriginalName} (source filename without extension). Universal adds: {Series}, {SeriesPosition}, {Subtitle}, {PrimaryTitle}. Use arbitrary prefix/suffix: {Vol. SeriesPosition - } outputs 'Vol. 2 - ' when set, nothing when empty. | string | `{Author}/{Title} ({Year})` | | `HARDLINK_TORRENTS` | Create hardlinks instead of copying. Preserves seeding but archives won't be extracted. Don't use if destination is a library ingest folder. | boolean | `false` | | `BOOKLORE_HOST` | Base URL of your Grimmory instance | string | _none_ | | `BOOKLORE_USERNAME` | Grimmory account username | string | _none_ | | `BOOKLORE_PASSWORD` | Grimmory account password | string (secret) | _none_ | | `BOOKLORE_DESTINATION` | Choose whether uploads go directly to a specific library path or to Bookdrop for review. | string (choice) | `library` | | `BOOKLORE_LIBRARY_ID` | Grimmory library to upload into. | string (choice) | _none_ | | `BOOKLORE_PATH_ID` | Grimmory library path for uploads. | string (choice) | _none_ | | `EMAIL_RECIPIENT` | Optional fallback email address when no per-user email recipient override is configured. | string | _none_ | | `EMAIL_ATTACHMENT_SIZE_LIMIT_MB` | Maximum total attachment size per email. Email encoding adds overhead; keep this below your provider's limit. | number | `25` | | `EMAIL_SMTP_HOST` | SMTP server hostname or IP (e.g., smtp.gmail.com). | string | _none_ | | `EMAIL_SMTP_PORT` | SMTP server port (587 is typical for STARTTLS, 465 for SSL). | number | `587` | | `EMAIL_SMTP_SECURITY` | Transport security mode for SMTP. | string (choice) | `starttls` | | `EMAIL_SMTP_USERNAME` | SMTP username (leave empty for no authentication). | string | _none_ | | `EMAIL_SMTP_PASSWORD` | SMTP password (required if Username is set). | string (secret) | _none_ | | `EMAIL_FROM` | From address used for the email. You can include a display name (e.g., Shelfmark ). Leave blank to default to the SMTP username (when it is an email address). | string | _none_ | | `EMAIL_SUBJECT_TEMPLATE` | Email subject. Variables: {Author}, {Title}, {PrimaryTitle}, {Year}, {Series}, {SeriesPosition}, {Subtitle}, {Format}. | string | `{Title}` | | `EMAIL_SMTP_TIMEOUT_SECONDS` | How long to wait for SMTP operations before failing. | number | `60` | | `EMAIL_ALLOW_UNVERIFIED_TLS` | Disable TLS certificate verification (not recommended). | boolean | `false` | | `DESTINATION_AUDIOBOOK` | Directory where downloaded audiobook files are saved. Leave empty to use the Books destination. | string | _none_ | | `FILE_ORGANIZATION_AUDIOBOOK` | Choose how downloaded audiobook files are named and organized. | string (choice) | `rename` | | `TEMPLATE_AUDIOBOOK_RENAME` | Variables: {Author}, {FirstAuthor} (first of several authors), {AuthorSort} (first author, surname first), {Title}, {Year}, {Language}, {User}, {OriginalName} (source filename without extension), {Series}, {SeriesPosition}, {Subtitle}, {PrimaryTitle}, {PartNumber}, {Narrator}. Use arbitrary prefix/suffix: {Vol. SeriesPosition - } outputs 'Vol. 2 - ' when set, nothing when empty. Rename templates are filename-only (no '/' or '\'); use Organize for folders. Applies to single-file downloads. | string | `{Author} - {Title}` | | `TEMPLATE_AUDIOBOOK_ORGANIZE` | Use / to create folders. Variables: {Author}, {FirstAuthor} (first of several authors), {AuthorSort} (first author, surname first), {Title}, {Year}, {Language}, {User}, {OriginalName} (source filename without extension), {Series}, {SeriesPosition}, {Subtitle}, {PrimaryTitle}, {PartNumber}, {Narrator}. Use arbitrary prefix/suffix: {Vol. SeriesPosition - } outputs 'Vol. 2 - ' when set, nothing when empty. {Narrator} and a Series fallback come from MyAnonamouse results (needs a MAM session ID); {{Narrator}} writes Audiobookshelf's '{Name}' style and is left out entirely when there is no narrator. | string | `{Author}/{Title}/{Title}` | | `HARDLINK_TORRENTS_AUDIOBOOK` | Create hardlinks instead of copying. Preserves seeding but archives won't be extracted. Don't use if destination is a library ingest folder. | boolean | `true` | | `AUTO_OPEN_DOWNLOADS_SIDEBAR` | Automatically open the downloads sidebar when a new download is queued. | boolean | `false` | | `DOWNLOAD_TO_BROWSER_CONTENT_TYPES` | Automatically download completed files to your browser for the selected content types. | string (comma-separated) | _empty list_ | | `MAX_CONCURRENT_DOWNLOADS` | Maximum number of simultaneous downloads. Not used while Max Concurrent Downloads Per Source is above 0. | number | `3` | | `MAX_CONCURRENT_DOWNLOADS_PER_SOURCE` | Simultaneous downloads allowed from each source (Soulseek, AudiobookBay, Direct Download and so on). A source at its limit does not hold the others back, so a Soulseek download waiting in a peer's queue cannot stop a torrent from starting. Above 0 this replaces Max Concurrent Downloads: the total can be this number for every source that has downloads at once. 0 uses the single limit above for all sources together. | number | `0` | | `STATUS_TIMEOUT` | How long to keep completed/failed downloads in the queue display. | number | `3600` |
Detailed descriptions #### `BOOKS_OUTPUT_MODE` **Output Mode** Choose where completed book files are sent. - **Type:** string (choice) - **Default:** `folder` - **Options:** `folder` (Folder), `email` (Email (SMTP)), `booklore` (Grimmory (API)) #### `INGEST_DIR` **Destination** Directory where downloaded files are saved. Use {User} for per-user folders (e.g. /books/{User}). - **Type:** string - **Default:** `/books` - **Required:** Yes #### `FILE_ORGANIZATION` **File Organization** Choose how downloaded book files are named and organized. - **Type:** string (choice) - **Default:** `rename` - **Options:** `none` (None), `rename` (Rename Only), `organize` (Rename and Organize) #### `NAMING_WORD_SEPARATOR` **Word Separator** Replaces spaces inside naming template values (e.g. 'Conan Doyle' -> 'Conan.Doyle' with '.'). Applies to books and audiobooks, rename and organize templates alike. Literal characters typed into a template (like the '-' in '{Author} - {Title}') are left as-is. Leave empty to keep spaces as-is. - **Type:** string - **Default:** _empty string_ #### `TEMPLATE_RENAME` **Naming Template** Variables: {Author}, {FirstAuthor} (first of several authors), {AuthorSort} (first author, surname first), {Title}, {Year}, {Language}, {User}, {OriginalName} (source filename without extension). Universal adds: {Series}, {SeriesPosition}, {Subtitle}, {PrimaryTitle}. Use arbitrary prefix/suffix: {Vol. SeriesPosition - } outputs 'Vol. 2 - ' when set, nothing when empty. Rename templates are filename-only (no '/' or '\'); use Organize for folders. Applies to single-file downloads. - **Type:** string - **Default:** `{Author} - {Title} ({Year})` #### `TEMPLATE_ORGANIZE` **Path Template** Use / to create folders. Variables: {Author}, {FirstAuthor} (first of several authors), {AuthorSort} (first author, surname first), {Title}, {Year}, {Language}, {User}, {OriginalName} (source filename without extension). Universal adds: {Series}, {SeriesPosition}, {Subtitle}, {PrimaryTitle}. Use arbitrary prefix/suffix: {Vol. SeriesPosition - } outputs 'Vol. 2 - ' when set, nothing when empty. - **Type:** string - **Default:** `{Author}/{Title} ({Year})` #### `HARDLINK_TORRENTS` **Hardlink Book Torrents** Create hardlinks instead of copying. Preserves seeding but archives won't be extracted. Don't use if destination is a library ingest folder. - **Type:** boolean - **Default:** `false` #### `BOOKLORE_HOST` **Grimmory URL** Base URL of your Grimmory instance - **Type:** string - **Default:** _none_ - **Required:** Yes #### `BOOKLORE_USERNAME` **Username** Grimmory account username - **Type:** string - **Default:** _none_ - **Required:** Yes #### `BOOKLORE_PASSWORD` **Password** Grimmory account password - **Type:** string (secret) - **Default:** _none_ - **Required:** Yes #### `BOOKLORE_DESTINATION` **Upload Destination** Choose whether uploads go directly to a specific library path or to Bookdrop for review. - **Type:** string (choice) - **Default:** `library` - **Options:** `library` (Specific Library), `bookdrop` (Bookdrop) #### `BOOKLORE_LIBRARY_ID` **Library** Grimmory library to upload into. - **Type:** string (choice) - **Default:** _none_ - **Required:** Yes #### `BOOKLORE_PATH_ID` **Path** Grimmory library path for uploads. - **Type:** string (choice) - **Default:** _none_ - **Required:** Yes #### `EMAIL_RECIPIENT` **Default Email Recipient** Optional fallback email address when no per-user email recipient override is configured. - **Type:** string - **Default:** _none_ #### `EMAIL_ATTACHMENT_SIZE_LIMIT_MB` **Attachment Size Limit (MB)** Maximum total attachment size per email. Email encoding adds overhead; keep this below your provider's limit. - **Type:** number - **Default:** `25` - **Constraints:** min: 1, max: 600 #### `EMAIL_SMTP_HOST` **SMTP Host** SMTP server hostname or IP (e.g., smtp.gmail.com). - **Type:** string - **Default:** _none_ - **Required:** Yes #### `EMAIL_SMTP_PORT` **SMTP Port** SMTP server port (587 is typical for STARTTLS, 465 for SSL). - **Type:** number - **Default:** `587` - **Constraints:** min: 1, max: 65535 #### `EMAIL_SMTP_SECURITY` **SMTP Security** Transport security mode for SMTP. - **Type:** string (choice) - **Default:** `starttls` - **Options:** `none` (None), `starttls` (STARTTLS), `ssl` (SSL/TLS) #### `EMAIL_SMTP_USERNAME` **Username** SMTP username (leave empty for no authentication). - **Type:** string - **Default:** _none_ #### `EMAIL_SMTP_PASSWORD` **Password** SMTP password (required if Username is set). - **Type:** string (secret) - **Default:** _none_ #### `EMAIL_FROM` **From Address** From address used for the email. You can include a display name (e.g., Shelfmark ). Leave blank to default to the SMTP username (when it is an email address). - **Type:** string - **Default:** _none_ #### `EMAIL_SUBJECT_TEMPLATE` **Subject Template** Email subject. Variables: {Author}, {Title}, {PrimaryTitle}, {Year}, {Series}, {SeriesPosition}, {Subtitle}, {Format}. - **Type:** string - **Default:** `{Title}` #### `EMAIL_SMTP_TIMEOUT_SECONDS` **SMTP Timeout (seconds)** How long to wait for SMTP operations before failing. - **Type:** number - **Default:** `60` - **Constraints:** min: 1, max: 600 #### `EMAIL_ALLOW_UNVERIFIED_TLS` **Allow Unverified TLS** Disable TLS certificate verification (not recommended). - **Type:** boolean - **Default:** `false` #### `DESTINATION_AUDIOBOOK` **Destination** Directory where downloaded audiobook files are saved. Leave empty to use the Books destination. - **Type:** string - **Default:** _none_ #### `FILE_ORGANIZATION_AUDIOBOOK` **File Organization** Choose how downloaded audiobook files are named and organized. - **Type:** string (choice) - **Default:** `rename` - **Options:** `none` (None), `rename` (Rename Only), `organize` (Rename and Organize), `rename_and_group` (Rename and Group) #### `TEMPLATE_AUDIOBOOK_RENAME` **Naming Template** Variables: {Author}, {FirstAuthor} (first of several authors), {AuthorSort} (first author, surname first), {Title}, {Year}, {Language}, {User}, {OriginalName} (source filename without extension), {Series}, {SeriesPosition}, {Subtitle}, {PrimaryTitle}, {PartNumber}, {Narrator}. Use arbitrary prefix/suffix: {Vol. SeriesPosition - } outputs 'Vol. 2 - ' when set, nothing when empty. Rename templates are filename-only (no '/' or '\'); use Organize for folders. Applies to single-file downloads. - **Type:** string - **Default:** `{Author} - {Title}` #### `TEMPLATE_AUDIOBOOK_ORGANIZE` **Path Template** Use / to create folders. Variables: {Author}, {FirstAuthor} (first of several authors), {AuthorSort} (first author, surname first), {Title}, {Year}, {Language}, {User}, {OriginalName} (source filename without extension), {Series}, {SeriesPosition}, {Subtitle}, {PrimaryTitle}, {PartNumber}, {Narrator}. Use arbitrary prefix/suffix: {Vol. SeriesPosition - } outputs 'Vol. 2 - ' when set, nothing when empty. {Narrator} and a Series fallback come from MyAnonamouse results (needs a MAM session ID); {{Narrator}} writes Audiobookshelf's '{Name}' style and is left out entirely when there is no narrator. - **Type:** string - **Default:** `{Author}/{Title}/{Title}` #### `HARDLINK_TORRENTS_AUDIOBOOK` **Hardlink Audiobook Torrents** Create hardlinks instead of copying. Preserves seeding but archives won't be extracted. Don't use if destination is a library ingest folder. - **Type:** boolean - **Default:** `true` #### `AUTO_OPEN_DOWNLOADS_SIDEBAR` **Auto-Open Downloads Sidebar** Automatically open the downloads sidebar when a new download is queued. - **Type:** boolean - **Default:** `false` #### `DOWNLOAD_TO_BROWSER_CONTENT_TYPES` **Download to Browser** Automatically download completed files to your browser for the selected content types. - **Type:** string (comma-separated) - **Default:** _empty list_ #### `MAX_CONCURRENT_DOWNLOADS` **Max Concurrent Downloads** Maximum number of simultaneous downloads. Not used while Max Concurrent Downloads Per Source is above 0. - **Type:** number - **Default:** `3` - **Requires restart:** Yes - **Constraints:** min: 1, max: 10 #### `MAX_CONCURRENT_DOWNLOADS_PER_SOURCE` **Max Concurrent Downloads Per Source** Simultaneous downloads allowed from each source (Soulseek, AudiobookBay, Direct Download and so on). A source at its limit does not hold the others back, so a Soulseek download waiting in a peer's queue cannot stop a torrent from starting. Above 0 this replaces Max Concurrent Downloads: the total can be this number for every source that has downloads at once. 0 uses the single limit above for all sources together. - **Type:** number - **Default:** `0` - **Requires restart:** Yes - **Constraints:** min: 0, max: 10 #### `STATUS_TIMEOUT` **Status Timeout (seconds)** How long to keep completed/failed downloads in the queue display. - **Type:** number - **Default:** `3600` - **Constraints:** min: 60, max: 86400
## Security | Variable | Description | Type | Default | |----------|-------------|------|---------| | `AUTH_METHOD` | Select the authentication method for accessing Shelfmark. Restart container after changing Calibre-Web passwords. | string (choice) | `none` | | `PROXY_AUTH_USER_HEADER` | The HTTP header your proxy uses to pass the authenticated username. | string | `X-Auth-User` | | `PROXY_AUTH_LOGOUT_URL` | The URL to redirect users to for logging out. Leave empty to disable logout functionality. | string | _empty string_ | | `PROXY_AUTH_ADMIN_GROUP_HEADER` | Optional: header your proxy uses to pass user groups/roles. | string | `X-Auth-Groups` | | `PROXY_AUTH_ADMIN_GROUP_NAME` | Optional: users in this group are treated as admins. Leave blank to skip group-based admin detection. | string | _empty string_ | | `PROXY_AUTH_DEFAULT_ROLE` | Role for users the proxy authenticates for the first time when no admin group is configured. The first account is always an admin so the instance is never left without one. | string (choice) | `user` | | `OIDC_DISCOVERY_URL` | OpenID Connect discovery endpoint URL. Usually ends with /.well-known/openid-configuration. | string | _none_ | | `OIDC_CLIENT_ID` | OAuth2 client ID from your identity provider. | string | _none_ | | `OIDC_CLIENT_SECRET` | OAuth2 client secret from your identity provider. | string (secret) | _none_ | | `OIDC_SCOPES` | OAuth2 scopes to request from the identity provider. Managed automatically: includes essential scopes and the group claim when using admin group authorization. | string (comma-separated) | `openid,email,profile` | | `OIDC_GROUP_CLAIM` | The name of the claim in the ID token that contains user groups. | string | `groups` | | `OIDC_ADMIN_GROUP` | Users in this group will be given admin access (if enabled below). Leave empty to use database roles only. | string | _empty string_ | | `OIDC_USE_ADMIN_GROUP` | When enabled, users in the Admin Group are granted admin access. When disabled, admin access is determined solely by database roles. | boolean | `true` | | `OIDC_AUTO_PROVISION` | Automatically create a user account on first OIDC login. When disabled, users must be pre-created by an admin. | boolean | `true` | | `OIDC_BUTTON_LABEL` | Custom label for the OIDC sign-in button on the login page. | string | _empty string_ |
Detailed descriptions #### `AUTH_METHOD` **Authentication Method** Select the authentication method for accessing Shelfmark. Restart container after changing Calibre-Web passwords. - **Type:** string (choice) - **Default:** `none` - **Options:** `none` (No Authentication), `builtin` (Local), `proxy` (Proxy Authentication), `oidc` (OIDC (OpenID Connect)), `cwa` (Calibre-Web Database) #### `PROXY_AUTH_USER_HEADER` **Proxy Auth User Header** The HTTP header your proxy uses to pass the authenticated username. - **Type:** string - **Default:** `X-Auth-User` #### `PROXY_AUTH_LOGOUT_URL` **Proxy Auth Logout URL** The URL to redirect users to for logging out. Leave empty to disable logout functionality. - **Type:** string - **Default:** _empty string_ #### `PROXY_AUTH_ADMIN_GROUP_HEADER` **Proxy Auth Admin Group Header** Optional: header your proxy uses to pass user groups/roles. - **Type:** string - **Default:** `X-Auth-Groups` #### `PROXY_AUTH_ADMIN_GROUP_NAME` **Proxy Auth Admin Group** Optional: users in this group are treated as admins. Leave blank to skip group-based admin detection. - **Type:** string - **Default:** _empty string_ #### `PROXY_AUTH_DEFAULT_ROLE` **Proxy Auth Default Role** Role for users the proxy authenticates for the first time when no admin group is configured. The first account is always an admin so the instance is never left without one. - **Type:** string (choice) - **Default:** `user` - **Options:** `user` (User), `admin` (Admin) #### `OIDC_DISCOVERY_URL` **Discovery URL** OpenID Connect discovery endpoint URL. Usually ends with /.well-known/openid-configuration. - **Type:** string - **Default:** _none_ - **Required:** Yes #### `OIDC_CLIENT_ID` **Client ID** OAuth2 client ID from your identity provider. - **Type:** string - **Default:** _none_ - **Required:** Yes #### `OIDC_CLIENT_SECRET` **Client Secret** OAuth2 client secret from your identity provider. - **Type:** string (secret) - **Default:** _none_ - **Required:** Yes #### `OIDC_SCOPES` **Scopes** OAuth2 scopes to request from the identity provider. Managed automatically: includes essential scopes and the group claim when using admin group authorization. - **Type:** string (comma-separated) - **Default:** `openid,email,profile` #### `OIDC_GROUP_CLAIM` **Group Claim Name** The name of the claim in the ID token that contains user groups. - **Type:** string - **Default:** `groups` #### `OIDC_ADMIN_GROUP` **Admin Group Name** Users in this group will be given admin access (if enabled below). Leave empty to use database roles only. - **Type:** string - **Default:** _empty string_ #### `OIDC_USE_ADMIN_GROUP` **Use Admin Group for Authorization** When enabled, users in the Admin Group are granted admin access. When disabled, admin access is determined solely by database roles. - **Type:** boolean - **Default:** `true` #### `OIDC_AUTO_PROVISION` **Auto-Provision Users** Automatically create a user account on first OIDC login. When disabled, users must be pre-created by an admin. - **Type:** boolean - **Default:** `true` #### `OIDC_BUTTON_LABEL` **Login Button Label** Custom label for the OIDC sign-in button on the login page. - **Type:** string - **Default:** _empty string_
## Hardcover Sync | Variable | Description | Type | Default | |----------|-------------|------|---------| | `HARDCOVER_SYNC_ENABLED` | Periodically sync the selected Hardcover shelves into requests. | boolean | `false` | | `HARDCOVER_SYNC_TOKEN` | Bearer token for your Hardcover account. Leave blank to reuse the token from the Hardcover metadata provider. | string (secret) | _none_ | | `HARDCOVER_SYNC_STATUSES` | Which Hardcover reading shelf to pull from. | string (choice) | `1` | | `HARDCOVER_SYNC_CONTENT_TYPE` | Content type for synced requests. "Ebooks and audiobooks" creates one request of each per shelf book; every request is checked against its own library and downloaded with its own format guard and source priority. | string (choice) | `audiobook` | | `HARDCOVER_SYNC_INTERVAL` | How often the scheduled sync runs (minimum 1 minute). | number | `6` | | `HARDCOVER_SYNC_INTERVAL_UNIT` | Whether the sync interval is measured in minutes or hours. | string (choice) | `hours` | | `AUTO_DOWNLOAD_ENABLED` | Auto-approve and auto-download matching releases for Hardcover requests. Another user's request is only approved this way where their request policy already lets them download directly; the rest wait for an admin. | boolean | `false` | | `AUTO_DOWNLOAD_SOURCE_PRIORITY` | Drag to set which release sources are tried first for audiobook requests. The first source with a strict match wins. Disabled sources are skipped. | JSON array | _empty list_ | | `AUTO_DOWNLOAD_EBOOK_SOURCE_PRIORITY` | Drag to set which release sources are tried first for ebook requests. The first source with a strict match wins. Disabled sources are skipped. | JSON array | _empty list_ | | `AUTO_DOWNLOAD_MIN_SEEDERS` | Skip torrent releases with fewer seeders than this. | number | `1` | | `AUTO_DOWNLOAD_RETRY_DAYS` | A synced request whose download failed, or was interrupted (a restart, say), goes back to pending after this many days and is tried again, a few per pass. A release that failed is not picked again, and a request is given up on after three failed retries. A download the stall timer cancelled counts as failed; one cancelled by a person, and rejected requests, are never retried. 0 turns retries off. | number | `7` | | `AUTO_DOWNLOAD_FAILURE_RETRY_MINUTES` | A download that failed, or that was given up on (stalled, no seeders), goes back to pending this many minutes later and another release is chosen, without waiting for the retry days above or the next sync cycle. The release that failed is not picked again, and a request is given up on after three failed attempts. 0 turns this off. | number | `0` | | `AUTO_DOWNLOAD_RETRY_FAILED_RELEASE_DAYS` | A release that failed or stalled is kept out of the search for this many days, then it may be picked again. A torrent that stalled can be revived by new seeds, so a failure should not shut a book out for good. A request is still given up on after three failed attempts. | number | `7` | | `AUTO_DOWNLOAD_BACKOFF_MAX_DAYS` | A request that no source has a match for is searched every cycle at first. After three passes in a row with no match it is searched once a day, then every two days, and at most this often apart. A match, or Sync now, starts it over. 0 searches every unmatched request every cycle. | number | `3` | | `AUTO_DOWNLOAD_EXISTENCE_CHECK_ENABLED` | An audiobook request that stays unmatched is looked up on Audible (US and UK) through your Audiobookshelf server. Either way it stays pending and its reason says what the store answered (with the ASIN when listed), for you to decline or keep; it is checked again after a week. A lookup that fails decides nothing. Needs the Audiobookshelf URL and token below. | boolean | `false` | | `AUTO_DOWNLOAD_EXISTENCE_CHECK_AFTER_PASSES` | How many consecutive passes with no strict match a request goes through before the store is asked. A pass that matched, or a reopen, starts the count over. | number | `3` | | `AUTO_DOWNLOAD_AUDIOBOOK_MIN_SIZE_PERCENT` | A copy of an audiobook smaller than this share of the largest copy found for the same book is probably a lower-bitrate copy. It is tried after the others, and a single m4b that small is not preferred over a fuller set of chapter files. 0 turns the check off. | number | `67` |
Detailed descriptions #### `HARDCOVER_SYNC_ENABLED` **Enable scheduled sync** Periodically sync the selected Hardcover shelves into requests. - **Type:** boolean - **Default:** `false` #### `HARDCOVER_SYNC_TOKEN` **Hardcover API Token** Bearer token for your Hardcover account. Leave blank to reuse the token from the Hardcover metadata provider. - **Type:** string (secret) - **Default:** _none_ #### `HARDCOVER_SYNC_STATUSES` **Shelves to sync** Which Hardcover reading shelf to pull from. - **Type:** string (choice) - **Default:** `1` - **Options:** `1` (Want to Read), `2` (Currently Reading), `3` (Read), `5` (Did Not Finish) #### `HARDCOVER_SYNC_CONTENT_TYPE` **Request as** Content type for synced requests. "Ebooks and audiobooks" creates one request of each per shelf book; every request is checked against its own library and downloaded with its own format guard and source priority. - **Type:** string (choice) - **Default:** `audiobook` - **Options:** `audiobook` (Audiobooks), `ebook` (Ebooks), `both` (Ebooks and audiobooks) #### `HARDCOVER_SYNC_INTERVAL` **Sync interval** How often the scheduled sync runs (minimum 1 minute). - **Type:** number - **Default:** `6` - **Constraints:** min: 1, max: 10000 #### `HARDCOVER_SYNC_INTERVAL_UNIT` **Interval unit** Whether the sync interval is measured in minutes or hours. - **Type:** string (choice) - **Default:** `hours` - **Options:** `minutes` (Minutes), `hours` (Hours) #### `AUTO_DOWNLOAD_ENABLED` **Enable automatic downloads** Auto-approve and auto-download matching releases for Hardcover requests. Another user's request is only approved this way where their request policy already lets them download directly; the rest wait for an admin. - **Type:** boolean - **Default:** `false` #### `AUTO_DOWNLOAD_SOURCE_PRIORITY` **Audiobook source priority** Drag to set which release sources are tried first for audiobook requests. The first source with a strict match wins. Disabled sources are skipped. - **Type:** JSON array - **Default:** _empty list_ #### `AUTO_DOWNLOAD_EBOOK_SOURCE_PRIORITY` **Ebook source priority** Drag to set which release sources are tried first for ebook requests. The first source with a strict match wins. Disabled sources are skipped. - **Type:** JSON array - **Default:** _empty list_ #### `AUTO_DOWNLOAD_MIN_SEEDERS` **Minimum seeders (torrents)** Skip torrent releases with fewer seeders than this. - **Type:** number - **Default:** `1` - **Constraints:** min: 0, max: 1000 #### `AUTO_DOWNLOAD_RETRY_DAYS` **Retry failed downloads after (days)** A synced request whose download failed, or was interrupted (a restart, say), goes back to pending after this many days and is tried again, a few per pass. A release that failed is not picked again, and a request is given up on after three failed retries. A download the stall timer cancelled counts as failed; one cancelled by a person, and rejected requests, are never retried. 0 turns retries off. - **Type:** number - **Default:** `7` - **Constraints:** min: 0, max: 365 #### `AUTO_DOWNLOAD_FAILURE_RETRY_MINUTES` **Try another release after a failed download (minutes)** A download that failed, or that was given up on (stalled, no seeders), goes back to pending this many minutes later and another release is chosen, without waiting for the retry days above or the next sync cycle. The release that failed is not picked again, and a request is given up on after three failed attempts. 0 turns this off. - **Type:** number - **Default:** `0` - **Constraints:** min: 0, max: 1440 #### `AUTO_DOWNLOAD_RETRY_FAILED_RELEASE_DAYS` **Try a failed release again after (days)** A release that failed or stalled is kept out of the search for this many days, then it may be picked again. A torrent that stalled can be revived by new seeds, so a failure should not shut a book out for good. A request is still given up on after three failed attempts. - **Type:** number - **Default:** `7` - **Constraints:** min: 1, max: 365 #### `AUTO_DOWNLOAD_BACKOFF_MAX_DAYS` **Longest wait between searches for an unmatched request (days)** A request that no source has a match for is searched every cycle at first. After three passes in a row with no match it is searched once a day, then every two days, and at most this often apart. A match, or Sync now, starts it over. 0 searches every unmatched request every cycle. - **Type:** number - **Default:** `3` - **Constraints:** min: 0, max: 30 #### `AUTO_DOWNLOAD_EXISTENCE_CHECK_ENABLED` **Mark audiobooks no store sells** An audiobook request that stays unmatched is looked up on Audible (US and UK) through your Audiobookshelf server. Either way it stays pending and its reason says what the store answered (with the ASIN when listed), for you to decline or keep; it is checked again after a week. A lookup that fails decides nothing. Needs the Audiobookshelf URL and token below. - **Type:** boolean - **Default:** `false` #### `AUTO_DOWNLOAD_EXISTENCE_CHECK_AFTER_PASSES` **Look the book up after (unmatched passes)** How many consecutive passes with no strict match a request goes through before the store is asked. A pass that matched, or a reopen, starts the count over. - **Type:** number - **Default:** `3` - **Constraints:** min: 1, max: 100 #### `AUTO_DOWNLOAD_AUDIOBOOK_MIN_SIZE_PERCENT` **Smallest acceptable audiobook copy (%)** A copy of an audiobook smaller than this share of the largest copy found for the same book is probably a lower-bitrate copy. It is tried after the others, and a single m4b that small is not preferred over a fuller set of chapter files. 0 turns the check off. - **Type:** number - **Default:** `67` - **Constraints:** min: 0, max: 100
## Network | Variable | Description | Type | Default | |----------|-------------|------|---------| | `CERTIFICATE_VALIDATION` | Controls SSL/TLS certificate verification for outbound connections. Disable for self-signed certificates on internal services (e.g. OIDC providers, Prowlarr). | string (choice) | `enabled` | | `CUSTOM_DNS` | DNS provider for domain resolution. 'Auto' rotates through providers on failure. | string (choice) | `auto` | | `CUSTOM_DNS_MANUAL` | Comma-separated list of DNS server IP addresses (e.g., 8.8.8.8, 1.1.1.1). | string | _none_ | | `USE_DOH` | Use encrypted DNS queries for improved reliability and privacy. | boolean | `true` | | `USING_TOR` | Route all traffic through Tor for enhanced privacy. Requires root startup. | boolean | `false` | | `PROXY_MODE` | Choose proxy type. SOCKS5 handles all traffic through a single proxy. | string (choice) | `none` | | `HTTP_PROXY` | HTTP proxy URL. Supports auth: http://user:pass@host:port | string | _none_ | | `HTTPS_PROXY` | HTTPS proxy URL (leave empty to use HTTP proxy for HTTPS). Supports auth: http://user:pass@host:port | string | _none_ | | `SOCKS5_PROXY` | SOCKS5 proxy URL. Supports auth: socks5://user:pass@host:port | string | _none_ | | `NO_PROXY` | Comma-separated hosts to bypass proxy (e.g., localhost,127.0.0.1,10.*,*.local) | string | _none_ |
Detailed descriptions #### `CERTIFICATE_VALIDATION` **Certificate Validation** Controls SSL/TLS certificate verification for outbound connections. Disable for self-signed certificates on internal services (e.g. OIDC providers, Prowlarr). - **Type:** string (choice) - **Default:** `enabled` - **Options:** `enabled` (Enabled (Recommended)), `disabled_local` (Disabled for Local Addresses), `disabled` (Disabled) #### `CUSTOM_DNS` **DNS Provider** DNS provider for domain resolution. 'Auto' rotates through providers on failure. - **Type:** string (choice) - **Default:** `auto` - **Options:** `auto` (Auto (Recommended)), `system` (System), `google` (Google), `cloudflare` (Cloudflare), `quad9` (Quad9), `opendns` (OpenDNS), `manual` (Manual) #### `CUSTOM_DNS_MANUAL` **Manual DNS Servers** Comma-separated list of DNS server IP addresses (e.g., 8.8.8.8, 1.1.1.1). - **Type:** string - **Default:** _none_ #### `USE_DOH` **Use DNS over HTTPS** Use encrypted DNS queries for improved reliability and privacy. - **Type:** boolean - **Default:** `true` #### `USING_TOR` **Tor Routing** Route all traffic through Tor for enhanced privacy. Requires root startup. - **Type:** boolean - **Default:** `false` #### `PROXY_MODE` **Proxy Mode** Choose proxy type. SOCKS5 handles all traffic through a single proxy. - **Type:** string (choice) - **Default:** `none` - **Options:** `none` (None (Direct Connection)), `http` (HTTP/HTTPS Proxy), `socks5` (SOCKS5 Proxy) #### `HTTP_PROXY` **HTTP Proxy** HTTP proxy URL. Supports auth: http://user:pass@host:port - **Type:** string - **Default:** _none_ #### `HTTPS_PROXY` **HTTPS Proxy** HTTPS proxy URL (leave empty to use HTTP proxy for HTTPS). Supports auth: http://user:pass@host:port - **Type:** string - **Default:** _none_ #### `SOCKS5_PROXY` **SOCKS5 Proxy** SOCKS5 proxy URL. Supports auth: socks5://user:pass@host:port - **Type:** string - **Default:** _none_ #### `NO_PROXY` **No Proxy** Comma-separated hosts to bypass proxy (e.g., localhost,127.0.0.1,10.*,*.local) - **Type:** string - **Default:** _none_
## Advanced | Variable | Description | Type | Default | |----------|-------------|------|---------| | `URL_BASE` | Optional URL path prefix. Use a path like /shelfmark (no hostname). Leave blank for root. | string | _none_ | | `DEBUG` | Enable verbose logging to console and file. Not recommended for normal use. | boolean | `false` | | `LOG_LEVEL` | Lowest severity written to the console and log file. Ignored while Debug Mode is on, which forces Debug. | string (choice) | `INFO` | | `MAIN_LOOP_SLEEP_TIME` | How often the download queue is checked for new items. | number | `5` | | `DOWNLOAD_PROGRESS_UPDATE_INTERVAL` | How often download progress is broadcast to the UI. | number | `1` | | `CUSTOM_SCRIPT` | Path to a script to run after each successful download. Must be executable. | string | _none_ | | `CUSTOM_SCRIPT_PATH_MODE` | Pass the path to the custom script as an absolute path or relative to the destination folder. | string (choice) | `absolute` | | `CUSTOM_SCRIPT_JSON_PAYLOAD` | Send a JSON payload to the script via stdin. Useful for multi-file imports (audiobooks) or richer metadata without relying on path parsing. | boolean | `false` | | `DOWNLOAD_CLIENT_COMPLETED_PATH_TIMEOUT` | How long to wait after a torrent or usenet client reports completion for the completed file path to become visible to Shelfmark. Increase this for seedbox or remote-sync workflows. | number | `60` | | `COVERS_CACHE_ENABLED` | Cache book covers on the server for faster loading. | boolean | `true` | | `COVERS_CACHE_TTL` | How long to keep cached covers. Set to 0 to keep forever (recommended for static artwork). | number | `0` | | `COVERS_CACHE_MAX_SIZE_MB` | Maximum disk space for cached covers. Oldest images are removed when limit is reached. | number | `500` | | `METADATA_CACHE_ENABLED` | When disabled, all metadata searches hit the provider API directly. | boolean | `true` | | `METADATA_CACHE_SEARCH_TTL` | How long to cache search results. Default: 300 (5 minutes). Max: 604800 (7 days). | number | `300` | | `METADATA_CACHE_BOOK_TTL` | How long to cache individual book details. Default: 600 (10 minutes). Max: 604800 (7 days). | number | `600` |
Detailed descriptions #### `URL_BASE` **Base Path** Optional URL path prefix. Use a path like /shelfmark (no hostname). Leave blank for root. - **Type:** string - **Default:** _none_ - **Requires restart:** Yes #### `DEBUG` **Debug Mode** Enable verbose logging to console and file. Not recommended for normal use. - **Type:** boolean - **Default:** `false` - **Requires restart:** Yes #### `LOG_LEVEL` **Log Level** Lowest severity written to the console and log file. Ignored while Debug Mode is on, which forces Debug. - **Type:** string (choice) - **Default:** `INFO` - **Requires restart:** Yes - **Options:** `DEBUG` (Debug), `INFO` (Info), `WARNING` (Warning), `ERROR` (Error), `CRITICAL` (Critical) #### `MAIN_LOOP_SLEEP_TIME` **Queue Check Interval (seconds)** How often the download queue is checked for new items. - **Type:** number - **Default:** `5` - **Requires restart:** Yes - **Constraints:** min: 1, max: 60 #### `DOWNLOAD_PROGRESS_UPDATE_INTERVAL` **Progress Update Interval (seconds)** How often download progress is broadcast to the UI. - **Type:** number - **Default:** `1` - **Requires restart:** Yes - **Constraints:** min: 1, max: 10 #### `CUSTOM_SCRIPT` **Custom Script Path** Path to a script to run after each successful download. Must be executable. - **Type:** string - **Default:** _none_ #### `CUSTOM_SCRIPT_PATH_MODE` **Custom Script Path Mode** Pass the path to the custom script as an absolute path or relative to the destination folder. - **Type:** string (choice) - **Default:** `absolute` - **Options:** `absolute` (Absolute), `relative` (Relative) #### `CUSTOM_SCRIPT_JSON_PAYLOAD` **Custom Script JSON Payload** Send a JSON payload to the script via stdin. Useful for multi-file imports (audiobooks) or richer metadata without relying on path parsing. - **Type:** boolean - **Default:** `false` #### `DOWNLOAD_CLIENT_COMPLETED_PATH_TIMEOUT` **Completed Path Wait (seconds)** How long to wait after a torrent or usenet client reports completion for the completed file path to become visible to Shelfmark. Increase this for seedbox or remote-sync workflows. - **Type:** number - **Default:** `60` - **Constraints:** min: 0, max: 3600 #### `COVERS_CACHE_ENABLED` **Enable Cover Cache** Cache book covers on the server for faster loading. - **Type:** boolean - **Default:** `true` #### `COVERS_CACHE_TTL` **Cache TTL (days)** How long to keep cached covers. Set to 0 to keep forever (recommended for static artwork). - **Type:** number - **Default:** `0` - **Constraints:** min: 0, max: 365 #### `COVERS_CACHE_MAX_SIZE_MB` **Max Cache Size (MB)** Maximum disk space for cached covers. Oldest images are removed when limit is reached. - **Type:** number - **Default:** `500` - **Constraints:** min: 50, max: 5000 #### `METADATA_CACHE_ENABLED` **Enable Metadata Caching** When disabled, all metadata searches hit the provider API directly. - **Type:** boolean - **Default:** `true` #### `METADATA_CACHE_SEARCH_TTL` **Search Results Cache (seconds)** How long to cache search results. Default: 300 (5 minutes). Max: 604800 (7 days). - **Type:** number - **Default:** `300` - **Constraints:** min: 60, max: 604800 #### `METADATA_CACHE_BOOK_TTL` **Book Details Cache (seconds)** How long to cache individual book details. Default: 600 (10 minutes). Max: 604800 (7 days). - **Type:** number - **Default:** `600` - **Constraints:** min: 60, max: 604800
## Prowlarr | Variable | Description | Type | Default | |----------|-------------|------|---------| | `PROWLARR_ENABLED` | Enable searching for books via Prowlarr indexers | boolean | `false` | | `PROWLARR_URL` | Base URL of your Prowlarr instance | string | _none_ | | `PROWLARR_API_KEY` | Found in Prowlarr: Settings > General > API Key | string (secret) | _none_ | | `PROWLARR_INDEXERS` | Select which indexers to search. 📚 = has book categories. Leave empty to search all. | string (comma-separated) | _empty list_ | | `PROWLARR_INDEXER_TIMEOUT` | How long to wait for a single indexer to answer a search. Indexers behind FlareSolverr can need 90 seconds or more while a cold Cloudflare challenge is solved; raise this if searches come back empty and the Prowlarr log shows the search still running. | number | `90` | | `PROWLARR_EBOOK_MAX_SIZE_MB` | Hide ebook results larger than this. Expanded searches and general indexers can return TV series, courses and software next to the books. 0 shows everything, and a result with no reported size is always shown. Audiobook searches are not limited. | number | `0` | | `PROWLARR_AUTO_EXPAND` | Automatically retry search without category filtering if no results are found | boolean | `false` | | `PROWLARR_COLLAPSE_DUPLICATES` | Collapse a release that several indexer entries returned down to a single row, keeping the entry with the best Prowlarr priority. Turn this off to see every entry that carried it, which is what makes results from filter-specific entries (freeleech and the like) visible. | boolean | `true` | | `PROWLARR_HIDE_UNSUPPORTED_FORMATS` | Hide a result whose title ends in a file extension that is not in Supported Book Formats, such as a .doc or .rtf file. Downloading it would only fail at post-processing. Titles without an extension, archives and audiobook searches are never hidden. | boolean | `true` | | `PROWLARR_USE_SEED_PREFERENCES` | Apply per-indexer seed time and ratio preferences from Prowlarr when sending torrents to the download client | boolean | `false` | | `PROWLARR_MAM_ID` | The mam_id value MyAnonamouse shows when you create a session. MAM locks each session to one IP or ASN, so reusing Prowlarr's or another client's session often fails with a 403: you will likely need a separate session for Shelfmark if it reaches MAM from another IP (different host, VPN or proxy) or the existing session is ASN-locked to another network. Leave empty to turn enrichment off. | string (secret) | _none_ |
Detailed descriptions #### `PROWLARR_ENABLED` **Enable Prowlarr source** Enable searching for books via Prowlarr indexers - **Type:** boolean - **Default:** `false` #### `PROWLARR_URL` **Prowlarr URL** Base URL of your Prowlarr instance - **Type:** string - **Default:** _none_ - **Required:** Yes #### `PROWLARR_API_KEY` **API Key** Found in Prowlarr: Settings > General > API Key - **Type:** string (secret) - **Default:** _none_ - **Required:** Yes #### `PROWLARR_INDEXERS` **Indexers to Search** Select which indexers to search. 📚 = has book categories. Leave empty to search all. - **Type:** string (comma-separated) - **Default:** _empty list_ #### `PROWLARR_INDEXER_TIMEOUT` **Indexer Search Timeout (seconds)** How long to wait for a single indexer to answer a search. Indexers behind FlareSolverr can need 90 seconds or more while a cold Cloudflare challenge is solved; raise this if searches come back empty and the Prowlarr log shows the search still running. - **Type:** number - **Default:** `90` - **Constraints:** min: 5, max: 300 #### `PROWLARR_EBOOK_MAX_SIZE_MB` **Maximum Ebook Size (MB)** Hide ebook results larger than this. Expanded searches and general indexers can return TV series, courses and software next to the books. 0 shows everything, and a result with no reported size is always shown. Audiobook searches are not limited. - **Type:** number - **Default:** `0` - **Constraints:** min: 0, max: 100000 #### `PROWLARR_AUTO_EXPAND` **Auto-expand search on no results** Automatically retry search without category filtering if no results are found - **Type:** boolean - **Default:** `false` #### `PROWLARR_COLLAPSE_DUPLICATES` **Show one row per release** Collapse a release that several indexer entries returned down to a single row, keeping the entry with the best Prowlarr priority. Turn this off to see every entry that carried it, which is what makes results from filter-specific entries (freeleech and the like) visible. - **Type:** boolean - **Default:** `true` #### `PROWLARR_HIDE_UNSUPPORTED_FORMATS` **Hide results in formats you did not enable** Hide a result whose title ends in a file extension that is not in Supported Book Formats, such as a .doc or .rtf file. Downloading it would only fail at post-processing. Titles without an extension, archives and audiobook searches are never hidden. - **Type:** boolean - **Default:** `true` #### `PROWLARR_USE_SEED_PREFERENCES` **Use Prowlarr seed preferences** Apply per-indexer seed time and ratio preferences from Prowlarr when sending torrents to the download client - **Type:** boolean - **Default:** `false` #### `PROWLARR_MAM_ID` **MAM Session ID** The mam_id value MyAnonamouse shows when you create a session. MAM locks each session to one IP or ASN, so reusing Prowlarr's or another client's session often fails with a 403: you will likely need a separate session for Shelfmark if it reaches MAM from another IP (different host, VPN or proxy) or the existing session is ASN-locked to another network. Leave empty to turn enrichment off. - **Type:** string (secret) - **Default:** _none_
## Jackett | Variable | Description | Type | Default | |----------|-------------|------|---------| | `JACKETT_ENABLED` | Enable searching for books via Jackett indexers | boolean | `false` | | `JACKETT_URL` | Base URL of your Jackett instance | string | _none_ | | `JACKETT_API_KEY` | Shown at the top right of the Jackett dashboard | string (secret) | _none_ | | `JACKETT_INDEXERS` | Select which indexers to search. Leave empty to search all configured indexers. | string (comma-separated) | _empty list_ | | `JACKETT_INDEXER_TIMEOUT` | How long to wait for Jackett to answer a search. Searching all indexers waits for the slowest one, and indexers behind FlareSolverr can need 90 seconds or more on a cold Cloudflare challenge. | number | `90` | | `JACKETT_EBOOK_MAX_SIZE_MB` | Hide ebook results larger than this. 0 shows everything, and a result with no reported size is always shown. Audiobook searches are not limited. | number | `0` | | `JACKETT_AUTO_EXPAND` | Automatically retry search without category filtering if no results are found | boolean | `false` | | `JACKETT_HIDE_UNSUPPORTED_FORMATS` | Hide a result whose title ends in a file extension that is not in Supported Book Formats, such as a .doc or .rtf file. Titles without an extension, archives and audiobook searches are never hidden. | boolean | `true` |
Detailed descriptions #### `JACKETT_ENABLED` **Enable Jackett source** Enable searching for books via Jackett indexers - **Type:** boolean - **Default:** `false` #### `JACKETT_URL` **Jackett URL** Base URL of your Jackett instance - **Type:** string - **Default:** _none_ - **Required:** Yes #### `JACKETT_API_KEY` **API Key** Shown at the top right of the Jackett dashboard - **Type:** string (secret) - **Default:** _none_ - **Required:** Yes #### `JACKETT_INDEXERS` **Indexers to Search** Select which indexers to search. Leave empty to search all configured indexers. - **Type:** string (comma-separated) - **Default:** _empty list_ #### `JACKETT_INDEXER_TIMEOUT` **Indexer Search Timeout (seconds)** How long to wait for Jackett to answer a search. Searching all indexers waits for the slowest one, and indexers behind FlareSolverr can need 90 seconds or more on a cold Cloudflare challenge. - **Type:** number - **Default:** `90` - **Constraints:** min: 5, max: 300 #### `JACKETT_EBOOK_MAX_SIZE_MB` **Maximum Ebook Size (MB)** Hide ebook results larger than this. 0 shows everything, and a result with no reported size is always shown. Audiobook searches are not limited. - **Type:** number - **Default:** `0` - **Constraints:** min: 0, max: 100000 #### `JACKETT_AUTO_EXPAND` **Auto-expand search on no results** Automatically retry search without category filtering if no results are found - **Type:** boolean - **Default:** `false` #### `JACKETT_HIDE_UNSUPPORTED_FORMATS` **Hide results in formats you did not enable** Hide a result whose title ends in a file extension that is not in Supported Book Formats, such as a .doc or .rtf file. Titles without an extension, archives and audiobook searches are never hidden. - **Type:** boolean - **Default:** `true`
## Newznab | Variable | Description | Type | Default | |----------|-------------|------|---------| | `NEWZNAB_ENABLED` | Enable searching for books via a Newznab-compatible indexer | boolean | `false` | | `NEWZNAB_INDEXERS` | Add each Newznab-compatible indexer separately. The configured name is shown beside every result from that indexer. | string | _empty list_ | | `NEWZNAB_URL` | Used only when the named indexer list is empty | string | _none_ | | `NEWZNAB_API_KEY` | Used only with the legacy Newznab URL | string (secret) | _none_ | | `NEWZNAB_EBOOK_CATEGORIES` | Newznab category IDs searched for ebooks. Most indexers use the standard 7000, but some use custom IDs. Leave empty to use 7000. | string (comma-separated) | `7000` | | `NEWZNAB_AUDIOBOOK_CATEGORIES` | Newznab category IDs searched for audiobooks. Most indexers use the standard 3030, but some use custom IDs. Leave empty to use 3030. | string (comma-separated) | `3030` | | `NEWZNAB_AUTO_EXPAND` | Automatically retry search without category filtering if no results are found | boolean | `false` |
Detailed descriptions #### `NEWZNAB_ENABLED` **Enable Newznab source** Enable searching for books via a Newznab-compatible indexer - **Type:** boolean - **Default:** `false` #### `NEWZNAB_INDEXERS` **Named Indexers** Add each Newznab-compatible indexer separately. The configured name is shown beside every result from that indexer. - **Type:** string - **Default:** _empty list_ #### `NEWZNAB_URL` **Legacy Newznab URL** Used only when the named indexer list is empty - **Type:** string - **Default:** _none_ #### `NEWZNAB_API_KEY` **Legacy API Key** Used only with the legacy Newznab URL - **Type:** string (secret) - **Default:** _none_ #### `NEWZNAB_EBOOK_CATEGORIES` **Ebook Categories** Newznab category IDs searched for ebooks. Most indexers use the standard 7000, but some use custom IDs. Leave empty to use 7000. - **Type:** string (comma-separated) - **Default:** `7000` #### `NEWZNAB_AUDIOBOOK_CATEGORIES` **Audiobook Categories** Newznab category IDs searched for audiobooks. Most indexers use the standard 3030, but some use custom IDs. Leave empty to use 3030. - **Type:** string (comma-separated) - **Default:** `3030` #### `NEWZNAB_AUTO_EXPAND` **Auto-expand search on no results** Automatically retry search without category filtering if no results are found - **Type:** boolean - **Default:** `false`
## Soulseek (slskd) | Variable | Description | Type | Default | |----------|-------------|------|---------| | `SLSKD_ENABLED` | Enable searching and downloading books through slskd | boolean | `false` | | `SLSKD_URL` | Base URL of the slskd web interface | string | _none_ | | `SLSKD_API_KEY` | An API key from slskd's configuration (web.authentication.api_keys) with the readwrite role | string (secret) | _none_ | | `SLSKD_DOWNLOAD_PATH` | Where slskd's completed downloads folder is mounted inside Shelfmark. Leave empty when both containers see it at the same path, or use Settings > Advanced > Remote Path Mappings with client 'slskd'. | string | _none_ | | `SLSKD_ISOLATE_DOWNLOADS` | Download into a folder of its own inside slskd's downloads folder (needs slskd 0.26 or newer). Other apps using the same slskd cannot mix files with it or lose track of it when they clear slskd's list of finished transfers, and Shelfmark confirms a download by the files on disk. | boolean | `true` | | `SLSKD_DESTINATION_PREFIX` | The folder, inside slskd's downloads folder, that holds one folder per download. It must not climb out of slskd's downloads folder. | string | `shelfmark` | | `SLSKD_KEEP_COMPLETED` | Leave the finished files (and their transfer records) in slskd after Shelfmark copies them to your library, so they stay shared with other Soulseek users. Turn off to delete them once imported. | boolean | `true` | | `SLSKD_SEARCH_TIMEOUT` | How long a Soulseek search collects peer responses. Longer waits find more peers but make every search slower. | number | `15` | | `SLSKD_RESPONSE_LIMIT` | Stop a search early once this many peers have answered | number | `100` | | `SLSKD_QUEUE_TIMEOUT_MINUTES` | Give up when the peer has not started sending within this long. Set to 0 to wait indefinitely. | number | `60` | | `SLSKD_CHAT_AUTOPROVE` | Some uploaders block downloads until you type a word in a private message ("please type 'download' in this chat"). Shelfmark replies with the word the message asks for, at most once per user every 12 hours, and logs each reply. It reads every unread private message in slskd, not only those from the peer of a running download, and marks a conversation it answered as read in slskd. Checked while a download is running. | boolean | `false` | | `SLSKD_REMOVE_COMPLETED` | Clear the transfer from slskd's download list after Shelfmark imports it. Applies when each download does not get its own folder. | boolean | `true` |
Detailed descriptions #### `SLSKD_ENABLED` **Enable Soulseek source** Enable searching and downloading books through slskd - **Type:** boolean - **Default:** `false` #### `SLSKD_URL` **slskd URL** Base URL of the slskd web interface - **Type:** string - **Default:** _none_ #### `SLSKD_API_KEY` **API Key** An API key from slskd's configuration (web.authentication.api_keys) with the readwrite role - **Type:** string (secret) - **Default:** _none_ #### `SLSKD_DOWNLOAD_PATH` **Downloads Path** Where slskd's completed downloads folder is mounted inside Shelfmark. Leave empty when both containers see it at the same path, or use Settings > Advanced > Remote Path Mappings with client 'slskd'. - **Type:** string - **Default:** _none_ #### `SLSKD_ISOLATE_DOWNLOADS` **Give each download its own folder** Download into a folder of its own inside slskd's downloads folder (needs slskd 0.26 or newer). Other apps using the same slskd cannot mix files with it or lose track of it when they clear slskd's list of finished transfers, and Shelfmark confirms a download by the files on disk. - **Type:** boolean - **Default:** `true` #### `SLSKD_DESTINATION_PREFIX` **Download Folder** The folder, inside slskd's downloads folder, that holds one folder per download. It must not climb out of slskd's downloads folder. - **Type:** string - **Default:** `shelfmark` #### `SLSKD_KEEP_COMPLETED` **Keep finished files in slskd** Leave the finished files (and their transfer records) in slskd after Shelfmark copies them to your library, so they stay shared with other Soulseek users. Turn off to delete them once imported. - **Type:** boolean - **Default:** `true` #### `SLSKD_SEARCH_TIMEOUT` **Search Wait (seconds)** How long a Soulseek search collects peer responses. Longer waits find more peers but make every search slower. - **Type:** number - **Default:** `15` - **Constraints:** min: 3, max: 120 #### `SLSKD_RESPONSE_LIMIT` **Max Peer Responses** Stop a search early once this many peers have answered - **Type:** number - **Default:** `100` - **Constraints:** min: 10, max: 1000 #### `SLSKD_QUEUE_TIMEOUT_MINUTES` **Queue Timeout (minutes)** Give up when the peer has not started sending within this long. Set to 0 to wait indefinitely. - **Type:** number - **Default:** `60` - **Constraints:** min: 0, max: 1440 #### `SLSKD_CHAT_AUTOPROVE` **Answer anti-leech chat challenges** Some uploaders block downloads until you type a word in a private message ("please type 'download' in this chat"). Shelfmark replies with the word the message asks for, at most once per user every 12 hours, and logs each reply. It reads every unread private message in slskd, not only those from the peer of a running download, and marks a conversation it answered as read in slskd. Checked while a download is running. - **Type:** boolean - **Default:** `false` #### `SLSKD_REMOVE_COMPLETED` **Remove completed transfers from slskd** Clear the transfer from slskd's download list after Shelfmark imports it. Applies when each download does not get its own folder. - **Type:** boolean - **Default:** `true`
## AudiobookBay | Variable | Description | Type | Default | |----------|-------------|------|---------| | `ABB_ENABLED` | Enable AudiobookBay as a release source for audiobooks. | boolean | `false` | | `ABB_HOSTNAME` | AudiobookBay domain (e.g., audiobookbay.lu, audiobookbay.is). Required to enable searches. | string | _empty string_ | | `ABB_PAGE_LIMIT` | Maximum number of search result pages to fetch (1-10). | number | `1` | | `ABB_EXACT_PHRASE` | Wrap generated queries in quotes for stricter matching. If no results are found, Shelfmark retries without quotes. | boolean | `false` | | `ABB_SEED_TIME_MINUTES` | How long a finished AudiobookBay torrent keeps seeding before the client stops it. 0 uses the torrent client's own limit. | number | `0` | | `ABB_SEED_RATIO` | Share ratio an AudiobookBay torrent should reach before the client stops it. 0 uses the torrent client's own limit. | number | `0.0` | | `ABB_RATE_LIMIT_DELAY` | Delay between requests in seconds to avoid rate limiting (0-10). | number | `1.0` |
Detailed descriptions #### `ABB_ENABLED` **Enable AudiobookBay** Enable AudiobookBay as a release source for audiobooks. - **Type:** boolean - **Default:** `false` #### `ABB_HOSTNAME` **Hostname** AudiobookBay domain (e.g., audiobookbay.lu, audiobookbay.is). Required to enable searches. - **Type:** string - **Default:** _empty string_ - **Required:** Yes #### `ABB_PAGE_LIMIT` **Max Pages to Search** Maximum number of search result pages to fetch (1-10). - **Type:** number - **Default:** `1` - **Constraints:** min: 1, max: 10 #### `ABB_EXACT_PHRASE` **Prefer Exact-Phrase Search** Wrap generated queries in quotes for stricter matching. If no results are found, Shelfmark retries without quotes. - **Type:** boolean - **Default:** `false` #### `ABB_SEED_TIME_MINUTES` **Seed Time (minutes)** How long a finished AudiobookBay torrent keeps seeding before the client stops it. 0 uses the torrent client's own limit. - **Type:** number - **Default:** `0` - **Constraints:** min: 0, max: 525600 #### `ABB_SEED_RATIO` **Seed Ratio** Share ratio an AudiobookBay torrent should reach before the client stops it. 0 uses the torrent client's own limit. - **Type:** number - **Default:** `0.0` - **Constraints:** min: 0.0, max: 100.0 #### `ABB_RATE_LIMIT_DELAY` **Rate Limit Delay (seconds)** Delay between requests in seconds to avoid rate limiting (0-10). - **Type:** number - **Default:** `1.0` - **Constraints:** min: 0.0, max: 10.0
## Libgen Search | Variable | Description | Type | Default | |----------|-------------|------|---------| | `LIBGEN_SEARCH_ENABLED` | Search the Libgen catalogue directly, including CBZ/CBR comics and manga that Anna's Archive does not index. Uses the Libgen mirrors configured under Mirrors for both search and download. | boolean | `false` | | `LIBGEN_SEARCH_MAX_RESULTS` | Maximum number of results to request per search (1-100). | number | `25` |
Detailed descriptions #### `LIBGEN_SEARCH_ENABLED` **Enable Libgen Search** Search the Libgen catalogue directly, including CBZ/CBR comics and manga that Anna's Archive does not index. Uses the Libgen mirrors configured under Mirrors for both search and download. - **Type:** boolean - **Default:** `false` #### `LIBGEN_SEARCH_MAX_RESULTS` **Max Results** Maximum number of results to request per search (1-100). - **Type:** number - **Default:** `25` - **Constraints:** min: 1, max: 100
## Webshare.cz | Variable | Description | Type | Default | |----------|-------------|------|---------| | `WEBSHARE_ENABLED` | Search Webshare.cz by file name and download matching ebooks and audiobooks. Requires a Webshare account; a VIP account is recommended for full download speed. | boolean | `false` | | `WEBSHARE_USERNAME` | Your Webshare.cz login. | string | _none_ | | `WEBSHARE_PASSWORD` | Your Webshare.cz password. | string (secret) | _none_ | | `WEBSHARE_MAX_RESULTS` | Maximum number of files to request per search (1-200). Results are then filtered to your supported ebook or audiobook formats. | number | `50` |
Detailed descriptions #### `WEBSHARE_ENABLED` **Enable Webshare.cz** Search Webshare.cz by file name and download matching ebooks and audiobooks. Requires a Webshare account; a VIP account is recommended for full download speed. - **Type:** boolean - **Default:** `false` #### `WEBSHARE_USERNAME` **Username or Email** Your Webshare.cz login. - **Type:** string - **Default:** _none_ - **Required:** Yes #### `WEBSHARE_PASSWORD` **Password** Your Webshare.cz password. - **Type:** string (secret) - **Default:** _none_ - **Required:** Yes #### `WEBSHARE_MAX_RESULTS` **Max Results** Maximum number of files to request per search (1-200). Results are then filtered to your supported ebook or audiobook formats. - **Type:** number - **Default:** `50` - **Constraints:** min: 1, max: 200
## IRC | Variable | Description | Type | Default | |----------|-------------|------|---------| | `IRC_SERVER` | IRC server hostname | string | _none_ | | `IRC_PORT` | IRC server port (usually 6697 for TLS, 6667 for plain) | number | `6697` | | `IRC_USE_TLS` | Enable TLS/SSL encryption for the IRC connection. Disable for servers that don't support TLS. | boolean | `true` | | `IRC_CHANNEL` | Channel name without the # prefix. Used for all searches unless a separate audiobook channel is configured below. | string | _none_ | | `IRC_NICK` | Your IRC nickname (required). Must be unique on the IRC network. | string | _none_ | | `IRC_SEARCH_BOT` | The search bot to address queries to (required). Searches are sent as "@ ". | string | _none_ | | `IRC_AUDIOBOOK_CHANNEL` | Optional. Channel name (without the # prefix) for networks that index audiobooks separately, such as Undernet's bookz. Leave blank (the usual setting) to search the main channel above for audiobooks too. | string | _none_ | | `IRC_AUDIOBOOK_SEARCH_BOT` | Optional. Search bot for the audiobook channel. Leave blank to reuse the main search bot above. Only used when an audiobook channel is set. | string | _none_ | | `IRC_CACHE_TTL` | How long to keep cached search results before they expire. | string (choice) | `2592000` |
Detailed descriptions #### `IRC_SERVER` **Server** IRC server hostname - **Type:** string - **Default:** _none_ - **Required:** Yes #### `IRC_PORT` **Port** IRC server port (usually 6697 for TLS, 6667 for plain) - **Type:** number - **Default:** `6697` #### `IRC_USE_TLS` **Use TLS** Enable TLS/SSL encryption for the IRC connection. Disable for servers that don't support TLS. - **Type:** boolean - **Default:** `true` #### `IRC_CHANNEL` **Channel** Channel name without the # prefix. Used for all searches unless a separate audiobook channel is configured below. - **Type:** string - **Default:** _none_ - **Required:** Yes #### `IRC_NICK` **Nickname** Your IRC nickname (required). Must be unique on the IRC network. - **Type:** string - **Default:** _none_ - **Required:** Yes #### `IRC_SEARCH_BOT` **Search bot** The search bot to address queries to (required). Searches are sent as "@ ". - **Type:** string - **Default:** _none_ - **Required:** Yes #### `IRC_AUDIOBOOK_CHANNEL` **Audiobook channel** Optional. Channel name (without the # prefix) for networks that index audiobooks separately, such as Undernet's bookz. Leave blank (the usual setting) to search the main channel above for audiobooks too. - **Type:** string - **Default:** _none_ #### `IRC_AUDIOBOOK_SEARCH_BOT` **Audiobook search bot** Optional. Search bot for the audiobook channel. Leave blank to reuse the main search bot above. Only used when an audiobook channel is set. - **Type:** string - **Default:** _none_ #### `IRC_CACHE_TTL` **Cache Duration** How long to keep cached search results before they expire. - **Type:** string (choice) - **Default:** `2592000` - **Options:** `2592000` (30 days), `0` (Forever (until manually cleared))
## Download Clients | Variable | Description | Type | Default | |----------|-------------|------|---------| | `PROWLARR_TORRENT_CLIENT` | Choose which torrent client to use | string (choice) | _empty string_ | | `BLACKHOLE_DIRECTORY` | Directory where Shelfmark saves .torrent files for another downloader | string | _none_ | | `ALLDEBRID_API_KEY` | AllDebrid API Key (apiv4) from your AllDebrid account settings | string (secret) | _none_ | | `DEBRIDLINK_API_KEY` | Debrid-Link API Key from your Debrid-Link account settings | string (secret) | _none_ | | `REALDEBRID_API_KEY` | Real-Debrid API Key (Secret Token) from your Real-Debrid account settings | string (secret) | _none_ | | `TORBOX_API_KEY` | TorBox API Key from your TorBox account settings | string (secret) | _none_ | | `QBITTORRENT_URL` | Web UI URL of your qBittorrent instance | string | _none_ | | `QBITTORRENT_USERNAME` | qBittorrent Web UI username | string | _none_ | | `QBITTORRENT_PASSWORD` | qBittorrent Web UI password | string (secret) | _none_ | | `QBITTORRENT_API_KEY` | Found in qBittorrent: Options > Web UI > API Key (qBittorrent 5.2.0+). Used instead of the username and password when set. | string (secret) | _none_ | | `QBITTORRENT_CATEGORY` | Category to assign to book downloads in qBittorrent | string | `books` | | `QBITTORRENT_CATEGORY_AUDIOBOOK` | Category for audiobook downloads. Leave empty to use the book category. | string | _empty string_ | | `QBITTORRENT_SEPARATE_DOWNLOAD_DIRS` | Download books and audiobooks to different directories instead of one shared directory. | boolean | `false` | | `QBITTORRENT_DOWNLOAD_DIR` | Server-side directory where torrents are downloaded (optional, uses qBittorrent default if not specified) | string | _none_ | | `QBITTORRENT_DOWNLOAD_DIR_BOOK` | Server-side directory where book torrents are downloaded (optional, uses qBittorrent default if not specified) | string | _none_ | | `QBITTORRENT_DOWNLOAD_DIR_AUDIOBOOK` | Server-side directory where audiobook torrents are downloaded (optional, uses qBittorrent default if not specified) | string | _none_ | | `QBITTORRENT_TAG` | Tag(s) to assign to qBittorrent downloads. Leave empty for no tags. | string (comma-separated) | _empty list_ | | `TRANSMISSION_URL` | URL of your Transmission instance (use https:// for TLS). Without a port, https uses 443 and http uses 9091, so add :9091 to an https URL served on 9091 | string | _none_ | | `TRANSMISSION_USERNAME` | Transmission RPC username (if authentication enabled) | string | _none_ | | `TRANSMISSION_PASSWORD` | Transmission RPC password | string (secret) | _none_ | | `TRANSMISSION_CATEGORY` | Label to assign to book downloads in Transmission | string | `books` | | `TRANSMISSION_CATEGORY_AUDIOBOOK` | Label for audiobook downloads. Leave empty to use the book label. | string | _empty string_ | | `TRANSMISSION_SEPARATE_DOWNLOAD_DIRS` | Download books and audiobooks to different directories instead of one shared directory. | boolean | `false` | | `TRANSMISSION_DOWNLOAD_DIR` | Server-side directory where torrents are downloaded (optional, uses Transmission default if not specified) | string | _none_ | | `TRANSMISSION_DOWNLOAD_DIR_BOOK` | Server-side directory where book torrents are downloaded (optional, uses Transmission default if not specified) | string | _none_ | | `TRANSMISSION_DOWNLOAD_DIR_AUDIOBOOK` | Server-side directory where audiobook torrents are downloaded (optional, uses Transmission default if not specified) | string | _none_ | | `DELUGE_HOST` | Hostname/IP or full URL of your Deluge Web UI (deluge-web) | string | `localhost` | | `DELUGE_PORT` | Deluge Web UI port (default: 8112) | string | `8112` | | `DELUGE_PASSWORD` | Deluge Web UI password (default: deluge) | string (secret) | _none_ | | `DELUGE_CATEGORY` | Label to assign to book downloads in Deluge | string | `books` | | `DELUGE_CATEGORY_AUDIOBOOK` | Label for audiobook downloads. Leave empty to use the book label. | string | _empty string_ | | `DELUGE_SEPARATE_DOWNLOAD_DIRS` | Download books and audiobooks to different directories instead of one shared directory. | boolean | `false` | | `DELUGE_DOWNLOAD_DIR` | Server-side directory where torrents are downloaded (optional, uses Deluge default if not specified) | string | _none_ | | `DELUGE_DOWNLOAD_DIR_BOOK` | Server-side directory where book torrents are downloaded (optional, uses Deluge default if not specified) | string | _none_ | | `DELUGE_DOWNLOAD_DIR_AUDIOBOOK` | Server-side directory where audiobook torrents are downloaded (optional, uses Deluge default if not specified) | string | _none_ | | `RTORRENT_URL` | XML-RPC URL of your rTorrent instance | string | _none_ | | `RTORRENT_USERNAME` | HTTP Basic auth username (if authentication enabled) | string | _none_ | | `RTORRENT_PASSWORD` | HTTP Basic auth password | string (secret) | _none_ | | `RTORRENT_LABEL` | Label to assign to ebook downloads in rTorrent | string | `cwabd` | | `RTORRENT_AUDIOBOOK_LABEL` | Label to assign to audiobook downloads in rTorrent (falls back to Book Label if not set) | string | _none_ | | `RTORRENT_SEPARATE_DOWNLOAD_DIRS` | Download books and audiobooks to different directories instead of one shared directory. | boolean | `false` | | `RTORRENT_DOWNLOAD_DIR` | Server-side directory where torrents are downloaded (optional, uses rTorrent default if not specified) | string | _none_ | | `RTORRENT_DOWNLOAD_DIR_BOOK` | Server-side directory where book torrents are downloaded (optional, uses rTorrent default if not specified) | string | _none_ | | `RTORRENT_DOWNLOAD_DIR_AUDIOBOOK` | Server-side directory where audiobook torrents are downloaded (optional, uses rTorrent default if not specified) | string | _none_ | | `PROWLARR_TORRENT_ACTION` | After a successful import, Remove keeps downloaded files in qBittorrent, Transmission, and Deluge; Remove & Delete Files also deletes them. rTorrent cannot delete download data, so this action leaves its torrent untouched. Blackhole does not support removal. Debrid clients delete temporary local files for either Remove action. | string (choice) | `keep` | | `TORRENT_NO_SEEDERS_WAIT` | Give up on a torrent when its client sees no seed at all for this long, even while it is still downloading, or fewer seeds than the minimum below while nothing is downloading. The torrent is removed and the download marked failed, so another release can be tried. The card shows the seed count and a countdown while it waits. 0 keeps the default behaviour (only the stall timer ends it). Only qBittorrent reports seed counts. | number | `0` | | `TORRENT_MIN_SEEDERS` | Seeds the client must see for a motionless torrent to keep waiting. 0 also turns the no-seed check off. Only qBittorrent reports seed counts. | number | `1` | | `PROWLARR_TORRENT_POST_IMPORT_CATEGORY` | Category or label to assign after a successful import | string | _empty string_ | | `TORRENT_STALL_TIMEOUT_MINUTES` | How long a torrent can go without any progress before Shelfmark cancels it. Applies from when the torrent starts and restarts each time it moves. Raise it for slow swarms or magnets that take a while to find peers, or lower it to give up on dead torrents sooner. | number | `15` | | `PROWLARR_USENET_CLIENT` | Choose which usenet client to use | string (choice) | _empty string_ | | `NZBGET_URL` | URL of your NZBGet instance | string | _none_ | | `NZBGET_USERNAME` | NZBGet control username | string | `nzbget` | | `NZBGET_PASSWORD` | NZBGet control password | string (secret) | _none_ | | `NZBGET_CATEGORY` | Category to assign to book downloads in NZBGet | string | `Books` | | `NZBGET_CATEGORY_AUDIOBOOK` | Category for audiobook downloads. Leave empty to use the book category. | string | _empty string_ | | `SABNZBD_URL` | URL of your SABnzbd instance | string | _none_ | | `SABNZBD_API_KEY` | Found in SABnzbd: Config > General > API Key | string (secret) | _none_ | | `SABNZBD_CATEGORY` | Category to assign to book downloads in SABnzbd | string | `books` | | `SABNZBD_CATEGORY_AUDIOBOOK` | Category for audiobook downloads. Leave empty to use the book category. | string | _empty string_ | | `PROWLARR_USENET_ACTION` | Move deletes the job from your usenet client after import; Copy keeps it in the client | string (choice) | `move` |
Detailed descriptions #### `PROWLARR_TORRENT_CLIENT` **Torrent Client** Choose which torrent client to use - **Type:** string (choice) - **Default:** _empty string_ - **Options:** `""` (None), `alldebrid` (AllDebrid), `blackhole` (Blackhole), `debridlink` (Debrid-Link), `qbittorrent` (qBittorrent), `realdebrid` (Real-Debrid), `torbox` (TorBox), `transmission` (Transmission), `deluge` (Deluge), `rtorrent` (rTorrent) #### `BLACKHOLE_DIRECTORY` **Blackhole Directory** Directory where Shelfmark saves .torrent files for another downloader - **Type:** string - **Default:** _none_ #### `ALLDEBRID_API_KEY` **API Key** AllDebrid API Key (apiv4) from your AllDebrid account settings - **Type:** string (secret) - **Default:** _none_ #### `DEBRIDLINK_API_KEY` **API Key** Debrid-Link API Key from your Debrid-Link account settings - **Type:** string (secret) - **Default:** _none_ #### `REALDEBRID_API_KEY` **API Key** Real-Debrid API Key (Secret Token) from your Real-Debrid account settings - **Type:** string (secret) - **Default:** _none_ #### `TORBOX_API_KEY` **API Key** TorBox API Key from your TorBox account settings - **Type:** string (secret) - **Default:** _none_ #### `QBITTORRENT_URL` **qBittorrent URL** Web UI URL of your qBittorrent instance - **Type:** string - **Default:** _none_ #### `QBITTORRENT_USERNAME` **Username** qBittorrent Web UI username - **Type:** string - **Default:** _none_ #### `QBITTORRENT_PASSWORD` **Password** qBittorrent Web UI password - **Type:** string (secret) - **Default:** _none_ #### `QBITTORRENT_API_KEY` **API Key** Found in qBittorrent: Options > Web UI > API Key (qBittorrent 5.2.0+). Used instead of the username and password when set. - **Type:** string (secret) - **Default:** _none_ #### `QBITTORRENT_CATEGORY` **Book Category** Category to assign to book downloads in qBittorrent - **Type:** string - **Default:** `books` #### `QBITTORRENT_CATEGORY_AUDIOBOOK` **Audiobook Category** Category for audiobook downloads. Leave empty to use the book category. - **Type:** string - **Default:** _empty string_ #### `QBITTORRENT_SEPARATE_DOWNLOAD_DIRS` **Separate Book and Audiobook Directories** Download books and audiobooks to different directories instead of one shared directory. - **Type:** boolean - **Default:** `false` #### `QBITTORRENT_DOWNLOAD_DIR` **Download Directory** Server-side directory where torrents are downloaded (optional, uses qBittorrent default if not specified) - **Type:** string - **Default:** _none_ #### `QBITTORRENT_DOWNLOAD_DIR_BOOK` **Book Download Directory** Server-side directory where book torrents are downloaded (optional, uses qBittorrent default if not specified) - **Type:** string - **Default:** _none_ #### `QBITTORRENT_DOWNLOAD_DIR_AUDIOBOOK` **Audiobook Download Directory** Server-side directory where audiobook torrents are downloaded (optional, uses qBittorrent default if not specified) - **Type:** string - **Default:** _none_ #### `QBITTORRENT_TAG` **Tags** Tag(s) to assign to qBittorrent downloads. Leave empty for no tags. - **Type:** string (comma-separated) - **Default:** _empty list_ #### `TRANSMISSION_URL` **Transmission URL** URL of your Transmission instance (use https:// for TLS). Without a port, https uses 443 and http uses 9091, so add :9091 to an https URL served on 9091 - **Type:** string - **Default:** _none_ #### `TRANSMISSION_USERNAME` **Username** Transmission RPC username (if authentication enabled) - **Type:** string - **Default:** _none_ #### `TRANSMISSION_PASSWORD` **Password** Transmission RPC password - **Type:** string (secret) - **Default:** _none_ #### `TRANSMISSION_CATEGORY` **Book Label** Label to assign to book downloads in Transmission - **Type:** string - **Default:** `books` #### `TRANSMISSION_CATEGORY_AUDIOBOOK` **Audiobook Label** Label for audiobook downloads. Leave empty to use the book label. - **Type:** string - **Default:** _empty string_ #### `TRANSMISSION_SEPARATE_DOWNLOAD_DIRS` **Separate Book and Audiobook Directories** Download books and audiobooks to different directories instead of one shared directory. - **Type:** boolean - **Default:** `false` #### `TRANSMISSION_DOWNLOAD_DIR` **Download Directory** Server-side directory where torrents are downloaded (optional, uses Transmission default if not specified) - **Type:** string - **Default:** _none_ #### `TRANSMISSION_DOWNLOAD_DIR_BOOK` **Book Download Directory** Server-side directory where book torrents are downloaded (optional, uses Transmission default if not specified) - **Type:** string - **Default:** _none_ #### `TRANSMISSION_DOWNLOAD_DIR_AUDIOBOOK` **Audiobook Download Directory** Server-side directory where audiobook torrents are downloaded (optional, uses Transmission default if not specified) - **Type:** string - **Default:** _none_ #### `DELUGE_HOST` **Deluge Web UI Host/URL** Hostname/IP or full URL of your Deluge Web UI (deluge-web) - **Type:** string - **Default:** `localhost` #### `DELUGE_PORT` **Deluge Web UI Port** Deluge Web UI port (default: 8112) - **Type:** string - **Default:** `8112` #### `DELUGE_PASSWORD` **Password** Deluge Web UI password (default: deluge) - **Type:** string (secret) - **Default:** _none_ #### `DELUGE_CATEGORY` **Book Label** Label to assign to book downloads in Deluge - **Type:** string - **Default:** `books` #### `DELUGE_CATEGORY_AUDIOBOOK` **Audiobook Label** Label for audiobook downloads. Leave empty to use the book label. - **Type:** string - **Default:** _empty string_ #### `DELUGE_SEPARATE_DOWNLOAD_DIRS` **Separate Book and Audiobook Directories** Download books and audiobooks to different directories instead of one shared directory. - **Type:** boolean - **Default:** `false` #### `DELUGE_DOWNLOAD_DIR` **Download Directory** Server-side directory where torrents are downloaded (optional, uses Deluge default if not specified) - **Type:** string - **Default:** _none_ #### `DELUGE_DOWNLOAD_DIR_BOOK` **Book Download Directory** Server-side directory where book torrents are downloaded (optional, uses Deluge default if not specified) - **Type:** string - **Default:** _none_ #### `DELUGE_DOWNLOAD_DIR_AUDIOBOOK` **Audiobook Download Directory** Server-side directory where audiobook torrents are downloaded (optional, uses Deluge default if not specified) - **Type:** string - **Default:** _none_ #### `RTORRENT_URL` **rTorrent URL** XML-RPC URL of your rTorrent instance - **Type:** string - **Default:** _none_ #### `RTORRENT_USERNAME` **Username** HTTP Basic auth username (if authentication enabled) - **Type:** string - **Default:** _none_ #### `RTORRENT_PASSWORD` **Password** HTTP Basic auth password - **Type:** string (secret) - **Default:** _none_ #### `RTORRENT_LABEL` **Book Label** Label to assign to ebook downloads in rTorrent - **Type:** string - **Default:** `cwabd` #### `RTORRENT_AUDIOBOOK_LABEL` **Audiobook Label** Label to assign to audiobook downloads in rTorrent (falls back to Book Label if not set) - **Type:** string - **Default:** _none_ #### `RTORRENT_SEPARATE_DOWNLOAD_DIRS` **Separate Book and Audiobook Directories** Download books and audiobooks to different directories instead of one shared directory. - **Type:** boolean - **Default:** `false` #### `RTORRENT_DOWNLOAD_DIR` **Download Directory** Server-side directory where torrents are downloaded (optional, uses rTorrent default if not specified) - **Type:** string - **Default:** _none_ #### `RTORRENT_DOWNLOAD_DIR_BOOK` **Book Download Directory** Server-side directory where book torrents are downloaded (optional, uses rTorrent default if not specified) - **Type:** string - **Default:** _none_ #### `RTORRENT_DOWNLOAD_DIR_AUDIOBOOK` **Audiobook Download Directory** Server-side directory where audiobook torrents are downloaded (optional, uses rTorrent default if not specified) - **Type:** string - **Default:** _none_ #### `PROWLARR_TORRENT_ACTION` **Torrent Completion Action** After a successful import, Remove keeps downloaded files in qBittorrent, Transmission, and Deluge; Remove & Delete Files also deletes them. rTorrent cannot delete download data, so this action leaves its torrent untouched. Blackhole does not support removal. Debrid clients delete temporary local files for either Remove action. - **Type:** string (choice) - **Default:** `keep` - **Options:** `keep` (Keep), `remove` (Remove), `remove_and_delete` (Remove & Delete Files), `change_category` (Change Category) #### `TORRENT_NO_SEEDERS_WAIT` **Give Up With No Seeders (minutes)** Give up on a torrent when its client sees no seed at all for this long, even while it is still downloading, or fewer seeds than the minimum below while nothing is downloading. The torrent is removed and the download marked failed, so another release can be tried. The card shows the seed count and a countdown while it waits. 0 keeps the default behaviour (only the stall timer ends it). Only qBittorrent reports seed counts. - **Type:** number - **Default:** `0` - **Constraints:** min: 0, max: 240 #### `TORRENT_MIN_SEEDERS` **Minimum Seeders** Seeds the client must see for a motionless torrent to keep waiting. 0 also turns the no-seed check off. Only qBittorrent reports seed counts. - **Type:** number - **Default:** `1` - **Constraints:** min: 0, max: 1000 #### `PROWLARR_TORRENT_POST_IMPORT_CATEGORY` **Post-Import Category** Category or label to assign after a successful import - **Type:** string - **Default:** _empty string_ #### `TORRENT_STALL_TIMEOUT_MINUTES` **Stall Timeout (minutes)** How long a torrent can go without any progress before Shelfmark cancels it. Applies from when the torrent starts and restarts each time it moves. Raise it for slow swarms or magnets that take a while to find peers, or lower it to give up on dead torrents sooner. - **Type:** number - **Default:** `15` - **Constraints:** min: 5, max: 60 #### `PROWLARR_USENET_CLIENT` **Usenet Client** Choose which usenet client to use - **Type:** string (choice) - **Default:** _empty string_ - **Options:** `""` (None), `nzbget` (NZBGet), `sabnzbd` (SABnzbd) #### `NZBGET_URL` **NZBGet URL** URL of your NZBGet instance - **Type:** string - **Default:** _none_ #### `NZBGET_USERNAME` **Username** NZBGet control username - **Type:** string - **Default:** `nzbget` #### `NZBGET_PASSWORD` **Password** NZBGet control password - **Type:** string (secret) - **Default:** _none_ #### `NZBGET_CATEGORY` **Book Category** Category to assign to book downloads in NZBGet - **Type:** string - **Default:** `Books` #### `NZBGET_CATEGORY_AUDIOBOOK` **Audiobook Category** Category for audiobook downloads. Leave empty to use the book category. - **Type:** string - **Default:** _empty string_ #### `SABNZBD_URL` **SABnzbd URL** URL of your SABnzbd instance - **Type:** string - **Default:** _none_ #### `SABNZBD_API_KEY` **API Key** Found in SABnzbd: Config > General > API Key - **Type:** string (secret) - **Default:** _none_ #### `SABNZBD_CATEGORY` **Book Category** Category to assign to book downloads in SABnzbd - **Type:** string - **Default:** `books` #### `SABNZBD_CATEGORY_AUDIOBOOK` **Audiobook Category** Category for audiobook downloads. Leave empty to use the book category. - **Type:** string - **Default:** _empty string_ #### `PROWLARR_USENET_ACTION` **NZB Completion Action** Move deletes the job from your usenet client after import; Copy keeps it in the client - **Type:** string (choice) - **Default:** `move` - **Options:** `move` (Move), `copy` (Copy)
## Metadata Providers ### Metadata Providers: Hardcover | Variable | Description | Type | Default | |----------|-------------|------|---------| | `HARDCOVER_ENABLED` | Enable Hardcover as a metadata provider for book searches | boolean | `false` | | `HARDCOVER_API_KEY` | Get your API key from hardcover.app/account/api (starts with hc_pat_) | string (secret) | _none_ | | `HARDCOVER_DEFAULT_SORT` | Default sort order for Hardcover search results. | string (choice) | `relevance` | | `HARDCOVER_EXCLUDE_COMPILATIONS` | Filter out compilations, anthologies, and omnibus editions from search results | boolean | `false` | | `HARDCOVER_EXCLUDE_UNRELEASED` | Filter out books with a release year in the future | boolean | `false` | | `HARDCOVER_AUTO_REMOVE_ON_DOWNLOAD` | Automatically remove a book from the active Hardcover list when you download it | boolean | `true` |
Detailed descriptions #### `HARDCOVER_ENABLED` **Enable Hardcover** Enable Hardcover as a metadata provider for book searches - **Type:** boolean - **Default:** `false` #### `HARDCOVER_API_KEY` **API Key** Get your API key from hardcover.app/account/api (starts with hc_pat_) - **Type:** string (secret) - **Default:** _none_ - **Required:** Yes #### `HARDCOVER_DEFAULT_SORT` **Default Sort Order** Default sort order for Hardcover search results. - **Type:** string (choice) - **Default:** `relevance` - **Options:** `relevance` (Most relevant), `popularity` (Most popular), `rating` (Highest rated), `newest` (Newest), `oldest` (Oldest) #### `HARDCOVER_EXCLUDE_COMPILATIONS` **Exclude Compilations** Filter out compilations, anthologies, and omnibus editions from search results - **Type:** boolean - **Default:** `false` #### `HARDCOVER_EXCLUDE_UNRELEASED` **Exclude Unreleased Books** Filter out books with a release year in the future - **Type:** boolean - **Default:** `false` #### `HARDCOVER_AUTO_REMOVE_ON_DOWNLOAD` **Auto-Remove from List on Download** Automatically remove a book from the active Hardcover list when you download it - **Type:** boolean - **Default:** `true`
### Metadata Providers: Open Library | Variable | Description | Type | Default | |----------|-------------|------|---------| | `OPENLIBRARY_ENABLED` | Enable Open Library as a metadata provider for book searches | boolean | `false` | | `OPENLIBRARY_DEFAULT_SORT` | Default sort order for Open Library search results. | string (choice) | `relevance` |
Detailed descriptions #### `OPENLIBRARY_ENABLED` **Enable Open Library** Enable Open Library as a metadata provider for book searches - **Type:** boolean - **Default:** `false` #### `OPENLIBRARY_DEFAULT_SORT` **Default Sort Order** Default sort order for Open Library search results. - **Type:** string (choice) - **Default:** `relevance` - **Options:** `relevance` (Most relevant), `newest` (Newest), `oldest` (Oldest)
### Metadata Providers: Google Books | Variable | Description | Type | Default | |----------|-------------|------|---------| | `GOOGLEBOOKS_ENABLED` | Enable Google Books as a metadata provider for book searches | boolean | `false` | | `GOOGLEBOOKS_API_KEY` | Get your API key from Google Cloud Console (APIs & Services > Credentials) | string (secret) | _none_ | | `GOOGLEBOOKS_DEFAULT_SORT` | Default sort order for Google Books search results. | string (choice) | `relevance` |
Detailed descriptions #### `GOOGLEBOOKS_ENABLED` **Enable Google Books** Enable Google Books as a metadata provider for book searches - **Type:** boolean - **Default:** `false` #### `GOOGLEBOOKS_API_KEY` **API Key** Get your API key from Google Cloud Console (APIs & Services > Credentials) - **Type:** string (secret) - **Default:** _none_ - **Required:** Yes #### `GOOGLEBOOKS_DEFAULT_SORT` **Default Sort Order** Default sort order for Google Books search results. - **Type:** string (choice) - **Default:** `relevance` - **Options:** `relevance` (Most relevant), `newest` (Newest)
### Metadata Providers: Moly.hu | Variable | Description | Type | Default | |----------|-------------|------|---------| | `MOLY_ENABLED` | Enable Moly.hu as a metadata provider for book searches | boolean | `false` |
Detailed descriptions #### `MOLY_ENABLED` **Enable Moly.hu** Enable Moly.hu as a metadata provider for book searches - **Type:** boolean - **Default:** `false`
### Metadata Providers: Databáze knih | Variable | Description | Type | Default | |----------|-------------|------|---------| | `DATABAZEKNIH_ENABLED` | Enable Databáze knih as a metadata provider for book searches | boolean | `false` |
Detailed descriptions #### `DATABAZEKNIH_ENABLED` **Enable Databáze knih** Enable Databáze knih as a metadata provider for book searches - **Type:** boolean - **Default:** `false`
### Metadata Providers: DNB | Variable | Description | Type | Default | |----------|-------------|------|---------| | `DNB_ENABLED` | Enable DNB as a metadata provider for book searches | boolean | `false` | | `DNB_DEFAULT_SORT` | Default sort order for DNB search results. | string (choice) | `relevance` | | `DNB_USE_BOOK_LANGUAGES` | Filter DNB results by Default Book Languages: each user's own setting, else the system default. DNB also catalogs translations into many other languages. | boolean | `true` |
Detailed descriptions #### `DNB_ENABLED` **Enable DNB** Enable DNB as a metadata provider for book searches - **Type:** boolean - **Default:** `false` #### `DNB_DEFAULT_SORT` **Default Sort Order** Default sort order for DNB search results. - **Type:** string (choice) - **Default:** `relevance` - **Options:** `relevance` (Most relevant), `newest` (Newest), `oldest` (Oldest) #### `DNB_USE_BOOK_LANGUAGES` **Only show editions in my book languages** Filter DNB results by Default Book Languages: each user's own setting, else the system default. DNB also catalogs translations into many other languages. - **Type:** boolean - **Default:** `true`
## Direct Download ### Direct Download: Download Sources | Variable | Description | Type | Default | |----------|-------------|------|---------| | `DIRECT_DOWNLOAD_ENABLED` | Show Direct Download in release-source lists and allow Direct mode searches. Add your own mirror URLs in the Mirrors tab before using it. | boolean | `false` | | `DIRECT_DOWNLOAD_LANGUAGE_FROM_PATH` | When language metadata is missing or unknown, parse the distant path (file path shown in search results) for language tags like [BD FR] or [En]. Also enables local language filtering so lgli files without AA language metadata are not excluded before the distant path can be checked. | boolean | `false` | | `AA_DONATOR_KEY` | Enables fast download access on AA. Get this from your donator account page. | string (secret) | _none_ | | `FAST_SOURCES_DISPLAY` | Always tried first, no waiting or bypass required. | JSON array | _see UI for defaults_ | | `SOURCE_PRIORITY` | Fallback sources, may have waiting. Requires bypasser. Drag to reorder. | JSON array | _see UI for defaults_ | | `MAX_RETRY` | Maximum retry attempts for failed downloads. | number | `10` | | `DEFAULT_SLEEP` | Wait time between download retry attempts. | number | `5` | | `RELEASE_SEARCH_TIMEOUT` | How long one release search may run before it gives up and reports why. A first search on a cold start pays for a browser solve, so leave room for one. If you use a reverse proxy, its read timeout should be at least this high or it will cut the search off with a 504 first. | number | `300` | | `AA_CONTENT_TYPE_ROUTING` | Override destination based on content type metadata. | boolean | `false` | | `AA_CONTENT_TYPE_DIR_FICTION` | Fiction Books | string | _none_ | | `AA_CONTENT_TYPE_DIR_NON_FICTION` | Non-Fiction Books | string | _none_ | | `AA_CONTENT_TYPE_DIR_UNKNOWN` | Unknown Books | string | _none_ | | `AA_CONTENT_TYPE_DIR_MAGAZINE` | Magazines | string | _none_ | | `AA_CONTENT_TYPE_DIR_COMIC` | Comic Books | string | _none_ | | `AA_CONTENT_TYPE_DIR_STANDARDS` | Standards Documents | string | _none_ | | `AA_CONTENT_TYPE_DIR_MUSICAL_SCORE` | Musical Scores | string | _none_ | | `AA_CONTENT_TYPE_DIR_OTHER` | Other | string | _none_ |
Detailed descriptions #### `DIRECT_DOWNLOAD_ENABLED` **Enable Direct Download Source** Show Direct Download in release-source lists and allow Direct mode searches. Add your own mirror URLs in the Mirrors tab before using it. - **Type:** boolean - **Default:** `false` #### `DIRECT_DOWNLOAD_LANGUAGE_FROM_PATH` **Detect Language From Distant Path** When language metadata is missing or unknown, parse the distant path (file path shown in search results) for language tags like [BD FR] or [En]. Also enables local language filtering so lgli files without AA language metadata are not excluded before the distant path can be checked. - **Type:** boolean - **Default:** `false` #### `AA_DONATOR_KEY` **Account Donator Key** Enables fast download access on AA. Get this from your donator account page. - **Type:** string (secret) - **Default:** _none_ #### `FAST_SOURCES_DISPLAY` **Fast downloads** Always tried first, no waiting or bypass required. - **Type:** JSON array - **Default:** _see UI for defaults_ #### `SOURCE_PRIORITY` **Slow downloads** Fallback sources, may have waiting. Requires bypasser. Drag to reorder. - **Type:** JSON array - **Default:** _see UI for defaults_ #### `MAX_RETRY` **Max Retries** Maximum retry attempts for failed downloads. - **Type:** number - **Default:** `10` - **Constraints:** min: 1, max: 50 #### `DEFAULT_SLEEP` **Retry Delay (seconds)** Wait time between download retry attempts. - **Type:** number - **Default:** `5` - **Constraints:** min: 1, max: 60 #### `RELEASE_SEARCH_TIMEOUT` **Release Search Timeout (seconds)** How long one release search may run before it gives up and reports why. A first search on a cold start pays for a browser solve, so leave room for one. If you use a reverse proxy, its read timeout should be at least this high or it will cut the search off with a 504 first. - **Type:** number - **Default:** `300` - **Constraints:** min: 30, max: 1800 #### `AA_CONTENT_TYPE_ROUTING` **Enable Content-Type Routing** Override destination based on content type metadata. - **Type:** boolean - **Default:** `false` #### `AA_CONTENT_TYPE_DIR_FICTION` **Fiction Books** - **Type:** string - **Default:** _none_ #### `AA_CONTENT_TYPE_DIR_NON_FICTION` **Non-Fiction Books** - **Type:** string - **Default:** _none_ #### `AA_CONTENT_TYPE_DIR_UNKNOWN` **Unknown Books** - **Type:** string - **Default:** _none_ #### `AA_CONTENT_TYPE_DIR_MAGAZINE` **Magazines** - **Type:** string - **Default:** _none_ #### `AA_CONTENT_TYPE_DIR_COMIC` **Comic Books** - **Type:** string - **Default:** _none_ #### `AA_CONTENT_TYPE_DIR_STANDARDS` **Standards Documents** - **Type:** string - **Default:** _none_ #### `AA_CONTENT_TYPE_DIR_MUSICAL_SCORE` **Musical Scores** - **Type:** string - **Default:** _none_ #### `AA_CONTENT_TYPE_DIR_OTHER` **Other** - **Type:** string - **Default:** _none_
### Direct Download: Cloudflare Bypass | Variable | Description | Type | Default | |----------|-------------|------|---------| | `USE_CF_BYPASS` | Attempt to bypass Cloudflare protection on download sites. | boolean | `true` | | `USING_EXTERNAL_BYPASSER` | Use FlareSolverr or similar external service instead of built-in bypasser. Caution: May have limitations with custom DNS, Tor and proxies. You may experience slower downloads and and poorer reliability compared to the internal bypasser. | boolean | `false` | | `EXT_BYPASSER_URL` | URL of the external bypasser service (e.g., FlareSolverr). | string | `http://flaresolverr:8191` | | `EXT_BYPASSER_PATH` | API path for the external bypasser. | string | `/v1` | | `EXT_BYPASSER_TIMEOUT` | Timeout for external bypasser requests in milliseconds. | number | `60000` | | `BYPASS_PAGE_SOURCE_TIMEOUT` | How long to wait for a solved page to produce its content before the bypass is retried. Raise it if solves succeed but searches still fail. | number | `20` | | `BYPASS_BROWSER_IDLE_TIMEOUT` | How long the bypass helper process may sit unused before it is shut down. Higher keeps more searches fast, lower frees memory sooner. | number | `180` |
Detailed descriptions #### `USE_CF_BYPASS` **Enable Cloudflare Bypass** Attempt to bypass Cloudflare protection on download sites. - **Type:** boolean - **Default:** `true` - **Requires restart:** Yes #### `USING_EXTERNAL_BYPASSER` **Use External Bypasser** Use FlareSolverr or similar external service instead of built-in bypasser. Caution: May have limitations with custom DNS, Tor and proxies. You may experience slower downloads and and poorer reliability compared to the internal bypasser. - **Type:** boolean - **Default:** `false` - **Requires restart:** Yes #### `EXT_BYPASSER_URL` **External Bypasser URL** URL of the external bypasser service (e.g., FlareSolverr). - **Type:** string - **Default:** `http://flaresolverr:8191` - **Requires restart:** Yes #### `EXT_BYPASSER_PATH` **External Bypasser Path** API path for the external bypasser. - **Type:** string - **Default:** `/v1` - **Requires restart:** Yes #### `EXT_BYPASSER_TIMEOUT` **External Bypasser Timeout (ms)** Timeout for external bypasser requests in milliseconds. - **Type:** number - **Default:** `60000` - **Requires restart:** Yes - **Constraints:** min: 10000, max: 300000 #### `BYPASS_PAGE_SOURCE_TIMEOUT` **Page Read Timeout (seconds)** How long to wait for a solved page to produce its content before the bypass is retried. Raise it if solves succeed but searches still fail. - **Type:** number - **Default:** `20` - **Constraints:** min: 1, max: 120 #### `BYPASS_BROWSER_IDLE_TIMEOUT` **Bypasser Idle Timeout (seconds)** How long the bypass helper process may sit unused before it is shut down. Higher keeps more searches fast, lower frees memory sooner. - **Type:** number - **Default:** `180` - **Requires restart:** Yes - **Constraints:** min: 30, max: 3600
### Direct Download: Mirrors | Variable | Description | Type | Default | |----------|-------------|------|---------| | `AA_BASE_URL` | Select Auto to try mirrors from your list on startup and fail over on errors. Choosing a specific mirror pins Shelfmark to that URL. | string (choice) | `auto` | | `AA_MIRROR_URLS` | List the Anna's Archive mirror URLs you want Shelfmark to use. Type a URL and press Enter to add it. Order matters when Auto is selected. | string (comma-separated) | _empty list_ | | `LIBGEN_MIRROR_URLS` | Mirrors are tried in the order you add them until one works. | string (comma-separated) | _empty list_ | | `ZLIB_MIRROR_URLS` | Only the first mirror in the list is used. | string (comma-separated) | _empty list_ | | `WELIB_MIRROR_URLS` | Only the first mirror in the list is used. | string (comma-separated) | _empty list_ | | `OCEANOFPDF_MIRROR_URLS` | Searches and downloads directly, without Anna's Archive. Only the first mirror in the list is used. The site is behind Cloudflare, so the bypass must be enabled. | string (comma-separated) | _empty list_ |
Detailed descriptions #### `AA_BASE_URL` **Primary Mirror** Select Auto to try mirrors from your list on startup and fail over on errors. Choosing a specific mirror pins Shelfmark to that URL. - **Type:** string (choice) - **Default:** `auto` - **Options:** `auto` (Auto (Recommended)) #### `AA_MIRROR_URLS` **Mirrors** List the Anna's Archive mirror URLs you want Shelfmark to use. Type a URL and press Enter to add it. Order matters when Auto is selected. - **Type:** string (comma-separated) - **Default:** _empty list_ #### `LIBGEN_MIRROR_URLS` **LibGen** Mirrors are tried in the order you add them until one works. - **Type:** string (comma-separated) - **Default:** _empty list_ #### `ZLIB_MIRROR_URLS` **Z-Library** Only the first mirror in the list is used. - **Type:** string (comma-separated) - **Default:** _empty list_ #### `WELIB_MIRROR_URLS` **Welib** Only the first mirror in the list is used. - **Type:** string (comma-separated) - **Default:** _empty list_ #### `OCEANOFPDF_MIRROR_URLS` **OceanofPDF** Searches and downloads directly, without Anna's Archive. Only the first mirror in the list is used. The site is behind Cloudflare, so the bypass must be enabled. - **Type:** string (comma-separated) - **Default:** _empty list_