thenug.net

the arr stack explained - sonarr, radarr, prowlarr, jellyfin setup guide

add a show to Sonarr, and within minutes it's downloaded, renamed, and showing up in Jellyfin. no manual searching, no renaming, no moving files. here's how the arr stack works and how Sonarr, Radarr, Prowlarr, and Jellyfin fit together in a self-hosted media server.

what's in the arr stack

how sonarr and radarr automate downloads

Jellyseerr (user request)
  └── Sonarr/Radarr (automation)
        └── Prowlarr (indexer search)
              └── qBittorrent (download)
                    └── /downloads on disk
                          └── Sonarr/Radarr (rename + move)
                                └── /movies or /tv
                                      └── Jellyfin (scans library, serves)

Sonarr and Radarr talk to Prowlarr to search for releases, pick the best one based on quality profiles, and send the magnet/torrent to qBittorrent. once the download finishes, they rename the file to a standard format, move it to the media library, and trigger a Jellyfin scan.

prowlarr as the indexer hub

before Prowlarr, each app had to be configured with every indexer separately — Sonarr had its own list, Radarr had its own list. Prowlarr centralizes all of that. you add an indexer once in Prowlarr, and Sonarr/Radarr both see it automatically through a sync.

sonarr and radarr quality profiles and custom formats

Sonarr and Radarr use quality profiles to decide which releases are acceptable and which are preferred. custom formats let you score releases by codec, so the arr stack automatically upgrades your library:

"upgrades allowed" is enabled, so if an x264 copy is downloaded first and an x265 version becomes available later, Sonarr/Radarr will grab it automatically. the upgrade stops once a release hits score 100 (x265).

docker volume path consistency

the trickiest part of setting up the arr stack in Docker is making sure every container sees files at the same path. Sonarr downloads to /downloads, then moves the file to /tv. qBittorrent writes to /downloads. Jellyfin reads from /tv. if any of those paths differ between containers, the hardlink or move fails and Jellyfin can't find the file.

all apps must share the same Docker volumes, so /downloads inside Sonarr is the same physical directory as /downloads inside qBittorrent. this is required for Sonarr and Radarr to work with qBittorrent properly. storage-wise, a media server like this chews through disk space fast - a 4TB NAS drive fills up quicker than you'd expect once Sonarr and Radarr start grabbing full seasons in x265.

jellyfin hardware transcoding

Jellyfin sits at the end of the arr stack and just watches folders. it doesn't interact with the download pipeline at all - Sonarr/Radarr notify it via API when new content lands, and it refreshes the library. NVENC hardware transcoding on the RTX 3070 handles converting formats on the fly when a client doesn't support the original codec. this is what makes Jellyfin a solid self-hosted Plex alternative with no subscription required. the best hard drive for this kind of setup is a NAS-rated CMR drive - desktop drives aren't designed for 24/7 operation and will die faster under constant media server workloads.

Seagate IronWolf NAS hard drive for media server storage
Seagate IronWolf NAS Internal Hard Drive

CMR - NAS Optimized - 3yr Rescue Data Recovery

Built for always-on media servers and multi-drive setups

view on amazon

affiliate link - helps support the blog

eli5

imagine a librarian (Sonarr/Radarr) who monitors a wishlist and knows all the bookshops in town (Prowlarr). when a new item on the wishlist becomes available, the librarian calls a courier (qBittorrent) to go pick it up. once delivered, the librarian puts the item in the proper section with a proper label, then updates the card catalog (Jellyfin). when you walk into the library to browse (through Jellyseerr), you see everything available and can request new titles — which just adds them to the wishlist and starts the whole loop again.


← back to blog