The *arr stack is a pipeline of four small web apps: Prowlarr manages your search sources, Sonarr and Radarr decide what to grab and how to rename it, a download client does the actual fetching, and Jellyseerr gives everyone else in the house a Netflix-style request page. None of the pieces is complicated on its own — the confusion comes from tutorials that assume you already know how they talk to each other. Wired in the right order, the whole stack takes about an hour and roughly 400MB of RAM.
Who does what
| App | Job | Default port |
|---|---|---|
| Prowlarr | Holds your indexers once, syncs them to Sonarr and Radarr | 9696 |
| Sonarr | TV: monitors series, grabs new episodes, renames on import | 8989 |
| Radarr | Movies: the same job, film-shaped | 7878 |
| qBittorrent / SABnzbd | Download client: transfers the actual files | 8080 / 8081 |
| Jellyseerr | Request portal tied to your Jellyfin users | 5055 |
Two ideas trip up every newcomer. First, Sonarr and Radarr never download anything themselves — they are search-and-librarian tools that hand work to the download client and file the results afterwards. Second, indexers (where to search) and download clients (how to fetch) are separate concepts, and Prowlarr only manages the first. There are further siblings — Lidarr for music, Bazarr for subtitles — but they're all the same shape; learn the TV/movie pair and the rest is copy-paste.
How one request flows
- Someone requests a series in Jellyseerr.
- Jellyseerr hands it to Sonarr with a root folder and a quality profile.
- Sonarr queries every indexer Prowlarr has synced to it and scores the candidate releases against that profile.
- The winning release goes to the download client.
- On completion, Sonarr imports the file — hardlinks it into the library, renamed to a clean
Show/Season 01/Show - S01E01.mkvscheme. - Jellyfin picks it up on the next library scan, and Jellyseerr flips the request to "available".
Once you can recite that flow, every settings page in the stack makes sense.
One /data mount, or your disk fills twice
The single most common mistake is mounting downloads and media as two different Docker volumes. Hardlinks can't cross filesystems or separate bind mounts, so every import silently becomes a full copy: double the disk usage, plus gigabytes of pointless IO on each import. Use one shared tree:
/data
├── torrents/ # download client writes here
├── usenet/
└── media/
├── tv/ # Sonarr's root folder
└── movies/ # Radarr's root folder
Every container mounts the same /data:/data, and the download client's save paths live inside that tree. A typical service definition:
services:
sonarr:
image: lscr.io/linuxserver/sonarr:latest
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Dublin
volumes:
- ./config/sonarr:/config
- /data:/data
ports:
- "8989:8989"
restart: unless-stopped
Repeat the pattern for the other four services. The folder structure and the reasoning behind it are documented exhaustively at TRaSH Guides, the community's canonical reference, and the official Servarr wiki covers each app's settings page by page. When Sonarr shows an import as "copied" instead of "hardlinked", your mounts are wrong — fix it before the disk teaches you the same lesson.
Wire it up in this order
Prowlarr first: add your indexers once, then use Settings → Apps to register Sonarr and Radarr by URL and API key. Prowlarr pushes every indexer to both and keeps them synced — the days of configuring twelve indexers twice are over. Next, add the download client inside Sonarr and Radarr under Settings → Download Clients. Jellyseerr comes last, pointing at Jellyfin for sign-in and at Sonarr/Radarr for fulfilment. Do it in reverse and you spend the evening testing against components that don't exist yet, which is where most "nothing works" posts come from.
Keep it legal
The stack is content-neutral automation: it searches whatever indexers you give it, and that part is entirely on you. Pointed at Usenet or torrent indexers carrying public-domain material, Creative Commons releases, and content you hold rights to, it's a tidy DVR. Pointed elsewhere, it isn't, and no framing about personal backups changes what your indexer list says. Know your jurisdiction and make your own call — I'm describing plumbing, not granting permission.
Quality profiles: pick a lane and stop
The profile system can absorb unlimited hours, and almost none of them pay. The pragmatic setup: a single "HD-1080p" profile with the cutoff at 1080p WEB-DL, upgrades allowed until the cutoff and no further. WEB-DL files are consistent, well-encoded, and predictable in size — figure 1.5–3GB per TV episode and 5–10GB per film. A 4K remux runs 50–80GB per film and commits you to thinking hard about transcoding hardware; skip it until your Jellyfin setup and your storage budget are ready. Custom formats — the scoring language TRaSH Guides documents — are genuinely powerful, and genuinely the deep end. Ignore them for the first few months.
Do set size limits per quality (Settings → Quality in both apps). One mislabelled 90GB "1080p" release will otherwise win a search someday, and you'll find out when the disk-full alerts start.
What I'd do
One evening, in this order: Prowlarr, then Sonarr and Radarr, then the download client, then Jellyseerr — all mounting a single /data. One 1080p WEB-DL profile with sane size caps. Add exactly one show and watch the full request-to-playable flow complete before you bulk-import anything; debugging the pipeline with one file in flight is easy, and with two hundred it's misery. Leave Lidarr, custom formats, and 4K for the month when the core pair has become boring — which is the whole point of the stack.