Excludarr
Excludarr is a rule engine for your Radarr and Sonarr libraries. You write rules (conditions plus an action) in YAML, and Excludarr deletes, unmonitors, monitors, tags or import-excludes the items that match. "Available on my streaming providers" (JustWatch) is one condition among many. Others use Radarr/Sonarr data, Tautulli watch history and Seerr requests.
- Radarr and Sonarr plus a JustWatch locale are enough. Tautulli, Seerr and Plex are optional.
- Rules read like a sentence:
any/all/notnest freely, andunlesslists exceptions. - Items are matched on TMDB/IMDB/TVDB IDs only. Titles are for display.
- Unknown data (failed lookup, no request record, ...) never causes an action.
Requirements
Python 3.12+ or Docker, Radarr v3+/v5 and/or Sonarr v4.
Installation
pip install excludarr
Docker:
docker run --rm -v ./config:/config ghcr.io/haijeploeg/excludarr run
The image reads /config/excludarr.yml (EXCLUDARR_CONFIG) and keeps its SQLite database in
/config. With CRON_MODE=true it runs crond with /config/crontab (falling back to a
built-in crontab that runs excludarr run -y daily at 02:00). See
.examples/docker-compose-example.yml.
cron starts jobs without the container environment, so the entrypoint writes it to
/etc/excludarr/env.sh. A custom crontab must source that file first and can send output to the
container log:
0 2 * * * . /etc/excludarr/env.sh && excludarr run -y > /proc/1/fd/1 2>&1
Configuration
Copy .examples/excludarr-example.yml to excludarr.yml. The config file is the first of:
--config, $EXCLUDARR_CONFIG, ./excludarr.yml, ~/.config/excludarr/excludarr.yml,
/config/excludarr.yml, /etc/excludarr/excludarr.yml.
profile:localeandproviders, the defaults for everystreamingcondition. List the providers withexcludarr providers list --locale nl_NL.integrations:radarr,sonarr,tautulli,seerr,plex. Reference secrets as dollar-brace environment variables (${RADARR_API_KEY}) inside string values. Every placeholder in a value must be set; placeholders in comments are ignored.rules: run in file order.
Rule fields: name, target (radarr|sonarr), level (Sonarr: series|season|episode,
default season), when, unless, action, preview (default true), grace_period
(default 0; <int>h|d|w), leaving_soon_collection, enabled.
Actions: delete, delete_files (keeps the entry so a monitor rule can bring it back),
unmonitor, monitor (search: true triggers a search), tag (tag: name),
import_exclusion. delete accepts delete_files and import_exclusion options.
delete_files and monitor rules work as a pair: delete_files removes the files and
unmonitors the entry, and a later monitor rule (for example monitored: false and
not: { streaming: my_providers }) monitors and searches it again. That monitor rule also
matches anything you unmonitored by hand, so give it an unless. Use delete for items that
must not come back: the entry is gone, so no monitor rule can match it.
Conditions: added_more_than, added_less_than, size_more_than, size_less_than, tag,
genre, year, rating, monitored, has_file, status (Sonarr), keep_latest (Sonarr),
streaming, and with Tautulli not_watched_for, watched_within, watched_by, play_count,
fully_watched, and with Seerr requested_by, requested_more_than, requested_less_than
and requester_watched_more_than. excludarr config validate describes each rule in words.
Safety workflow
- Preview. New rules have
preview: true.excludarr run(orexcludarr preview) only reports the matching items, totals, and per-condition match and unknown counts. - Grace. Set
preview: falseand optionally agrace_period. Matches enter a queue (excludarr queue) and, withleaving_soon_collection: true, a Plex collection. When due they are re-evaluated, and only still-matching items are executed. Rescue an item withexcludarr rescue KEY --rule NAME --once|--forever. - Automatic. With
grace_period: 0andpreview: false, matches are executed on every run, and each action is written toexcludarr history.
Unknown condition results never lead to an action. Run excludarr run --interactive to
skip individual items from a preview.
Commands
excludarr [--config PATH] [--debug] [--version] COMMAND
run [--rule NAME] [--interactive] [-y] [--sort title|size|date]
preview [--rule NAME] [--sort title|size|date]
queue [--sort title|size|date]
rescue ITEM_KEY --rule NAME [--forever | --once]
history [--limit N]
exceptions list | remove ITEM_KEY --rule NAME
providers list [--locale nl_NL]
config validate
Verify against your setup
The request that adds items to the Plex "Leaving Soon" collection is not verified against a real
Plex server. Try a rule with preview: false, a long grace_period and
leaving_soon_collection: true on a few items before relying on it.
Migrating from v1
v2 is a breaking release. v1 configs, the radarr/sonarr commands and the env-var based Docker
configuration are gone, because rules do not fit in environment variables.
general.localeandgeneral.providersbecomeprofile.localeandprofile.providers.radarr/sonarrurl and api_key move underintegrations. Excluded titles/tags become anunlessblock withtag:. Titles are no longer matched.radarr exclude/sonarr excludebecome a rule withwhen: { streaming: my_providers }and an action such asunmonitorordelete_files.radarr re-add/sonarr re-addbecome a rule withaction: monitorandwhen: { all: [ { monitored: false }, { not: { streaming: my_providers } } ] }.- The TMDB API key and
fast_searchare gone. Mount/configinstead of setting env vars in Docker, and callexcludarr run -yfrom the crontab.
Metadata
Release files for excludarr 2.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| excludarr-2.0.1.tar.gz | 87.6 kB | With provenance | Details for excludarr-2.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| excludarr-2.0.1-py3-none-any.whl | Python 3 | none | any | Details for excludarr-2.0.1-py3-none-any.whl |
Total release size: 127.9 kB
Release files / excludarr-2.0.1.tar.gz
| Download URL | excludarr-2.0.1.tar.gz |
|---|---|
| Size | 87.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0db7d5d0447664b7602906d1bce78336dd32745721295082606e4494de286f37
|
|
BLAKE2b-256 checksum How to use checksums |
e7b23cdc44401baccd12d9938a71546f539ee9ff58afc0e57a75706eb9064371
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logRelease files / excludarr-2.0.1-py3-none-any.whl
| Download URL | excludarr-2.0.1-py3-none-any.whl |
|---|---|
| Size | 40.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ecbe2038dd36198e9fb0db5f585f7b2e1b5fd5d979641e55eaa296d8ece5ff57
|
|
BLAKE2b-256 checksum How to use checksums |
2068ed3e3543e87a4542857477e5965f4f9a4a0f8decd501d465e49d9aa29c07
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logSecurity for excludarr 2.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for excludarr-2.0.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.