An alternative to the *arr stack
Sonarr, Radarr, Prowlarr, a Usenet client and a torrent client: five containers to configure, connect and keep updated. Nabbed does the same job with one container at home and a web app that manages it.
What’s in a typical *arr stack
| App | Its job | Usual port |
|---|---|---|
| Sonarr | Follows TV series and grabs new episodes | 8989 |
| Radarr | Does the same for films | 7878 |
| Prowlarr | Manages indexers and syncs them to Sonarr and Radarr | 9696 |
| SABnzbd or NZBGet | Downloads from Usenet | 8080 or 6789 |
| qBittorrent | Downloads torrents | 8080 |
Many setups add more: Overseerr or Jellyseerr for requests, Bazarr for subtitles, Recyclarr to sync quality profiles, Unpackerr to extract downloads, a VPN container and a reverse proxy to reach it all from outside.
Where the time goes
- Wiring. Each app needs the others’ addresses and API keys. Change one and something downstream stops working.
- Paths. The download client and Sonarr or Radarr have to see the same files at the same paths, or imports fail. Hence remote path mappings and the long guides on hardlinks.
- Updates. Five release cycles, five changelogs and five things that can break after a pull.
- Access. Five web interfaces on five ports, plus a reverse proxy, VPN or open ports to use them away from home.
- People. One login per app, shared by everyone in the house.
The same job in one container
Here is a trimmed-down *arr stack in Docker Compose:
services:
sonarr:
image: lscr.io/linuxserver/sonarr
ports: ["8989:8989"]
volumes: ["./sonarr:/config", "/srv/data:/data"]
radarr:
image: lscr.io/linuxserver/radarr
ports: ["7878:7878"]
volumes: ["./radarr:/config", "/srv/data:/data"]
prowlarr:
image: lscr.io/linuxserver/prowlarr
ports: ["9696:9696"]
volumes: ["./prowlarr:/config"]
sabnzbd:
image: lscr.io/linuxserver/sabnzbd
ports: ["8080:8080"]
volumes: ["./sabnzbd:/config", "/srv/data:/data"]
qbittorrent:
image: lscr.io/linuxserver/qbittorrent
environment: ["WEBUI_PORT=8081"]
ports: ["8081:8081", "6881:6881", "6881:6881/udp"]
volumes: ["./qbittorrent:/config", "/srv/data:/data"]
# …then PUID/PGID and TZ for each, API keys copied
# between the apps, and a reverse proxy in front.And here is everything Nabbed runs at home:
services:
agent:
image: ghcr.io/getnabbed/agent:0.2
restart: unless-stopped
environment:
NABBED_API_URL: https://api.nabbed.media
NABBED_LIBRARY_ROOTS: /media
volumes:
- data:/data
- ./downloads:/downloads
- /srv/media:/media
ports: ["6881:6881", "6881:6881/udp"] # optional
volumes:
data:The agent searches, downloads and imports in one process, so there are no API keys between apps and no path mappings: the folder it downloads to and the library it imports into are both its own. The Docker walkthrough explains each line, and the install guide adds the hardening options.
What Nabbed covers
| Today | With Nabbed |
|---|---|
| Sonarr and Radarr | One library for TV and films: quality profiles with a minimum, preferred and cutoff, automatic upgrades, RSS sync, backfill and a daily search for missing episodes |
| Prowlarr | Newznab and Torznab indexers in the web app, searched in parallel, with health checks |
| SABnzbd or NZBGet | Built-in Usenet client: several servers, par2 repair and extraction |
| qBittorrent | Built-in BitTorrent client: DHT, PEX, ratio rules and bandwidth scheduling |
| Reverse proxy for remote access | Not needed: the agent connects out and the web app works anywhere |
| Overseerr or Jellyseerr | Households (Pro): everyone gets their own account, watchlist and requests |
You keep Plex or Jellyfin: the agent triggers a library scan after each import. You also keep your indexers and Usenet provider, and any tools for things outside TV and films, such as music.
Why one agent is easier to live with
- Imports are all or nothing. The agent verifies, extracts, renames and moves a release, and writes nothing to your library unless every step succeeds.
- It keeps going offline. If the web app is unreachable, downloads carry on and events are sent once it’s back.
- It only writes where you say. Library folders are opt-in on the agent’s machine; by default it can’t write anywhere.
- It’s auditable. The agent is open source under the MIT licence, so you can read every byte it sends.
Comparing Nabbed with Sonarr and Radarr specifically, including when they’re the better choice? See the Sonarr and Radarr comparison.
Questions
Do I need to open ports or set up a VPN to reach it from outside?
No. The agent only makes outbound connections, and you use the web app from any browser. Forwarding port 6881 is optional and only speeds up BitTorrent.
What can the agent run on?
A NAS, a home server, a Raspberry Pi or a Kubernetes cluster. The Docker image is built for amd64, arm64 and armv7, and there are signed binaries for Linux, macOS and Windows.
What happens if Nabbed's cloud is down?
Downloads that are running keep running. The agent queues its events locally and sends them when the web app is reachable again.
Is it open source?
The agent, the part that runs on your hardware, is open source under the MIT licence and sends no telemetry unless you opt in. The web app is a hosted service.
Who can see my Usenet password?
Only your agent. Your browser encrypts provider credentials to the agent's key before sending them, so Nabbed stores them but can't read them.