Automate Your TV Library With Jellyfin and Sonarr
Running a self-hosted media server is satisfying until you realize you’re spending more time manually managing files than actually watching anything. Pairing Jellyfin with Sonarr solves that problem by automating the entire pipeline – from episode monitoring to library organization – so your media server stays current without constant babysitting.

What You Need Before Starting
Jellyfin is an open-source media server that streams your local video files to any device on your network, or remotely if configured. Sonarr is an automated TV show manager that watches for new episodes, grabs them via your preferred download client, and sorts them into a clean folder structure. Together, they form the backbone of a self-managed TV library that handles renewals, season premieres, and missed episodes without manual input.
Before wiring these two tools together, both need to be running independently. Jellyfin should already have a working library pointed at a folder – something like /media/tv – and be accessible through its web interface, typically at http://your-server-ip:8096. Sonarr should be installed and reachable, usually at port 8989, and you’ll need a working download client connected to it – qBittorrent, Deluge, and NZBGet are all common choices. If you’re running everything through Docker, make sure all containers share the same network or at minimum can reach each other by IP.
The critical requirement that trips up most first-time setups is path consistency. Sonarr needs to write files to a location that Jellyfin can read. If Sonarr is saving completed downloads to /downloads/complete/tv and then moving them to /media/tv, Jellyfin’s library root must point to that same /media/tv path. Docker users need to be especially careful here because each container sees its own filesystem – a path inside the Sonarr container and the same physical folder inside the Jellyfin container can have entirely different names unless you explicitly map them to match.
You’ll also want to grab your Jellyfin API key before touching anything else. Log into Jellyfin’s web interface, go to Dashboard > API Keys, and generate a new key. Label it something obvious like “Sonarr” so you remember what it’s tied to. Keep that browser tab open – you’ll paste it into Sonarr shortly.

Connecting Sonarr to Jellyfin
Open Sonarr and navigate to Settings > Connect. Click the plus icon to add a new connection and select Emby/Jellyfin from the list – Sonarr uses Emby as the label because both platforms share a compatible API structure. This is where the integration actually lives: Sonarr will ping Jellyfin every time it finishes downloading and organizing an episode, telling Jellyfin to scan that specific folder and add the new file to the library immediately.
In the connection form, set a name like “Jellyfin Notify”, then enter your server’s host address – either an IP like 192.168.1.100 or a hostname if you’ve set one up. The port is 8096 by default for HTTP, or 8920 if you’ve enabled HTTPS inside Jellyfin. Paste in your API key, leave the path field blank unless you have a specific reason to scope it, and make sure Notify on Import and Notify on Upgrade are both checked. Hit Test before saving – if the connection details are correct, you’ll get a green confirmation and Sonarr will confirm it can reach Jellyfin.
The Notify on Upgrade toggle matters more than it sounds. When Sonarr replaces a lower-quality file with a better one – say, swapping a 720p episode for a 1080p version – Jellyfin won’t automatically know the file changed unless Sonarr tells it to rescan. Without that toggle enabled, Jellyfin can end up holding metadata and artwork for a file that no longer exists at that path, causing playback errors or duplicate entries in the library.
Next, go to Settings > Media Management in Sonarr and review your naming scheme and root folder. The root folder should point to wherever Jellyfin’s TV library is reading from. If they don’t match exactly, Sonarr will correctly organize and rename the files but Jellyfin won’t see them – or worse, will see them in a folder it wasn’t told to monitor. Enable Rename Episodes and set a consistent naming convention. The format {Series Title} – S{season:00}E{episode:00} – {Episode Title} works well because Jellyfin’s metadata scrapers can read it reliably and it keeps your folders clean at a glance.
With that done, go add a show. In Sonarr, search for any series, set its quality profile and root folder, then click Add Series. If you select Start search for missing episodes on the way in, Sonarr will immediately begin looking for episodes. Once a file lands in the right folder, Sonarr fires the notification to Jellyfin, Jellyfin scans the path, pulls metadata from its configured scraper, and the episode shows up in your library – usually within a minute or two of the download finishing.
Fixing the Common Problems
The most frequent issue after setup is Jellyfin not updating despite Sonarr claiming the notification was sent successfully. This almost always comes down to one of two things: the API key has a typo, or the server address Sonarr is using resolves to something Jellyfin doesn’t recognize as itself. If you’re running Docker, use the container name or the Docker bridge network IP instead of localhost – Sonarr and Jellyfin are separate containers, so localhost inside Sonarr’s container points to Sonarr, not Jellyfin. Switching to something like http://jellyfin:8096 where jellyfin is the container name usually resolves it instantly.

A separate issue worth knowing about: Jellyfin’s library scan can sometimes identify a newly added show as an unknown title if the folder name doesn’t match what the metadata provider expects. This happens most often with shows that have subtitle-style names, like The Bear or titles with years in them. In Sonarr’s series settings, check the folder name it assigned and compare it against what Jellyfin’s TMDB or TVDB scraper returns. If they’re off, you can override the folder name in Sonarr manually, or use Jellyfin’s built-in Fix Incorrect Match option to manually point the library entry at the right metadata record. Once the match is locked in, all future episodes for that series will populate correctly without any extra intervention.





