selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

GitHub
bindery logo

Self-host bindery

v1.46.0

Automated ebook and audiobook manager for Usenet

ReleaseOpen SourceMIT
Updated5 hours ago
LanguageGo
Setup difficultyModerate
MobileResponsive
ThemeDark mode
Stars
540
Port
8787 (HTTP server port)
Docker
ghcr.io/vavallee/bindery
Install with Docker
Tour through authors, books, release calendar, and download queueAuthor detail page with monitored books (dark theme)Books library grid view (dark theme)Release calendar of upcoming books (dark theme)Download queue with live status (dark theme)Books view on mobile (dark theme)Authors view on mobile (dark theme)Author detail on mobile (dark theme)

What is bindery?

Bindery is a self-hosted, open-source tool that automates ebook and audiobook acquisition from Usenet and torrents. It watches authors you follow, queries Newznab and Torznab indexers in parallel, hands off downloads to clients like SABnzbd or qBittorrent, and files the results into a searchable library. Unlike Readarr, it relies on several documented public metadata APIs — OpenLibrary, Google Books, Hardcover, DNB, Audnex, Audible, plus optional Norwegian and French national libraries — so no single upstream outage can disable the app. A one-step import brings over a Readarr database (authors, indexers, download clients, blocklist). The stack is a single Go binary with an embedded React frontend, SQLite for storage, and no external database or sidecars. You can run it via distroless Docker images, Docker Compose, a Helm chart, or pre-built binaries for Linux, macOS, and Windows (including ARM down to a Pi Zero). The web UI has light/dark themes, works well on mobile, and serves an OPDS 1.2 catalogue for readers like KOReader. Auth options include local passwords, API keys, OIDC (Google, GitHub, Authelia, Keycloak), and forward-auth proxy (Authelia, Authentik, oauth2-proxy). Notifications go out through generic webhooks to services like Apprise, ntfy, Home Assistant, Discord, or Slack.

Should you self-host bindery?

bindery scores 56/100 on selfhost.directory (how scoring works) and ranks #3 of 19 in Ebook Management. It has 540 GitHub stars.

It shipped 26 stable releases in the past year. The latest, v1.46.0, came out on 27 October 2026. New versions land roughly every 2 days.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is MIT-licensed and written mostly in Go.

Its closest alternative on selfhost.directory is Mediarium (52/100, 271 stars). bindery scores higher overall. See bindery vs Mediarium side by side.

Features

  • Author aliases
  • Author monitoring
  • Download client diagnostics
  • Download client integration
  • Dual-format library
  • Library adoption
  • Library scan with fuzzy matching
  • Metadata re-binding
  • Multiple library roots
  • Newznab and Torznab indexers
  • Readarr database import
  • Release calendar
  • Series Support
  • Smart search matching
  • Unattended release discovery

bindery README

How to install bindery

Install bindery with Docker

Docker Engine
Environment variables
BINDERY_PORT, BINDERY_DB_PATH, BINDERY_DATA_DIR, BINDERY_LIBRARY_DIR, BINDERY_AUDIOBOOK_DIR, BINDERY_DOWNLOAD_DIR, BINDERY_AUDIOBOOK_DOWNLOAD_DIR, BINDERY_URL_BASE, BINDERY_OUTBOUND_PROXY, BINDERY_DOWNLOAD_RETENTION_DAYS, BINDERY_LOG_LEVEL, BINDERY_PUID, BINDERY_PGID, and many more

docker run -d
--name bindery
-p 8787:8787
-v /path/to/config:/config
-v /path/to/books:/books
-v /path/to/downloads:/downloads
ghcr.io/vavallee/bindery:latest

Distroless image, multi-arch (amd64, arm64)

How to configure bindery

  • BINDERY_ALLOW_LAN_OIDCoffSet to true/1 to lift the SSRF guard on the OIDC discovery probe

    Set to true/1 to lift the SSRF guard on the OIDC discovery probe

    values: true, false

  • BINDERY_ALLOW_LINK_LOCAL_SERVICESunsetSet to 1 or true to let service URLs use link-local addresses

    Set to 1 or true to let service URLs use link-local addresses

    values: 1, true

  • BINDERY_AUDIOBOOK_DIRinherits libraryImported audiobook destination

    Imported audiobook destination

  • BINDERY_AUDIOBOOK_DOWNLOAD_DIRinherits download dirSeparate watch folder for audiobook downloads

    Separate watch folder for audiobook downloads

  • BINDERY_CONTACTfalls back to project URLContact pointer Bindery advertises in its User-Agent header

    Contact pointer Bindery advertises in its User-Agent header

  • BINDERY_COOKIE_SECUREautoSession cookie Secure flag policy

    Session cookie Secure flag policy

    values: auto, always, never

  • BINDERY_DATA_DIRplatform-defaultConfig directory (backups, image cache, secrets)

    Config directory (backups, image cache, secrets)

  • BINDERY_DB_FK_CHECKunsetOffline database integrity tool

    Offline database integrity tool

    values: report, repair

  • BINDERY_DB_PATHplatform-defaultSQLite database path

    SQLite database path

  • BINDERY_DEPLOY_METHODauto-detectedOverrides the deployment method reported in the daily telemetry ping

    Overrides the deployment method reported in the daily telemetry ping

  • BINDERY_DOWNLOAD_ALLOW_LOOPBACKunsetSet to 1 to allow Bindery to fetch indexer-provided download links that resolve to loopback

    Set to 1 to allow Bindery to fetch indexer-provided download links that resolve to loopback

    values: 1

  • BINDERY_DOWNLOAD_DIR/downloadsWhere the download client deposits completed jobs

    Where the download client deposits completed jobs

  • BINDERY_DOWNLOAD_PATH_REMAPemptyGlobal comma-separated from:to pairs rewriting paths reported by download clients

    Global comma-separated from:to pairs rewriting paths reported by download clients

  • BINDERY_DOWNLOAD_RETENTION_DAYS90Days to keep a finished download row before a scheduled job deletes it

    Days to keep a finished download row before a scheduled job deletes it

  • BINDERY_ENFORCE_TENANCYoffSet to true/1 to enforce per-user data isolation

    Set to true/1 to enforce per-user data isolation

    values: 1, true, yes, on

  • BINDERY_FRAME_ANCESTORSemptyAllow the UI to be embedded in an iframe by a dashboard

    Allow the UI to be embedded in an iframe by a dashboard

  • BINDERY_JOBS_DRAIN_GRACE15Seconds to drain detached background jobs after the HTTP server has stopped

    Seconds to drain detached background jobs after the HTTP server has stopped

  • BINDERY_LIBRARY_DIR/booksImported ebook destination

    Imported ebook destination

  • BINDERY_LOCAL_AUTH_ENABLEDtrueSet to false to disable password-based login entirely

    Set to false to disable password-based login entirely

    values: true, false

  • BINDERY_LOG_LEVELinfoLog verbosity

    Log verbosity

    values: debug, info, warn, error

  • BINDERY_LOG_RETENTION_DAYS14Days to retain persisted log entries in the SQLite log store before they are pruned

    Days to retain persisted log entries in the SQLite log store before they are pruned

  • BINDERY_NOTIFICATIONS_ALLOW_PRIVATEunsetSet to 1 to flip outbound webhook SSRF policy from Strict to LAN, allowing RFC1918 targets

    Set to 1 to flip outbound webhook SSRF policy from Strict to LAN, allowing RFC1918 targets

    values: 1

  • BINDERY_OIDC_ADMIN_GROUPunsetWhen set, makes the IdP authoritative for the admin role via group claim

    When set, makes the IdP authoritative for the admin role via group claim

  • BINDERY_OIDC_AUTO_PROVISIONtrueSet to false to require that OIDC users already exist in Bindery's database

    Set to false to require that OIDC users already exist in Bindery's database

    values: true, false

  • BINDERY_OIDC_DEFAULT_ROLEuserRole assigned to a freshly auto-provisioned OIDC user

    Role assigned to a freshly auto-provisioned OIDC user

    values: user, admin, requester

  • BINDERY_OIDC_EMAIL_LINKfalseSet to true to link an unknown OIDC identity to an existing Bindery account if the email address matches

    Set to true to link an unknown OIDC identity to an existing Bindery account if the email address matches

    values: true, false

  • BINDERY_OIDC_GROUP_CLAIMgroupsTop level claim name Bindery reads the user's groups from

    Top level claim name Bindery reads the user's groups from

  • BINDERY_OIDC_REDIRECT_BASE_URLauto-derivedPublic base URL Bindery is reachable at for OIDC callbacks

    Public base URL Bindery is reachable at for OIDC callbacks

  • BINDERY_OUTBOUND_PROXYemptyRoute outbound HTTP through an http/https/socks5 proxy

    Route outbound HTTP through an http/https/socks5 proxy

  • BINDERY_OUTBOUND_PROXY_BYPASS_LOCALtrueWhen the proxy is set, dial LAN/loopback destinations direct instead of through it

    When the proxy is set, dial LAN/loopback destinations direct instead of through it

    values: true, false

  • BINDERY_OUTBOUND_PROXY_NO_PROXYemptyComma-separated extra exceptions that always bypass the proxy

    Comma-separated extra exceptions that always bypass the proxy

  • BINDERY_PGIDunsetSanity-check assertion for the container GID

    Sanity-check assertion for the container GID

  • BINDERY_PORT8787HTTP server port

    HTTP server port

  • BINDERY_PROXY_AUTH_HEADERX-Forwarded-UserHeader name Bindery reads for the authenticated username in proxy mode

    Header name Bindery reads for the authenticated username in proxy mode

  • BINDERY_PROXY_AUTO_PROVISIONtrueWhen true, a Bindery user is created on first login if none exists for that username

    When true, a Bindery user is created on first login if none exists for that username

    values: true, false

  • BINDERY_PUIDunsetSanity-check assertion for the container UID

    Sanity-check assertion for the container UID

  • BINDERY_RATE_LIMIT_MAX_FAILURES5Maximum failed password attempts per IP within the rate-limit window

    Maximum failed password attempts per IP within the rate-limit window

  • BINDERY_RATE_LIMIT_WINDOW_MINUTES15Duration in minutes of the per-IP login rate-limit window

    Duration in minutes of the per-IP login rate-limit window

  • BINDERY_SHUTDOWN_GRACE10sHow long to drain in-flight HTTP requests after receiving SIGTERM or SIGINT

    How long to drain in-flight HTTP requests after receiving SIGTERM or SIGINT

  • BINDERY_TELEMETRY_DISABLEDunsetSet to true to opt out of the daily anonymous telemetry ping before any DB setting exists

    Set to true to opt out of the daily anonymous telemetry ping before any DB setting exists

    values: true

  • BINDERY_TRUSTED_PROXYunsetComma-separated CIDRs of reverse proxies whose X-Forwarded-* headers Bindery may trust

    Comma-separated CIDRs of reverse proxies whose X-Forwarded-* headers Bindery may trust

  • BINDERY_URL_BASEemptyReverse-proxy subpath (e.g. /bindery)

    Reverse-proxy subpath (e.g. /bindery)

bindery releases & version history

More in Audiobook Management

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…