<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Sonarr on rHomelab</title><link>https://rhomelab.com/tags/sonarr/</link><description>Recent content in Sonarr on rHomelab</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sun, 13 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://rhomelab.com/tags/sonarr/index.xml" rel="self" type="application/rss+xml"/><item><title>The *arr Stack: Automating Media Acquisition with Sonarr, Radarr, and Prowlarr</title><link>https://rhomelab.com/data-hoarding/arr-stack-sonarr-radarr-prowlarr/</link><pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate><guid>https://rhomelab.com/data-hoarding/arr-stack-sonarr-radarr-prowlarr/</guid><description>How Sonarr, Radarr, and Prowlarr fit together to automate media acquisition and organization, and the Docker setup details (path mapping, hardlinks) that make or break the stack.</description><content:encoded><![CDATA[<p>Once a media library and a media server are both sorted out, the next question most data hoarders hit is how everything actually gets into the library in the first place. Doing it by hand, manually searching, downloading, renaming, and moving files into the <a href="/data-hoarding/media-library-folder-structure/">folder structure your media server expects</a>, works fine at a few dozen items. It falls apart well before a few hundred. The *arr stack (Sonarr, Radarr, Prowlarr, and a handful of siblings) is the standard homelab answer: a set of small, single-purpose applications that watch for content you want, find it, grab it, rename it, and drop it into your library automatically.</p>
<h2 id="what-each-piece-actually-does">What each piece actually does</h2>
<p>The naming convention (everything ending in &ldquo;-arr&rdquo;) comes from Sonarr, the original of the bunch, and the rest followed the same pattern once they proved the model out. Each one owns exactly one media type and one job:</p>
<ul>
<li><strong>Sonarr</strong> manages TV shows: tracks which episodes you want, monitors for new releases, and grabs them as they air.</li>
<li><strong>Radarr</strong> does the same job for movies.</li>
<li><strong>Lidarr</strong> covers music, <strong>Readarr</strong> covers books and audiobooks, <strong>Bazarr</strong> handles subtitle download and matching for whatever Sonarr/Radarr already pulled in. Most homelabs start with just Sonarr and Radarr and add the others only if they actually need that media type.</li>
<li><strong>Prowlarr</strong> is the indexer manager. Rather than configuring your indexers separately inside Sonarr, Radarr, and every other *arr app, you configure them once in Prowlarr and it pushes the configuration out to every app that&rsquo;s connected to it. This one addition removed what used to be the single most annoying part of running more than one *arr app at a time.</li>
</ul>
<p>None of these applications download anything themselves. They all hand the actual fetch off to a separate download client, most commonly qBittorrent for torrents or SABnzbd for Usenet. The *arr apps are the brains: deciding what to get, what quality to accept, when to search again if nothing suitable turned up yet, and what to do with a finished download. The download client is just the hands.</p>
<h2 id="how-a-request-actually-flows-through-the-stack">How a request actually flows through the stack</h2>
<p>It helps to see the full path end to end before touching any configuration:</p>
<ol>
<li>You tell Sonarr or Radarr what you want (add a show, add a movie), and set a <strong>quality profile</strong> (more on that below).</li>
<li>The *arr app checks Prowlarr&rsquo;s connected indexers on a schedule, searching for a release that matches your quality profile.</li>
<li>When it finds a match, it sends the download to your configured download client (qBittorrent, SABnzbd, whichever you&rsquo;ve set up) and tracks the job.</li>
<li>Once the download client reports the file complete, the *arr app picks it up, renames it according to your naming settings, and moves (or hardlinks, see below) it into your actual library folder.</li>
<li>Your media server (Plex, Jellyfin, Emby) picks up the new file on its next scan, exactly the way it would if you&rsquo;d dropped it in manually.</li>
</ol>
<p>Everything from step 2 onward happens with no further input from you. Steps 1 stays manual by design, you&rsquo;re still the one deciding what belongs in your library, the automation only handles the mechanical work of getting it there correctly formatted.</p>
<h2 id="quality-profiles-the-setting-most-people-configure-wrong-the-first-time">Quality profiles: the setting most people configure wrong the first time</h2>
<p>A quality profile tells Sonarr or Radarr which resolutions and encodes are acceptable, and in what preference order. The trap most new users fall into is setting the profile too narrow (only accepting one exact quality, so nothing is ever found) or too loose (accepting anything, including a low-quality initial grab that gets replaced constantly). Two settings matter more than the rest:</p>
<ul>
<li><strong>Cutoff.</strong> The quality level at which the app stops looking for anything better. Set this to whatever you&rsquo;ll actually be satisfied keeping long-term, not the maximum theoretical quality, since anything above the cutoff still triggers upgrade searches that cost bandwidth and indexer API calls for a difference you may not notice on your actual display.</li>
<li><strong>Upgrade allowed.</strong> Whether the app should replace an already-downloaded file with a better one if a higher-quality release shows up before the cutoff is hit. This is genuinely useful when you want to grab something immediately in a lower quality and quietly upgrade it later, but it does mean a file can change out from under you without you asking for it that specific time, worth knowing before you assume every file is final the moment it lands.</li>
</ul>
<p>Start with one clear cutoff per profile (something like &ldquo;1080p, stop there&rdquo;) rather than trying to hand-tune a complex ranked list of formats and codecs on day one. You can layer in encoder or source preferences later once you understand what your indexers actually tend to offer.</p>
<h2 id="the-docker-detail-that-determines-whether-this-works-well-or-badly-path-mapping">The Docker detail that determines whether this works well or badly: path mapping</h2>
<p>This is the single most common setup mistake, and it&rsquo;s worth understanding before you deploy anything, not after. When Sonarr/Radarr finish a download, they don&rsquo;t want to physically copy the file from your downloads folder into your library folder if they can avoid it. On the same filesystem, they instead create a <strong>hardlink</strong>, a second directory entry pointing at the same underlying data on disk. The file exists in both places instantly, with zero additional disk space used and zero copy time, no matter how large it is. When the original in the downloads folder is later cleaned up (by your download client&rsquo;s seeding/retention rules), the copy in your library folder is completely unaffected, it&rsquo;s not a &ldquo;copy&rdquo; in the fragile sense, it&rsquo;s a second name for the same data.</p>
<p>Hardlinks only work when both paths are on the <strong>same filesystem</strong>, and in a Dockerized setup, that means the same <strong>container-side path</strong>, not necessarily the same host path. This is where people get tripped up: if your download client sees its downloads folder as <code>/data/downloads</code> inside its container, and Sonarr sees the same physical directory but mapped as <code>/downloads</code> inside its own container, Sonarr and the download client each think they&rsquo;re on different filesystems, since neither has visibility into the other&rsquo;s mount configuration. The result: Sonarr silently falls back to a real copy instead of a hardlink, and now you&rsquo;re storing every piece of media twice, once in the downloads folder and once in the library, quietly eating disk space you thought you had.</p>
<p>The fix is consistent volume mapping across every container in the stack. Pick one top-level path (a common convention is <code>/data</code>) and mount your actual storage there identically in every container, downloads client, Sonarr, Radarr, and anything else that touches the same files:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">qbittorrent</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/mnt/storage:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">sonarr</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/mnt/storage:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">radarr</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/mnt/storage:/data</span><span class="w">
</span></span></span></code></pre></div><p>With that in place, <code>/data/downloads</code> and <code>/data/media/tv</code> are the same filesystem from every container&rsquo;s point of view, even though the host path is identical the whole time, and hardlinking works exactly as intended. This is worth checking on any existing setup, not just a fresh one, if you&rsquo;ve never confirmed it, run <code>df</code> inside two of your containers and compare the filesystem each path resolves to.</p>
<h2 id="indexers-vpns-and-staying-inside-your-own-risk-tolerance">Indexers, VPNs, and staying inside your own risk tolerance</h2>
<p>Prowlarr connects to indexers, which fall broadly into public trackers, private trackers (invite-based, usually much higher quality and reliability, but with their own ratio/seeding rules to respect), and Usenet indexers paired with a Usenet provider subscription. Whichever you use, route torrent traffic for this stack through a VPN with a kill switch, most people run this as a dedicated container (Gluetun is the common choice) that the download client&rsquo;s network traffic is forced through, so a VPN disconnect stops downloads entirely instead of silently falling back to your real IP. Usenet traffic doesn&rsquo;t have the same exposure profile as torrenting and doesn&rsquo;t strictly need this, though plenty of people route it through anyway for consistency.</p>
<p>None of this is specific to any particular kind of content. The same stack that automates grabbing a weekly TV episode also automates grabbing Linux ISOs, your own ripped Blu-ray backups pulled from a seedbox, or anything else you have the rights to store, the automation doesn&rsquo;t care what it&rsquo;s fetching, it just executes the search-grab-rename-import loop you&rsquo;ve configured.</p>
<h2 id="bottom-line">Bottom line</h2>
<p>Prowlarr centralizes indexer configuration so you set it up once instead of per-app. Sonarr and Radarr do the actual deciding, searching, and importing, driven by quality profiles you should start simple and tune later. The download client does the fetching, and should sit behind a VPN with a kill switch if it&rsquo;s handling torrent traffic. The one setup detail that separates a stack that works cleanly from one that quietly wastes disk space is consistent container path mapping, get every container agreeing on the same internal path for your storage, and hardlinks do the rest of the work for free.</p>
]]></content:encoded></item></channel></rss>