Blog

The *arr Stack with Jellyfin and Plex: Sonarr, Radarr, Prowlarr, Bazarr, Seerr

How Sonarr, Radarr, Lidarr, Prowlarr, Bazarr and Seerr fit together with Jellyfin or Plex: a UML diagram, what each tool does, one Docker Compose file, hardlinks, and GPU transcoding on an Intel UHD 770.

The *arr stack with Jellyfin and Plex: a reminder of how it fits together

Our Jellyfin & Plex hardware transcoding guide covers the media server itself. Around it, most self-hosters run a family of tools whose names end in arr: they organise the library, rename files, fetch subtitles and let your household request titles. This page is a short reminder of who does what and how they talk to each other.

Important: we do not encourage downloading content you do not have the rights to. These tools are neutral; what you feed them is your responsibility. On Linux GPU servers, downloading, storing or sharing pirated works (BitTorrent, Usenet, illegal IPTV…) is forbidden by Article 6 of our terms and leads to suspension. Use them with your own files (your rips, your music), public-domain works (Internet Archive, Wikimedia Commons) and free licences (Blender open movies, Creative Commons music).

The diagram

UML component diagram: you request a title in Seerr; Sonarr, Radarr or Lidarr searches through Prowlarr; the download client writes to /data/downloads; the *arr app imports into /data/media with a hardlink; Bazarr adds subtitles; Jellyfin or Plex refreshes its library, transcodes on the Intel UHD 770 and streams to your devices

  1. You (or someone in your household) ask for a film or a series in Seerr.
  2. Seerr hands the request to Radarr (films) or Sonarr (series).
  3. The *arr app searches the sources configured in Prowlarr.
  4. It sends the chosen item to the download client.
  5. The file lands in /data/downloads/.
  6. The *arr app imports it: it renames it and places it in /data/media/ with a hardlink (instant, no extra disk space).
  7. It tells Jellyfin or Plex to refresh the library; Bazarr adds the missing subtitles next to the video.
  8. Jellyfin or Plex reads /data/media/.
  9. When a device can’t play the original format, the server transcodes on the GPU (VAAPI / Quick Sync).
  10. The video streams to the TV, phone or browser.

No download client? The stack still works: drop your own files into a folder and use the Manual Import of Sonarr, Radarr or Lidarr to rename and file them.

Who does what

ToolRoleDefault port
Jellyfin / PlexMedia server: library, metadata, streaming, GPU transcoding8096 / 32400
SonarrSeries: follows episodes, imports and renames them8989
RadarrFilms: same job for movies7878
LidarrMusic: albums and artists, great for your own CD rips8686
ProwlarrManages the sources (indexers) once and syncs them to the *arr apps9696
BazarrSubtitles for everything Sonarr and Radarr manage6767
SeerrRequest portal for your household, for Jellyfin, Plex and Emby5055

Seerr is the merger of Overseerr (Plex) and Jellyseerr (Jellyfin): the two teams joined forces and released Seerr 3.0 in February 2026 (ghcr.io/seerr-team/seerr). Overseerr images are deprecated; if you still run Overseerr or Jellyseerr, migrate to Seerr with a fresh data directory so the old one stays as a rollback.

Readarr (books) was retired by its developers in 2025 and its repository is archived: for books and audiobooks, look at Audiobookshelf or LazyLibrarian instead.

The tools that usually come along

ToolWhat it adds
RecyclarrSyncs well-known quality profiles and naming rules (TRaSH Guides) into Sonarr and Radarr
UnpackerrExtracts archives so Sonarr / Radarr can import them
TdarrRe-encodes your library in bulk (e.g. to HEVC or AV1-friendly formats); it can use the Intel GPU with VAAPI / QSV
Tautulli (Plex) / Jellystat (Jellyfin)Watch statistics, who played what, notifications
KometaPlex (and partly Jellyfin) collections, posters and overlays
MaintainerrRules to clean up what nobody watches
WizarrInvitation links to give someone access to Jellyfin or Plex
AudiobookshelfAudiobooks and podcasts server
HomepageOne dashboard with all the services and their status

One Docker Compose file

All the apps share one /data folder with downloads/ and media/ inside. It must be the same filesystem for every container, otherwise hardlinks turn into slow copies that double the disk usage.

mkdir -p /srv/data/{downloads,media/{movies,tv,music}} /srv/arr
cd /srv/arr

docker-compose.yml:

x-common: &common
  restart: unless-stopped
  environment:
    PUID: "1000"
    PGID: "1000"
    TZ: Europe/Paris
  volumes:
    - /srv/data:/data

services:
  sonarr:
    <<: *common
    image: lscr.io/linuxserver/sonarr:latest
    volumes: [/srv/data:/data, ./sonarr:/config]
    ports: ["127.0.0.1:8989:8989"]

  radarr:
    <<: *common
    image: lscr.io/linuxserver/radarr:latest
    volumes: [/srv/data:/data, ./radarr:/config]
    ports: ["127.0.0.1:7878:7878"]

  lidarr:
    <<: *common
    image: lscr.io/linuxserver/lidarr:latest
    volumes: [/srv/data:/data, ./lidarr:/config]
    ports: ["127.0.0.1:8686:8686"]

  prowlarr:
    <<: *common
    image: lscr.io/linuxserver/prowlarr:latest
    volumes: [./prowlarr:/config]
    ports: ["127.0.0.1:9696:9696"]

  bazarr:
    <<: *common
    image: lscr.io/linuxserver/bazarr:latest
    volumes: [/srv/data:/data, ./bazarr:/config]
    ports: ["127.0.0.1:6767:6767"]

  seerr:
    image: ghcr.io/seerr-team/seerr:latest
    init: true
    restart: unless-stopped
    environment:
      TZ: Europe/Paris
    volumes: [./seerr:/app/config]
    ports: ["5055:5055"]

  jellyfin:                      # or the plex service below
    image: jellyfin/jellyfin:latest
    restart: unless-stopped
    devices: [/dev/dri/renderD128:/dev/dri/renderD128]
    group_add: ["${RENDER_GID}"]
    volumes: [./jellyfin:/config, /srv/data/media:/data/media:ro]
    ports: ["8096:8096"]

  # plex:
  #   image: plexinc/pms-docker:latest
  #   restart: unless-stopped
  #   network_mode: host
  #   devices: [/dev/dri:/dev/dri]
  #   volumes: [./plex:/config, /srv/data/media:/data/media:ro]
echo "RENDER_GID=$(stat -c %g /dev/dri/renderD128)" > .env
docker compose up -d

Add the download client of your choice to the same file, with /srv/data:/data as its volume and /data/downloads as its target folder, for legal sources only.

Wiring the apps together

  1. Prowlarr → Settings → Apps: add Sonarr, Radarr and Lidarr with their API key (each app’s Settings → General). Prowlarr then pushes the same sources to all of them.
  2. Sonarr / Radarr / Lidarr → Settings → Media Management: root folders /data/media/tv, /data/media/movies, /data/media/music; leave Use Hardlinks instead of Copy on.
  3. Sonarr / Radarr → Settings → Connect: add Emby / Jellyfin or Plex Media Server so the library refreshes after each import.
  4. Bazarr → Settings → Sonarr / Radarr: same API keys, then pick your subtitle languages and providers.
  5. Seerr: the first-run wizard asks for Jellyfin or Plex, then Settings → Services to add Radarr and Sonarr.
  6. Jellyfin or Plex: libraries on /data/media/... and GPU transcoding as in our transcoding guide.

Security

  • Only Jellyfin/Plex and Seerr need to be reachable. The other apps listen on 127.0.0.1: open them through an SSH tunnel (ssh -L 8989:localhost:8989 support@your-server) or behind a reverse proxy with authentication.
  • Turn on authentication in every *arr app (Settings → General → Authentication).
  • Keep the media folder read-only for the media server (:ro above).

Storage

Plans come with 60 GB (Start), 120 GB (Power) or 240 GB SSD (Pro). That is plenty for the apps and a music or home-video library; for a large film collection, plan the disk size first, since hardlinks only work inside one filesystem.

Try it

A Linux GPU server with an Intel UHD 770 inside the VM, Docker already installed, VAAPI and Quick Sync ready for Jellyfin and Plex. From €14.99 excl. VAT/month, root access.