Configuration File Reference¶
This comprehensive guide explains every setting in qBitrr's config.toml configuration file.
Contents¶
- Configuration File Location
- File Format
- Configuration Sections
- Settings Section
- WebUI Section
- qBit Section
- Arr Sections
- Configuration Best Practices
- Troubleshooting Config Issues
- Complete Minimal Config
- Advanced/Hidden Settings
- Edge Case Behaviors
- Implementation Details
- See Also
Configuration File Location¶
Native Installation¶
Docker Installation¶
Mounted from your host at the path specified in your Docker compose/run command.
File Format¶
qBitrr uses TOML (Tom's Obvious, Minimal Language) for configuration.
TOML basics:
# Comments start with #
key = "value"
number = 42
boolean = true
list = ["item1", "item2", "item3"]
[Section]
nested_key = "nested value"
[[ArrayOfTables]]
name = "first"
[[ArrayOfTables]]
name = "second"
Time values (durations)¶
Many settings accept time durations. You can use:
- Integers (legacy): Plain numbers in the key's base unit (seconds or minutes, depending on the setting). Example:
LoopSleepTimer = 5(5 seconds),StalledDelay = 15(15 minutes). - Suffixed strings: A number followed by a unit letter for human-readable values:
s= secondsm= minutesh= hoursd= daysw= weeksM= months (30 days; uppercase to distinguish from minutes)
Examples: MaxSeedingTime = "1w" (1 week in seconds), StalledDelay = "1440m" (1440 minutes). Unsupplied or empty suffix is treated as the key's base unit (seconds or minutes). Use -1 or "-1" where a setting supports "disabled".
Configuration Sections¶
qBitrr's configuration is organized into several sections:
- Settings - Global qBitrr settings
- WebUI - Web interface configuration
- qBit - qBittorrent connection
- Sonarr-* - Sonarr instance configuration
- Radarr-* - Radarr instance configuration
- Lidarr-* - Lidarr instance configuration
Settings Section¶
The [Settings] section contains global configuration that applies to all qBitrr operations.
Complete Settings Example¶
[Settings]
# Internal config schema version - DO NOT MODIFY (managed automatically)
# ConfigVersion = "5.10.1"
# Logging
ConsoleLevel = "INFO"
Logging = true
# Paths
CompletedDownloadFolder = "/data/downloads"
FreeSpaceFolder = "/data/downloads"
# Disk space management
FreeSpace = "50G"
AutoPauseResume = true
# Timers
NoInternetSleepTimer = 15
LoopSleepTimer = 5
SearchLoopDelay = -1
# Special categories
FailedCategory = "failed"
RecheckCategory = "recheck"
# Torrent processing
Tagless = false
IgnoreTorrentsYoungerThan = 180
# Network
PingURLS = ["one.one.one.one", "dns.google.com"]
# FFprobe
FFprobeAutoUpdate = true
# Auto-updates
AutoUpdateEnabled = false
AutoUpdateCron = "0 3 * * 0"
# Process management
AutoRestartProcesses = true
MaxProcessRestarts = 5
ProcessRestartWindow = 300
ProcessRestartDelay = 5
ConfigVersion¶
Type: String Default: Set automatically by qBitrr (e.g. "5.9.x"). Legacy integer values 1–4 are accepted and mapped to semver strings. Required: Yes (managed automatically)
Internal configuration schema version. DO NOT MODIFY this value manually. qBitrr uses it to detect when config migrations are needed.
ConsoleLevel¶
Type: String Default: "INFO" Options: CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, TRACE
Controls logging verbosity. Higher levels include all lower levels.
Level descriptions:
CRITICAL- Only fatal errorsERROR- Errors that need attentionWARNING- Warnings and errorsNOTICE- Important notices, warnings, and errorsINFO- (Recommended) General informationDEBUG- Detailed debugging informationTRACE- Very verbose, traces all operations
Recommendation: Start with INFO. Switch to DEBUG when troubleshooting.
Logging¶
Type: Boolean Default: true
Enable or disable logging to files. When enabled, logs are written to:
- Native:
~/logs/or%USERPROFILE%\logs\ - Docker:
/config/logs/
Log files created:
Main.log- qBitrr main processWebUI.log- Web interfaceRadarr-<name>.log- Per Radarr instanceSonarr-<name>.log- Per Sonarr instanceLidarr-<name>.log- Per Lidarr instance
Recommendation: Keep enabled for troubleshooting.
CompletedDownloadFolder¶
Type: String (path) Required: Yes
Path where qBittorrent saves completed downloads. This must match qBittorrent's "Default Save Path" setting.
Finding this path:
- Open qBittorrent
- Go to Tools → Options → Downloads
- Note the Default Save Path
Important:
- Use forward slashes
/(even on Windows) - Don't include trailing slash
- Path must be accessible to qBitrr
- Docker: Must be the path as qBitrr sees it (inside container)
Examples:
# Linux/Docker
CompletedDownloadFolder = "/data/downloads"
# Windows (use forward slashes!)
CompletedDownloadFolder = "D:/Downloads/Complete"
# Network share (Docker)
CompletedDownloadFolder = "/mnt/nas/downloads"
FreeSpace¶
Type: String Default: "-1" (disabled) Format: Number + Unit (K, M, G, T)
Minimum free space to maintain in download directory. When free space drops below this threshold, qBitrr pauses downloads.
Units:
K- KilobytesM- MegabytesG- Gigabytes (recommended)T- Terabytes
Examples:
FreeSpace = "50G" # 50 gigabytes
FreeSpace = "100M" # 100 megabytes
FreeSpace = "1T" # 1 terabyte
FreeSpace = "-1" # Disabled
How it works:
- qBitrr monitors
FreeSpaceFolderevery loop - If free space <
FreeSpacethreshold: - Pauses all downloads
- Keeps seeding active
- Logs warning
- When space frees up:
- Resumes downloads automatically
Recommendation: Set to 10-20% of your disk capacity.
FreeSpaceFolder¶
Type: String (path) Default: "CHANGE_ME" in generated config. Must be set explicitly when FreeSpace != "-1".
Folder to monitor for free space checks. Usually the same as CompletedDownloadFolder.
Use cases for different path:
- Download folder on SSD, monitoring HDD
- Monitoring parent filesystem
- Shared storage with multiple mount points
AutoPauseResume¶
Type: Boolean Default: true
Enable automatic pausing and resuming of torrents. Required for FreeSpace feature to work.
When true:
- qBitrr can pause torrents when disk is full
- qBitrr can resume torrents when space frees up
- Health checks can pause/resume stalled torrents
Recommendation: Keep enabled.
NoInternetSleepTimer¶
Type: Integer (seconds) Default: 15
How long to wait when internet connection is lost before checking again.
Process:
- qBitrr pings
PingURLSto check connectivity - If all pings fail, internet is considered down
- qBitrr sleeps for
NoInternetSleepTimerseconds - Checks again
Recommendation: 15 for quick recovery, 60 for slower connections.
LoopSleepTimer¶
Type: Integer (seconds) Default: 5
Delay between each torrent processing loop. Lower values = more responsive, higher CPU usage.
What happens each loop:
- Check all managed torrents
- Detect stalled/failed downloads
- Process completed torrents
- Trigger imports
- Check disk space
Recommendations:
5- (Default) Balanced3- More responsive10- Lower resource usage1- Very responsive (higher CPU)
SearchLoopDelay¶
Type: Integer (seconds) Default: -1 (uses 30 seconds)
Controls the delay between individual search commands when processing a batch of searches within a single search loop.
How it works: - When set to -1 (default): Uses 30 seconds between each search command - When set to a positive value: Uses that many seconds between each search command - Applies to both missing media searches and request searches (Overseerr/Ombi)
Use cases: - Default (-1): Recommended for most setups - 30 second delay prevents overwhelming indexers - Lower values (5-15): For faster request processing with high-quality indexers - Higher values (60-120): For limited indexer API calls or rate-limited trackers
Example: If you have 10 missing movies to search: - SearchLoopDelay = -1 → 30 seconds between each movie search (5 minutes total) - SearchLoopDelay = 10 → 10 seconds between each movie search (1.7 minutes total) - SearchLoopDelay = 60 → 60 seconds between each movie search (10 minutes total)
Indexer Rate Limits
Setting this too low may trigger indexer rate limits. Most indexers allow 5-10 API calls per second, but spacing searches prevents hitting these limits.
Recommendation: Keep at -1 for the default 30-second delay, or adjust based on your indexer's rate limits.
FailedCategory¶
Type: String Default: "failed"
qBittorrent category for manually marking torrents as failed.
How to use:
- In qBittorrent, move a torrent to this category
- qBitrr detects it on next loop
- qBitrr marks it as failed in Arr
- Triggers re-search (if enabled)
- Removes torrent and files
Use cases:
- Fake/corrupt files
- Wrong content
- Manual intervention needed
Torrents in this category receive the same qBit-side behaviour as Arr-managed categories (recheck on error, missing files handling, stalled detection, etc.). Only research and blocklisting (notifying Arr, re-search) are Arr-specific; for the failed category, qBitrr still marks the release as failed in Arr and removes the torrent when so configured.
RecheckCategory¶
Type: String Default: "recheck"
qBittorrent category for forcing torrent recheck.
How to use:
- Move torrent to this category in qBittorrent
- qBitrr forces a full recheck
- Moves torrent back to original category
- Continues normal processing
Use cases:
- Fix "missing files" errors
- After restoring from backup
- After moving download location
Torrents in this category receive the same qBit-side behaviour as Arr-managed categories (recheck on error, missing files handling, stalled detection, etc.). Only research and blocklisting remain Arr-specific; for the recheck category, qBitrr forces a full recheck and moves the torrent back to its original category.
Tagless¶
Type: Boolean Default: false
Advanced feature: Manage torrents without requiring Arr tags.
When false (default):
- qBitrr uses both category and tags to identify torrents
- More reliable
- Recommended
When true:
- qBitrr uses only categories
- Useful if Arr doesn't apply tags consistently
- May cause conflicts if multiple Arr instances share categories
Recommendation: Keep false unless you have specific tagging issues.
IgnoreTorrentsYoungerThan¶
Type: Integer (seconds) Default: 180 (3 minutes)
Ignore torrents newer than this age for certain operations.
Applies to:
FailedCategoryprocessingRecheckCategoryprocessing- Some health checks
Why?
- Torrents need time to start
- Prevents false "stalled" detection
- Allows metadata to load
Recommendations:
180- (Default) 3 minutes120- 2 minutes (faster)300- 5 minutes (more conservative)
PingURLS¶
Type: Array of strings Default: ["one.one.one.one", "dns.google.com"]
Hostnames to ping for internet connectivity checks.
Requirements:
- Must be reliable, always-online services
- Must respond to ICMP pings or HTTP
- Must tolerate frequent pings
Examples:
# Cloudflare and Google DNS
PingURLS = ["one.one.one.one", "dns.google.com"]
# Alternative DNS providers
PingURLS = ["1.1.1.1", "8.8.8.8", "9.9.9.9"]
# Mix of services
PingURLS = ["cloudflare.com", "google.com", "github.com"]
Recommendation: Keep at least 2 URLs for redundancy.
FFprobeAutoUpdate¶
Type: Boolean Default: true
Automatically download and update FFprobe binary for media file validation.
When true:
- qBitrr downloads FFprobe from https://ffbinaries.com/downloads
- Automatically updates to latest version
- Stored in
~/config/qBitManager/ffprobe
When false:
- You must provide your own FFprobe binary
- Place at
~/config/qBitManager/ffprobe(Linux/Mac) orffprobe.exe(Windows)
Recommendation: Keep true for automatic management.
AutoUpdateEnabled¶
Type: Boolean Default: false
Enable automatic qBitrr updates on a schedule.
When true:
- qBitrr checks for updates on schedule (see
AutoUpdateCron) - Downloads and installs latest version
- Restarts automatically
- Logs update in
Main.log
Supported installation methods:
- ✅ PyPI package (
pip install) - ✅ Docker (pulls latest image)
- ⚠️ Binary (manual, not fully automated)
Recommendation: Enable for Docker deployments. Consider manual updates for PyPI.
AutoUpdateCron¶
Type: String (cron expression) Default: "0 3 * * 0" (Sundays at 3:00 AM)
Cron schedule for automatic updates (when AutoUpdateEnabled = true).
Cron format:
┌─ minute (0-59)
│ ┌─ hour (0-23)
│ │ ┌─ day of month (1-31)
│ │ │ ┌─ month (1-12)
│ │ │ │ ┌─ day of week (0-6, 0=Sunday)
│ │ │ │ │
* * * * *
Examples:
# Every Sunday at 3:00 AM
AutoUpdateCron = "0 3 * * 0"
# Every day at 2:00 AM
AutoUpdateCron = "0 2 * * *"
# Every Monday at 4:30 AM
AutoUpdateCron = "30 4 * * 1"
# First day of month at midnight
AutoUpdateCron = "0 0 1 * *"
Tools: Use crontab.guru to validate expressions.
AutoRestartProcesses¶
Type: Boolean Default: true
Automatically restart crashed worker processes.
When true:
- Crashed Arr manager processes restart automatically
- Subject to restart limits (see below)
- Prevents infinite crash loops
When false:
- Crashed processes stay down
- Only logs failures
- Requires manual intervention
Recommendation: Keep true for automatic recovery.
MaxProcessRestarts¶
Type: Integer Default: 5
Maximum restart attempts per process within ProcessRestartWindow.
How it works:
- Process crashes
- qBitrr restarts it after
ProcessRestartDelay - If process crashes
MaxProcessRestartstimes withinProcessRestartWindow: - Auto-restart disabled for that process
- Manual intervention required
Recommendation: 5 is safe. Increase if you have intermittent issues.
ProcessRestartWindow¶
Type: Integer (seconds) Default: 300 (5 minutes)
Time window for tracking restart attempts.
Example:
MaxProcessRestarts = 5ProcessRestartWindow = 300- If a process restarts 5 times within 5 minutes, auto-restart stops
Recommendation: 300 (5 minutes) prevents crash loops while allowing recovery.
ProcessRestartDelay¶
Type: Integer (seconds) Default: 5
Wait time before attempting to restart a crashed process.
Why wait?
- Gives system time to recover
- Prevents immediate re-crash
- Allows logs to flush
Recommendation: 5 is sufficient. Increase if processes crash immediately after restart.
WebUI Section¶
The [WebUI] section configures qBitrr's web interface.
Complete WebUI Example¶
[WebUI]
Host = "0.0.0.0"
Port = 6969
Token = ""
LiveArr = true
GroupSonarr = true
GroupLidarr = true
Theme = "Dark"
ViewDensity = "Comfortable"
Host¶
Type: String (IP address) Default: "0.0.0.0"
IP address the WebUI listens on.
Options:
0.0.0.0- (Default) Listen on all interfaces127.0.0.1- Localhost only (secure, but can't access remotely)- Specific IP - Listen on one network interface
Recommendation: 0.0.0.0 for Docker, 127.0.0.1 + reverse proxy for native.
Port¶
Type: Integer Default: 6969
TCP port for the WebUI.
Access: http://<host>:<port>/ui
Examples:
Port = 6969 # http://localhost:6969/ui
Port = 8080 # http://localhost:8080/ui
Port = 443 # https://localhost:443/ui (with reverse proxy)
Token¶
Type: String Default: "" (empty, no authentication)
Bearer token for API authentication.
When empty:
- WebUI and API are publicly accessible
- No authentication required
When set:
- All
/api/*endpoints require authentication - Must include
Authorization: Bearerheader in requests
Setting up authentication:
Using authenticated API:
Recommendation: Set a token if qBitrr is accessible from the internet.
LiveArr¶
Type: Boolean Default: true
Enable live updates in Arr views (Radarr/Sonarr/Lidarr tabs).
When true:
- Real-time status updates
- Progress bars update live
- No manual refresh needed
When false:
- Static snapshots
- Must manually refresh page
- Lower resource usage
Recommendation: Keep true for best UX.
GroupSonarr¶
Type: Boolean Default: true
Group Sonarr episodes by series in the WebUI.
When true:
When false:
Recommendation: true for cleaner view.
GroupLidarr¶
Type: Boolean Default: true
Group Lidarr albums by artist in the WebUI.
When true:
When false:
├─ Pink Floyd - The Dark Side of the Moon
├─ Pink Floyd - The Wall
└─ Pink Floyd - Wish You Were Here
Recommendation: true for better organization.
Theme¶
Type: String Default: "Dark" Options: Dark, Light
WebUI color theme.
Dark- Dark mode (easier on eyes)Light- Light mode (better in bright environments)
Note: Users can toggle theme in the WebUI itself. This sets the default.
ViewDensity¶
Type: String Default: "Comfortable" Options: Comfortable, Compact
List view density in the WebUI (e.g. Arr views, process list). Comfortable uses more spacing; Compact fits more rows on screen.
qBit Section¶
The [qBit] section configures the connection to qBittorrent.
Complete qBit Example¶
[qBit]
Disabled = false
Host = "localhost"
Port = 8080
UserName = "admin"
Password = "adminpass"
ManagedCategories = []
For detailed qBittorrent configuration, including [qBit.CategorySeeding] for per-category seeding settings, see the qBittorrent Configuration Guide.
Arr Sections¶
Arr sections follow the naming pattern [<Type>-<Name>]:
[Radarr-Movies][Sonarr-TV][Lidarr-Music]
Each Arr instance has its own section with subsections for:
[<Type>-<Name>.EntrySearch]- Automated searching[<Type>-<Name>.Overseerr]- Request integration (Radarr/Sonarr only)[<Type>-<Name>.Torrent]- Torrent management[<Type>-<Name>.Torrent.SeedingMode]- Seeding configuration[[<Type>-<Name>.Torrent.Trackers]]- Per-tracker settings
For complete Arr configuration documentation:
Configuration Best Practices¶
1. Start with Example Config¶
You can get a config file in either of these ways:
Option A: Generate with qBitrr
This writes config.toml to the config directory (Docker: /config; native: .config in the current working directory, or the path set by QBITRR_OVERRIDES_DATA_PATH). If a config already exists there, qBitrr writes config_new.toml in the current directory instead. Move or copy the generated file to your config location if needed.
Option B: Copy from the repository
# Copy the example file to your config directory
cp config.example.toml ~/config/config.toml # Linux/macOS native
# Or for Docker: copy to the host path that you mount at /config
Then edit the file to match your setup (paths, API keys, categories).
2. Use Environment Variables¶
Override settings with environment variables (Docker-friendly):
# Format: QBITRR_<SECTION>_<KEY> (use underscores, e.g. CONSOLE_LEVEL not CONSOLELEVEL)
# WebUI host/port/token are not overridable via env; use config.toml
export QBITRR_SETTINGS_CONSOLE_LEVEL=DEBUG
export QBITRR_QBIT_HOST=qbittorrent
See Environment Variables for the full list of supported variables.
3. Validate Your Config¶
Check for syntax errors:
# Python TOML validation
python3 -c "import toml; toml.load('~/config/config.toml')"
# Or use online validator
# https://www.toml-lint.com/
4. Backup Your Config¶
# Before major changes
cp ~/config/config.toml ~/config/config.toml.backup
# Automated backup (cron)
0 0 * * * cp ~/config/config.toml ~/config/config.toml.$(date +\%Y\%m\%d)
5. Version Control¶
# Initialize git repo
cd ~/config
git init
git add config.toml
git commit -m "Initial config"
# Track changes
git diff # See what changed
git commit -am "Adjusted stall delay"
6. Security¶
Sensitive data in config:
# DON'T commit these to public repos
APIKey = "your-secret-key"
Password = "your-password"
Token = "your-token"
Use environment variables for secrets:
7. Documentation¶
Add comments to your config:
[Radarr-4K]
# Separate instance for 4K movies
# Uses higher quality profile and longer ETAs
MaximumETA = 172800 # 48 hours for large 4K files
Troubleshooting Config Issues¶
Config Not Loading¶
Symptoms: qBitrr uses defaults or doesn't start
Solutions:
-
Check file location:
-
Check file permissions:
-
Validate TOML syntax:
Invalid Value Errors¶
Symptoms: "Invalid value for X" errors in logs
Solutions:
-
Check data types:
-
Check enums:
Changes Not Applied¶
Symptoms: Modified config not taking effect
Solution: Restart qBitrr after config changes:
Missing Required Values¶
Symptoms: "Missing required config key" errors
Solution: Check these are set:
[Settings]
CompletedDownloadFolder = "/path/to/downloads" # Required
[qBit]
Host = "localhost" # Required
Complete Minimal Config¶
Absolute minimum configuration to get started. ConfigVersion is managed automatically by qBitrr; omit it or leave as set by --gen-config.
[Settings]
CompletedDownloadFolder = "/data/downloads"
[WebUI]
Host = "0.0.0.0"
Port = 6969
[qBit]
Disabled = false
Host = "localhost"
Port = 8080
UserName = "admin"
Password = "adminpass"
[Radarr-Movies]
Managed = true
URI = "http://localhost:7878"
APIKey = "your-radarr-api-key"
Category = "radarr-movies"
ReSearch = true
Advanced/Hidden Settings¶
These configuration options exist but are not generated by qbitrr --gen-config because they are intended for advanced troubleshooting only.
Settings.ProcessSpawnTimeoutSeconds¶
Type: Integer (seconds) Default: 30 seconds Added manually to config
Timeout for spawning Arr instance worker processes during startup.
When to adjust:
- Slow disk I/O (network storage, HDD)
- High system load during startup
- Database on slow filesystem
Behavior:
- If process doesn't spawn within timeout, startup fails with error
- Increase if seeing "Process spawn timed out" errors
- Do NOT set below 10 seconds
Default is usually sufficient - only adjust if experiencing startup timeouts.
Edge Case Behaviors¶
Infinite Retry Loops¶
qBitrr uses infinite retry loops in specific scenarios for reliability:
Quality Profile Fetching (Startup)¶
Location: arss.py Behavior: Retries forever until Arr responds with quality profiles
Retry Strategy:
- Network errors: Immediate retry
- Server errors: Wait 5 minutes, retry
- Unexpected errors: Give up
Why: Quality profiles are required for proper operation. Startup blocks until available.
Impact: Startup can hang if Arr is persistently unavailable. Check Arr logs if this occurs.
Search Command Posting¶
Location: arss.py Behavior: Retries search API call until network succeeds
Retry Strategy:
- ChunkedEncodingError: Retry immediately
- ContentDecodingError: Retry immediately
- ConnectionError: Retry immediately
- JSONDecodeError: Retry immediately
Why: Ensures search commands are never lost due to transient network issues.
Impact: Search processing pauses during Arr downtime but resumes automatically when Arr recovers.
Note: Searched=True only set AFTER successful API call, so failed searches are retried.
Implementation Details (Not User-Configurable)¶
Database WAL Checkpoint¶
qBitrr automatically performs WAL checkpoint and VACUUM on database errors for self-repair.
Not configurable - happens automatically during database error recovery.
See Database Troubleshooting for details on manual database maintenance.
TAGLESS Mode Exception¶
When Settings.Tagless = true, qBitrr emulates tags using database entries EXCEPT for the special qBitrr-ignored tag, which still uses a real qBittorrent tag.
Why: The ignore functionality requires a real tag to prevent qBitrr from processing marked torrents.
This is intentional design, not a bug.