Prowlarr + qBittorrent Setup Guide: Complete Download Stack for Jellyfin (2026)

Prowlarr + qBittorrent Setup Guide: Complete Download Stack for Jellyfin (2026)

Prowlarr + qBittorrent: Complete Download Stack for Jellyfin (2026)

Radarr and Sonarr handle automation - but they need two things to work: an indexer manager (Prowlarr) and a download client (qBittorrent or Transmission). This guide covers the full download layer setup and how it feeds directly into your Jellyfin library.


The Full Stack Overview

Prowlarr (indexers) → Radarr/Sonarr (automation) → qBittorrent (download) → Jellyfin (media server)
ToolRole
ProwlarrManages all torrent/usenet indexers in one place
RadarrMonitors and grabs movies automatically
SonarrMonitors and grabs TV shows automatically
qBittorrentDownloads the files
JellyfinServes the media to your users

Docker Compose: Full Stack

services:
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
    volumes:
      - ./prowlarr/config:/config
    ports:
      - 9696:9696
    restart: unless-stopped

  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
      - WEBUI_PORT=8080
    volumes:
      - ./qbittorrent/config:/config
      - /path/to/downloads:/downloads
    ports:
      - 8080:8080
      - 6881:6881
      - 6881:6881/udp
    restart: unless-stopped

  radarr:
    image: lscr.io/linuxserver/radarr:latest
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
    volumes:
      - ./radarr/config:/config
      - /path/to/movies:/movies
      - /path/to/downloads:/downloads
    ports:
      - 7878:7878
    restart: unless-stopped

  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
    volumes:
      - ./sonarr/config:/config
      - /path/to/tv:/tv
      - /path/to/downloads:/downloads
    ports:
      - 8989:8989
    restart: unless-stopped

Critical: All containers must share the same /downloads path so Radarr/Sonarr can move completed files.


Step 1: Configure Prowlarr

Prowlarr replaces individual indexer configuration in Radarr and Sonarr. Configure once, sync everywhere.

Add indexers

  1. Open Prowlarr at http://your-server:9696
  2. Indexers → Add Indexer
  3. Search for your preferred indexers (public or private trackers)
  4. Configure credentials if required
  5. Test and save

Connect to Radarr and Sonarr

  1. Settings → Apps → Add Application
  2. Select Radarr → enter URL and API key
  3. Repeat for Sonarr
  4. Click Sync App Indexers - all indexers push to both apps automatically

From now on, add indexers only in Prowlarr. They sync to all connected apps.


Step 2: Configure qBittorrent

Initial setup

  1. Open qBittorrent Web UI at http://your-server:8080
  2. Default credentials: admin / adminadmin (change immediately)
  3. Tools → Options → Web UI → Change username and password

Recommended settings

Downloads tab:

  • Default save path: /downloads/complete
  • Keep incomplete torrents in: /downloads/incomplete
  • Enable "Append .!qB extension to incomplete files"

Connection tab:

  • Listening port: 6881 (or random, avoid ISP-blocked ports)
  • Enable UPnP/NAT-PMP if behind a router

Speed tab:

  • Set upload limits to avoid saturating your connection
  • Schedule lower speeds during peak hours

BitTorrent tab:

  • Enable DHT, PeX, and Local Peer Discovery for public trackers
  • Set seeding ratio limit (e.g., 2.0) to be a good community member

Step 3: Connect qBittorrent to Radarr and Sonarr

In Radarr

  1. Settings → Download Clients → Add
  2. Select qBittorrent
  3. Host: qbittorrent (Docker service name)
  4. Port: 8080
  5. Username / Password: your qBittorrent credentials
  6. Category: radarr (qBittorrent will create this category automatically)
  7. Test → Save

In Sonarr

Same steps, use category sonarr.

Using separate categories lets you apply different rules (seeding limits, paths) per app.


Step 4: Configure Root Folders and Import

Radarr root folder

Settings → Media Management → Root Folders → Add /movies

JellyWatchTry JellyWatch — Your Jellyfin companion, everywhere.

When a download completes, Radarr:

  1. Detects the completed file in /downloads
  2. Renames it according to your naming format
  3. Moves (hardlinks) it to /movies/Movie Name (Year)/
  4. Triggers a Jellyfin library scan

Enable hardlinks (critical for storage efficiency)

Hardlinks let the file exist in both /downloads (for seeding) and /movies (for Jellyfin) without using double the disk space.

This only works if /downloads and /movies are on the same filesystem. This is why the Docker volume mapping must be consistent across all containers.


Step 5: Connect Radarr/Sonarr to Jellyfin

After import, trigger an automatic Jellyfin library scan:

In Radarr

  1. Settings → Connect → Add Connection → Jellyfin
  2. Host: jellyfin, Port: 8096
  3. API Key: from Jellyfin Dashboard → API Keys
  4. Select which libraries to refresh
  5. Save

Now when Radarr imports a movie, Jellyfin automatically scans and adds it - no manual refresh needed.


Naming Conventions

Jellyfin requires specific naming for correct metadata matching:

Movies:

/movies/Movie Name (2024)/Movie Name (2024).mkv

TV Shows:

/tv/Show Name/Season 01/Show Name - S01E01 - Episode Title.mkv

Radarr and Sonarr handle renaming automatically - configure the format in Settings → Media Management → Naming.


Troubleshooting

ProblemCauseFix
Radarr can't move filesPermission mismatch (PUID/PGID)Ensure all containers use same PUID/PGID
Hardlinks not workingDifferent filesystemsMap /downloads and /movies to same volume
qBittorrent not reachableWrong hostnameUse Docker service name, not localhost
Jellyfin not updatingNotification not configuredAdd Jellyfin connection in Radarr/Sonarr
Downloads stuckPort blocked by ISPChange listening port or use VPN

Monitor Your Download Activity

Once your stack is running, new content appears in Jellyfin automatically. But you still want to know:

  • When new content is available for your users
  • Whether the server is handling new streams correctly
  • If a new download triggered unexpected transcoding

JellyWatch notifies you when new sessions start and shows real-time transcoding status - so you know the moment your users start watching newly imported content.


Your download stack is running - now monitor what your users do with it. Download JellyWatch on Google Play - session monitoring, transcoding alerts, and server health for Jellyfin on Android.

On Emby? Download EmbyWatch on Google Play - the same monitoring experience for Emby servers.

Comments

No comments yet. Be the first to share your thoughts.

Leave a comment

Never displayed publicly.
0 / 2000 · Supports limited Markdown: **bold**, *italic*, `code`, [link](url), lists, > quote.