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. Genre browse cards, Coming Soon sections, 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
10 notification agents: In-app bell, Discord (webhook + bot DM), Pushover, Webhook, Slack, Gotify, ntfy, Telegram, Pushbullet, Email, and WebPush. Granular per-type toggles with clickable hyperlinks. 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, Pushover, Slack, Telegram, and more.
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.
DUMB / RivenOptional
Real-Debrid based media acquisition. Diskovarr provides request routing and an Overseerr-compatible bridge for DUMB/Riven request 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. Optional settings (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.
ℹ
If you expose Diskovarr externally via 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
Architecture
Diskovarr has two components that run together: a React frontend (Vite) and an Express backend. In production, the frontend is built into static files served by the Express server. For development, both run separately with hot-reload.
Production Install
1
Clone the repository
git clone https://github.com/Lebbitheplow/diskovarr.git
cd diskovarr
At minimum, set SESSION_SECRET, ADMIN_PASSWORD, Plex_URL, Plex_TOKEN, Plex_SERVER_ID, and Plex_SERVER_NAME. See the environment variables reference below.
4
Build the frontend
npm run build
This compiles the React app into optimized static files in dist/, served by the Express backend.
5
Start the server
cd server && npm start
Diskovarr will be available at http://your-server:3232. Continue to First-Time Setup.
Development Mode
For active development, run the Express backend and Vite dev server separately. You'll need two terminal windows:
1
Start the backend (terminal 1)
cd server && npm run dev
The Express server runs on port 3233 with auto-restart on file changes.
2
Start the frontend (terminal 2)
npm run dev
The Vite dev server runs on port 5173 with hot module replacement. API calls are automatically proxied to the backend.
Environment Variables
All environment variables go in server/.env. See the full reference below.
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.
PLEX_URLRequired
URL of your Plex Media Server (e.g. http://192.168.1.x:32400).
PLEX_TOKENRequired
Your Plex admin token.
PLEX_SERVER_IDRequired
Your Plex server's machine identifier. Found in Plex Web → Settings → about this Pluto.
PLEX_SERVER_NAMERequired
Display name for your Plex server.
TAUTULLI_URLOptional
URL of your Tautulli instance. Can also be configured in the admin panel.
TAUTULLI_API_KEYOptional
Your Tautulli API key. Can also be configured in the admin panel.
TMDB_API_KEYOptional
Your TMDB API v3 key. Can also be configured in the admin panel.
PLEX_MOVIES_SECTION_IDOptional
Section ID for your Movies library. Defaults to 1. Can also be set in admin panel.
PLEX_TV_SECTION_IDOptional
Section ID for your TV Shows library. Defaults to 2. Can also be set in admin panel.
APP_URLOptional
Public URL of your Diskovarr instance. Used for Plex OAuth callbacks. Defaults to http://localhost:3232.
RIVEN_SETTINGS_PATHOptional
Path to your Riven settings file (e.g. /opt/riven/settings.json). Used for Riven integration.
PORTOptional
Port for the Express backend. Defaults to 3232.
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
cd server && npm install
cd .. && npm run build
sudo systemctl restart diskovarr
ℹ
If you expose Diskovarr externally via 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. Enter your Plex server address and port (default 32400), then click Sign in to Plex to open a Plex OAuth window — sign in with the server owner account and Diskovarr will fill in your token automatically.
ℹ
Sign in with the account that owns the Plex server — not a managed user or friend. If you prefer to paste the token manually, see Connection — Plex for instructions.
Click Test to confirm the connection, then 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. Diskovarr also keeps a permanent WebSocket connection to Plex for instant updates — this runs automatically with no additional setup.
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
Overseerr Compat API
Diskovarr exposes an Overseerr-compatible API at /api/v1/ so external apps that speak the Overseerr API can connect to it directly. Supported apps include DUMB (Riven request polling), Agregarr (collection auto-requests), and Homarr (media stats and request list widgets).
Enable toggle
Master on/off for the shim. When disabled, all requests using the compat key return 401. Your key is preserved so you can re-enable without reconfiguring connected apps.
Compat Key
A single shared key used by all Overseerr-compatible integrations. Copy this into DUMB, Agregarr, and Homarr as the Overseerr API key. Use the eye button to reveal it and the copy button to copy it to the clipboard.
Generate / Regenerate
Creates a new compat key. Once a key exists the button turns red and says "Regenerate Key" — regenerating immediately invalidates the old key for all connected apps (DUMB, Agregarr, Homarr). Update each app with the new key right away.
Service Accounts
Agregarr automatically creates one service user per collection type (e.g. "TmdbAgregarr", "ImdbAgregarr") the first time it syncs. These appear in the Service Accounts list beneath the key. You can set per-user request limits for each bot account from the Users tab.
API Endpoint Reference
A collapsible table of 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:
Real-Debrid based media acquisition and DUMB request integration.
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 — retrieved automatically via the Sign in button, or manually if preferred
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
Your Plex admin token. Use the Sign in to Plex button to retrieve it automatically, or paste it manually. Stored encrypted — displayed as ••••••• after saving.
Getting your token — Sign in to Plex (recommended)
Click the Sign in to Plex button on the Connections → Plex page. A Plex OAuth window opens — sign in with the account that owns the server. Diskovarr retrieves the token automatically and fills it in. No digging through URLs required.
ℹ
Sign in with the server owner's account. Tokens from managed users or Plex Home members won't have the required library access. The token is stored server-side only — Diskovarr never exposes it to browsers.
Getting your token — manually
If you prefer to paste the token directly:
Open Plex Web (app.plex.tv) and sign in as the server owner.
Click any movie or show → ⋮ menu → Get Info → View XML.
In the new tab's address bar, copy the value after X-Plex-Token= — that's your 20-character token.
Enter the address, port, and token, then click Test. A green success message confirms Diskovarr can reach your Plex server. 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.
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 provides an Overseerr-compatible bridge for automatic request polling.
★
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
Overseerr-compatible bridge — Diskovarr exposes an Overseerr-compatible API endpoint so Riven's poller can pull approved requests on its own schedule
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 → DUMB/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 for Real-Debrid cache checks and integration.
Click Test then Save. Once saved, request routing to Riven is active.
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 exposes an Overseerr-compatible endpoint — configure Riven to point at it using the Overseerr Compat Key from Admin → General.
1
Copy the Overseerr Compat Key from Diskovarr
In Admin → General → Overseerr Compat API, copy the Compat Key using the copy icon. Make sure the toggle is Enabled.
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 Compat 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 in Admin → General → Overseerr Compat API, the old key stops working immediately for all connected apps (DUMB, Agregarr, Homarr). Update the key in Riven's Overseerr settings right away — otherwise Riven's polls will start returning 401 errors and requests won't be processed.
How the bridge works
In Pull mode, Riven periodically calls Diskovarr's /api/v1/request endpoint (Overseerr-compatible format). Approved requests appear with media.status=3 (PROCESSING). Riven picks these up and triggers downloads via your debrid service. When content becomes available, Riven calls PUT /api/v1/media/:id/available which Diskovarr uses to mark the request as fulfilled and send a "Request Available" notification to the requester.
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 bridge steps above. Request routing and Overseerr-compatible polling 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.
Connection — Agregarr
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 the Overseerr Compat API in Diskovarr
Go to Admin → General → Overseerr Compat API and make sure the toggle is Enabled. This activates the /api/v1/ shim endpoint.
2
Copy the Overseerr Compat Key
The Overseerr Compat Key is shown in Admin → General → Overseerr Compat API. Click the copy icon to 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 Compat 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. The Overseerr Compat Key already has the right permissions for this — no extra steps needed.
Settings reference
Overseerr Compat Key
Shared key for all Overseerr-compatible integrations (Agregarr, DUMB, Homarr). Found in Admin → General → Overseerr Compat API. If you regenerate it, update it in Agregarr and restart its container — the old key stops working immediately for all connected apps.
Enable
Master toggle for the shim, located in Admin → General → Overseerr Compat API. When off, all compat key auth returns 401. Your key is preserved so you can re-enable without reconfiguring any apps.
Regenerate Key
Generates a new compat key and immediately invalidates the old one for all connected apps (Agregarr, DUMB, Homarr). Update each app after regenerating.
Diskovarr can notify users and admins through multiple channels: the in-app bell, Discord (shared channel webhook and/or personal bot DMs), Pushover push notifications, and eight additional agents — Webhook, Slack, Gotify, ntfy, Telegram, Pushbullet, Email, and WebPush. All can be active simultaneously with independent settings and per-type toggles. Notifications include clickable hyperlinks that open the relevant item in Diskovarr. 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 10 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 declinedRequester
Sent to the requester when their request is declined, optionally including the admin's note. Includes a clickable link back to Diskovarr.
Request available in libraryRequester
Sent when a requested title appears in the Plex library. Diskovarr detects new content in real time via its built-in WebSocket connection to Plex — no Plex Pass required, no webhook setup needed. Clicking the in-app notification opens the item's detail modal. External notifications (Discord, Telegram, etc.) include clickable hyperlinks back to the relevant page in Diskovarr.
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.
Request auto-requested from watchlistAdmins
Fired when auto-request from watchlist is enabled and an item is automatically submitted as a request.
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.
Webhook
Send notifications to any HTTP endpoint as JSON. Supports customizable JSON templates, custom headers, and variable substitution. Works with tools like n8n, Make, Home Assistant, and custom scripts.
Configuration
Webhook URLRequired
The HTTP endpoint that receives POST requests with JSON payloads.
Auth HeaderOptional
Authorization header value (e.g. Bearer your-token).
JSON TemplateOptional
Customizable JSON payload template. If empty, a default template is used. Supports template variables: {{notification_type}}, {{event}}, {{subject}}, {{message}}, {{image}}, {{url}}, {{timestamp}}. Variables are resolved recursively in nested objects and arrays.
Custom HeadersOptional
Additional HTTP headers to include with each request.
Variables in URLOptional
When enabled, template variables in the webhook URL itself are resolved (e.g. routing to different URLs per notification type).
Slack
Send notification messages to a Slack channel using an Incoming Webhook. Uses Slack's Block Kit for formatted messages with emoji icons, description text, and clickable links.
Step 1 — Create a Slack Incoming Webhook
1
Create a Slack app
Go to api.slack.com/apps and click Create New App → From scratch. Name it and select your workspace.
2
Add Incoming Webhooks
In your app's settings, go to Features → Incoming Webhooks. Toggle it On. Scroll down and click Add New Webhook to Workspace. Choose the channel you want to post to and click Allow.
3
Copy the webhook URL
Copy the generated webhook URL. It starts with https://hooks.slack.com/services/T...
Step 2 — Enter in Diskovarr
Paste the webhook URL into Admin → Notifications → Slack. Enable the toggle, select notification types, and click Save. Click Test to verify a message appears in your Slack channel.
Gotify
Send notifications to a self-hosted Gotify server. Gotify delivers push notifications to your phone and desktop with minimal setup.
Configuration
Gotify URLRequired
The base URL of your Gotify server (e.g. https://gotify.example.com).
Application TokenRequired
Create an application in Gotify and use its token. Go to your Gotify web UI, click + Application, give it a name, and copy the generated token.
Messages are sent in Markdown format with a clickable link to the relevant Diskovarr page.
ntfy
Send notifications via ntfy — a simple pub-sub notification service. Use the free public server (ntfy.sh) or self-host your own instance.
Configuration
ntfy URLRequired
Your ntfy server URL. Use https://ntfy.sh for the public server, or your own instance URL.
TopicRequired
The topic name to publish to (e.g. diskovarr). Subscribe to this topic on your phone or desktop to receive notifications.
PriorityOptional
1 (minimal) through 5 (urgent). Default is 3.
AuthenticationOptional
For self-hosted instances with auth: choose Bearer Token or Basic Auth and enter credentials.
Embed PosterOptional
Attach the movie/show poster image to the notification as a file attachment.
Messages include a clickable link that opens directly in Diskovarr.
Telegram
Send personal notifications through the Telegram Bot API. Each user can configure their own Telegram chat ID to receive DMs from the bot. Supports MarkdownV2 formatting, inline buttons, and poster images.
Step 1 — Create a Telegram Bot
1
Message @BotFather
Open Telegram and search for @BotFather. Send /newbot and follow the prompts to name your bot.
2
Copy the bot token
BotFather will give you a token like 123456789:ABCdefGHIjklMNOpqrSTUvwxYZ. Copy it.
3
Get your chat ID
Message your new bot, then visit https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates in a browser. Find the "chat":{"id":123456789} field — that's your chat ID. Alternatively, message @userinfobot for your numeric ID.
Step 2 — Configure in Diskovarr
Bot API TokenRequired
The token from BotFather.
Chat IDRequired
Your admin chat ID for admin-type notifications.
Message Thread IDOptional
For forum supergroups: the thread ID where messages should be posted.
Send SilentlyOptional
Suppresses sound and vibration on the recipient's device.
Embed PosterOptional
Sends the movie/show poster as a photo attachment with the notification as its caption.
Each notification includes an inline View in Diskovarr button. Users can optionally configure their own Telegram chat ID in My Settings → Telegram to receive personal notifications (approved, denied, available).
Pushbullet
Send push notifications through Pushbullet. Messages are delivered to your linked devices (phone, desktop app, browser extension). Supports note-style messages and link-type messages with clickable URLs.
If you want notifications sent to a Pushbullet channel instead of your personal devices, enter the channel's tag here.
Users can optionally set their own Pushbullet access token in My Settings → Pushbullet to receive personal notifications on their own devices.
Email
Send notification emails via SMTP. Supports custom sender name, HTML-formatted messages with poster images, and TLS/STARTTLS. Users with email addresses on file receive personal notifications.
Configuration
SMTP HostRequired
Your SMTP server address (e.g. smtp.gmail.com, mail.example.com).
Enable for port 465 (implicit TLS). Leave off for port 587 with STARTTLS.
Allow Self-SignedOptional
Skip certificate verification for self-signed TLS certificates.
Require TLSOptional
Force TLS upgrade. Refuses to send if TLS negotiation fails.
Auth Username / PasswordOptional
SMTP credentials if your server requires authentication.
From EmailRequired
The sender email address (e.g. diskovarr@example.com).
Sender NameOptional
Display name shown in the From field. Defaults to "Diskovarr".
Emails are sent as formatted HTML with poster images. Each notification includes a clickable button to open the relevant page in Diskovarr.
WebPush
Send native browser push notifications using the Web Push API. Works even when the browser tab is closed. Users subscribe from their browser — no server-side email or phone setup required.
How It Works
WebPush uses VAPID keys (auto-generated on first use) to authenticate push messages. Users subscribe from My Settings → WebPush by clicking Subscribe and allowing browser notifications. Each subscription is stored and used to deliver push notifications to the user's browser.
Configuration
Enable
Master toggle. When enabled, VAPID keys are auto-generated on first use. No other configuration is required on the admin side.
ℹ
WebPush requires Diskovarr to be served over HTTPS. The Web Push API does not work on HTTP origins. Make sure your reverse proxy is configured with a valid TLS certificate.
Admins receive WebPush notifications for admin-type events. Regular users receive personal notifications for events relevant to them (request approved, available, etc.). Users manage their subscription from My Settings → WebPush.
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
Browse by Genre — grid of 18 genre tiles with gradient backgrounds and emoji icons; clicking a genre navigates to Search filtered to that genre
Upcoming Movies — movies releasing in the future, "Coming Soon" badge; shown when 8+ items are available
Upcoming TV Shows — TV shows releasing in the future, "Coming Soon" badge; shown when 8+ items are available
Genre Browse
A genre browse section displays clickable genre cards (Action, Comedy, Drama, Horror, etc.) with gradient backgrounds and emoji icons. Clicking a genre card navigates to the Search page filtered to that genre, showing all TMDB results for that genre not in your library.
Coming Soon
Coming Soon sections show upcoming movies and TV shows with release dates in the future. Each card displays a "Coming Soon" badge (or "Requested" if already requested). These sections help users discover and request content before it's released.
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).
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.
Items you've already watched display a small green checkmark badge on the poster corner.
Page — Search
Search across both your Plex library and TMDB simultaneously. Supports text search, genre-based browsing, and advanced filtering.
Nav Bar Search
The search input is always visible in the navigation bar on desktop. 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 an "In Library" indicator
Library items you've already watched show a small green checkmark badge on the poster
TMDB results not in your library appear below with a Request or Coming Soon 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
Filter Section
When viewing search results or genre-browse results, a collapsible filter section lets you narrow down what's shown:
Hide in Library
Toggle to hide items already in your Plex library. Useful for finding only content you don't yet have. Defaults to on when browsing by genre.
Genre
Multi-select genre chips to filter results to specific genres. Chips are dynamically built from your library's genres.
Year Range
Set a minimum and/or maximum year to filter by release date.
Content Rating
Filter by TMDB content rating (e.g. PG-13, R, TV-MA).
Minimum Score
Set a minimum TMDB rating threshold to filter out low-rated results.
More Like This
When viewing search results or item details, a More Like This section shows similar titles based on TMDB recommendations and local metadata overlap. It scores candidates by shared directors, cast, genres, keywords, collections, and language — then re-ranks them so the most relevant results appear first. The Hide in Library toggle also applies to this section, so you can see only items you don't already have.
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 · Available · Denied — click any tab to filter the table. The Available tab shows approved requests whose title has already arrived in the Plex library.
Sortable Columns
Click any column header to sort the queue by that column. Click again to reverse direction. An arrow indicator (↑ or ↓) shows the active sort. Sortable columns: Title, User, Type, Age, Status. Sort state is server-side — applies across all pages of results.
Table Columns
Title — poster thumbnail (52 × 78 px), 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 Resolved, Issue Comment, Auto-Requested from Watchlist. 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.
Telegram
Chat ID
Your personal Telegram chat ID for receiving DMs from the bot. Get it by messaging the Diskovarr bot then visiting https://api.telegram.org/bot<BOT_TOKEN>/getUpdates.
Message Thread ID
Optional. For forum supergroups: the thread ID where messages should be posted.
Sends a test notification to your Pushbullet devices.
Enable Pushbullet Notifications
Master toggle for Pushbullet notifications.
Email
Email Address
Your email address to receive notifications. Requires SMTP to be configured in Admin → Notifications → Email.
Test
Sends a test email to verify delivery.
Enable Email Notifications
Master toggle for email. Disabling stops all email notifications for you regardless of type checkboxes.
WebPush
Subscribe
Click to subscribe your browser to push notifications. You'll be prompted to allow notifications. Works even when the browser tab is closed. Requires Diskovarr to be served over HTTPS.
Unsubscribe
Removes your browser's push subscription. You won't receive WebPush notifications until you subscribe again.
Enable WebPush Notifications
Master toggle. Disabling stops WebPush notifications even if you're subscribed.
Integration — Plex Real-Time Sync
Diskovarr maintains a persistent WebSocket connection to your Plex server — the same method Tautulli uses — to detect new library content in real time. No Plex Pass required. No setup needed.
How It Works
On startup, Diskovarr opens a WebSocket to /:/websockets/notifications on your Plex server. Plex pushes timeline events over this connection whenever items are added or updated. When Diskovarr sees a new library item, it:
Invalidates the library cache
Checks all pending requests against the new content
Sends "Request Available" notifications to requesters whose titles just arrived
This happens within seconds of Plex finishing the scan — no polling interval, no Plex Pass subscription needed.
Verifying It's Connected
Check your Diskovarr service logs for:
Plex WebSocket connected
If it disconnects (e.g. Plex restarts), Diskovarr automatically reconnects with exponential backoff.
💡
The WebSocket connection is fully automatic once your Plex URL and token are configured in Admin → General. There is nothing to set up in Plex itself.
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 Overseerr Compat Key
In Admin → General → Overseerr Compat API, enable the toggle and copy the Compat Key using the copy icon.
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 Compat Key from Step 1
ℹ
The Overseerr Compat Key already has admin-level permissions, so Agregarr can create its service user accounts automatically — no extra configuration needed.
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 Key
If you regenerate the Overseerr Compat Key (Admin → General), update it in Agregarr's source configuration and restart the Agregarr container. Note this also invalidates the key for any other connected apps (DUMB, Homarr) — update those too.
API Reference
All 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.
Authentication
Method
Path
Description
Key Params
GET
/auth/check-auth
Check if the current session is authenticated
—
GET
/auth/logout
End the current session
—
POST
/auth/callback
OAuth callback handler (Plex login)
OAuth params
GET
/auth/check-pin
Check Plex OAuth PIN status
—
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
GET
/api/explore/services
List enabled request services
—
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
tmdbId, mediaType, title
Library & Search
Method
Path
Description
Key Params
GET
/api/search
Search across Plex library and TMDB
q, genre, type, page
GET
/api/search/suggest
TMDB title autocomplete suggestions
q
GET
/api/search/details
Full TMDB item details
tmdbId, type
GET
/api/search/seasons
Get season numbers for a TV show
tmdbId
GET
/api/search/similar
"More Like This" — similar items based on TMDB recommendations + local metadata
tmdbId, type, hideLibrary
GET
/api/discover
Browse library with filters
type, genres, decade, minRating, sort, page, q
GET
/api/discover/genres
All unique genres in the Plex library
—
GET
/api/poster
Proxy Plex poster image (Plex token never exposed to client)
path
GET
/api/trailer
Fetch YouTube trailer key from TMDB
tmdbId, mediaType
Watchlist
Method
Path
Description
Key Params
GET
/api/watchlist
Get current user's watchlist items
—
POST
/api/watchlist/add
Add item to watchlist
ratingKey
POST
/api/watchlist/remove
Remove item from watchlist
ratingKey
Requests
Method
Path
Description
Key Params
POST
/api/request
Submit a new media request
tmdbId, mediaType, seasonList (TV), service
GET
/api/queue
Get request queue (admin: all; user: own)
status, page, perPage
GET
/api/queue/:id
Get a single request by ID
—
POST
/api/queue/:id/approve
Approve a pending request (admin)
service
POST
/api/queue/:id/deny
Deny a pending request with optional note (admin)
note
PUT
/api/queue/:id
Update a request (edit service, seasons)
Request fields
DELETE
/api/queue/:id
Delete a request
—
Issues
Method
Path
Description
Key Params
POST
/api/issues
Report a new playback issue
ratingKey, description, scope, season, episode
GET
/api/issues
Get issues (admin: all; user: own)
status, page
GET
/api/issues/:id
Get a single issue by ID
—
POST
/api/issues/:id/resolve
Resolve an issue with optional admin note (admin)
note
POST
/api/issues/:id/close
Close an issue with optional note (admin)
note
DELETE
/api/issues/:id
Delete an issue (admin)
—
GET
/api/issues/:id/comments
Get comments on an issue
—
POST
/api/issues/:id/comments
Add a comment to an issue
content
DELETE
/api/issues/:id/comments/:commentId
Delete a comment (admin)
—
Notifications & Settings
Method
Path
Description
Key Params
GET
/api/notifications
Get user notifications (pass countOnly=1 for unread count)
countOnly
POST
/api/notifications/read
Mark specific notifications as read
ids[]
POST
/api/notifications/read-all
Mark all notifications as read
—
GET
/api/user/settings
Get user content preferences and notification settings
—
POST
/api/user/settings
Save user content preferences and notification settings
The /api/v1/ endpoint exposes an Overseerr-compatible API for external tools (Agregarr, DUMB/Riven, Homarr). Authenticate with the Overseerr Compat Key from Admin → General using the header: X-Api-Key: your-compat-key. The shim maps Diskovarr's data model to Overseerr API format automatically.