How it works
There are two flows: searching for media (Torznab) and downloading it (the qBittorrent API). The .torrent files involved are not real torrents — they're tiny stubs jack hands to *arr, which sends them back to jack through the qBittorrent download-client API. Nothing ever touches BitTorrent.
1. Search flow (Torznab)
The setup happens once, at startup: jack registers itself in each destination Radarr/Sonarr as a Torznab indexer and — when downloads is configured — as a qBittorrent download client. Both registrations point at jack.internalUrl and authenticate with an auto-issued managed key. If you'd rather register jack yourself, set that server's autoregister.enable to false.
From then on, every search works like this:
- When you search or monitor something, Radarr/Sonarr query jack's
/torznabendpoint with that managed key. - jack fans the query out to every
peeryou've configured, calling each one's/peer/searchwith the API key that peer issued you. - Each peer searches its own Radarr/Sonarr library — movies and episodes that have files — and returns matching releases, mirroring the *arr file metadata.
- jack turns each match into a Torznab "release" whose download link points back at itself:
/torznab/download/<peerId>:<itemId>.torrent. - Radarr/Sonarr show these as grabbable releases — indistinguishable from a normal indexer's results.
2. Download flow (qBittorrent API)
- You grab a release. Your *arr's download client is the qBittorrent client jack registered on startup, pointed at jack's own qBittorrent API — so *arr fetches the stub
.torrentfrom jack and immediately POSTs it back to jack at/api/v2/torrents/add. - That
.torrentis a stub — bencoded data that just encodes thepeerIdanditemId. No trackers, no pieces; it's never written to disk. - jack parses the stub, finds the matching peer, and queues the download.
- jack downloads the real file over HTTP from that peer's
/peer/items/:id/fileendpoint intodownloads.completedPath. - *arr polls jack's
/api/v2/torrents/infofor progress; once jack reports the torrent complete, *arr scans the completed folder and imports the file into your library, renamed and tracked.
3. Serving — being a peer to others
When a friend lists you as a peer, their jack calls your /peer/* endpoints, authenticated with the peer API key you issued them:
/peer/search— search your Radarr/Sonarr library./peer/items/:id— release metadata./peer/items/:id/file— stream the actual file.
jack streams files straight from disk using the paths your Radarr/Sonarr report, so the jack process must be able to read your media files at those same paths — mount your media into the container the same way your *arr apps see it.