RescanArr is a lightweight service that periodically triggers Radarr searches for a rotating subset of movies in a large library.
It is designed for large Radarr libraries where manual rescans or Radarr’s built-in search behavior becomes inefficient.
RescanArr guarantees that every eligible movie eventually receives a search without repeatedly searching the same titles within a single sweep cycle.
RescanArr operates using sweep cycles.
A sweep cycle works like this:
- Fetch the entire Radarr movie library
- Identify base eligible movies
- Exclude movies already processed in the current cycle
- Randomly select a subset
- Trigger Radarr searches
- Apply a
checkedtag - Continue until no selectable movies remain
- Remove
checkedfrom all currently checked movies - Immediately start a new sweep cycle
This guarantees:
- No repeated searches during a cycle
- Full coverage of eligible movies
- Automatic cycle reset
- Continuous operation
A movie is base eligible if:
monitored == truestatus == released- it does not have the ignore tag
A movie is selectable if:
- it is base eligible
- it does not have the checked tag
When the selectable pool reaches zero while base eligible movies still exist, RescanArr resets the sweep by removing the checked tag from all currently checked movies in the library, then continues in the same run.
- Randomized movie selection
- Sweep cycle search coverage
- Automatic sweep reset
- Ignore tag support
- Cron-based scheduling
- Radarr API integration
- Config reload support
- Non-root container runtime
- Environment variable support (
PUID,PGID,TZ) - File logging with rotation
- Docker / Portainer stdout logging
Published image:
ghcr.io/brodybuster/rescanarr
Example tags:
ghcr.io/brodybuster/rescanarr:latestghcr.io/brodybuster/rescanarr:0.1.0
Create a configuration directory:
mkdir -p configCreate config/config.yaml:
radarr_url: "http://radarr:7878"
api_key: "YOUR_API_KEY"
checked_tag_name: "checked"
ignore_tag_name: "ignore"
count: 3
dry_run: false
cron: "*/20 * * * *"
request_timeout: 60Example docker-compose.yml:
services:
rescanarr:
image: ghcr.io/brodybuster/rescanarr:latest
container_name: rescanarr
restart: unless-stopped
environment:
PUID: "1000"
PGID: "1000"
TZ: "America/New_York"
volumes:
- ./config:/config
logging:
driver: json-file
options:
max-size: "5m"Start the container:
docker compose up -d| Variable | Description |
|---|---|
PUID |
Runtime user ID |
PGID |
Runtime group ID |
TZ |
Timezone inside the container |
Example:
environment:
PUID: "1000"
PGID: "1000"
TZ: "America/New_York"| Option | Description |
|---|---|
radarr_url |
Radarr base URL |
api_key |
Radarr API key |
checked_tag_name |
Tag used to track sweep progress |
ignore_tag_name |
Tag used to exclude movies from sweeps |
count |
Number of movies selected each run |
dry_run |
Simulate actions without modifying Radarr |
cron |
Cron schedule for sweep runs |
request_timeout |
Radarr API timeout in seconds |