# Copy to ~/.config/breadarr/breadarrd.toml and fill in the empty values. # Every field has a sensible default (see breadarr-shared/src/config.rs) — # this file lists them explicitly for reference, not because all are required. [daemon] log_level = "info" listen_addr = "127.0.0.1:7879" db_path = "~/.local/share/breadarr/breadarr.db" # Embedding model for title matching — downloaded automatically on first # run if not already present (~90MB, one-time). model_dir = "~/.cache/breadarr/models/all-MiniLM-L6-v2" # Empty (default) means no auth at all. Set this if listen_addr is ever # changed to bind non-loopback (e.g. so a TUI on another host on the same # tailnet can reach it) — otherwise that's unauthenticated add/delete/search # access to anyone who can reach the port. The API is plaintext HTTP; there # is no TLS. /health is always exempt (liveness only). /health/detail # carries cycle info and is authenticated when this token is set. api_token = "" [qbit] base_url = "http://127.0.0.1:8090" username = "" password = "" category = "breadarr" # Only needed if qBittorrent runs in a container (its own downloads mounted # at some internal prefix) while breadarr runs natively on the same host — # translates qBittorrent's reported paths into ones breadarr can open. # Leave both empty if qBittorrent's reported paths are already host paths. container_downloads_path = "" host_downloads_path = "" [jellyfin] base_url = "http://127.0.0.1:8096" api_key = "" [notifications] # Push notifications for things that would otherwise sit invisible until # the TUI is next opened: releases needing manual confirmation, a run of # import failures, the search loop halting. Empty (default) disables this # entirely. POSTs {"title", "message"} JSON — Gotify's own message API # accepts this directly (e.g. "http://127.0.0.1:5600/message?token=..."); # most other self-hosted webhook receivers accept the same shape. webhook_url = "" [tvdb] # https://thetvdb.com/dashboard/account/apikeys — v4 key, "Fan/Personal" tier api_key = "" [tmdb] # https://www.themoviedb.org/settings/api — "API Read Access Token (v4 auth)", # not the shorter v3 "API Key" bearer_token = "" [library] # Default root folder for shows added via the TUI's "Add" flow. Each show # lands in its own "{root}/{Title} ({Year})" subfolder. default_root_folder = "~/breadarr-library" # Same, but for movies added via the TUI's "Add" flow — kept separate from # default_root_folder since movies and shows live under different category # roots on disk. movies_root_folder = "~/breadarr-library/Movies" [sources] # nyaa's English-translated anime category — the daemon polls this # automatically and grabs anything matching a monitored, missing episode. nyaa_rss_url = "https://nyaa.si/?page=rss&c=1_2" grab_poll_interval_secs = 300 # Kill switch for the passive RSS-feed grab loop (nyaa). Independent of # search_enabled / upgrade_enabled. grab_enabled = true import_poll_interval_secs = 60 # Community JSON API mirror of The Pirate Bay — primary general-content # search source (movies + non-anime TV). tpb_api_url = "https://apibay.org/q.php" # torrents.csv DHT-dump search — first fallback when TPB fails or returns # nothing. Same hash-to-magnet grab; movies and TV. torrents_csv_url = "https://torrents-csv.com/service/search" # YTS v2 list_movies JSON — movie-only fallback. yts.mx does not resolve; # yts.lt is a working host as of 2026-08-16. yts_api_url = "https://yts.lt/api/v2/list_movies.json" # Search-driven acquisition (movies + non-anime TV via 1337x, anime movies # via nyaa's search mode) — unlike the nyaa RSS feed watch above, this # actively queries a Cloudflare-fronted service with a ban history, so keep # the budget conservative. `search_enabled = false` is the kill switch; a # restart resets all in-memory mirror cooldown/backoff state, so this is the # only reliable way to keep it off across restarts. search_poll_interval_secs = 1800 search_budget_per_cycle = 5 search_enabled = true # Upgrade-search — periodically re-checks episodes/movies that already have # a file, in case a better release now exists (repacks/propers always # supersede; anything else needs to beat the current file's score by at # least upgrade_min_score_gain to avoid re-grabbing over marginal deltas). # Much longer interval than search_poll_interval_secs since there's no # urgency once content is already satisfied. upgrade_enabled = true upgrade_poll_interval_secs = 21600 upgrade_budget_per_cycle = 3 upgrade_min_score_gain = 5.0 # 1337x's main domain bans IPs at the Cloudflare WAF level after bursts of # automated traffic; these community mirrors are round-robined (not just # tried in a fixed fallback order), with a failing mirror demoted into a # cooldown rather than re-probed on the very next search. torrent_1337x_mirrors = [ "https://www.1337xx.to", "https://13377x.info", "https://13377x.email", "https://1337xto.info", "https://1337x.maskbay.info", "https://1337x.ninjaproxy.live", "https://1337x.proxyhive.pro", "https://1337x.torproxy.live", "https://1337x.unblockit.world", "https://1337x.unblockpirate.xyz", "https://1337x.unblockshark.info", "https://1337x.unblocktorrent.click", "https://1337x.unblocktorrent.info", "https://1337x.unblocktor.xyz", ] # Off by default — GPU/CPU AV1 encode needs a calibration pass against # real content on the target hardware before it's safe unattended. # Defaults match breadarr-shared/src/config.rs. [transcode] enabled = false poll_interval_secs = 60 vaapi_device = "/dev/dri/renderD128" parallelism_min = 1 # Live-action (av1_vaapi) concurrent-stream ceiling; Jellyfin viewers # are subtracted from this each cycle. parallelism_max = 7 # Separate CPU-bound anime (libsvtav1) ceiling. parallelism_max_anime = 2 reference_bitrate_kbps = 5320 reference_height = 1080 av1_efficiency_factor = 0.7 exclude_hdr = true exclude_min_height = 2000 quality_live_action = 26 # Path prefixes routed to the anime encode pipeline. Empty is a no-op. anime_root_folders = [] quality_anime = 24 anime_svtav1_preset = 10 anime_svtav1_max_threads = 4 min_size_reduction_pct = 0.10 skip_below_ceiling_ratio = 0.5 verify_sample_secs = 20.0