arr/blocklists
Curated blacklist and whitelist for the ARR media stack. The blacklist is synced automatically from upstream Cleanuparr and stripped of anything listed in the locally-maintained whitelist, so consumers like qBittorrent and Cleanuparr can point at a single raw URL per list and stay in sync.
See the wiki for full technical reference:
- Sync
-- three-way merge, whitelist exclusion,
.prevsnapshot, edge cases - Lists -- the two-file model, pattern semantics, maintaining the whitelist
- Consumers -- qBittorrent and Cleanuparr integration, raw URLs, recommended modes
- CI and Workflow -- scheduled Gitea Actions job, manual dispatch, commit behaviour
How it works
The repository contains two data files:
| File | Role | Source |
|---|---|---|
blacklist |
Extensions blocked by downloaders and file cleaners | Synced from upstream, with the whitelist subtracted |
whitelist |
Extensions that must never be blocked or deleted | Locally maintained |
On every scheduled run the sync script:
- Fetches the current upstream blacklist from Cleanuparr.
- Detects any manual additions made directly to
blacklist(three-way merge againstblacklist.prev). - Subtracts every entry listed in
whitelist. - Writes the result back to
blacklistand updatesblacklist.prev.
The whitelist is the single source of truth for "what I want kept." Adding
an extension to whitelist removes it from blacklist on the next sync
and prevents consumers from blocking or deleting it. See
Sync for the full algorithm.
Prerequisites
- A consumer that reads a remote text file of glob patterns (qBittorrent excluded file names, Cleanuparr blacklist/whitelist sync, etc.)
- Network access from that consumer to
git.hisp.no
File structure
| Path | Purpose |
|---|---|
blacklist |
Merged output: upstream blacklist minus the whitelist. Consumer-facing |
blacklist.prev |
Snapshot of the last upstream fetch. Baseline for the three-way merge. Do not edit |
whitelist |
Locally-maintained allow list. Edit directly to add or remove entries |
scripts/merge_blocklists.py |
Sync script executed by the scheduled workflow |
.gitea/workflows/sync.yml |
Scheduled Gitea Actions workflow |
Usage
Point your consumer at the raw URL of the file it should use.
qBittorrent
qBittorrent has no whitelist feature, so it consumes the blacklist directly. Set the excluded file names list (Options -> Downloads -> Excluded file names) to:
https://git.hisp.no/arr/blocklists/raw/branch/main/blacklist
Because the whitelist is already subtracted from this file, any extension
you add to whitelist stops being blocked by qBittorrent on the next sync.
Cleanuparr
Cleanuparr supports both blacklist and whitelist modes. Use whichever matches your setup:
- Blacklist mode -- point at the same
blacklistraw URL as qBittorrent. - Whitelist mode -- point at the
whitelistraw URL:
https://git.hisp.no/arr/blocklists/raw/branch/main/whitelist
See Consumers for recommended mode per feature.
Maintaining the whitelist
Edit whitelist directly in Gitea or via a local clone. One glob pattern
per line, sorted, no blank lines. Patterns are matched against the blacklist
with exact-string set subtraction:
*.srtinwhitelistremoves*.srtfromblacklist.*sample.srtinblacklistis not affected by*.srtinwhitelist. Sample-file patterns are preserved because exact-string subtraction only removes identical entries.
See Lists for the full pattern rules and examples.
Maintaining the blacklist
Most blacklist maintenance happens through the whitelist (above). To add
an entry that upstream Cleanuparr does not block -- a tracker-specific junk
file, a new malware extension, anything else upstream missed -- edit
blacklist directly in Gitea, add the line, commit. The next sync run
detects the new line as a manual local addition and preserves it across
every subsequent sync.
To remove an entry, use whitelist instead. Deleting a line from
blacklist does not work as a removal mechanism: the next sync re-adds it
from upstream. Removals must go through the whitelist.
See Lists for the full rules and worked examples.
Sync schedule
The Gitea Actions workflow runs every 7 days at 04:00 UTC and on manual dispatch. Each run:
- Executes
scripts/merge_blocklists.py. - Commits
blacklistandblacklist.previf either changed. - Pushes the commit to
main.
See CI and Workflow for workflow details and manual dispatch instructions.
Upstream source
The blacklist is sourced from:
https://raw.githubusercontent.com/Cleanuparr/Cleanuparr/main/blacklist