Seeding Configuration¶
Configure intelligent seeding management with per-torrent and per-tracker rules for ratio limits, seeding time, and automatic cleanup.
All torrent removals and referenced-content cleanup require fresh HnR clearance and all applicable age, stalled, and seeding protections. RemoveTorrent = -1 (Never remove) blocks every removal reason, including custom-format failures and failed categories. Completed torrents must pass their effective ratio/time policy using its configured AND/OR mode. Incomplete torrents must pass minimum age and stalled grace: -1 holds them indefinitely, 0 adds no stalled grace, and positive values require idle minutes. Blocked candidates remain subject to current classification on each scan. Unchanged refused candidates back off for five minutes before repeating the final removal and content checks, including direct content-cleanup calls and unavailable targeted lookups. Elapsed seeding time alone does not cancel the delay. Refusal records are pruned after a scan no longer observes the candidate. Changed activity, progress, ratio, tags, category, location, or a re-added torrent ends that backoff immediately; tracker or policy changes are checked on the next retry. All protections are checked again before deletion. Saving settings never deletes torrents.
The INFO log names each new refusal reason per torrent and qBittorrent instance, including never-remove policy, age or stalled grace, HnR, changed identity, and unverified shared-content ownership. Unchanged refusals do not repeat their reason or mark the torrent again during backoff. Deletion summary reports candidates, blocked (including deferred refusals), pending (uncertain client responses), and confirmed_removed (successful client responses) separately. Hash comparisons ignore case; legacy pending work is counted once per hash. When a later lookup confirms an uncertain removal, an INFO message identifies the hash and client instance. Arr queue removal and blocklisting still wait for client removal confirmation.
Overview¶
qBitrr provides granular control over torrent seeding behavior:
- Global seeding limits - Apply to all torrents in an Arr category
- Per-tracker overrides - Different rules for different trackers
- Ratio-based removal - Remove after upload/download ratio reached
- Time-based removal - Remove after seeding duration
- Combined conditions - Remove when ratio OR/AND time met
- Rate limiting - Control upload/download speeds per torrent
- Dead tracker cleanup - Remove non-responsive trackers
Key benefits:
- Comply with private tracker seeding requirements
- Automatically free up disk space
- Maintain healthy torrent ecosystems
- Optimize bandwidth usage
- Prevent hit-and-runs
Configuration Structure¶
Seeding is configured in the [<Arr>-<Name>.Torrent.SeedingMode] section. Tracker configs are defined once at the qBit level and inherited by all Arr instances:
[Radarr-Movies.Torrent.SeedingMode]
# Global seeding settings for this Arr instance
[[qBit.Trackers]]
# Shared tracker config — inherited by ALL Arr instances on this qBit
[[Radarr-Movies.Torrent.Trackers]]
# Optional per-Arr override (only if this Arr needs different settings)
Tracker Inheritance¶
Trackers defined under [[qBit.Trackers]] are automatically available to every Arr instance. If an Arr instance defines a tracker with the same URI, the Arr version fully replaces the qBit version for that Arr only.
SortTorrents¶
Type: Boolean (per-tracker) Default: false
Set on individual tracker entries in [[qBit.Trackers]] or [[<Arr>.Torrent.Trackers]], right under Priority.
When true on any merged tracker entry, qBitrr enables tracker-order processing in the global TorrentPolicyManager worker (which also handles free-space policy) so the qBittorrent queue follows tracker priority (highest first). The worker sleeps Settings.LoopSleepTimer seconds between passes (same as other torrent loops; default 5).
Before each sort pass, TorrentPolicyManager performs tracker checks and managed AddTags reconciliation for monitored torrents. When this mode is enabled, this pre-sort path is the single owner of tracker/tag sync (Arr loops skip duplicate sync for those categories).
When sorting is disabled, TorrentPolicyManager does not own tracker/tag sync and Arr category loops continue using the legacy tracker/tag maintenance path.
Order rule: If your merged tracker rows define AddTags, queue order considers the maximum Priority among those labels that are currently on the torrent and also the announce-URL / host-based priority (same as when no tags match). The higher of the two values is used, so announce-based ordering is always a fallback when it would place the torrent higher, and when no configured tag is present only announce matching applies. Stale AddTags labels are removed when the tracker no longer applies (only tags listed in merged tracker config are managed this way).
Within the same tracker-priority tier, torrents are ordered by added_on with newest first in the resulting queue.
Torrents whose trackers are not in your configured trackers list are assigned the lowest priority and appear at the bottom.
Merge scope: Sorting uses one unified map: start with [[qBit.Trackers]], then merge every [[<Arr>.Torrent.Trackers]] block (same URI-keyed rules as per-Arr merge—later Arr sections in the config file overwrite earlier entries for the same URI, including overrides to qBit-level defaults). RemoveDeadTrackers / RemoveTrackerWithMessage for deciding which announce URLs count as "removed" during priority resolution use the union of all Arr Torrent.SeedingMode settings (RemoveDeadTrackers is enabled if any Arr enables it; messages are combined and deduplicated).
Reordering applies to all qBitrr-monitored categories on each qBittorrent instance—the union of every Arr Category and every qBit instance ManagedCategories (same scope as free-space monitoring). Torrents outside that set are not reordered. If there are no monitored categories, the TorrentPolicyManager worker is not started.
TorrentPolicyManager starts whenever monitored categories exist and at least one qBittorrent instance is configured. Feature flags still control behavior inside the worker: with sorting disabled, queue sorting and tracker/tag ownership are skipped; with free-space disabled, free-space pause/resume actions are skipped.
Requirements:
- qBittorrent Torrent Queuing must be enabled (Options → BitTorrent → Torrent Queuing). When queuing is off,
priorityis-1and queue moves have no effect.
Queue split: qBittorrent keeps separate download and seeding queues. qBitrr classifies seeding for ordering as upload states including forced upload and checking after complete (forcedUP, checkingUP), not only normal seeding. Reorder calls are applied one-by-one (lowest tier first) and seeding queue promotions are executed before downloading queue promotions.
Verification: In the Web API, priority is the queue position (-1 if queuing is disabled). Compare the downloading and seeding queues in the UI if order looks wrong; a torrent in forced upload belongs on the seeding side.
Example:
[[Radarr-Movies.Torrent.Trackers]]
Name = "BeyondHD"
URI = "https://tracker.beyond-hd.me/announce"
Priority = 10
SortTorrents = true
MaxUploadRatio = 1.0
Global Seeding Settings¶
Complete Example¶
[Radarr-Movies.Torrent.SeedingMode]
# Rate limits (KB/s, -1 = unlimited)
DownloadRateLimitPerTorrent = -1
UploadRateLimitPerTorrent = -1
# Seeding limits
MaxUploadRatio = 2.0 # Seed to 2:1 ratio
MaxSeedingTime = 259200 # 72 hours (3 days)
# Removal condition
RemoveTorrent = 3 # Remove when ratio OR time met
# Dead tracker management
RemoveDeadTrackers = false
RemoveTrackerWithMessage = [
"skipping tracker announce (unreachable)",
"No such host is known"
]
DownloadRateLimitPerTorrent¶
Type: Integer (KB/s) Default: -1 (unlimited)
Limit download speed for individual torrents managed by this Arr instance.
Values:
-1- Unlimited (default)1024- 1 MB/s5120- 5 MB/s10240- 10 MB/s
Use cases:
- Slow connections - prevent one torrent from saturating bandwidth
- Background downloads - limit while torrents complete
- Fair sharing - distribute bandwidth across torrents
Example:
UploadRateLimitPerTorrent¶
Type: Integer (KB/s) Default: -1 (unlimited)
Limit upload speed for individual torrents.
Use cases:
- Preserve download bandwidth
- Meet minimum ratio without excessive upload
- Comply with ISP upload limits
Example:
MaxUploadRatio¶
Type: Float Default: -1 (unlimited)
Maximum upload ratio (uploaded/downloaded) before triggering removal.
Ratio calculation:
Examples:
| Ratio | Downloaded | Uploaded | Meaning |
|---|---|---|---|
1.0 | 10 GB | 10 GB | 1:1 ratio |
2.0 | 10 GB | 20 GB | 2:1 ratio |
0.5 | 10 GB | 5 GB | 0.5:1 ratio |
Common values:
-1- Never remove based on ratio (unlimited seeding)1.0- Minimum for most private trackers1.5- Generous seeding2.0- Very generous5.0- Maximum for some trackers
Private Tracker Requirements
Many private trackers require minimum ratios:
- Common: 1.0 (1:1 ratio)
- Strict: 1.5 or higher
- New users: May have higher requirements
Check your tracker's rules before setting this value!
MaxSeedingTime¶
MaxSeedingTime = 259200 # 72 hours
# Or a duration string (same value):
# MaxSeedingTime = "3d"
# MaxSeedingTime = "2w" # 14 days = 1209600 seconds
Type: Integer (seconds) or duration string ("2w", "30m", …) Default: -1 (no limit from this source)
Maximum seeding duration before triggering removal. Duration strings are parsed the same as other time fields (see Config file).
The time limit is met when either:
- qBittorrent
seeding_time(seconds actually spent seeding) is at leastMaxSeedingTime, or - qBitrr has observed the torrent in stalled upload (
stalledUP) for at leastMaxSeedingTime
The stalled clock starts the first time qBitrr sees that hash in stalledUP and resets if the torrent leaves that state (queued, paused, stopped, forced, or actively uploading). It is not qBittorrent last_activity (last payload): a long queue or pause does not count, and the first stalledUP loop never removes. A qBitrr restart resets the observation window (conservative: delays deletion).
Actively uploading, queued, paused, stopped, or forced seeds are not removed via this stalled path; those still use seeding_time only.
Hit-and-run (HnR) protection is unchanged and still uses actual seeding_time (and ratio / partial rules). A torrent that has been stalled long enough is kept if HnR obligations are unmet.
-1 means this source contributes no limit. A matched tracker with MaxSeedingTime = -1 (or the key omitted) does not clear a positive SeedingMode / CategorySeeding value. Effective seeding is unlimited only when no contributing source sets a positive time limit for that torrent.
Time conversions:
| Duration | Seconds | Config Value |
|---|---|---|
| 1 hour | 3,600 | 3600 |
| 6 hours | 21,600 | 21600 |
| 12 hours | 43,200 | 43200 |
| 1 day | 86,400 | 86400 |
| 3 days | 259,200 | 259200 |
| 1 week | 604,800 | 604800 |
| 2 weeks | 1,209,600 | 1209600 |
| 30 days | 2,592,000 | 2592000 |
| 90 days | 7,776,000 | 7776000 |
Use cases:
- Public trackers: 1-3 days sufficient
- Private trackers: Often require 48-72 hours minimum
- Music trackers: May require weeks or months
- Long-term seeding: 30+ days for rare content
Example:
RemoveTorrent¶
Type: Integer Default: -1 (never remove)
Controls when qBitrr removes torrents based on seeding limits.
Options:
| Value | Condition | Behavior |
|---|---|---|
-1 | Never | Keep seeding indefinitely |
1 | Ratio | Remove when MaxUploadRatio reached |
2 | Time | Remove when MaxSeedingTime reached |
3 | OR | Remove when EITHER ratio OR time met |
4 | AND | Remove when BOTH ratio AND time met |
Comparison:
| RemoveTorrent | After 1 day @ 3.0 ratio | After 5 days @ 0.5 ratio | After 4 days @ 2.5 ratio |
|---|---|---|---|
-1 | Keep | Keep | Keep |
1 (ratio only) | Remove (ratio met) | Keep (ratio not met) | Remove (ratio met) |
2 (time only) | Keep (time not met) | Remove (time met) | Remove (time met) |
3 (OR) | Remove (ratio met) | Remove (time met) | Remove (either met) |
4 (AND) | Keep (time not met) | Keep (ratio not met) | Remove (both met) |
Recommendations:
| Use Case | RemoveTorrent | MaxUploadRatio | MaxSeedingTime |
|---|---|---|---|
| Public trackers | 3 (OR) | 1.0 | 86400 (1 day) |
| Private trackers | 4 (AND) | 1.5 | 259200 (3 days) |
| Long-term seeding | -1 (Never) | -1 | -1 |
| Ratio priority | 1 (Ratio) | 2.0 | -1 |
| Time priority | 2 (Time) | -1 | 604800 (7 days) |
RemoveDeadTrackers¶
Type: Boolean Default: false
Automatically remove tracker entries that return errors.
When true:
- qBitrr monitors tracker announce responses
- Removes trackers matching
RemoveTrackerWithMessageerrors - Keeps working trackers
Use cases:
- Tracker shutdown/migration
- Clean up dead backup trackers
- Maintain healthy tracker lists
Private Tracker Caution
Be careful with private trackers:
- Some trackers have temporary outages
- Removing tracker may violate rules
- May lose credit for seeding time
Recommendation: Keep false for private trackers.
RemoveTrackerWithMessage¶
RemoveTrackerWithMessage = [
"skipping tracker announce (unreachable)",
"No such host is known",
"unsupported URL protocol",
"info hash is not authorized with this tracker"
]
Type: Array of strings Default: See example above
Error messages that trigger tracker removal (when RemoveDeadTrackers = true).
Common error messages:
RemoveTrackerWithMessage = [
# Network errors
"skipping tracker announce (unreachable)",
"No such host is known",
"timed out",
# DNS errors
"Could not resolve host",
"temporary failure in name resolution",
# Authentication errors
"info hash is not authorized with this tracker",
"unregistered torrent",
# Protocol errors
"unsupported URL protocol"
]
Per-Tracker Configuration¶
Define shared tracker configs at the qBit level using [[qBit.Trackers]]. All Arr instances on this qBit inherit these settings. Use [[<Arr>-<Name>.Torrent.Trackers]] only for per-Arr overrides.
Complete Tracker Example (qBit-level)¶
[[qBit.Trackers]]
# Tracker identification
Name = "BeyondHD"
Priority = 10
URI = "https://tracker.beyond-hd.me/announce"
# Seeding requirements
MaxUploadRatio = 1.0
MaxSeedingTime = 432000 # 5 days
# Rate limits
DownloadRateLimit = -1
UploadRateLimit = 5242880 # 5 MB/s
# Tracker management
AddTrackerIfMissing = false
RemoveIfExists = false
SuperSeedMode = false
# Hit and Run protection
HitAndRunMode = "and"
MinSeedRatio = 1.0
MinSeedingTimeDays = 5
TrackerUpdateBuffer = 3600
# Tagging
AddTags = ["BeyondHD", "private"]
Per-Arr Override Example¶
If a specific Arr instance needs different settings for the same tracker, override by URI:
[[Radarr-4K.Torrent.Trackers]]
Name = "BeyondHD"
URI = "https://tracker.beyond-hd.me/announce"
MaximumETA = 36000 # 4K gets more time
MaxSeedingTime = 864000 # 10 days for 4K
Tracker Fields¶
Name¶
Type: String Purpose: Human-readable identifier (for your reference only)
Not used by qBitrr currently, but may be used for logging/reporting in future versions.
Priority¶
Type: Integer Default: 0
When a torrent has multiple trackers, the tracker with the highest priority has its settings applied.
Example:
[[Radarr-Movies.Torrent.Trackers]]
Name = "BeyondHD"
Priority = 10 # Highest priority
MaxUploadRatio = 1.0
[[Radarr-Movies.Torrent.Trackers]]
Name = "Public Fallback"
Priority = 5 # Lower priority
MaxUploadRatio = 2.0
# Torrent with both trackers → Uses BeyondHD settings (ratio 1.0)
URI¶
Type: String (tracker announce URL) Required: Yes
The tracker announce URL as it appears in qBittorrent.
How to find:
- In qBittorrent, select a torrent
- Right-click → Properties → Trackers tab
- Copy the announce URL exactly
Must match exactly (including protocol, subdomain, path, passkey).
MaximumETA¶
Type: Integer (seconds) or duration string Default: Inherits from [<Arr>-<Name>.Torrent].MaximumETA when unset or -1
A positive tracker MaximumETA overrides the Arr Torrent.MaximumETA. Tracker -1 / omitted does not clear a positive parent limit. Unlimited only when neither parent nor tracker sets a positive ETA.
Use cases:
- Slow private trackers (rare content) - higher ETA
- Fast public trackers - lower ETA
- Freeleech torrents - higher tolerance
MaxUploadRatio / MaxSeedingTime¶
Override global seeding limits for this tracker with positive values:
Tracker -1 or omitting these keys means "no limit from this tracker" and does not force unlimited when SeedingMode / CategorySeeding already has a positive limit. Unlimited applies only when no positive limit exists for the torrent from any contributing source.
Example - Different tracker requirements:
# Private tracker - strict requirements
[[Radarr-4K.Torrent.Trackers]]
Name = "PassThePopcorn"
URI = "https://please.passthepopcorn.me:2443/announce"
Priority = 10
MaxUploadRatio = 1.0
MaxSeedingTime = 259200 # 72 hours minimum
# Public tracker - lenient
[[Radarr-4K.Torrent.Trackers]]
Name = "YTS"
URI = "udp://open.stealth.si:80/announce"
Priority = 5
MaxUploadRatio = 0.5
MaxSeedingTime = 86400 # 24 hours
DownloadRateLimit / UploadRateLimit¶
Per-tracker rate limiting:
AddTrackerIfMissing¶
Type: Boolean Default: false
Automatically add this tracker to torrents that don't have it.
When true:
- qBitrr checks if torrent has this tracker
- If missing, adds tracker announce URL
- Useful for adding backup trackers
Use case: Add public tracker backups to private torrents.
Tracker Rules
Some private trackers prohibit adding external trackers. Check rules before enabling.
RemoveIfExists¶
Type: Boolean Default: false
Remove this tracker from any torrent that has it.
Use case: Remove old/shutdown trackers automatically.
SuperSeedMode¶
Type: Boolean Default: false
Enable qBittorrent's "super seeding" mode for torrents with this tracker.
What is super seeding?
- Optimized for initial seeding
- Sends different pieces to each peer
- More efficient for new torrents
- Slower overall, but better distribution
Recommendation: true only for initial seeds on slow trackers.
AddTags¶
Type: Array of strings Default: [] (empty)
Automatically add tags to torrents with this tracker.
Use cases:
- Organize by tracker
- Mark private vs public
- Flag for special handling
- Integration with other tools
HitAndRunMode¶
Type: String: "and" | "or" | "disabled" Default: "disabled" (no clearance requirements supplied by this rule)
Single setting for Hit and Run (HnR) protection for this tracker:
| Value | Meaning |
|---|---|
"and" | HnR enabled; clears only when both minimum ratio and minimum time are met |
"or" | HnR enabled; clears when either minimum ratio or minimum time is met |
"disabled" | Supplies no HnR clearance requirements; private torrents still require verifiable clearance from applicable rules |
When "and" or "or", torrents with this tracker will not be removed until HnR obligations are met, regardless of RemoveTorrent settings. When only one of ratio or time is set (e.g. MinSeedingTimeDays = 0), that single condition is used. Partial downloads always use HitAndRunPartialSeedRatio only.
MinSeedRatio¶
Type: Float Default: 1.0
Minimum upload ratio required to clear HnR. A value of 1.0 means you must upload at least as much as you downloaded. For full downloads, whether both ratio and time are required or either clears the obligation is controlled by HitAndRunMode ("and" vs "or").
MinSeedingTimeDays¶
Type: Integer (days) Default: 0 (disabled)
Minimum number of days to seed before HnR clears. Set to 0 to use ratio-only protection. Only applies to full downloads — partial downloads use HitAndRunPartialSeedRatio instead.
HitAndRunMinimumDownloadPercent¶
Type: Integer (0-100) Default: 10
Minimum percentage of a torrent that must be downloaded before HnR obligations apply. Torrents below this threshold can be safely removed without triggering HnR. Most trackers use 10%, but some may differ.
HitAndRunPartialSeedRatio¶
Type: Float Default: 1.0
Ratio required for partial downloads (downloaded >=HitAndRunMinimumDownloadPercent% but <100%). Partial downloads never accrue seeding time, so ratio is the only way to clear HnR for them. For example, if you downloaded 25GB of a 100GB torrent, you must upload 25GB back (ratio 1.0).
TrackerUpdateBuffer¶
Type: Integer (seconds) Default: 0
Extra seconds to wait after meeting HnR criteria before allowing removal. Tracker statistics typically lag 15-30 minutes behind the client. Setting this to 3600 (60 minutes) provides a safety margin.
Configuration Examples¶
Example 1: Public Tracker (Generous Seeding)¶
[Radarr-Movies.Torrent.SeedingMode]
DownloadRateLimitPerTorrent = -1
UploadRateLimitPerTorrent = -1
MaxUploadRatio = 2.0 # Seed to 2:1
MaxSeedingTime = 604800 # 7 days
RemoveTorrent = 3 # Remove when either met
RemoveDeadTrackers = true
Result: Seeds to 2:1 ratio or 7 days, whichever comes first.
Example 2: Private Tracker (Strict Requirements)¶
[Radarr-Private.Torrent.SeedingMode]
MaxUploadRatio = 1.5
MaxSeedingTime = 432000 # 5 days
RemoveTorrent = 4 # Remove only when BOTH met
RemoveDeadTrackers = false # Keep all trackers
Result: Must seed to 1.5:1 ratio AND 5 days before removal.
Example 3: Mixed Setup with Per-Tracker Rules¶
[Radarr-Movies.Torrent.SeedingMode]
# Global defaults (conservative)
MaxUploadRatio = 1.0
MaxSeedingTime = 259200 # 3 days
RemoveTorrent = 3
# Shared trackers at qBit level — inherited by all Arr instances
[[qBit.Trackers]]
Name = "BeyondHD"
Priority = 10
URI = "https://tracker.beyond-hd.me/announce"
MaxUploadRatio = 1.5
MaxSeedingTime = 432000 # 5 days
HitAndRunMode = "and"
MinSeedRatio = 1.0
MinSeedingTimeDays = 5
AddTags = ["private", "BeyondHD"]
[[qBit.Trackers]]
Name = "YTS"
Priority = 5
URI = "udp://open.stealth.si:80/announce"
MaxUploadRatio = 0.5
MaxSeedingTime = 86400 # 1 day
AddTags = ["public", "YTS"]
# Optional: per-Arr override for 4K instance (higher ETA tolerance)
[[Radarr-4K.Torrent.Trackers]]
Name = "BeyondHD"
URI = "https://tracker.beyond-hd.me/announce"
MaximumETA = 36000
Example 4: Music Tracker (Long-term Seeding)¶
[Lidarr-Music.Torrent.SeedingMode]
MaxUploadRatio = 1.0
MaxSeedingTime = 6220800 # 72 hours minimum (RED/OPS requirement)
RemoveTorrent = 2 # Remove based on time only
RemoveDeadTrackers = false
# Shared at qBit level
[[qBit.Trackers]]
Name = "RED"
Priority = 10
URI = "https://flacsfor.me/announce"
MaxUploadRatio = -1 # Never remove based on ratio
MaxSeedingTime = 259200 # 72 hours
HitAndRunMode = "and"
MinSeedRatio = 1.0
MinSeedingTimeDays = 3
AddTags = ["RED", "music", "lossless"]
Example 5: Freeleech Torrents (Seed Forever)¶
[Radarr-Freeleech.Torrent.SeedingMode]
MaxUploadRatio = -1 # Never remove
MaxSeedingTime = -1 # Never remove
RemoveTorrent = -1 # Never remove
# Shared at qBit level
[[qBit.Trackers]]
Name = "Freeleech Tracker"
URI = "https://tracker.example.com/announce"
Priority = 10
AddTags = ["freeleech", "permanent-seed"]
Import Mode and Seeding¶
The importMode setting affects seeding behavior:
Copy Mode (Recommended for Seeding)¶
What happens:
- Download completes
- Arr copies files to library
- Original files remain in download folder
- Torrent continues seeding
Pros:
- Preserves torrents for seeding
- Meets tracker requirements
- Maintains ratio
Cons:
- Uses more disk space (2x)
- Slower import (copy operation)
Move Mode (Frees Disk Space)¶
What happens:
- Download completes
- Arr moves files to library
- Torrent can no longer seed (files missing)
- qBitrr removes torrent
Pros:
- Saves disk space
- Faster import (move operation)
Cons:
- Can't seed after import
- May violate private tracker rules
- Hit-and-run risk
Private Tracker Warning
Using importMode = "Move" on private trackers can result in:
- Hit-and-run warnings
- Ratio penalties
- Account suspension
- Permanent ban
Always use importMode = "Copy" for private trackers.
Tracker-Specific Recommendations¶
Private Movie Trackers¶
PassThePopcorn, BeyondHD, etc.
MaxUploadRatio = 1.0 # Minimum required
MaxSeedingTime = 432000 # 5 days
RemoveTorrent = 4 # Both conditions
importMode = "Copy"
Private TV Trackers¶
BTN, MTV, etc.
Private Music Trackers¶
RED, OPS, APL¶
MaxUploadRatio = 1.0
MaxSeedingTime = 259200 # 72 hours minimum
RemoveTorrent = 2 # Time-based (ratio harder for music)
importMode = "Copy"
Public Trackers¶
RARBG, YTS, EZTV, etc.
MaxUploadRatio = 1.0 # Be generous
MaxSeedingTime = 86400 # 1 day
RemoveTorrent = 3 # Either condition
importMode = "Move" # Save space
Monitoring Seeding¶
WebUI¶
View seeding status:
- Open
http://localhost:6969/ui - Navigate to Arr tab
- Check torrent status and ratio
qBittorrent¶
Check seeding in qBittorrent:
- Open qBittorrent WebUI
- View ratio, upload speed, seeding time
- Sort by ratio or seeding time
Logs¶
Monitor seeding removal in logs:
Example log output:
2025-11-27 14:00:00 - INFO - Torrent reached 2.0 ratio: The Matrix (1999)
2025-11-27 14:00:05 - INFO - Removing torrent (ratio met): The Matrix (1999)
2025-11-27 14:00:10 - INFO - Torrent seeded for 7 days: Inception (2010)
2025-11-27 14:00:15 - INFO - Removing torrent (time met): Inception (2010)
Troubleshooting¶
Torrents Not Removed¶
Symptom: Torrents continue seeding past limits
Solutions:
- Check RemoveTorrent setting:
- Verify limits are set:
MaxUploadRatio = 2.0 # Must not be -1
MaxSeedingTime = 604800 # Must not be -1
# MaxSeedingTime = "1w" # also valid
If RemoveTorrent is 1–4 but neither MaxUploadRatio nor MaxSeedingTime is set (both -1 or unset on SeedingMode and no positive tracker override), qBitrr will not remove torrents for seeding limits and will log a single warning per run. Set at least one limit to enable ratio/time-based removal.
Tracker rows with MaxSeedingTime = -1 / MaxUploadRatio = -1 (common WebUI defaults) do not disable a positive SeedingMode limit — -1 means no tracker override, not "force unlimited."
- Stalled seeds with almost no
seeding_time:
qBitrr's primary time clock is qBittorrent seeding_time (seconds actually spent seeding), not added_on. For stalled uploads only, qBitrr also counts how long it has observed the torrent in stalledUP (RemoveTorrent 2, 3, or the time half of 4). That observation window starts on the first stalled loop and resets if the torrent is queued, paused, stopped, or uploading. A long queue/pause followed by one stalledUP pass does not meet the limit. A qBitrr restart resets the window. HnR still blocks deletion until its own seeding-time / ratio rules are satisfied.
- Check import mode:
- Review logs:
Removed Too Early¶
Symptom: Torrents removed before meeting requirements
Solutions:
- Increase limits:
- Change removal condition:
- Check per-tracker overrides:
- Positive tracker
MaxSeedingTime/MaxUploadRatiooverride SeedingMode - Tracker
-1does not clear SeedingMode limits - Verify tracker URI matches exactly
Hit-and-Run Warnings¶
Symptom: Private tracker warnings about insufficient seeding
Solutions:
- Use Copy mode:
- Increase seeding requirements:
MaxUploadRatio = 1.5 # Higher than tracker minimum
MaxSeedingTime = 432000 # 5 days
RemoveTorrent = 4 # Require both
- Never remove:
- Check tracker rules:
- Review minimum seeding requirements
- Set qBitrr limits above minimums
Best Practices¶
1. Know Your Tracker Requirements¶
Before configuring:
- Read tracker rules carefully
- Note minimum ratio requirements
- Note minimum seeding time
- Check hit-and-run policies
2. Set Limits Above Minimums¶
# Tracker requires 1.0 ratio and 48 hours
# Set qBitrr to 1.5 ratio and 72 hours for safety margin
MaxUploadRatio = 1.5
MaxSeedingTime = 259200 # 72 hours
3. Use Copy Mode for Private Trackers¶
Never risk hit-and-runs.
4. Test with Public Trackers First¶
- Configure public tracker seeding first
- Monitor for a few days
- Verify removal works correctly
- Then apply to private trackers
5. Monitor Disk Space¶
With importMode = "Copy":
6. Use Per-Tracker Rules for Mixed Setups¶
Different trackers have different requirements - define them once at the qBit level:
# Conservative global default
[Radarr-Movies.Torrent.SeedingMode]
MaxUploadRatio = 2.0
MaxSeedingTime = 604800
# Shared trackers — inherited by ALL Arr instances
[[qBit.Trackers]]
Name = "Private1"
URI = "https://tracker.private1.com/announce"
MaxUploadRatio = 1.5
MaxSeedingTime = 432000
[[qBit.Trackers]]
Name = "Public1"
URI = "udp://tracker.public1.com/announce"
MaxUploadRatio = 1.0
MaxSeedingTime = 86400
Hit and Run Protection¶
Hit and Run (HnR) is a rule enforced by private trackers: after downloading a torrent you must seed it back to a minimum ratio (typically 1:1) or for a minimum period of time (often 4-10 days depending on user class). Violating HnR rules can result in warnings, ratio penalties, or permanent bans.
qBitrr's HnR protection acts as a safety layer on top of the existing seeding limits. Even when RemoveTorrent conditions are met, HnR protection will block removal until the tracker's seeding obligations are satisfied. HnR settings are configured per-tracker using the fields documented in Tracker Fields above.
How It Works¶
- Full downloads (100% complete): HnR clears when either
MinSeedRatioORMinSeedingTimeDaysis met - Partial downloads (>=
HitAndRunMinimumDownloadPercent% but <100%): HnR clears only whenHitAndRunPartialSeedRatiois met (time does not apply) - Downloads below
HitAndRunMinimumDownloadPercent% (default 10%): Not subject to HnR (most trackers don't count these) TrackerUpdateBuffer: Extra seconds subtracted from seeding time to account for tracker stats lag (~30 min behind the client)
When HitAndRunMode = "disabled" (default), this rule supplies no clearance requirements. Private torrents still need verifiable clearance from another applicable rule.
No automatic bypass: Unregistered, unauthorized, missing, or unhealthy tracker responses do not prove clearance. qBitrr preserves the torrent when its HnR obligations or tracker accounting cannot be verified. Tracker removal also requires clearance so cleanup cannot erase an outstanding obligation.
When a torrent has multiple trackers, every matching tracker with HnR enabled must clear. Priority affects sorting and ordinary limits only.
TorrentLeech Example¶
TorrentLeech enforces HnR with seeding time requirements based on user class:
| User Class | Minimum Seed Time |
|---|---|
| Registered | 10 days |
| Power User | 8 days |
| Super User | 7 days |
| Extreme User | 6 days |
| TL God | 4 days |
| VIP User | No minimum |
Conservative setup (for Registered class):
[Radarr-Movies.Torrent.SeedingMode]
MaxUploadRatio = 2.0
MaxSeedingTime = 1296000 # 15 days
RemoveTorrent = 3 # Remove when either met
# Defined once at qBit level — shared by all Arr instances
[[qBit.Trackers]]
Name = "TorrentLeech"
URI = "tracker.torrentleech.org"
Priority = 10
HitAndRunMode = "and"
MinSeedRatio = 1.0
MinSeedingTimeDays = 10 # Registered class requirement
HitAndRunMinimumDownloadPercent = 10 # TL counts HnR at >=10% downloaded
HitAndRunPartialSeedRatio = 1.0
TrackerUpdateBuffer = 3600 # 60 min buffer for tracker lag
Aggressive setup (for TL God class):
[Radarr-Movies.Torrent.SeedingMode]
MaxUploadRatio = 1.5
MaxSeedingTime = 604800 # 7 days
RemoveTorrent = 3
[[qBit.Trackers]]
Name = "TorrentLeech"
URI = "tracker.torrentleech.org"
Priority = 10
HitAndRunMode = "and"
MinSeedRatio = 1.0
MinSeedingTimeDays = 4 # TL God class requirement
TrackerUpdateBuffer = 3600
Multi-tracker setup (different trackers, different rules):
[Radarr-Movies.Torrent.SeedingMode]
MaxUploadRatio = 2.0
MaxSeedingTime = 1296000
RemoveTorrent = 3
# TorrentLeech - strict HnR (shared by all Arr instances)
[[qBit.Trackers]]
Name = "TorrentLeech"
URI = "tracker.torrentleech.org"
Priority = 10
HitAndRunMode = "and"
MinSeedRatio = 1.0
MinSeedingTimeDays = 10
TrackerUpdateBuffer = 3600
# IPTorrents - shorter requirement
[[qBit.Trackers]]
Name = "IPTorrents"
URI = "tracker.iptorrents.com"
Priority = 8
HitAndRunMode = "and"
MinSeedRatio = 1.0
MinSeedingTimeDays = 4
TrackerUpdateBuffer = 3600
# Public tracker - no HnR
[[qBit.Trackers]]
Name = "Public"
URI = "udp://open.stealth.si:80/announce"
Priority = 1
HitAndRunMode = "disabled"
See Also¶
- qBittorrent Configuration - qBittorrent setup
- Instant Imports - Import behavior and seeding
- Radarr Configuration - Radarr instance setup
- Sonarr Configuration - Sonarr instance setup
- Lidarr Configuration - Lidarr instance setup
- Config File Reference - All configuration options
Mandatory removal clearance¶
Every qBitrr torrent removal and deletion of torrent-owned content requires current HnR clearance. This covers custom-format rejection, failed categories, stalled downloads, missing files, import failures, and excluded-file cleanup. Manual categorization and dead-tracker messages cannot override HnR.
All applicable client/category and tracker obligations must clear. Tracker priority controls sorting and ordinary limits, not which HnR obligations apply. Existing AND/OR rules, partial-download thresholds, ratios, durations, and accounting buffers retain their meanings. Verified public torrents without configured obligations remain eligible for normal removal policies; private or unidentified torrents without verifiable requirements remain protected.
Verified public torrents using only DHT/PeX can also clear without announce trackers when the tracker list was retrieved successfully. Any applicable category HnR rules and ordinary removal limits still apply. Unavailable tracker information continues to block removal.
qBitrr refreshes torrent and tracker information at the final deletion boundary and on retries. Blocked actions stay pending for a later processing cycle. If client identity or shared-file ownership is ambiguous, content and torrents are preserved. Arr receives queue-only cleanup after qBitrr confirms client removal; it is not independently instructed to remove the torrent. Deliberate queue-only workflows that leave the torrent seeding remain supported.
Metadata downloads (metaDL / forcedMetaDL) with zero downloaded payload bytes, zero progress, and a successfully retrieved empty file list have no payload to protect. They can clear HnR without privacy or tracker metadata, but minimum age, StalledDelay, ignored tags, and removal policy still apply. qBitrr rechecks this condition before removing the client entry with file deletion disabled. Arr queue cleanup and blocklisting follow confirmed client removal as usual. These empty magnets do not block cleanup of other torrents sharing their save folder.
On older qBittorrent versions without a privacy property, qBitrr uses the DHT/PeX/LSD tracker entries to verify privacy. If privacy cannot be verified, HnR clearance is blocked unless the verified empty-magnet shortcut applies. Unknown downloaded bytes prevent that shortcut; they do not independently block ordinary HnR clearance. A failed file-list lookup during metadata-only verification blocks that clearance attempt. Ordinary HnR clearance does not read the file list, though content deletion still requires verified file ownership. An empty file list alone does not authorize removal. An unrelated metadata download in a separate save folder does not block content cleanup. Ordinary tracker limits keep Arr overrides by URI; HnR obligations from both levels still apply.
Completed file-cleanup entries are discarded even if valid media remains for seeding. Only blocked cleanup is retried. Confirmed client removals retain their Arr queue cleanup and replacement-search work across processing cycles if Arr is unavailable; these retries are held in memory until they succeed or qBitrr restarts.
Blocked import-error paths also survive warning refreshes, including when Arr no longer reports the original warning. Existing paths are reconsidered under current removal protections on each cleanup pass.
If a client deletion response is lost, qBitrr retains the attempted torrent identity and original Arr queue/media IDs. A later successful lookup must confirm absence from every targeted client before Arr follow-up work proceeds. An unavailable client keeps the confirmation pending. A fresh lookup that still finds the torrent invalidates the old attempt, including when a retry refuses deletion, so a later unrelated removal cannot release stale Arr follow-up work. These records are held in memory and clear on restart.
Only Arr sections with Managed = true participate in removal ownership. Exact matches and the longest eligible prefix are resolved across both Arr and qBit-managed categories, so a qBit-managed child does not inherit its parent Arr's removal policy. The global minimum age uses the effective environment override, including the fallback for clients without an explicit age. Explicit client, category, and Arr age protections still apply.
A protection log includes the requested reason, client, torrent, and blocking condition. Configure the real tracker obligations before expecting private torrents to be removed. This enforcement covers qBitrr actions; other applications and qBittorrent's own global removal actions operate independently.