Building Your Own Automated Movie Library
Running a personal media server used to mean manually downloading files, organizing folders, and updating libraries by hand. Jellyfin changed that by giving self-hosters a free, open-source media platform with no subscription fees and no tracking. Pair it with Radarr – a movie collection manager that watches for releases, grabs them automatically, and drops them in the right place – and you get something closer to a private Netflix that you actually control.
This guide walks through connecting Radarr to Jellyfin so that when you add a movie to your watchlist, the file appears in your library without any further action. The setup assumes you have Docker installed and are comfortable editing configuration files. No prior experience with either app is required, but familiarity with basic networking concepts will help when troubleshooting connection issues.

Installing Jellyfin and Radarr with Docker
Docker is the cleanest way to run both services because it isolates dependencies and makes updates straightforward. Start by creating a working directory – something like /opt/mediastack – and a docker-compose.yml file inside it. You will define both containers in a single file so they share a network and can communicate by container name rather than IP address.
For Jellyfin, the compose block needs a volume mapping that points to your actual media folder. A typical setup maps /mnt/media/movies on the host to /movies inside the container. Radarr needs access to the same physical folder, mapped to a path like /movies inside its own container as well. The exact path inside each container can differ, but both must point to the same directory on disk – this is the detail that trips up most first-time setups. If Radarr saves a file to a location Jellyfin cannot read, the library update will silently fail.
Once both containers are running, open Jellyfin in your browser at http://localhost:8096 and complete the initial setup wizard. When it asks you to add a media library, select Movies and point it to the folder you mapped in the compose file. Radarr opens at http://localhost:7878 by default. Go to Settings, then Media Management, and confirm the root folder path matches what you configured in the volume mapping. A mismatch here is the most common reason automated imports break later.
Connecting a Download Client to Radarr
Radarr does not download anything itself. It watches indexers for matching releases and then hands off the actual download job to a separate client – typically qBittorrent, Transmission, or an Usenet downloader like SABnzbd. In Radarr, go to Settings, then Download Clients, and add whichever client you are running. Fill in the host (use the container name if all services are in the same Docker network), port, and credentials. Click Test – if the connection is green, Radarr can talk to your downloader.
Adding an indexer is the next step. Go to Settings, then Indexers, and add a Torznab or Newznab source depending on whether you use torrents or Usenet. Most public and private trackers that support Jackett or Prowlarr will work here. Prowlarr is worth mentioning specifically because it acts as a proxy for dozens of indexers at once and can sync them directly to Radarr, eliminating the need to configure each source manually. If you want push notifications when a download completes, you can also set up Gotify as a self-hosted notification gateway and point Radarr at it through the Connect settings.

Wiring Radarr to Jellyfin for Automatic Library Updates
After Radarr downloads and renames a movie, Jellyfin needs to know the file exists. The default behavior is a scheduled library scan, which runs every few hours. That works, but there is a faster method: Radarr can call the Jellyfin API directly after each successful import, triggering an immediate library refresh. To set this up, go to Radarr’s Settings, then Connect, and add a new Jellyfin connection. You will need your Jellyfin server URL and an API key.
To get the Jellyfin API key, open the Jellyfin dashboard, go to Administration, then API Keys, and generate a new one. Copy it into the Radarr connection form. Under the connection options, you can choose to notify Jellyfin only when a movie is available or also when it is upgraded to a better quality version. Enabling both keeps your library accurate without any manual intervention. Save the connection and run a test – Radarr will ping Jellyfin and confirm the token is valid.
Quality profiles in Radarr deserve real attention here because they control what gets downloaded and whether Radarr will replace an existing file with a better version. The default profile grabs the first available release, which might be a low-resolution encode or a bloated remux depending on what the indexer has. Go to Settings, then Quality, and define minimum and maximum file sizes for each resolution tier. Then go to Profiles and set up a custom profile that prioritizes 1080p Bluray encodes but accepts 1080p web releases if nothing better appears within a set number of days. Radarr will monitor the movie and upgrade automatically when a preferred release shows up.
One detail that catches people off guard: Radarr’s rename settings need to match the folder structure Jellyfin expects. Jellyfin works best when each movie lives in its own folder named with the title and year, like The Godfather (1972), with the video file inside. In Radarr, go to Settings, then Media Management, and enable Rename Movies. Set the folder format to {Movie Title} ({Release Year}) and the file format to match. Without this, Jellyfin may misidentify movies or fail to pull metadata from TMDB correctly, leaving you with blank posters and missing descriptions.

Monitoring, Permissions, and What Breaks First
File permissions are where this setup most often falls apart quietly. If Radarr runs as one user and Jellyfin runs as another, Jellyfin may not be able to read newly imported files even though they are in the right folder. The cleanest fix is to run both containers with the same PUID and PGID values in the compose file, matching a user on the host system that owns the media directory. Docker Compose makes this straightforward with environment variables – PUID=1000 and PGID=1000 is the standard starting point if you have not customized your host user setup.
Radarr’s Activity tab shows what the system is currently doing – queued downloads, imports in progress, and any errors. Check it first when something seems stuck. The most common errors are path mapping problems (Radarr and the download client disagree on where a file lives), permission denials, and indexer authentication failures. Each error message in Radarr is specific enough to point you toward the right setting. Jellyfin’s logs, found under Administration then Logs, will tell you whether a library scan failed and why.
Once the stack is stable, adding a movie to your Radarr watchlist takes about thirty seconds. Search by title, select the correct entry, choose a quality profile, and save. If the release already exists on your indexers, Radarr grabs it within minutes. If it is a future release, Radarr sits on it until the file appears, then downloads and imports it without any further input. Jellyfin picks it up immediately via the API call, and the movie shows up with full metadata, poster art, and subtitle options – ready to stream on any device connected to your server.
The one question this setup does not answer for you is storage planning. Uncompressed 4K Bluray remuxes can run 60-80GB per film, while efficient H.265 encodes of the same movie might land under 15GB with minimal visible quality loss. Radarr’s quality caps let you set a ceiling on file size, but deciding where to draw that line depends entirely on your available disk space and how much you care about the difference on your specific display. Get that wrong and you will either fill a drive in a month or end up with a library that looks noticeably worse than what you were expecting.





