Diskovarr is a self-hosted recommendation and media request platform for Plex. Give your users curated picks from their own watch history — and a clean way to request what's missing.
Point Diskovarr at your Plex Media Server and Tautulli. It syncs your library and reads watch history to understand every user's taste.
→
✨
2
Get Personalized Picks
The recommendation engine scores titles by shared directors, actors, keywords, genres, and TMDB similarity — uniquely for each user on your server.
→
📬
3
Request What's Missing
The Requests tab surfaces personalized picks not yet in your library. Users request titles; you approve and route to Overseerr, Radarr, Sonarr, or Riven.
Features
Everything included
🎯
Personalized Recommendations
Per-user scoring based on watch history, TMDB similarity, shared cast/crew, genres, keywords, and decade. Refreshes every 30 minutes per user.
🔍
Diskovarr Requests
TMDB-powered discovery tab showing personalized picks not yet in your library. Mature content filter, hide-requested toggle, and trending sections.
📋
Request Queue & Approval
Full request management with approve/deny/edit actions, denial notes, season-level selection for TV, status tracking, and relative timestamps.
⚡
Multi-Service Routing
Route requests to Overseerr, Radarr (direct), Sonarr (direct), or Riven. Per-user and global auto-approve. Agregarr shim included.
🔔
Notifications
In-app bell, Discord (webhook + bot DM), and Pushover. Granular per-type toggles. Broadcast messages to all users at once.
🐛
Issue Tracking
Users report playback problems with scope targeting (movie, season, episode). Admin resolves with notes. Threaded comments between user and admin.
🔖
Watchlist
Save titles for later from any card or modal. Syncs with Plex watchlist or uses Diskovarr's own playlist. Optional auto-request on add.
Jump to Connections to wire up Overseerr, Radarr, Sonarr, or Riven, or check Notifications to configure Discord and Pushover.
Looking for a specific feature?
Use the search box above or browse the sidebar tree. Every page, button, toggle, and setting is documented.
Prerequisites
What you need before installing Diskovarr.
Required
Docker or Node.js ≥ 23.4.0Required
Docker is the recommended way to run Diskovarr — no manual dependency management, automatic restarts, and one-line updates. Any machine with Docker and Docker Compose installed is sufficient.
Node.js is required if you prefer to run natively on the host. Diskovarr uses the built-in node:sqlite module which requires Node 23+. Check your version with node -v; install or update via nodejs.org or nvm. See Installation for both setup paths.
Plex Media ServerRequired
A running Plex server with at least one movie or TV library. Diskovarr reads your library and authenticates users via Plex OAuth. You'll need your Plex admin token.
TautulliRequired
Tautulli provides watch history — the core data source for personalized recommendations. Without it, Diskovarr can't score items for each user. Tautulli must be able to see your Plex server's play history.
TMDB API KeyRequired for Requests tab
Free at themoviedb.org. Register an account, request a v3 API key. Without it the Diskovarr Requests tab is disabled but the home recommendation page still works.
Network Access
Diskovarr must be able to reach your Plex server and Tautulli over HTTP/HTTPS. If they run on the same machine, http://localhost:PORT works. If they're on separate machines, use local IPs or hostnames.
Optionally, expose Diskovarr externally (via Nginx Proxy Manager or similar) so users can access it from outside your home network. An external URL is also required if you want Discord bot avatar upload to work.
Optional Services
Overseerr / JellyseerrOptional
One of the request routing backends. Handles the actual download request after a user submits in Diskovarr.
Radarr / SonarrOptional
Direct request routing without Overseerr. Radarr for movies, Sonarr for TV shows.
Riven / DUMBOptional
Real-Debrid based media acquisition. Diskovarr includes a torrent browser and DUMB integration for Overseerr-compatible polling.
AgregarrOptional
Collection manager for Plex. Diskovarr provides an Overseerr-compatible API shim so Agregarr can send requests to Diskovarr directly.
Installation
Docker is the recommended installation method — it handles all dependencies, isolates Diskovarr from your host, and makes updates a one-liner. Native installation is also supported if you prefer to run directly on the host.
★
Docker keeps Diskovarr fully contained, restarts it automatically on failure or reboot, and makes updates a one-liner. If you already run other containers (Plex, Radarr, etc.) this is the fastest path to getting running.
Quick start — pull from Docker Hub
The image is published on Docker Hub as lebbi/diskovarr. The fastest way to get running is a single docker run:
That's it. Visit http://your-server-ip:3232 and continue to First-Time Setup. All other settings (Plex, Tautulli, TMDB, etc.) can be entered through the admin panel after first boot.
ℹ
The ./data volume persists the SQLite database and any uploaded files (bot avatars, etc.) across container restarts and updates. Always mount this — without it all data is lost when the container is recreated.
docker-compose.yml (recommended for long-term use)
For a more maintainable setup, use Compose. Create a directory, drop in this file, and you're done:
Docker pulls the image from Docker Hub and starts the container in the background.
2
Check it's running
docker compose logs -f diskovarr
You should see Diskovarr running on port 3232. Press Ctrl+C to stop following logs.
3
Open the app
Visit http://your-server-ip:3232 and continue to First-Time Setup.
Updating
docker compose pull && docker compose up -d
Pulls the latest image from Docker Hub and recreates the container. Your data in ./data is untouched.
Reverse Proxy (Nginx Proxy Manager)
To expose Diskovarr over HTTPS, add a proxy host in Nginx Proxy Manager:
Forward Hostname/IP: your server IP (or diskovarr if NPM is on the same Docker network)
Forward Port: 3232
WebSockets Support: Enabled — required for real-time Plex WebSocket notifications
ℹ
After setting up a reverse proxy, set the App Public URL in Admin → General to your full external URL (e.g. https://diskovarr.example.com). This is required for Discord bot avatar uploads.
Docker Network (optional)
If Plex, Radarr, Sonarr, or other services also run in Docker, add Diskovarr to the same network so you can reference them by container name instead of IP:
services:
diskovarr:
image: lebbi/diskovarr:latest
container_name: diskovarr
restart: unless-stopped
ports:
- "3232:3232"
volumes:
- ./data:/app/data
environment:
- ADMIN_PASSWORD=your_password
- SESSION_SECRET=your_secret
networks:
- media
networks:
media:
external: true # name of your existing Docker network
Then in Admin → Connections you can use http://plex:32400, http://radarr:7878, etc. instead of host IPs.
ℹ
Native installation runs Diskovarr directly on your host. You're responsible for keeping Node.js updated and running the process persistently. Docker is easier for most setups, but native works well if you prefer it.
Prerequisites
Node.js v23.4 or newer is required. Check your version:
node -v
If you need to install or update Node.js, use the official installer or nvm:
# Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
# Install and use Node.js 23
nvm install 23
nvm use 23
Install Diskovarr
1
Clone the repository
git clone https://github.com/Lebbitheplow/diskovarr.git
cd diskovarr
2
Install dependencies
npm install
3
Create your .env file
cp .env.example .env
nano .env
At minimum, set SESSION_SECRET and ADMIN_PASSWORD. See the environment variables reference below.
4
Start the server
npm start
Diskovarr will be available at http://your-server:3232. Continue to First-Time Setup.
Environment Variables
SESSION_SECRETRequired
A long random string used to sign session cookies. Generate with: openssl rand -hex 32
ADMIN_PASSWORDRequired
Password for the /admin panel. Choose something strong — this is the only thing protecting admin access.
PORTOptional
Port to listen on. Defaults to 3232.
NODE_ENVOptional
Set to production for production deployments. Enables secure cookie flags and disables verbose stack traces.
Running as a systemd Service
To keep Diskovarr running after reboots, create a systemd unit file. Replace your-user with your actual username.
cd /home/your-user/diskovarr
git pull
npm install
sudo systemctl restart diskovarr
Reverse Proxy (Nginx Proxy Manager)
To expose Diskovarr over HTTPS, create a proxy host in Nginx Proxy Manager pointing to http://localhost:3232. Enable WebSockets Support — this is required for real-time Plex WebSocket notifications.
ℹ
After setting up a reverse proxy, set the App Public URL in Admin → General to your full external URL (e.g. https://diskovarr.example.com). This is required for Discord bot avatar uploads.
First-Time Setup
After starting Diskovarr for the first time, follow these steps to get the core services connected. Once done, Diskovarr will be fully functional — optional integrations (Overseerr, Radarr, Sonarr, Riven, Agregarr) can be added any time from the Connections tab.
1
Open the Admin Panel
Navigate to http://your-server:3232/admin and log in with the ADMIN_PASSWORD you set during installation. You'll land on the General tab.
2
Connect Plex
Go to Admin → Connections → Plex. You need three things:
Address — the IP or hostname of your Plex server (e.g. 192.168.1.10). If Diskovarr is running on the same machine as Plex, use localhost.
Port — leave blank to use the default 32400, or enter a custom port if you've changed it.
Token — your Plex admin authentication token (see below).
How to find your Plex token:
Open Plex Web in your browser and sign in as the server admin.
Click on any movie or show to open its detail page.
Click the ⋮ (three dots) menu → Get Info → at the bottom, click View XML.
Look at the URL in your browser's address bar — it contains X-Plex-Token=YOURTOKEN. Copy everything after the =.
ℹ
This must be the admin token — the account that owns the Plex server. Tokens from managed users or Plex Home members won't have the required library access. Your token is a 20-character alphanumeric string.
Enter the address, port, and token, then click Test. You should see a green success message. Click Save.
3
Connect Tautulli
Go to Admin → Connections → Tautulli. Tautulli provides per-user watch history — without it, Diskovarr can't generate personalized recommendations.
Address — IP or hostname of your Tautulli server.
Port — Tautulli's default is 8181.
API Key — found inside Tautulli at Settings → Web Interface → API Key. It's a 32-character hex string. If you don't see an API key there, scroll down and make sure Enable API is checked, then save Tautulli's settings.
Click Test to verify, then Save.
ℹ
Tautulli must be connected to the same Plex server you configured in the previous step. If Tautulli is on the same machine as Diskovarr, use localhost as the address.
4
Add a TMDB API Key (enables Diskovarr Requests)
Go to Admin → Connections → TMDB. The TMDB API is free and enables the Diskovarr Requests discovery tab, item detail metadata, search autocomplete, and trailer embeds. Without it, the Requests tab is hidden — the home recommendation page still works.
After verifying your email, go to Settings → API (under your account avatar in the top right).
Click Request an API Key → choose Developer.
Fill in the form — for personal use, describe it as a personal home server project. Accept the terms.
Your API Key (v3 auth) — a 32-character hex string — is shown on the API settings page. Copy it.
Paste the key into Diskovarr, click Test, then Save. The Diskovarr Requests tab will appear immediately for all users.
5
Sync Your Library
Go to Admin → General and click Sync Library Now. This pulls your full movie and TV library from Plex into Diskovarr's local database. The stat cards (Movies, TV & Anime, Total) will update when it finishes. On large libraries (10,000+ items) this can take a minute or two — subsequent syncs are much faster.
Auto-sync runs every 2 hours in the background once enabled — toggle it on in the same section.
6
Set the Server Owner
Go to Admin → Users and find the Server Owner dropdown at the top. Select your own account. This permanently locks your elevated privileges so they can never accidentally be revoked — even by another admin. The owner badge also appears next to your name throughout the admin panel.
Your account appears in this list once you've signed in at least once via the Plex login page (/login).
7
Invite Users
Users sign in at http://your-server:3232/login using their own Plex account. They must be either:
A Plex Friend — you've shared your Plex libraries with them (Plex → Friends → Invite Friend by email)
A Plex Home member — added to your Plex Home from your account settings
The first time they sign in, their Diskovarr profile is created automatically. You can then adjust their settings, limits, and permissions from Admin → Users.
★
That's the core setup done. To let users request media, connect at least one request service — Overseerr, Radarr, Sonarr, or Riven — from the Connections tab. You can also set up Discord and Pushover notifications so users are alerted when their requests are approved or available.
Admin Panel — General
The General tab contains app-wide settings: public URL, theme, library sync, logging, and the API key.
App Public URL
Enter the full external URL where Diskovarr is accessible (e.g. https://diskovarr.example.com). This is used when uploading a Discord bot avatar — without it, the avatar upload will fail. It does not affect Plex authentication.
Theme Color
Pick an accent color for the entire app. Changes apply immediately — all users see the new color on their next page load without a restart.
Preset swatches — click any swatch to apply instantly
Custom color picker — enter any hex value or use the color wheel
Apply button — confirms your selection
Library Sync
Diskovarr maintains an in-memory library cache synced from Plex every 2 hours. The General tab shows the current state and lets you trigger a manual sync.
Auto-Sync Toggle
When enabled, library sync runs automatically every 2 hours. Disable only if you want to manage syncing manually or via Plex webhook.
Sync Status Badge
Shows Syncing… (with spinner) or Idle. Stat cards below show Movies count, TV & Anime count, Total, and last sync time.
Sync Library Now
Triggers an immediate full sync from Plex. Disabled while a sync is already in progress. An error banner appears below if the last sync failed.
Verbose Logging
When enabled, Diskovarr writes detailed HTTP request logs including headers, query params, and response times. Useful for debugging connection issues.
# View live logs (systemd)
journalctl -u diskovarr -f
# Or if running directly
npm start 2>&1 | tee diskovarr.log
⚠
Verbose logging can produce a large volume of output. Disable it once you're done troubleshooting to avoid filling your disk.
API Key
Generate a token for external API access (scripts, automation tools, etc.). The key is shown once — copy it immediately. You can regenerate at any time, which invalidates the old key.
Eye button — toggle visibility of the masked key field
Copy button — copies key to clipboard
Generate / Regenerate — creates a new key (old key is immediately invalid)
Pass the key in requests using the header: X-Api-Key: your-key-here
API Endpoint Reference
A collapsible table of all 28 public API endpoints is shown below the API Key section. It documents every endpoint's method, path, parameters, and purpose. See the full API Reference section in this documentation.
Admin Panel — Users
Manage all users on your server: request limits, auto-approve, elevated privileges, bulk actions, and cache controls.
Server Owner
Select which Plex user is the designated server owner. The owner's elevated privileges toggle is permanently locked — they cannot have admin access removed. Choose yourself or a trusted admin account.
Watchlist Mode
Controls how the Watchlist feature works:
Plex Watchlist — reads and writes to the user's actual Plex watchlist. Requires the user to be connected via Plex OAuth.
Diskovarr Playlist — Diskovarr manages its own per-user playlist independent of Plex. Useful if users don't use Plex's native watchlist.
Individual Season Requests
When enabled, TV show request dialogs show a checkbox list of individual seasons so users can request only specific seasons rather than the whole show. When disabled, TV requests are submitted for the full series.
User Table
Lists all known Plex users who have signed in. Columns:
Checkbox — select for bulk operations
User — avatar, username, and Plex user ID
Watched — number of items in their Tautulli watch history
Requests — total number of requests submitted
Last Visit — when they last accessed Diskovarr
Settings ⚙ — opens the per-user settings page (when Diskovarr Requests is enabled)
The table paginates at 10 users per page. Use the per-page dropdown (10 / 25 / 50) to show more. Pagination controls are always visible.
Bulk Edit
Select one or more users via the row checkboxes, then click Bulk Edit Settings to apply settings to all selected users at once. Each field has a three-state selector — No change means that field is skipped for all selected users, so only fields you explicitly set will be updated.
Bulk editable fields: request limit overrides (movies and TV seasons), auto-approve (movies and TV), elevated privileges (grant or revoke).
Cache Management
These buttons affect all users at once. Use when troubleshooting stale data:
Clear All Watched Caches
Forces a fresh Tautulli sync for all users on the next recommendation build.
Clear All Dismissals
Removes all "✕ Dismiss" actions — dismissed items will reappear in recommendations.
Clear Rec Cache (All Users)
Wipes the scored recommendation cache for every user. Recommendations rebuild on next visit (or background pre-warm in ~25 min).
Global Request Limits
Set defaults applied to all users. Individual users can have overrides set on their per-user settings page.
Movies — check Unlimited for no limit, or enter a count and window in days (e.g. "3 movies per 7 days")
TV Seasons — same format, counted per season requested (not per show)
ℹ
The TV season limit counts individual seasons, not shows. If a user requests a 5-season show, that costs 5 against their limit.
Auto-Approve
When enabled, requests skip the queue entirely and route directly to the configured service (Overseerr, Radarr, Sonarr, etc.) without waiting for admin approval.
Auto-Approve Movies — toggle for all movie requests
Auto-Approve TV Shows — toggle for all TV requests
Per-user overrides can enable or disable auto-approve independently of the global setting.
Auto-Request Watchlist
When enabled, adding an item to the Diskovarr watchlist automatically submits a request for it. Works per-media-type:
Auto-Request Movies from Watchlist
Auto-Request TV Shows from Watchlist
Disable All Requests
A global kill switch in the Request Limits section. When toggled on, the Request button is hidden site-wide and any attempt to submit a request is blocked. Individual users can be granted a bypass via their per-user settings page (Override Global → enable requests for that user).
Admin Panel — Connections
Configure all external services. Each service follows the same pattern: toggle to enable/disable, enter credentials, Test, then Save. Saved values are stored masked (shown as ••••••••).
Use the sidebar links to jump to a specific service:
Overseerr-compatible shim for Agregarr collection requests.
Default Request Service
Visible when two or more request services are enabled. Sets which service handles new requests by default. Users with access to multiple services can switch via the Advanced button in the request dialog.
Alternate Request App Access
Controls who sees the Advanced service selector button in request dialogs:
All Users — any user can choose which service to route their request to
Admin Only — only admins and elevated users see the alternate service option
Connection — Plex
Plex is required. It provides the library, user authentication via Plex OAuth, and poster images. All other features depend on this connection being healthy.
What you need
The IP address or hostname of your Plex server
Your Plex server's port (default 32400)
Your Plex admin token — a 20-character string tied to your Plex account
Finding your Plex token
The easiest method using Plex Web:
1
Open Plex Web and sign in as the server admin
Go to app.plex.tv or your local Plex Web address. Make sure you're signed in with the account that owns the server — not a friend or managed user.
2
Open any item's info page
Click on any movie or TV show. In the detail view, click the ⋮ (three dots) menu → Get Info.
3
View the XML
At the bottom of the Get Info dialog, click View XML. A new browser tab opens with raw XML data.
4
Copy the token from the URL
Look at the address bar. The URL contains X-Plex-Token=XXXXXXXXXXXXXXXXXXXX. Copy the 20-character value after the equals sign — that's your token.
ℹ
This must be the server owner's token. It's used server-side only — Diskovarr never exposes it to browsers. Poster images are proxied through /api/poster so the token never leaves your server.
Entering the connection
In Admin → Connections → Plex:
AddressRequired
IP or hostname of your Plex server. If Diskovarr and Plex are on the same machine, use localhost. For Docker on the same host, use the server's LAN IP or the container name if they share a network. Do not include http:// or a port here.
PortOptional
Default is 32400. Leave blank to use the default. Only change this if you've moved Plex to a non-standard port.
TokenRequired
The 20-character admin token from the steps above. Stored encrypted — displayed as ••••••• after saving.
Click Test — a green success message confirms Diskovarr can reach your Plex server and authenticate. Then click Save.
Connection — Tautulli
Tautulli is required for personalized recommendations. It tracks what every user has watched on your Plex server — Diskovarr uses that history to score and rank titles for each person.
What is Tautulli?
Tautulli is a free, open-source monitoring and tracking tool for Plex. If you don't have it installed yet, grab it from tautulli.com — it runs as a Docker container or native service and takes about 5 minutes to set up. It must be pointed at the same Plex server you connected in the previous step.
Finding your Tautulli API key
1
Open Tautulli and go to Settings
In the Tautulli web interface, click the Settings gear icon in the top navigation (or go to Settings in the sidebar).
2
Open Web Interface settings
In the Settings sidebar, click Web Interface.
3
Copy the API key
Scroll down to the API section. Make sure Enable API is checked. Your API Key (a 32-character hex string) is shown below it. Click it to select all, then copy.
Entering the connection
In Admin → Connections → Tautulli:
AddressRequired
IP or hostname of your Tautulli server. Use localhost if it's on the same machine as Diskovarr.
PortOptional
Default is 8181. Leave blank unless you've changed it.
API KeyRequired
The 32-character key from Tautulli's Web Interface settings.
Click Test then Save. Once saved, Diskovarr will start pulling watch history for recommendations.
Connection — TMDB
The Movie Database (TMDB) provides metadata, poster art, trailers, cast info, and discovery data. The API is completely free for personal use — no credit card required.
Search autocomplete — title suggestions in the nav bar search
Season data — TV season counts and episode info in request dialogs
Without a TMDB key the Requests tab is hidden for all users. The home recommendation page still works since it reads from your existing Plex library.
Getting a free TMDB API key
1
Create a TMDB account
Go to themoviedb.org/signup and register. Verify your email — you can't request an API key without a verified account.
2
Request an API key
Click your avatar in the top right → Settings → API in the left sidebar. Under Request an API Key, click the link and choose Developer.
3
Fill in the application form
TMDB asks for basic details about how you'll use the API. For a personal home server, something like "Personal Plex recommendation and request app for home use" is fine. Accept the terms and submit.
4
Copy your API key
After submitting, you'll be taken back to the API settings page where your API Key (v3 auth) is shown — a 32-character hex string. Copy it.
Entering the connection
In Admin → Connections → TMDB, paste your key into the API Key (v3) field and click Test then Save. The Diskovarr Requests tab appears immediately for all users.
API Key (v3)Required
The 32-character key from your TMDB account API settings. Use the v3 key, not the "API Read Access Token (v4)".
Diskovarr Requests Tab
Toggle to show or hide the Requests tab for all users. Useful if you want to temporarily disable discovery without removing your API key.
Connection — Overseerr
Overseerr (or Jellyseerr) handles the actual download trigger when a user submits a request in Diskovarr. It connects to your Radarr and Sonarr instances and manages approvals, quality profiles, and notifications on its own side. Use this if you already have Overseerr running — or use Radarr/Sonarr directly instead.
Getting your Overseerr API key
1
Open Overseerr and go to Settings
In your Overseerr web interface, click the Settings link in the sidebar (gear icon). You need to be signed in as an admin.
2
Copy the API key from General settings
Under Settings → General, your API Key is shown near the top of the page. Click Copy or select and copy the key manually.
Entering the connection
In Admin → Connections → Overseerr:
AddressRequired
IP or hostname of your Overseerr instance. No port, no http://.
PortOptional
Default is 5055. Leave blank if unchanged.
API KeyRequired
The key from Overseerr → Settings → General. If you also plan to use Agregarr, this must be an admin-level API key so Agregarr can automatically create service user accounts.
Enable
Toggle on to make Overseerr available as a request destination. When multiple services are enabled, you can set which is the default in the Connections overview.
Click Test then Save. Users will now see a request button on all items not in the library.
Connection — Radarr
Direct movie request routing without needing Overseerr. When a user's movie request is approved in Diskovarr, it's sent straight to Radarr which handles searching, downloading, and adding it to your library.
Getting your Radarr API key
1
Open Radarr → Settings → General
In your Radarr web interface, click Settings in the sidebar, then choose General.
2
Copy the API Key
Under the Security section, your API Key is listed. Click the clipboard icon or select and copy it.
Entering the connection
In Admin → Connections → Radarr:
AddressRequired
IP or hostname of your Radarr instance.
PortOptional
Default is 7878.
API KeyRequired
The key from Radarr → Settings → General → Security.
Quality ProfileRequired to enable
Click Test first — this loads your available quality profiles from Radarr. Select the profile you want applied to all movie requests routed through Diskovarr (e.g. "HD-1080p", "Any"). If Radarr is temporarily unreachable later, the last-saved profile name is still shown.
Click Test to load quality profiles, select one, then click Save. Movies requested through Diskovarr will now be added directly to Radarr.
ℹ
You can use Radarr and Overseerr at the same time. When both are enabled, set your preferred default in Admin → Connections → Default Request Service. Users with access can switch services per-request using the Advanced button.
Connection — Sonarr
Direct TV show request routing. Works the same as Radarr but for TV series — when a TV request is approved, Diskovarr sends it to Sonarr which handles downloading and library management.
Getting your Sonarr API key
In Sonarr, go to Settings → General → Security. Your API Key is shown there — copy it.
Entering the connection
In Admin → Connections → Sonarr:
AddressRequired
IP or hostname of your Sonarr instance.
PortOptional
Default is 8989.
API KeyRequired
The key from Sonarr → Settings → General → Security.
Quality ProfileRequired to enable
Click Test first to load available profiles from Sonarr, then select one. All TV requests routed to Sonarr will use this profile. Common choices: "HD-1080p", "Any", or a custom profile you've defined in Sonarr.
Click Test to load profiles, select one, then click Save.
ℹ
If you have both Radarr and Sonarr connected, Diskovarr automatically routes movie requests to Radarr and TV requests to Sonarr. No manual routing selection needed — it's based on media type.
Connection — DUMB / Riven
DUMB (Debrid Unlimited Media Bridge) is an all-in-one Docker stack that bundles 25+ media automation services — including Riven, Zurg, rclone, Radarr, Sonarr, Tautulli, Plex, and more — into a single, modular deployment. Riven is one component within DUMB responsible for media automation: it finds debrid-cached torrents and symlinks them into your library without downloading anything locally. Diskovarr connects to the Riven component inside DUMB (or a standalone Riven install) to route requests and provide a torrent browser UI.
★
DUMB is the recommended setup. It handles all the plumbing between Riven, debrid services, rclone, and Plex in one container stack. If you're starting fresh, deploy DUMB rather than installing Riven standalone. Visit github.com/I-am-PUID-0/DUMB for installation instructions.
What this connection does
Request routing — approved requests from Diskovarr are sent to Riven (inside DUMB) which finds a cached torrent on your debrid service and adds it to your library automatically
Torrent browser — search for a title, browse Torrentio results with Real-Debrid cache indicators, and inject a torrent directly into Riven with one click
Overseerr-compatible bridge — Diskovarr exposes an Overseerr-compatible API endpoint so Riven's poller can pull approved requests on its own schedule
Prerequisites
DUMB running with the Riven service enabled (recommended), or a standalone Riven instance
An active Real-Debrid (or All-Debrid) subscription — Riven uses debrid for cached torrent access
Riven already configured and connected to your Plex library within DUMB
Step 1 — Connect Diskovarr to Riven
In Admin → Connections → Riven:
Riven URL
URL of your Riven instance. If using DUMB on the same host, this is typically http://127.0.0.1:8082. If DUMB is on a different machine, use its LAN IP and Riven's port.
API KeyAuto-read
Automatically read from Riven's settings file. Shown for reference — no manual entry needed.
Real-Debrid KeyAuto-read
Read from Riven's environment. Used by the torrent browser to show RD cache status — green means the torrent is already cached on your RD account and will stream instantly.
Click Test then Save. Once saved, the Browse Torrents button becomes active. See Riven Torrent Browser for usage details.
Step 2 — Set up the DUMB request bridge (recommended)
The DUMB integration lets Riven automatically pull and process approved requests from Diskovarr without any manual intervention. Diskovarr generates a unique API key that makes it look like an Overseerr instance to Riven's poller.
1
Copy the DUMB API Key from Diskovarr
In Admin → Connections → Riven → DUMB Integration, copy the DUMB API Key — a 68-character auto-generated string. This key is sized specifically to pass Riven's Overseerr key validation.
2
Point Riven at Diskovarr as its Overseerr source
In your Riven (or DUMB) settings, find the Overseerr content source configuration and enter:
Overseerr URL → your Diskovarr URL (e.g. http://192.168.1.x:3232)
Overseerr API Key → the DUMB API Key copied above
Save the Riven settings. Riven will now treat Diskovarr as its Overseerr source for request polling.
3
Choose a request mode in Diskovarr
Pull (recommended) — Riven polls Diskovarr's /api/v1/request endpoint on its own schedule and picks up approved requests. No extra configuration needed on Diskovarr's end.
Push — Diskovarr immediately sends each approved request to Riven the moment it's approved, without waiting for Riven's next poll cycle. Use this for real-time delivery if you find Pull too slow.
ℹ
If you click Regenerate Key, the old DUMB API key stops working immediately. Update it in Riven's Overseerr settings right away — otherwise Riven's polls will start returning 401 errors and requests won't be processed.
Using Riven without DUMB
If you're running Riven standalone (not inside DUMB), the connection works exactly the same way — enter your Riven URL and follow the same DUMB bridge steps above. The torrent browser and request routing both function identically. DUMB is recommended because it manages Riven alongside all the supporting services (rclone, Zurg, Tautulli, etc.) in one place, but it's not a hard requirement.
Agregarr is a Plex collection manager that can automatically request missing items from your collections. Diskovarr provides an Overseerr-compatible API shim so Agregarr can send those requests to Diskovarr as if it were Overseerr — they show up in your request queue with a bot badge and go through the same approval and routing as user requests.
How it works
When Agregarr finds a movie or show that belongs in one of your Plex collections but isn't in your library, it sends a request to Diskovarr's /api/v1/ shim endpoint. Diskovarr processes it as a regular request, auto-approves it if your settings allow, and routes it to whichever download service you have configured (Overseerr, Radarr, Sonarr, or Riven). Each collection type gets its own service user account in Diskovarr (e.g. "TmdbAgregarr", "ImdbAgregarr") that appears in the request queue.
Setting up the connection
1
Enable Agregarr in Diskovarr
Go to Admin → Connections → Agregarr and toggle Enable on. Click Save. This activates the /api/v1/ shim endpoint.
2
Copy the Agregarr API Key
The Agregarr API Key is auto-generated and shown read-only in the Connections panel. Copy it — you'll paste it into Agregarr in the next step.
3
Add Diskovarr as an Overseerr source in Agregarr
In your Agregarr web interface, go to the Overseerr source configuration and set:
Overseerr URL → your Diskovarr URL (e.g. http://192.168.1.x:3232)
Overseerr API Key → the Agregarr API Key you copied above
Save and restart the Agregarr container if required.
4
Trigger a sync in Agregarr
Run a manual sync in Agregarr or wait for its scheduled run. The first time it connects, it creates service user accounts in Diskovarr automatically. You'll see them appear in Admin → Users with names like "TmdbAgregarr" or "ImdbAgregarr".
ℹ
Agregarr needs to create service user accounts the first time it syncs. This requires an admin-level API key in Diskovarr — the auto-generated key already has the right permissions, so no extra steps are needed on your end.
Settings reference
Agregarr API Key
Auto-generated, read-only. This is what you paste into Agregarr as the Overseerr API key. If you regenerate it, update Agregarr immediately and restart its container — the old key stops working instantly.
Enable
Master toggle for the shim. When off, all requests from Agregarr are rejected with a 401. Your key is preserved so you can re-enable without reconfiguring Agregarr.
Regenerate Key
Generates a new API key and immediately invalidates the old one. Use this if you suspect the key was compromised. Remember to update it in Agregarr and restart its container.
Diskovarr can notify users and admins through three channels: the in-app bell, Discord (shared channel webhook and/or personal bot DMs), and Pushover push notifications. All three can be active simultaneously with independent settings. This page walks through setting up each one from scratch.
Broadcast Message
Type a message in the textarea and click Notify All Users. The message is delivered simultaneously to the in-app bell for all users, plus Discord and Pushover if configured. Broadcast bell notifications open a full-text modal when clicked rather than navigating away.
Notification Types
All notification services share the same 9 event types. Each service has its own independent set of checkboxes — you can enable "Request approved" on Discord but not Pushover, for example. The recipient column shows who receives each type:
New request pendingAdmins
Fired when a user submits a request that requires manual approval.
Request auto-approvedAdmins
Fired when auto-approve is on and a request is routed immediately without admin review.
Request approvedRequester
Sent to the user who made the request when an admin approves it.
Request deniedRequester
Sent to the requester when their request is denied, optionally including the admin's note.
Request available in libraryRequester
Sent when a requested title appears in the Plex library. Triggered by Plex webhook or WebSocket events.
Request processing errorAdmins
Fired when a request fails to forward to Overseerr, Radarr, Sonarr, or Riven.
New issue reportedAdmins
Fired when a user reports a playback issue through the detail modal.
Issue status updatedRequester
Sent to the issue reporter when an admin resolves or closes it.
Issue commentBoth
Admin comments on an issue notify the reporter. User comments notify all admins.
Discord — Webhook Setup
A webhook posts notification embeds to a single Discord channel. It's the simplest way to get shared visibility — everyone in that channel sees new requests, approvals, and alerts. No bot account needed.
Step 1 — Create the webhook in Discord
1
Open your Discord server settings
In Discord, right-click your server name in the left sidebar (or click the server name at the top) and choose Server Settings.
2
Go to Integrations → Webhooks
In the left sidebar under Server Settings, click Integrations, then click Webhooks. Click New Webhook.
3
Configure and copy the URL
Give the webhook a name (e.g. "Diskovarr"), choose which channel it posts to using the Channel dropdown, then click Copy Webhook URL. The URL looks like: https://discord.com/api/webhooks/1234567890/AbCdEfGhIjKlMnOp...
Step 2 — Enter the URL in Diskovarr
Paste the webhook URL into the Webhook URL field in Admin → Notifications → Discord Webhook. Toggle the enable switch on, choose your notification types, then click Save. Click Test to verify a test embed arrives in the channel.
Webhook Settings Reference
Enable
Master toggle for the webhook. Disabling it stops all webhook posts without clearing your settings.
Webhook URLRequired
The full discord.com/api/webhooks/... URL from the step above.
Notification Role IDOptional
If you want webhook messages to @mention a Discord role (e.g. to ping your Plex admins), paste the role's numeric ID here and check the Mention role checkbox. To find a role ID: enable Developer Mode in Discord (User Settings → Advanced → Developer Mode), then right-click the role in Server Settings → Roles and choose Copy Role ID.
Embed Poster
Includes the movie or show's poster image in the Discord embed. Disable if you prefer text-only messages or if images make the channel too noisy.
Notification type checkboxes
Select which events post to this channel. A typical admin setup: enable "New request pending" and "New issue reported" so admins see activity; leave requester-specific types (approved, denied, available) off since they'll be handled by the bot DM or Pushover.
Discord — Bot Setup
A bot sends personal DMs to individual users. Each user receives only notifications relevant to them (their own requests, their own issues) rather than a shared channel flood. Both webhook and bot can be active at the same time with independent notification type selections.
ℹ
For bot DMs to reach a user, two things must be true: the user must be in your Discord server, and their DMs from server members must be allowed. Discord blocks DMs by default on many servers — the easiest fix is having users right-click the server → Privacy Settings → enable Direct Messages.
Step 1 — Create a Discord application and bot
1
Open the Discord Developer Portal
Go to discord.com/developers/applications and log in with your Discord account. Click New Application in the top right.
2
Name your application
Give it a name like "Diskovarr" — this becomes the bot's default display name. Click Create.
3
Add a bot to the application
In the left sidebar, click Bot. Click Add Bot → Yes, do it!. The bot user is now created.
4
Copy the bot token
On the Bot page, click Reset Token → confirm → then click Copy. The token looks like: MTIzNDU2Nzg5MA.GhIjKl.MnOpQrStUvWxYz... Treat this like a password — anyone with it can control your bot. Do not share it or commit it to git.
5
Enable the Message Content intent (optional but recommended)
Still on the Bot page, scroll down to Privileged Gateway Intents and enable Message Content Intent. This isn't strictly required for DMs but prevents warnings and is good practice.
6
Invite the bot to your server
In the left sidebar click OAuth2 → URL Generator. Under Scopes, check bot. Under Bot Permissions, check Send Messages (that's all it needs for DMs). Copy the generated URL and open it in your browser to invite the bot to your Discord server.
Step 2 — Enter the token in Diskovarr
Paste the bot token into Bot Token in Admin → Notifications → Discord Bot. Enable the toggle, configure your notification types, and click Save. Click Test — if your own Discord User ID is set in your My Settings, you should receive a test DM from the bot.
Step 3 — Create a non-expiring invite link (recommended)
Users need to be in your Discord server to receive DMs. Create a permanent invite: right-click your server → Invite People → click Edit invite link → set expiry to Never → copy the link. Paste it into the Discord Server Invite Link field in Diskovarr. This shows a "Join Server" button on each user's My Settings page.
Step 4 — Users configure their Discord User ID
Each user who wants bot DMs must enter their own Discord User ID in My Settings → Discord. To find a user ID:
In Discord, go to User Settings → Advanced → enable Developer Mode
Right-click any user's name → Copy User ID (a numeric string like 123456789012345678)
Paste that into the Discord User ID field in Diskovarr My Settings → Save
Bot Settings Reference
Enable
Master toggle for the bot. Independent of the webhook toggle.
Bot TokenRequired
The secret token from the Developer Portal. Never expose this publicly. If compromised, regenerate it immediately in the Developer Portal (Reset Token) and update Diskovarr.
Bot UsernameOptional
Overrides the display name shown in DMs. If blank, uses the bot's account name set in the Developer Portal.
Bot AvatarOptional
Upload a PNG/JPG/GIF (128×128 px recommended, max 2 MB) or enter a direct image URL. The avatar is pushed to Discord's API via your bot token. Requires App Public URL to be set in Admin → General — without it, the upload API call has no return address and will fail.
Discord Server Invite LinkOptional
A permanent invite URL shown as "Join Server" in each user's My Settings. Use a never-expiring invite so it doesn't break after a few days.
Embed Poster
Attaches the movie/show poster to DM embeds. Independent of the webhook's embed poster setting.
Pushover Setup
Pushover delivers push notifications to iOS and Android phones. The Pushover app costs a one-time $5 per platform (free 30-day trial). Once set up, it's highly reliable and works even when Discord DMs are blocked.
★
Pushover is a great complement to Discord: use Discord for shared channel visibility and Pushover for per-user personal alerts (request approved, item available) that don't belong in a group channel.
Step 1 — Create a Pushover account and install the app
1
Sign up at pushover.net
Go to pushover.net and create a free account. Your User Key (a 30-character string) is displayed on the dashboard immediately after signup. Keep this page open — you'll need it shortly.
2
Install the Pushover app on your phone
Download Pushover from the App Store (iOS) or Google Play (Android). Open it and log in with your pushover.net credentials. The app registers your device — you'll see the device name appear on your pushover.net dashboard under "Your Devices".
3
Create an application API token
On pushover.net, scroll down to Your Applications and click Create an Application/API Token. Fill in:
Name: Diskovarr (or whatever you like)
Type: Application
Description / URL / Icon: Optional, can be left blank
Click Create Application. Your new API Token/Key (also 30 characters) is shown on the next page. This is the application token — different from your user key.
Step 2 — Enter keys in Diskovarr (Admin)
In Admin → Notifications → Pushover:
Application API Token — paste the token from the application you just created
User or Group Key — paste your personal 30-character user key from the pushover.net dashboard. This is the admin's own key — it receives admin-type notifications (new request, new issue, etc.).
Choose a notification sound, configure your notification types, click Save, then click Test. Your phone should buzz within a few seconds.
Step 3 — Users add their own Pushover key
Each user who wants Pushover notifications must enter their own Pushover User Key in My Settings → Pushover. They follow the same signup process (pushover.net account + app install), then copy their user key and paste it in Diskovarr. They do not need to create a separate application — they all share the same application token you created as admin.
ℹ
The Application API Token is set once by the admin and is shared across all users. The User Key is per-person — each user enters their own. Diskovarr routes notifications to the correct user by pairing the shared app token with each user's individual key.
Pushover Settings Reference
Application API TokenRequired
The token from the application you created at pushover.net. Shared across all users — do not confuse with the user key.
User or Group KeyRequired
The admin's own Pushover user key (30 characters). Controls which device(s) admin-type notifications are delivered to. If you want admin notifications to go to multiple people, create a Pushover Group on pushover.net and paste the group key here instead.
Notification Sound
The default sound for Diskovarr notifications on all devices. Options: Device Default (uses whatever the device has set), Silent (no sound), Vibrate Only, Pushover (default tone), and 17 named sounds (Bike, Bugle, Cash Register, Classical, Cosmic, Falling, Gamelan, Incoming, Intermission, Magic, Mechanical, Piano Bar, Siren, Space Alarm, Tug Boat) plus 5 long-duration variants. Users can override this with their device's per-app sound settings in iOS/Android.
Embed Poster
Attaches the movie/show's poster image to notifications. Pushover supports image attachments natively — the poster appears inline in the notification on the lock screen.
Notification type checkboxes
Select which events trigger Pushover notifications. A typical setup: enable requester-facing types (approved, denied, available, issue updated) since those are personal and time-sensitive; leave admin types optional.
Pushover Groups (for multi-admin setups)
If you have multiple admins who all need to receive admin-type notifications (new request, new issue), create a Pushover Group: on pushover.net → Your Groups → Create a Group. Add each admin's user key to the group. Paste the group key into Diskovarr's User or Group Key field. All group members receive the notification simultaneously.
Page — Diskovarr Home
The home page shows personalized recommendations from your own Plex library for each user, based on their watch history.
Hero Controls
Show Mature Content Toggle
When off (default), titles rated R or TV-MA are hidden from all recommendation sections. Toggle state is stored per-user server-side.
Shuffle ↺
Refreshes all recommendation sections simultaneously by fetching a new randomized ordering from the current scored cache.
Recommendation Sections
Four carousels load in parallel after the page opens:
Top Picks for You — highest-scored items across all types, labeled "Personalized"
Movies — top-scored movies from your library's extended TMDB neighborhood
TV Shows — top-scored TV series
Anime — TV items tagged with the "Anime" genre
Sections show a shimmer skeleton while loading and are replaced with live cards on fetch.
Cards
Each card shows a poster with title, year, and rating below. On hover:
+ Watchlist — saves the item to the user's watchlist
✕ Dismiss — hides the item from all future recommendations for that user
Clicking the poster opens the detail modal
Detail Modal
Shows full item information. Sections:
Backdrop hero image, poster thumbnail
Title, year, IMDB and audience ratings
Recommendation reason tags (e.g. "Similar to Breaking Bad", "Director match")
Genre chips, overview/synopsis
Cast and director credits
Embedded YouTube trailer (if available)
Play on Plex — opens the item in Plex Web
Cast to TV — sends playback to a Plex player (TV, streaming stick, etc.) registered to your account. See Cast to TV for requirements and troubleshooting.
+ Watchlist / ★ In Watchlist — toggle watchlist membership
Report Issue — opens the issue reporting flow
Recommendation Engine
The engine builds a scored list of items from your library for each user by:
Fetching TMDB recommendations and similar titles for everything the user has watched
Scoring each candidate using: TMDB similarity (40pts), shared director (30pts), shared actor (35pts), keyword overlap (25pts), same collection (30pts), shared studio (10pts), genre match (8pts/genre), same decade (8pts), high rating bonus
Subtracting points for previously dismissed items
Filtering out items already in the user's library
Caches are pre-warmed every 25 minutes per user in the background so the page loads instantly.
Page — Diskovarr Requests
Shows personalized picks from TMDB that are not yet in your library. Users can request titles directly from this page.
Requires TMDB API key to be configured in Admin → Connections → TMDB.
Hero Controls
Show Mature Content
Controls include_adult in TMDB discover API calls at the source. Stored server-side per user — the preference applies to which candidates are fetched, not just which are displayed. Default off.
Hide Requested
Filters out all already-requested items from every section server-side. When on, only truly unrequested recommendations are shown. Toggle state persists across sessions in localStorage.
Shuffle ↺
Refetches all sections with a new random ordering from the scored cache.
Sections
Top Picks for You — highest-scored non-library items, "Outside Your Library" badge
Movies — top-scored movie candidates
TV Shows — top-scored TV candidates
Anime — anime candidates (sourced from Japanese-language TMDB discover)
Trending Movies — TMDB weekly trending movies not in your library
Trending TV Shows — TMDB weekly trending TV not in your library
Request Badges & Buttons
Requested badge
Shown on any card for an item that has been requested by any user. The item still appears so others know it's on its way.
Request button
Opens the request dialog. Lets the user select a service (if multiple are available) and optionally specific seasons (for TV).
Notify Me button
Shown instead of Request when the item was already requested by a different user. Clicking creates a follow entry — you'll receive a notification when the title becomes available in the library, without placing a duplicate request.
Requested ✓
Shown (disabled) when you are the requester or you've already clicked Notify Me.
TMDB Pipeline
Candidate discovery is optimized to minimize API calls:
A shared candidate pool is pre-fetched once per unique region+language+mature combination across all users (8-hour TTL)
Full item details (genres, cast, keywords, ratings, trailers) are cached in the database permanently once fetched
Per-user scoring runs every 28 minutes in the background against the shared candidates
Region and language preferences (set in My Settings) are applied to TMDB discover queries at fetch time
Page — Filter
Browse your own Plex library with advanced filters. All items shown are already in your library.
Filter Controls
Media Type
All / Movie / TV Show / Anime — filters results to a specific type.
Genre
Multi-select genre chips loaded from your actual library. Select multiple to narrow results. Genre list is dynamically built from your content.
Decade
Filter by release decade (1950s, 1960s … 2020s).
Min Rating
Minimum TMDB rating threshold (0.0–9.0).
Sort
Rating (highest first), Year (newest first), or Title (A–Z).
Include Watched
When off (default), previously watched items are excluded. Toggle on to include everything.
Keyword Search
Free-text filter applied against title and genre.
Results & Pagination
Results load in a card grid. A Load More button at the bottom fetches additional pages. Clicking a card opens the same detail modal as the home page — library items show Play on Plex and Cast to TV buttons.
Page — Search
Search across both your Plex library and TMDB simultaneously.
Nav Bar Search
The search input is always visible in the navigation bar on desktop (220px). On mobile it collapses to a magnifying glass icon — tapping it expands a full-width overlay input.
As you type, TMDB autocomplete suggestions appear in a dropdown showing title, year, and type (Movie/TV). Select a suggestion or press Enter to go to the full search results page.
Search Results Page (/search?q=…)
Results from your Plex library appear first with a "In Library" indicator
TMDB results not in your library appear below with a Request button
Library items open the full detail modal including Cast to TV and Report Issue
Non-library items open the request dialog
Load More button fetches additional TMDB results
Back button returns to the previous page or falls back to the configured landing page
Page — Queue
The request queue shows all submitted requests. Regular users see their own requests ("My Requests"). Admins and elevated users see all requests ("Request Queue") with full approval controls.
Filter Tabs
All · Pending (with count) · Requested · Approved · Denied — click any tab to filter the table.
Table Columns
Title — poster thumbnail, title, year, rating. If a request was denied, the denial note appears below in red.
User — requester's avatar and name (admin view only)
Type — Movie (gold) or TV (blue) badge
Age — relative time since request was submitted (e.g. "3 hours ago")
Status — Pending / Requested / Available / Denied badge
Actions — varies by status and role (see below)
For TV requests, season chips appear below the title: S1 S2 S3… For shows with more than 9 seasons selected, the list truncates to an ellipsis followed by the last 8.
Request Actions (Admin / Elevated)
Approve
Routes the request to the configured service immediately. Changes status to Requested. Only available on Pending requests.
Deny
Opens a small input for an optional denial note, then marks the request Denied and notifies the requester.
Edit
Opens the edit modal — change the routing service or modify season selection for TV shows. Only available on Pending requests.
Delete
Permanently removes the request. Shows a confirmation modal with a "Don't ask again" checkbox (backed by localStorage). Available on all statuses.
All actions update the row in place — no page scroll or reload.
Pagination
25 / 50 / 100 items per page. The per-page preference is saved to localStorage and restored on next visit. Previous/Next buttons plus page indicator.
Page — Issues
Users report playback problems with library content. Admins manage and resolve them.
Reporting an Issue
Any library item's detail modal has a Report Issue button. Clicking it opens the issue form:
Description — text area for the problem details
Scope (TV only) — Entire Series / Specific Season / Specific Episode
Season number (if Specific Season selected)
Season + Episode number (if Specific Episode selected)
User View ("My Issues")
Shows the user's own reports with scope label, status badge, and a Details button. Filter by All / Open / Resolved / Closed.
Admin View ("Issue Reports")
Shows all reports from all users. Additional columns: poster, reporter name. Additional actions: Resolve, Close, Delete.
Status Badges
Open (orange) — awaiting admin action
Resolved (green) — admin has addressed the issue
Closed (gray) — issue closed without resolution (e.g. user error, duplicate)
Details Modal
Shows full description, scope breakdown, reporter (admin view), status, and admin note. Contains a threaded comment section:
Both user and admin can leave comments
Admin comments send a notification to the reporter
User comments send a notification to all admins
Admin can delete any comment
Admin Actions
Resolve
Opens a note input (optional), then marks the issue Resolved and notifies the reporter. The note is shown in the details modal.
Close
Same flow as Resolve but sets status to Closed.
Delete
Permanently removes the issue. Uses the same custom confirmation modal as queue deletions.
All actions update the row in place.
Page — Watchlist
A personal save list. Add items from any card or detail modal; remove them from the watchlist page.
Adding Items
The + Watchlist button appears on card hover overlays and in detail modals across all pages (home, explore, filter, search). Once added, the button changes to ★ In Watchlist.
Watchlist Page
Shows a grid of saved items with poster, title, year, and rating. Clicking a poster opens the same detail modal. The ✕ Remove button on each card removes it with a fade animation.
Auto-Request from Watchlist
If enabled in Admin → Users → Auto-Request Watchlist, adding an item to the watchlist automatically submits a request for it. This works per-media-type (movies and TV can be configured separately). Per-user overrides are available in the per-user settings page.
Cast to TV
Cast to TV lets you send playback of any library item to a Plex player (smart TV, streaming stick, Roku, Apple TV, etc.) directly from a detail modal. It works entirely through the Plex cloud relay — no local network access to the TV is required.
How It Works
When you click Cast to TV, Diskovarr performs three steps server-side:
Create a PlayQueue — Diskovarr calls your Plex server to create a PlayQueue for the chosen title. This tells Plex what content is about to play and where it lives.
Look up your player — Diskovarr calls plex.tv/api/v2/resources using your own Plex account token. This returns the list of Plex player clients registered to your account, along with their connection URIs. Relay connections (routed through plex.tv) are preferred over direct LAN connections so casting works regardless of network location.
Send playMedia — Diskovarr calls the player's relay URI with a playMedia command, again using your own token. Your Plex app on the TV receives the command and begins playback.
ℹ
Device discovery is entirely cloud-based and per-user. Diskovarr does not broadcast on the local network, so each user only ever sees their own Plex player devices — not the server admin's or any other user's.
Requirements
Plex Pass (server)Required for remote casting
The relay connections that make casting work across different networks are only available if the Plex server has an active Plex Pass subscription. Without it, plex.tv only returns local LAN connection URIs for player devices, which are unreachable from outside the user's home network. If your server has Plex Pass, relay is available to all shared users automatically.
Full Plex accountRequired
Each user must be signed in with their own full Plex account (not a Plex Home managed user). The plex.tv/api/v2/resources endpoint is scoped to the authenticated account — managed user tokens return an empty or restricted device list, so the cast picker will appear empty.
Plex app open on the TVRequired at cast time
The Plex app on the target device must be running and in the foreground when you cast. The cast command is sent to the app's active session. If the app is closed or in the background, the command is delivered but may be ignored, resulting in nothing happening on the TV.
Device signed in to the same Plex accountRequired
The TV's Plex app must be signed in to the same Plex account that is logged in to Diskovarr. If your friend logs in to Diskovarr, the cast picker shows devices signed in to their Plex account — not yours. Each user casts only to their own devices.
Using the Cast Picker
Open any library item's detail modal (click a poster on the home page or filter page)
Click the Cast to TV button in the action row
A dropdown expands showing all Plex player devices registered to your account. If the list is empty, see Troubleshooting below.
Click the device you want to cast to. The button shows "Casting…" while the command is sent.
Playback starts on your TV. A confirmation toast appears in the corner.
Troubleshooting
Cast picker is empty — no devices listed
Plex app not registered to your account
Open the Plex app on your TV and make sure it is signed in to your Plex account. Devices appear in the picker once they have been used with your account at least once.
Using a managed user account
Plex Home managed users (created under another person's account) do not have independent device registries on plex.tv. The resources API returns nothing for managed user tokens. To fix this, the server admin must add you as a Friend/Share using your own full Plex account email instead.
plex.tv API temporarily unreachable
Device discovery requires a live connection to plex.tv. If plex.tv is down or the server has no internet access, the list will be empty. Try again after a moment.
Devices appear but cast fails or nothing happens on the TV
Plex app is closed or backgrounded
The app must be open and active on the TV when the cast command arrives. Open Plex on the TV first, then cast from Diskovarr.
No Plex Pass on the server — relay unavailable
Without Plex Pass, the only connection URI returned for a player is its local LAN IP (e.g. http://192.168.1.x:32500). Diskovarr tries to reach that address from the server, which times out because it is on your home network, not the server's. The solution is Plex Pass on the server, which enables relay connections that route through plex.tv and work from anywhere.
Device has no relay connection in plex.tv
Some older Plex client apps or non-standard devices may not register relay connections even with Plex Pass. In this case, casting only works if the user is on the same LAN as the Plex server (or the same LAN as the TV, if the server reaches it locally). Check the Plex app version on the TV and update it if possible.
PlayQueue creation failed
If the Plex server is temporarily unreachable, the PlayQueue step is skipped and Diskovarr attempts to cast without one. Some Plex client apps require a PlayQueue to start playback — if yours does, the cast will fail silently. Check that your Plex server is online and reachable from Diskovarr.
Server error in the browser console
If the cast button shows an error toast, open your browser's developer tools (F12) → Console or Network tab, then try casting again. The error message from the server will indicate whether it is a "Player not found" (device lookup failed) or a status code (e.g. 400/401 from the Plex player API).
Cast works for the server admin but not for friends
Most likely cause: no Plex Pass relay for friend's device
Even with Plex Pass on the server, the friend's specific device may not have an active relay connection entry — for example, if they have not opened the Plex app recently or the device registration with plex.tv has expired. Have the friend open Plex on their TV and wait 30–60 seconds before trying to cast.
Friend is a managed user
See "Using a managed user account" above. The server admin should re-add the friend as a full Plex account share instead of a managed user.
ℹ
Known limitation: Cast to TV is only available on library items (items already in your Plex library). Items on the Diskovarr Requests / Explore page are not yet in the library and cannot be cast — the button does not appear for them.
My Settings
Each user's personal preferences: region and language for TMDB discovery, landing page, and notification preferences. Accessible from the user menu (avatar button).
Content Preferences
Region
30+ country options. Applied to TMDB discover queries in the Diskovarr Requests tab — affects which trending titles and genre results are shown. Does not affect library recommendations.
Language
15+ language options. Applied alongside region to TMDB discover queries.
Default Landing Page
Toggle between Diskovarr (home, library recommendations) and Diskovarr Requests (explore, TMDB discovery). Controls where you land after login and when clicking the Diskovarr logo. Admins can also set this per-user in the per-user settings page.
Notification Preferences
Checkboxes for each notification type. Standard users see: Request Approved, Declined, Available, Issue Status Updated, Issue Comment. Elevated users also see: New Request Pending, Auto-Approved, Processing Failed, New Issue Reported.
Discord
Discord User ID
Your Discord user ID (numeric, e.g. 123456789012345678). Required to receive bot DMs. Enable developer mode in Discord settings to see user IDs.
Join Server
Shown if the admin configured a Discord invite link. Opens the invite in a new tab so you can join the server (required to receive DMs from the bot).
Test
Sends a test DM to your Discord account to verify the connection.
Enable Discord Notifications
Master toggle for Discord DMs. Disabling this stops all Discord notifications for you regardless of type checkboxes.
Pushover
User Key
Your personal Pushover user key (30 characters, from the Pushover app or pushover.net dashboard).
Test
Sends a test notification to your Pushover devices.
Enable Pushover Notifications
Master toggle for Pushover. Disabling stops all Pushover notifications for you.
Integration — Plex Webhook
Register Diskovarr as a Plex webhook to get instant library-change notifications. Requires Plex Pass.
Setup
1
Open Plex Settings
In Plex Web: Settings → Webhooks (under "Account" in the left sidebar).
2
Add the Diskovarr webhook
Click Add Webhook and enter:
https://your-diskovarr-url/api/webhooks/plex
3
Save
Plex will now POST to Diskovarr whenever new content is added to your library.
What It Does
When Plex fires a library.new event, Diskovarr:
Immediately invalidates the library cache
Checks all pending requests against the new content
Sends "Request Available" notifications to requesters whose titles just arrived
💡
Without Plex Pass, Diskovarr uses its built-in Plex WebSocket connection instead — this provides the same real-time notifications without requiring Plex Pass, just with slightly less reliability.
Integration — Riven Torrent Browser
A built-in browser for searching and injecting torrents into Riven via Debrid Media Manager. Accessed at Admin → Connections → Riven → Browse Torrents.
Searching
Type a movie or TV show title in the search box
TMDB suggestions appear — click one to select it
The selected item appears as a chip showing poster, title, and metadata
For TV shows, season tabs (S01, S02…) let you target specific seasons
Browsing Torrents
An embedded Debrid Media Manager iframe loads for the selected item (searched by IMDB ID). Browse available torrents with RD cache status indicators directly in the browser.
Reload — refreshes the DMM iframe if RD auth redirected you away
Open in New Tab — opens DMM in a full tab for RD authentication flows
Injecting a Torrent
Once you find a torrent in DMM, copy its magnet link. Paste it into the magnet input bar at the bottom of the page. Diskovarr automatically submits it to Riven and shows a status response.
ℹ
After injection, Riven will download and process the torrent. Once complete, trigger a Plex library scan or wait for the automatic sync to pick up the new content.
Integration — DUMB Setup
DUMB is Riven's built-in Overseerr-compatible request poller. Configure it to use Diskovarr as its Overseerr source so Riven picks up approved requests automatically.
Step 1 — Get the DUMB API Key
In Admin → Connections → Riven → DUMB Integration, copy the DUMB API Key. This is a 68-character key generated by Diskovarr.
Step 2 — Configure Riven
In Riven's settings, under the Overseerr/Jellyseerr source configuration:
Overseerr URL — set to your Diskovarr URL (e.g. https://diskovarr.example.com)
Overseerr API Key — paste the DUMB API Key from Step 1
Step 3 — Choose Request Mode
Back in Diskovarr Admin → Connections → Riven → DUMB Integration:
Pull — DUMB polls /api/v1/request on Diskovarr for approved requests. Riven controls the polling interval. Recommended for most setups.
Push — When a request is approved in Diskovarr, it immediately POSTs to Riven. More real-time but requires Diskovarr to reach Riven's API.
How It Works
In Pull mode, DUMB periodically calls Diskovarr's /api/v1/request endpoint (Overseerr-compatible format). Approved requests appear with media.status=3 (PROCESSING). DUMB picks these up and triggers downloads. When content becomes available, DUMB calls PUT /api/v1/media/:id/available which Diskovarr uses to mark the request as fulfilled and notify the requester.
Integration — Agregarr Setup
Connect Agregarr to Diskovarr so collection-based auto-requests route through Diskovarr's queue instead of directly to Overseerr.
Step 1 — Get the Agregarr API Key
In Admin → Connections → Agregarr, enable the toggle and copy the Agregarr API Key.
Step 2 — Configure Agregarr
In the Agregarr web UI, add an Overseerr source:
Overseerr URL — your Diskovarr URL (e.g. https://diskovarr.example.com)
API Key — the Agregarr API Key from Step 1
⚠
The API key you enter in Agregarr must be an admin-level key from Diskovarr so Agregarr can create its service user accounts automatically. Use the Agregarr API Key shown in the Connections tab.
What Happens
When Agregarr syncs a collection:
Agregarr sends requests to Diskovarr's /api/v1/ shim (Overseerr-compatible)
Diskovarr creates service user accounts per collection type (e.g. "TmdbAgregarr")
Requests appear in the Diskovarr queue with a bot badge
If auto-approve is enabled, they route to your configured service immediately
If rate limits are hit, Diskovarr returns a silent 201 so Agregarr's sync continues uninterrupted
After Updating the API Key
If you regenerate the Agregarr API key in Diskovarr, update it in Agregarr's source configuration and restart the Agregarr container to apply the change.
API Reference
All 28 public API endpoints. Authenticate with a session cookie (browser) or the X-Api-Key: your-key header (external tools). Generate your API key in Admin → General.
Recommendations & Discovery
Method
Path
Description
Key Params
GET
/api/recommendations
Personalized library recommendations for the current user
mature
GET
/api/explore/recommendations
Diskovarr Requests picks (non-library TMDB items)
mature, hideRequested
POST
/api/explore/dismiss
Dismiss a recommendation from all future Requests results
tmdbId, mediaType
POST
/api/explore/follow
Follow a requested item to receive an availability notification