A Home Assistant custom integration that acts as a secure server-side proxy between the Arr Stack Card and your local media services.
Browsers block direct API calls from a web page to local network services (CORS policy). This integration solves that by routing all requests through Home Assistant's own API — keeping your API keys secure on the server side and requiring HA authentication for every call.
| Service | Role | Required |
|---|---|---|
| Radarr | Movie library management | ✅ Yes |
| Sonarr | TV show library management | ✅ Yes |
| Lidarr | Music library management | Optional |
| Radarr 2 | Second Radarr instance (e.g. 4K) | Optional |
| Sonarr 2 | Second Sonarr instance (e.g. 4K) | Optional |
| qBittorrent | Torrent download client | Optional |
| Deluge | Torrent download client | Optional |
| rTorrent / ruTorrent | Torrent download client | Optional |
| SABnzbd | Usenet download client | Optional |
| NZBGet | Usenet download client | Optional |
| Seerr (Overseerr / Jellyseerr) | Media discovery & requests | Optional |
| Bazarr | Subtitle management | Optional |
| Plex | Stream monitoring & playback control | Optional |
| Jellyfin | Stream monitoring & playback control (via HA integration — no config needed here) | Optional |
| Emby | Stream monitoring & playback control | Optional |
| Kodi | Stream monitoring & playback control (via HA integration — no config needed here) | Optional |
| Tautulli | Watch history, statistics & account sharing detection | Optional |
| Jellystat | Watch history and statistics | Optional |
| Tracearr (beta) | Watch history, statistics, and usage analytics | Optional |
| Prowlarr | Indexer management and search statistics | Optional |
| Trakt | Film and show recommendations — needs a paid VIP account | Optional |
| SuggestArr | Free film and show recommendations from what you have watched | Optional |
| Last.fm | Music recommendations — free API key, works with Lidarr | Optional |
| Maintainerr | Automatic library cleanup, with countdowns shown across the card | Optional |
| Gluetun | VPN status in the downloads panel | Optional |
Note: Plex, Jellyfin, and Kodi also require their official Home Assistant integrations to be installed and connected — Plex, Jellyfin, Kodi. The card uses these HA integrations for live stream detection. Emby does not have an official HA integration — configure it directly in Arr Stack instead.
- Open HACS → Integrations
- Click the ⋮ menu (top right) → Custom repositories
- Add
https://github.com/martinargalas/arr-stack-integration— category Integration - Search for Arr Stack Integration and install
- Restart Home Assistant
- Go to Settings → Devices & Services → + Add Integration
- Search for Arr Stack and follow the setup wizard
- Copy the
custom_components/arr_stack/folder to your HA/config/custom_components/directory - Restart Home Assistant
- Add the integration via Settings → Devices & Services
⚠️ After any change to the integration settings, restart Home Assistant for changes to take effect.
Setup starts with two steps that are always shown, followed by steps for the services you select.
| Field | Default | Notes |
|---|---|---|
| Skip SSL certificate verification | Off | Enable if any of your services use a self-signed or untrusted certificate. Applies to all services at once. |
Choose which optional services you want to configure. Only the selected steps will appear. Radarr and Sonarr are always configured — they are required for the card to work.
| Toggle | Services configured |
|---|---|
| Lidarr | Lidarr |
| Torrent clients | qBittorrent, Deluge, rTorrent |
| Usenet clients | SABnzbd, NZBGet |
| 2nd instances | Radarr 2, Sonarr 2 |
| Bazarr | Bazarr |
| Discovery | TMDB, Seerr, family and guest accounts |
| Plex / Emby | Plex, Emby |
| Streaming stats | Tautulli, Jellystat, Tracearr |
| Prowlarr | Prowlarr |
| Recommendations | Trakt, SuggestArr, Last.fm |
| Maintainerr | Maintainerr |
| Gluetun | Gluetun |
| Field | Example |
|---|---|
| Radarr URL | http://192.168.1.10:7878 |
| Radarr API key | Find in Radarr → Settings → General |
| Sonarr URL | http://192.168.1.10:8989 |
| Sonarr API key | Find in Sonarr → Settings → General |
Your music library. Fill it in and the card gains artists, albums and everything that goes with them — the library, the calendar, the download queue, search, and the artist detail with its own interactive search. Leave it empty and the card carries no music at all.
| Field | Example |
|---|---|
| Lidarr URL | http://192.168.1.10:8686 |
| Lidarr API key | Find in Lidarr → Settings → General |
Music recommendations are set up later, in the Recommendations step — they need Lidarr as well as a Last.fm key.
| Field | Example |
|---|---|
| qBittorrent URL | http://192.168.1.10:8080 |
| qBittorrent username | admin |
| qBittorrent password | •••• |
| Deluge URL | http://192.168.1.10:8112 |
| Deluge password | Your Deluge Web UI password |
| rTorrent URL | http://192.168.1.10:9080 — base URL of ruTorrent |
| rTorrent username | HTTP Basic auth username (if configured) |
| rTorrent password | HTTP Basic auth password |
Leave any field empty to skip that service individually.
| Field | Example |
|---|---|
| SABnzbd URL | http://192.168.1.10:8080 |
| SABnzbd API key | Find in SABnzbd → Config → General |
| NZBGet URL | http://192.168.1.10:6789 |
| NZBGet username | nzbget (default) |
| NZBGet password | Find in NZBGet → Settings → Security |
Leave any field empty to skip that service individually.
Configure a second Radarr and/or Sonarr instance — useful for HD + 4K setups.
| Field | Example |
|---|---|
| Radarr 2 URL | http://192.168.1.10:7879 |
| Radarr 2 API key | •••• |
| Sonarr 2 URL | http://192.168.1.10:8990 |
| Sonarr 2 API key | •••• |
| Field | Example |
|---|---|
| Bazarr URL | http://192.168.1.10:6767 |
| Bazarr API key | Find in Bazarr → Settings → General |
Where the card gets posters, metadata and requests from. This step has four parts, all optional.
TMDB — needed only if you do not use Seerr. Fill in your own free key and posters, ratings, cast, trailers and the Trending and Popular rows keep working. With Seerr configured you can skip this section entirely.
| Field | Notes |
|---|---|
| TMDB API key | Free from themoviedb.org → Settings → API |
Seerr — Overseerr and Jellyseerr have merged under the name Seerr; both existing installations work here unchanged. Without it, movies and shows are added straight to Radarr and Sonarr; with it you get requests, approvals and multi-user support.
| Field | Notes |
|---|---|
| Seerr URL | http://192.168.1.10:5055 |
| Seerr API key | Find in Seerr → Settings → General |
Family account — a non-admin Seerr account shared by the household. Requests made by non-admin Home Assistant users go through it, so they appear in Seerr as ordinary requests waiting for approval rather than as admin actions.
| Field | Notes |
|---|---|
| Family account email | Login email of that Seerr account |
| Family account password | Password for it |
Guest account — a second non-admin Seerr account for visitors or anyone you would rather keep separate from the household. With both accounts filled in, a Users tab appears in the card editor where each Home Assistant user is assigned to one or the other; anyone not assigned falls back to the family account.
| Field | Notes |
|---|---|
| Guest account email | Login email of that Seerr account |
| Guest account password | Password for it |
Plex — authenticate via the Plex login link shown during setup. This enables stream monitoring, active user display, and playback control.
| Field | Notes |
|---|---|
| Plex Server URL | Leave empty to auto-detect. Fill in if HA runs on a different machine or VLAN than Plex — e.g. http://192.168.1.10:32400. |
Note: Plex Now Playing in the card also requires the official Plex integration installed in HA.
Emby — enter your Emby server URL and API key to enable stream monitoring and remote stop with a message.
| Field | Notes |
|---|---|
| Emby URL | http://192.168.1.10:8096 |
| Emby API key | Find in Emby → Dashboard → API Keys → New API Key |
Jellyfin and Kodi do not require any configuration here. Install the official Jellyfin or Kodi HA integration and the card picks them up automatically.
| Field | Notes |
|---|---|
| Tautulli URL | http://192.168.1.10:8181 |
| Tautulli API key | Find in Tautulli → Settings → Web Interface |
| Jellystat URL | http://192.168.1.10:4000 |
| Jellystat API key | Find in Jellystat → Settings |
| Tracearr URL | http://192.168.1.10:3102 — default port is 3102 |
| Tracearr API key | Find in Tracearr → Settings → API |
| Tracearr session cookie | Required for statistics — see below |
| Tracearr refresh token | Older alternative to the cookie — see below |
Tautulli also powers account sharing detection — alerts when the same user streams from multiple IPs simultaneously.
Tracearr is currently in beta. Some features may be incomplete or change in future updates.
The API key alone only reaches Tracearr's public endpoints. Watch history, library and storage statistics — everything the card actually shows — sit behind the same login its own web interface uses, so one more field is needed.
How to get it:
- Open Tracearr in your browser and sign in as you normally would
- Press F12 → Application tab → Cookies → select your Tracearr address
- Find the entry whose name starts with
better-auth.session_tokenand copy both the name and the value, written asname=value - Paste that into the Tracearr session cookie field
The cookie lasts as long as your Tracearr login does. If the statistics stop loading one day, sign in again and copy a fresh one.
Refresh token — the older way of doing the same thing, kept for accounts that already have one. It is being retired and will stop working, so use the session cookie. Accounts that sign in through Plex never had a refresh token to begin with; for those the cookie has always been the only way.
| Field | Example |
|---|---|
| Prowlarr URL | http://192.168.1.10:9696 |
| Prowlarr API key | Find in Prowlarr → Settings → General |
Displays a VPN status badge in the downloads panel — current status, public IP, country, and provider logo.
Gluetun's control server must be reachable from Home Assistant:
- Expose port 8000 in your Gluetun container — map it to any free host port, e.g.
8002:8000 - Create an API key config at
/gluetun/auth/config.toml(bind-mounted into the container):[[roles]] name = "admin" auth = "apikey" apikey = "your-api-key" routes = ["GET /v1/vpn/status", "GET /v1/publicip/ip"]
- Enter the URL (e.g.
http://192.168.1.10:8002) and your API key in the setup step.
The
auth = "apikey"line is required — Gluetun does not support unauthenticated access. Without the config file the container will crash on startup.
Three sources for one Recommendations row in the card. Use any of them, or none — the card's own settings are where you choose which ones it draws on, and its posters wear the mark of whichever service suggested them.
Trakt has moved personalised recommendations behind its paid VIP plan. SuggestArr is a free, self-hosted alternative that needs no third-party account: it reads what you have actually watched on Plex, Jellyfin or Emby and suggests titles you do not own yet.
| Field | Notes |
|---|---|
| SuggestArr URL | http://192.168.1.10:5001 |
| SuggestArr username | Leave empty if SuggestArr runs with AUTH_MODE=local_bypass or with authentication disabled |
| SuggestArr password | Leave empty for the same reason |
Turn off automatic requests in SuggestArr. In SuggestArr's own settings, stop it from sending requests to Seerr on its own. Its background job runs on a schedule, so left on it will request titles by itself and you only find out afterwards. With it off, the suggestions wait in the card until you approve them.
SuggestArr refills its pool on its own schedule, so once you have worked through the current suggestions, a fresh batch can take a few hours to appear.
Film and show recommendations from your Trakt watch history. Trakt now requires a paid VIP account for this — without one the API returns nothing and Trakt simply contributes nothing to the row.
Scrobbling required for personalised results. Recommendations are based on your watch history — titles you've already seen are filtered out and the suggestions are tailored to your taste. For this to work, your plays need to be synced to Trakt automatically. If you use Plex, PlexTraktSync is a good option — run it as a Docker container in
watchmode and it will mark titles as watched on Trakt in real time as you finish them.
- Go to trakt.tv/oauth/applications/new and create a new application (redirect URI:
urn:ietf:wg:oauth:2.0:oob) - Copy the Client ID and Client Secret into the setup step
- Visit the shown URL on trakt.tv, enter the code, then click Submit
The music side of the row: artists you do not own yet, suggested from what you actually listen to. Lidarr is required — without a library to compare against, there is nothing to suggest and nowhere to add an artist.
| Field | Notes |
|---|---|
| Last.fm API key | Free, from last.fm/api/account/create. Only the key is needed — the shared secret is for scrobbling, which this never does |
| Last.fm username | Optional. With it, suggestions follow your scrobbles wherever they come from — Plexamp, Spotify, Apple Music, YouTube Music, your phone or your car; anything that scrobbles to Last.fm counts, not just your own server. Without it, they come from what has been played on your own server |
In the card, Like tells Last.fm to find more in that direction and Skip retires an artist for good. Both are remembered per Home Assistant user, so two people sharing an instance do not steer each other's suggestions.
Maintainerr cleans up your library by rules — "delete a movie 30 days after everyone has watched it", and so on. Connecting it does two things: it gives the card a full Maintainerr panel, and it puts a countdown badge on every title queued for deletion, everywhere in the card. That second part is the real gain — you see what is about to disappear while browsing, not only when you go looking.
Maintainerr has no authentication, so only the address is needed.
| Field | Example |
|---|---|
| Maintainerr URL | http://192.168.1.10:6246 — default port is 6246 |
In the card you can then browse and run rules, edit them or build new ones, manage collections and exclusions, see the deletion schedule on a calendar, and check how much space the cleanup has reclaimed.
If you configure a family account (non-admin Seerr user), the card uses that account for media requests made by non-admin HA users. This lets household members request media without admin privileges.
You can optionally add a guest account — a second non-admin Seerr user for visitors or temporary users. Once both accounts are configured, a Users tab appears in the card editor where you can map specific HA users to either the Family or Guest account. Users not explicitly mapped default to the Family account.
This integration does not expose any Home Assistant sensors, entities, or devices. It acts purely as a proxy — all data is fetched on demand by the card.
Change any setting at any time without reinstalling:
Settings → Devices & Services → Arr Stack → ⋮ → Reconfigure
Your existing settings are pre-filled. Clearing a URL disables that service in the card.
The card sends one anonymous ping per browser session: its version, whether it is running on a phone, and which services are configured — just the names, no URLs, no keys, no titles, nothing about your library. The installation is identified by a short hash of your dashboard's hostname, so it cannot be traced back to you. You can see exactly what is collected at argalas.org/arr-stats.
Knowing which parts people actually use is what guides where the work goes next, so leaving it on genuinely helps. If you would rather not take part, that is entirely fine:
Settings → Devices & Services → Arr Stack → ⋮ → Reconfigure → tick Metrics collection in the service list → turn on the opt-out switch on the final step.
This installation then stops sending anything.
- Arr Stack Card — the Lovelace card that uses this integration
