
Set up the complete arr stack — Sonarr, Radarr, Prowlarr, qBittorrent, Bazarr, and Overseerr — with Docker Compose on an Intel N100 home server. Automated TV and movie management under 12W idle.
The "arr stack" — Sonarr, Radarr, Prowlarr, and their companion apps — is the gold standard for automated media management on a home server. Set it up once, and new TV episodes and movies appear in Jellyfin or Plex automatically, organized and ready to watch, without any manual downloading.
This guide covers a complete arr stack on Docker Compose, tested on an Intel N100 mini PC running Ubuntu 24.04.

The arr stack is a collection of open-source apps that work together to automate media acquisition:
| App | Role | What It Does |
|---|---|---|
| Sonarr | TV Shows | Monitors for new episodes, searches, downloads |
| Radarr | Movies | Monitors watchlists, searches, downloads |
| Prowlarr | Indexer Manager | Manages search sources (like a search engine meta-layer) |
| qBittorrent | Download Client | Actually downloads files |
| Jellyfin / Plex | Media Server | Streams your organized library |
| Bazarr | Subtitles | Automatically downloads subtitles |
| Overseerr | Request UI | Friend/family-friendly request interface |
| Recyclarr | Quality Profiles | Syncs quality profiles from TRaSH Guides |
Flow:

# Verify Docker is installed
docker --version
docker compose version
# Check available storage
df -h

Consistent directory structure is critical — the arr apps need to see the same paths as qBittorrent for "hardlinking" (instant file moves without copying):
/mnt/data/
├── torrents/ ← qBittorrent downloads here
│ ├── tv/
│ ├── movies/
│ └── incomplete/
├── media/ ← Arr apps move finished files here
│ ├── tv/ ← Sonarr manages this
│ ├── movies/ ← Radarr manages this
│ └── music/ ← Lidarr (if using)
# Create the directory structure
sudo mkdir -p /mnt/data/{torrents/{tv,movies,incomplete},media/{tv,movies,music}}
# Set permissions (replace 1000 with your UID: run `id` to check)
sudo chown -R 1000:1000 /mnt/data
sudo chmod -R 755 /mnt/data
Why one parent directory? When qBittorrent finishes downloading and Sonarr moves the file, if both point to the same underlying filesystem, the move is instantaneous (hardlink) — no copying. If they're on different filesystems, it physically copies the file (slow, uses double disk space temporarily).
Create the stack directory:
mkdir -p ~/arr-stack
cd ~/arr-stack
Create docker-compose.yml:
version: "3.9"
networks:
arr:
driver: bridge
services:
# ============================================================
# qBittorrent — Download Client
# ============================================================
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
networks:
- arr
ports:
- "8080:8080" # Web UI
- "6881:6881" # BitTorrent port
- "6881:6881/udp"
environment:
PUID: "1000"
PGID: "1000"
TZ: "America/New_York"
WEBUI_PORT: "8080"
volumes:
- ./config/qbittorrent:/config
- /mnt/data/torrents:/downloads
# ============================================================
# Prowlarr — Indexer Manager (replaces Jackett)
# ============================================================
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
restart: unless-stopped
networks:
- arr
ports:
- "9696:9696"
environment:
PUID: "1000"
PGID: "1000"
TZ: "America/New_York"
volumes:
- ./config/prowlarr:/config
# ============================================================
# Sonarr — TV Show Automation
# ============================================================
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
restart: unless-stopped
networks:
- arr
ports:
- "8989:8989"
environment:
PUID: "1000"
PGID: "1000"
TZ: "America/New_York"
volumes:
- ./config/sonarr:/config
- /mnt/data:/data # IMPORTANT: must see same root as qBittorrent
# ============================================================
# Radarr — Movie Automation
# ============================================================
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
restart: unless-stopped
networks:
- arr
ports:
- "7878:7878"
environment:
PUID: "1000"
PGID: "1000"
TZ: "America/New_York"
volumes:
- ./config/radarr:/config
- /mnt/data:/data # Same root path as qBittorrent
# ============================================================
# Bazarr — Subtitle Automation
# ============================================================
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: bazarr
restart: unless-stopped
networks:
- arr
ports:
- "6767:6767"
environment:
PUID: "1000"
PGID: "1000"
TZ: "America/New_York"
volumes:
- ./config/bazarr:/config
- /mnt/data/media:/media # Needs to see your media library
# ============================================================
# Overseerr — User-Friendly Request Interface
# ============================================================
overseerr:
image: lscr.io/linuxserver/overseerr:latest
container_name: overseerr
restart: unless-stopped
networks:
- arr
ports:
- "5055:5055"
environment:
LOG_LEVEL: "debug"
TZ: "America/New_York"
PORT: "5055"
volumes:
- ./config/overseerr:/app/config
# ============================================================
# Jellyfin — Media Server (keep in sync with arr stack)
# ============================================================
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
networks:
- arr
ports:
- "8096:8096"
environment:
JELLYFIN_PublishedServerUrl: "http://192.168.1.100:8096"
volumes:
- ./config/jellyfin:/config
- ./cache/jellyfin:/cache
- /mnt/data/media:/media:ro # Read-only — only arr apps write here
devices:
- /dev/dri:/dev/dri # Intel Quick Sync hardware transcoding
group_add:
- "render"
- "video"
Start everything:
docker compose up -d
docker compose ps
http://server:8080admin / adminadmin (change this immediately)/downloads/incomplete/downloads/incomplete6881 (forward this port on your router)sonarr-tv, radarr-moviesProwlarr is your indexer aggregator. It connects your indexers (where you search for content) to Sonarr and Radarr.
http://server:9696Adding an indexer:
http://prowlarr:9696http://sonarr:8989This syncs all your Prowlarr indexers to Sonarr/Radarr automatically.
http://server:8989/data/media/tv{Series Title} - S{season:00}E{episode:00} - {Episode Title}qbittorrent (Docker service name — containers resolve each other by name)8080adminsonarr-tvSame process as Sonarr, but for movies:
http://server:7878/data/media/movies{Movie Title} ({Release Year})radarr-moviesIn Sonarr:
/data/media/tvIn Radarr:
/data/media/moviesSonarr/Radarr will immediately start searching your Prowlarr indexers and send any matches to qBittorrent for download.
The TRaSH Guides (trash-guides.info) are the community standard for quality profiles in Sonarr and Radarr. They define exactly what file formats are acceptable, ranked by quality.
Recyclarr syncs these profiles automatically:
# Add to your docker-compose.yml
recyclarr:
image: ghcr.io/recyclarr/recyclarr:latest
container_name: recyclarr
restart: unless-stopped
networks:
- arr
environment:
TZ: "America/New_York"
volumes:
- ./config/recyclarr:/config
After starting Recyclarr:
# Initialize config
docker exec recyclarr recyclarr config create
# Edit config to point to your Sonarr/Radarr
nano ~/arr-stack/config/recyclarr/recyclarr.yml
TRaSH Guides recyclarr.yml templates are available at their GitHub repository.
http://server:6767http://sonarr:8989/data/mediaBazarr will automatically download subtitles for everything in your library and new content as it arrives.
If family or friends want to request content without logging into Sonarr/Radarr directly, Overseerr is the answer.
http://server:5055Users see a Netflix-like interface, request content, and it automatically sends to Sonarr/Radarr.
Full arr stack (qBittorrent, Prowlarr, Sonarr, Radarr, Bazarr, Overseerr, Jellyfin) on Beelink EQ12:
| State | Power Draw |
|---|---|
| All containers idle, no downloads | 9.5W |
| Active downloading (qBittorrent, 50MB/s) | 11–13W |
| Sonarr/Radarr indexing scan | 12–15W |
| Jellyfin 1080p hardware transcode | 16–20W |
| Jellyfin 4K hardware transcode | 14–18W |
The N100's Quick Sync handles 4K HEVC hardware transcoding at lower power than software 1080p transcoding on a Raspberry Pi.
Hardlinks are critical for efficient storage. When Sonarr moves a downloaded file to your media library:
Without hardlinks (Copy):
/downloads/incomplete/Show.S01E01.mkv (4GB)
→ Copy creates:
/media/tv/Show/Season 1/Show - S01E01.mkv (4GB)
→ Now 8GB used, then qBittorrent's version deleted
With hardlinks:
/downloads/incomplete/Show.S01E01.mkv (4GB, 1 inode)
→ Hardlink creates:
/media/tv/Show/Season 1/Show - S01E01.mkv (same inode, no extra space)
→ Still only 4GB used
→ qBittorrent continues seeding via /downloads path
→ When seeding complete, qBittorrent deletes its path, media path remains
Requirements for hardlinks:
/data must be mounted the same way in both qBittorrent and Sonarr containersSonarr says "no files found" after download:
Check path mappings. The path qBittorrent reports must match what Sonarr can access. In Docker, use the service name (qbittorrent) not localhost.
Permission errors when moving files:
# Check ownership
ls -la /mnt/data
# Fix permissions
sudo chown -R 1000:1000 /mnt/data
Prowlarr not finding results:
qBittorrent download stuck at 0%:
Jellyfin not picking up new files:
Q: Is this legal?
Downloading copyrighted content without permission is illegal in most countries. This guide covers the technical setup of the arr stack software, which has legitimate uses including downloading public domain content, Linux ISOs, legal free torrents, and content you own. Whether and how you use these tools is your own responsibility.
Q: Do I need a VPN with qBittorrent?
Using a VPN with qBittorrent prevents your ISP from seeing your torrent traffic and hides your IP from other peers. A kill switch (that stops downloads if VPN disconnects) is important. Add Gluetun container as a VPN client and route qBittorrent's traffic through it.
Q: What's the difference between Prowlarr and Jackett?
Both aggregate indexers for Sonarr/Radarr. Prowlarr is the newer, actively maintained successor with native Sonarr/Radarr integration (no Cardigann needed). New setups should use Prowlarr.
Q: How much RAM does the arr stack use?
| Container | RAM |
|---|---|
| qBittorrent | 150–400MB |
| Prowlarr | 80MB |
| Sonarr | 150MB |
| Radarr | 150MB |
| Bazarr | 100MB |
| Overseerr | 200MB |
| Jellyfin (idle) | 300MB |
| Total | ~1.1–1.5GB |
An 8GB N100 system handles this stack with 6.5GB remaining.
Q: Can I add Lidarr for music?
Yes. Lidarr is the music equivalent of Sonarr/Radarr. The same Docker pattern applies — mount /data, connect to Prowlarr and qBittorrent, set root folder to /data/media/music. Navidrome then serves your music library.
| Service | URL | Purpose |
|---|---|---|
| qBittorrent | http://server:8080 | Download client |
| Prowlarr | http://server:9696 | Indexer manager |
| Sonarr | http://server:8989 | TV automation |
| Radarr | http://server:7878 | Movie automation |
| Bazarr | http://server:6767 | Subtitle automation |
| Overseerr | http://server:5055 | Request interface |
| Jellyfin | http://server:8096 | Media streaming |
Use Cases
Compared 7 popular home server dashboards head-to-head in 2026. From Homarr to Dashy — find the best fit for your homelab setup in under 5 minutes.
Use Cases
From replacing Netflix to running local AI, a home server running on 8W can do far more than you'd expect. Here are 15 real uses with app recommendations — and the cost breakdown that makes it worth it.

Use Cases
Run 15 self-hosted services on an Intel N100 mini PC using a single Docker Compose file. Jellyfin, Nextcloud, Pi-hole, Immich, Home Assistant, Vaultwarden, Grafana, and more — all under 12W idle.
Check out our build guides to get started with hardware.
View Build Guides