Skip to content

Instances & per-user defaults

Implementation contracts and behavior for instances & per-user defaults.

The instance registry supports sixteen service types: radarr, sonarr, chaptarr, lidarr, sabnzbd, qbittorrent, nzbget, transmission, deluge, rutorrent, tautulli, tracearr, jellyfin, emby, audiobookshelf, plex. qBittorrent takes either its WebUI username and password or, on 5.2 and newer, an api_key generated under Options > WebUI (sent as a Bearer token, no login call); a row holds one shape or the other, a create or update carrying one clears the stored other, and the admin list reports has_api_key for qBittorrent rows so the editor opens on the right shape without the key ever being served. Deluge takes only its web UI password (there is no username), and its stored URL is the web UI address (http://deluge:8112 by default) to which Cantinarr appends /json. ruTorrent takes an optional HTTP Basic username and password (only when the web server asks for them), and its stored URL is the ruTorrent address (http://rutorrent:8080, or the path ruTorrent is served under) to which Cantinarr appends /plugins/httprpc/action.php: reads go to rTorrent as XML-RPC through that plugin, and start, pause, remove, and remove-with-data go as ruTorrent’s own commands, because rTorrent refuses the raw start and stop calls from the untrusted connection the plugin forwards; remove-with-data runs through ruTorrent’s erasedata plugin (it ships with ruTorrent) and needs a ruTorrent that has been opened at least once, since that is when it learns rTorrent’s command names: until then Cantinarr says so and keeps the torrent. Tautulli and Tracearr are watch-history providers behind one handler (internal/watchhistory): admin-only, one global default, never grantable; Tracearr authenticates with the bearer key its Settings > General issues and is proved by its /api/v1/public/health call. Lidarr follows the Chaptarr access rule (grant-only, no global default), and Jellyfin, Emby, and Plex instances follow it too: never the global default, granted per user, absent from arr routing and the proxy: but a granted user’s /api/config does list the instance (id, type, name) so the app can offer the access guide. Stored URLs must be absolute http/https with no credentials, query, or fragment, and every create/update (plus the dry-run POST /api/instances/test) proves reachability with a live connection check from the server: the only host that ever dials these URLs. Clients never receive them (/api/config omits the URL field), so cluster-internal names like http://radarr:7878 are fully supported and the arrs need no exposure beyond the server’s network. https instances need a certificate the server container trusts: add an internal CA to the image trust store, or use plain http on a trusted network: a self-signed cert otherwise fails the connection check with an x509 error. At most one instance per service type is the global default (enforced in the store: setting a new default clears the old one). Admins can additionally pin a per-user default per service type, which wins over the global flag; for Chaptarr and Lidarr: which have no global default: the per-user pin is the access grant. /api/config returns a per-user filtered view: regular users only see their effective default instances, and services.chaptarr/services.lidarr are false without a grant.

View the maintained source for this page.