All apps · 0 apps
Rangarr
Docker app from JudoChinX's Repository
Overview
Rangarr is a lightweight orchestration service that automates and staggers media searches across multiple *arr instances (Radarr, Sonarr, Lidarr). It helps keep your library complete without overwhelming your indexers or API limits.
Features:
- Multi-Instance Support: Manage Radarr, Sonarr, and Lidarr from a single service.
- Smart Staggering: Prevents "thundering herd" issues by spacing out search requests.
- Proportional Interleaving: Balanced searching between missing items and upgrades.
- Weighted Distribution: Prioritize specific instances.
- No Telemetry: Only communicates with the *arr instances you configure.
Note: By default, this template is configured using environment variables. You can also use a config.yaml by mapping the /app/config path and changing RANGARR_CONFIG_SOURCE to "file".
Readme
View on GitHubRangarr
Rangarr is a lightweight orchestration service that automates and staggers media searches across multiple *arr instances (Radarr, Sonarr, Lidarr, Readarr, Whisparr). It helps keep your library complete without overwhelming your indexers or API limits.
Key Features
- Multi-Instance Support: Manage Radarr, Sonarr, Lidarr, Readarr, Whisparr v2, and Whisparr v3 from a single service.
- Global Slot Allocation: Efficiently distributes search slots across all instances, ensuring no search capacity is wasted.
- Instance Interleaving: Spreads search pressure evenly across multiple *arr instances and shared indexers throughout the cycle.
- Smart Staggering: Prevents "thundering herd" issues by spacing out search requests.
- Proportional Interleaving: Balanced searching between missing items and upgrades within each instance.
- Weighted Distribution: Prioritize specific instances (e.g., prioritize Movies over Music).
- Season Pack Support: Group Sonarr and Whisparr v2 searches by season, with configurable count or ratio thresholds and automatic fallback to individual episode searches for seasons that are still airing.
- Independent Scheduling: Run missing item searches and upgrade searches on separate, configurable intervals — poll for missing content aggressively while checking for upgrades less frequently, or any combination that fits your indexer usage.
- Retry Logic: Configurable skip windows for recently searched items, with independent retry intervals for missing and upgrade searches, plus automatic startup connection retries (3 attempts, 10-second delay) to handle Docker Compose race conditions.
- Custom Format Score Awareness: Finds Radarr, Sonarr, Whisparr v2, and Whisparr v3 items below their custom format score target — candidates *arr's Cutoff Unmet endpoint silently omits.
- Tag Filtering: Restrict searches to items with specific *arr tags, or exclude tagged items entirely.
- Active Hours: Restrict searches to a configured time window (e.g., overnight only) to avoid peak indexer load.
- Flexible Configuration: Configure via
config.yamlwith${ENV_VAR}expansion for secrets, or skip the file entirely and use environment variables only. - No External Connections: Only communicates with the *arr instances you configure. No telemetry, no phone-home, no external services.
Why Rangarr?
Some tools in this space have done things their users didn't know about — phoning home, collecting data, making connections that were never disclosed. Rangarr exists as a direct response to that. It talks to the *arr instances you configure. It talks to nothing else.
The codebase is intentionally small. There is no database, no persistence layer. If you want to verify what it does, SECURITY.md documents the exact threat model, and the source itself is four files you can read in an afternoon.
Quick Start
The fastest way to get started is with Docker Compose.
# 1. Get the configuration
curl -O https://raw.githubusercontent.com/JudoChinX/rangarr/main/config.example.yaml
curl -O https://raw.githubusercontent.com/JudoChinX/rangarr/main/compose.example.yaml
mv config.example.yaml config.yaml
mv compose.example.yaml compose.yaml
chmod 644 config.yaml # Required: container runs as UID 65532 (nonroot), not your user
# 2. Edit config.yaml with your *arr API keys and hostnames
nano config.yaml
# 3. Start with dry_run: true to verify config before triggering real searches
# Set dry_run: false in config.yaml once logs look correct, then restart
docker compose up -d
Without Compose, use docker run directly:
docker run -d \
--name rangarr \
--restart unless-stopped \
-v ./config.yaml:/app/config/config.yaml:ro \
judochinx/rangarr:latest
See the User Guide for full details including Docker networking.
A minimal config.yaml to get you running:
global:
interval: 3600 # Run every hour
stagger_interval_seconds: 30 # Wait 30s between searches
missing_batch_size: 20 # Search 20 missing items per cycle (0=disabled, -1=unlimited)
upgrade_batch_size: 10 # Search 10 upgrade-eligible items per cycle (0=disabled, -1=unlimited)
max_queue_size: 0 # Skip/limit searches when the download queue is busy (0=disabled)
interleave_instances: true # Alternate between instances during search
search_order: last_searched_ascending # Prioritize items not searched recently
instances:
Radarr:
type: radarr
host: "http://radarr:7878"
api_key: "YOUR_API_KEY"
enabled: true
Quick Start (Environment Variables Only)
If you prefer not to use a config.yaml file, you can configure Rangarr entirely through environment variables.
docker run -d \
--name rangarr \
--restart unless-stopped \
-e RANGARR_CONFIG_SOURCE=env \
-e RANGARR_GLOBAL_INTERVAL=3600 \
-e RANGARR_INSTANCE_0_NAME=MyRadarr \
-e RANGARR_INSTANCE_0_TYPE=radarr \
-e RANGARR_INSTANCE_0_URL=http://radarr:7878 \
-e RANGARR_INSTANCE_0_API_KEY=YOUR_API_KEY \
judochinx/rangarr:latest
Documentation
- User Guide — Setup, configuration, Docker networking, and troubleshooting.
- Technical Audit — Architecture, security model, and design philosophy.
- Security & Trust — What Rangarr does and doesn't do, how to verify it, and how to report vulnerabilities.
- Contributing — How to help improve Rangarr.
- Roadmap — Planned and in-progress features.
Related Projects
- Killarr — Detects and removes stalled downloads from Radarr, Sonarr, and Lidarr queues. Shares the same
config.yamlformat as Rangarr — both tools can run side-by-side from a single config file.
Development Transparency
AI tooling was used to assist with development tasks in this project. The architecture — no database, no persistence layer, three files, two dependencies — was designed by the author. All code is human-reviewed before inclusion.
License
MIT License — see LICENSE for details.
Install Rangarr on Unraid in a few clicks.
Find Rangarr in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Download Statistics
Total Downloads Over Time
Related apps
Explore more like this
Explore allLinks
Details
judochinx/rangarr:latestRuntime arguments
- Network
bridge- Privileged
- false
Template configuration
Set to 'env' to use environment variables or 'file' to use a config.yaml mount.
- Target
- RANGARR_CONFIG_SOURCE
- Default
- env
- Value
- env
How often to run the search cycle (e.g., 3600 for every hour).
- Target
- RANGARR_GLOBAL_INTERVAL
- Default
- 3600
- Value
- 3600
If true, Rangarr will log what it would search without actually triggering the search.
- Target
- RANGARR_GLOBAL_DRY_RUN
- Default
- false
- Value
- false
Seconds to wait between individual search requests.
- Target
- RANGARR_GLOBAL_STAGGER_INTERVAL_SECONDS
- Default
- 30
- Value
- 30
Max missing items to search per cycle (0 = disabled, -1 = unlimited).
- Target
- RANGARR_GLOBAL_MISSING_BATCH_SIZE
- Default
- 20
- Value
- 20
Max upgrade-eligible items to search per cycle (0 = disabled, -1 = unlimited).
- Target
- RANGARR_GLOBAL_UPGRADE_BATCH_SIZE
- Default
- 10
- Value
- 10
Set your timezone for log timestamps.
- Target
- TZ
- Default
- UTC
- Value
- UTC
Set the log level (DEBUG, INFO, WARNING, ERROR).
- Target
- LOG_LEVEL
- Default
- INFO
- Value
- INFO
Priority for choosing items (alphabetical_ascending, alphabetical_descending, last_added_ascending, last_added_descending, last_searched_ascending, last_searched_descending, random, release_date_ascending, release_date_descending).
- Target
- RANGARR_GLOBAL_SEARCH_ORDER
- Default
- last_searched_ascending
- Value
- last_searched_ascending
Days to wait before searching the same item again (0 to disable).
- Target
- RANGARR_GLOBAL_RETRY_INTERVAL_DAYS
- Default
- 30
- Value
- 30
Comma-separated list of *arr tag names to include. Only items with at least one matching tag will be searched. Leave blank to include all items.
- Target
- RANGARR_GLOBAL_INCLUDE_TAGS
Comma-separated list of *arr tag names to exclude. Items with any matching tag will be skipped. Leave blank to exclude nothing.
- Target
- RANGARR_GLOBAL_EXCLUDE_TAGS
Display name for this instance.
- Target
- RANGARR_INSTANCE_0_NAME
Must be 'radarr'.
- Target
- RANGARR_INSTANCE_0_TYPE
- Default
- radarr
- Value
- radarr
URL to your Radarr instance (use Docker IP or hostname).
- Target
- RANGARR_INSTANCE_0_URL
- Default
- http://radarr:7878
- Value
- http://radarr:7878
Your Radarr API Key.
- Target
- RANGARR_INSTANCE_0_API_KEY
Display name for this instance.
- Target
- RANGARR_INSTANCE_1_NAME
Must be 'sonarr'.
- Target
- RANGARR_INSTANCE_1_TYPE
- Default
- sonarr
- Value
- sonarr
URL to your Sonarr instance (use Docker IP or hostname).
- Target
- RANGARR_INSTANCE_1_URL
- Default
- http://sonarr:8989
- Value
- http://sonarr:8989
Your Sonarr API Key.
- Target
- RANGARR_INSTANCE_1_API_KEY
If true, Sonarr will search for missing/upgrade items as season packs when multiple episodes are needed.
- Target
- RANGARR_GLOBAL_SEASON_PACKS
- Default
- false
- Value
- false
Display name for this instance.
- Target
- RANGARR_INSTANCE_2_NAME
Must be 'lidarr'.
- Target
- RANGARR_INSTANCE_2_TYPE
- Default
- lidarr
- Value
- lidarr
URL to your Lidarr instance (use Docker IP or hostname).
- Target
- RANGARR_INSTANCE_2_URL
- Default
- http://lidarr:8686
- Value
- http://lidarr:8686
Your Lidarr API Key.
- Target
- RANGARR_INSTANCE_2_API_KEY
Mount point for config.yaml (only needed if RANGARR_CONFIG_SOURCE is 'file').
- Target
- /app/config
- Default
- /mnt/user/appdata/rangarr
- Value
- /mnt/user/appdata/rangarr