A self-hosted Discord bot that bridges Jellyfin and Seerr — with smart notifications, automatic channel routing, and a fully featured web dashboard.
🇩🇪 Deutsche Dokumentation | 💬 Discord Community | Buy me a Coffee | 🐛 Report a Bug
📸 Screenshot notice: All screenshots in this README were taken from a demo environment and show no real user data. The live version may look slightly different and shows more content depending on your configuration.
| Feature | Description |
|---|---|
🔍 /search |
Search for movies and TV shows, request directly from the embed |
📤 /request |
Instant media requests with optional tag, server and quality selection |
🔥 /trending |
Browse weekly trending movies and TV shows |
🔎 /status |
Check the Seerr request status of any title — with poster, summary, genre, runtime, rating and age rating. Shows a Request button if not yet requested |
🎲 /random |
Get a random movie or series from your Jellyfin library — with poster, summary, genre, runtime and rating. Only visible to the user who ran the command |
💡 /recommend |
Get recommendations based on a movie or TV show via TMDB |
🧭 /discover |
Discover media by genre, year and minimum rating |
📦 /collection |
View all movies in a franchise/collection with availability |
🎭 /cast |
Browse an actor's full filmography with pagination |
🔗 /similar |
Find similar titles based on genre and keywords |
📥 /queue |
Track the status of your own requests — grouped by stage (waiting, downloading, available, declined, failed) |
🔔 /subscribe |
Subscribe to a series for a DM when a new season drops, plus an opt-in personalised weekly recommendation DM |
✨ /foryou |
Personalised recommendations based on your Jellyfin watch history |
🔖 /watchlist |
View recent media requests from Seerr |
🕘 /history |
View recently added movies and series on Jellyfin |
📅 /upcoming |
Browse upcoming movie releases and new TV shows from TMDB |
❓ /help |
Show all available commands with quick-action buttons |
| 🆕 Weekly digest | Opt-in weekly post of new movies, series and episodes added to your Jellyfin library |
| 🚦 Per-user quota | Optional rolling 7-day request limit per user, with bypass roles and unlimited users |
| 🔔 Smart notifications | Rich Discord embeds for all Seerr events (pending, approved, available, declined, failed, issues) |
| 📺 Channel routing | Notifications automatically routed to the correct channel based on Radarr/Sonarr root folder |
| 🔕 Private events | New request and declined notifications go directly to the requester as a DM — not to the public channel |
| ✉️ Private DMs | Users receive a DM when their requested content is approved, declined or becomes available |
| 🔘 Button toggles | Choose which buttons (View on Seerr, Watch Now, Letterboxd, IMDb) appear on notification embeds |
| 👤 User mapping | Link Discord accounts to Seerr accounts so requests appear from the correct user |
| 🔐 Role permissions | Control who can use bot commands via Discord role allowlist / blocklist |
| 🌟 Daily recommendation | Post a daily pick from your existing Jellyfin library |
| 🎲 Daily random pick | Post a daily random suggestion from TMDB |
| 🎨 Custom embed colors | Customize notification embed colors per event type |
| ⚙️ Web dashboard | Full configuration at http://your-server:8282 — Tetris-style UI |
| 📱 Mobile-friendly | Responsive dashboard, works on smartphones and tablets |
| ✅ Availability status | All embed lists show Seerr status: ✅ available, ⏳ requested, 📥 partial |
| 🎬 Content ratings | FSK/MPAA age ratings in search embeds, configurable by country |
| 📡 Streaming providers | Show where a title is available for streaming (Netflix, Disney+, etc.) |
| YouTube trailer links in /search and /request embeds | |
| 💚 Health-check bar | Real-time service status display in the dashboard |
| 📊 Statistics dashboard | Command usage statistics with per-user breakdown |
| 🧩 Embeddable widget | HTML widget for Homarr/Homepage/Organizr with bot status and controls |
| 🌍 Multi-language | English and German dashboard interface |
📖 New here? The Full Usage & Configuration Guide explains every command, feature and setting in plain language — including the Seerr webhook status badge and the common Docker URL pitfall.
- A running Jellyfin server
- A running Seerr instance (connected to Radarr/Sonarr)
- A Discord account with admin access to a server
- Docker (recommended) or Node.js 20+
- API keys: TMDB (required) · OMDb (optional)
Standard setup — direct access via IP and port:
services:
questorr:
image: jellyforge/questorr:latest
container_name: questorr
restart: unless-stopped
environment:
- WEBHOOK_PORT=8282
- NODE_ENV=production
ports:
- "8282:8282"
volumes:
- ./questorr-data:/usr/src/app/configThen open http://your-server-ip:8282 and follow the setup wizard.
With a reverse proxy (Nginx Proxy Manager, Traefik, Caddy) — remove ports and add the shared network instead:
services:
questorr:
image: jellyforge/questorr:latest
container_name: questorr
restart: unless-stopped
environment:
- WEBHOOK_PORT=8282
- NODE_ENV=production
volumes:
- ./questorr-data:/usr/src/app/config
networks:
- proxy # Must match the network name of your reverse proxy
networks:
proxy: # Must match the network name of your reverse proxy
external: trueReverse proxy forward settings: Scheme: http · Host / Forward hostname: questorr · Port: 8282
| Tag | Description |
|---|---|
latest |
Latest stable release |
dev |
Development build (may be unstable) |
2.3.0 |
Specific version |
git clone https://github.com/Jellyforge-Dev/Questorr.git
cd Questorr
npm install
node app.js- Go to the Discord Developer Portal → New Application
- Bot → Enable
Server Members Intent(required for user mapping) - OAuth2 → URL Generator → Scopes:
bot+applications.commands - Permissions:
Send Messages,Embed Links,Read Message History - Copy the generated URL, open it in your browser and add the bot to your server
Open http://your-server-ip:8282, create an account and complete all steps:
| Step | What to configure |
|---|---|
| 1. Discord | Bot token, client ID, server, default notification channel |
| 2. Seerr | Seerr URL, API key, webhook URL, channel routing, root folder mapping |
| 3. Media Databases | TMDB API key (required), OMDb API key (optional) |
| 4. Jellyfin | Server URL, API key, server ID, notification channel |
| 5. User Mapping | Link Discord users to Seerr accounts |
| 6. Role Permissions | Allowlist / blocklist for bot commands |
| 7. Miscellaneous | Auto-start, DMs, daily picks, embed colors, /request options, Discord commands, notification buttons |
In Seerr → Settings → Notifications → Webhook, configure the following:
| Field | Value |
|---|---|
| Webhook URL | The URL shown in Questorr under Step 2 → Seerr Webhook URL |
| Authorization Header | Paste the secret shown under Step 2 → Copy Secret |
The secret is transmitted via the
Authorizationheader — it never appears in the URL or server logs.
Recommended: enable all notification types in Seerr so Questorr can forward the full request lifecycle to Discord:
| Seerr event | What Questorr does |
|---|---|
| Request pending approval | Sends DM to the requester only |
| Request approved / auto-approved | Posts to default channel · sends DM to requester |
| Media available | Posts to the matching root folder channel · sends DM to requester |
| Request declined | Sends DM to the requester only |
| Download failed | Posts to admin channel |
| Issue created / commented | Posts to default channel |
Under Step 2 → Root Folder → Channel Mapping, click Load Root Folders, then assign a Discord channel to each Radarr/Sonarr root folder. Questorr will automatically route MEDIA_AVAILABLE notifications to the correct channel — for example, anime requests go to #anime, movies to #movies.
Under Step 7 → Notification Buttons, you can individually enable or disable which buttons appear on Discord notification embeds:
| Button | Description |
|---|---|
| View on Seerr | Links to the media page in Seerr |
| ▶ Watch Now! | Direct link to the Jellyfin player (available content only) |
| Letterboxd | Links to the Letterboxd page (movies only) |
| IMDb | Links to the IMDb page |
Use the Test Buttons button to send a preview notification to your admin channel showing the currently active buttons.
| Variable | Description | Default |
|---|---|---|
WEBHOOK_PORT |
Web server port | 8282 |
LOG_LEVEL |
error / warn / info / verbose / debug |
info |
TRUST_PROXY |
Set to false to disable trust proxy (e.g. without reverse proxy) |
true |
All other settings are managed through the web dashboard and saved to config/config.json.
Questorr v2.3.0 includes the following security hardening:
| Feature | Details |
|---|---|
| Non-root container | Process runs as app user via entrypoint.sh + su-exec |
| Content Security Policy | Strict CSP headers via helmet — inline scripts blocked, frame-ancestors: none |
| Authorization header | Webhook secret transmitted via Authorization header, never in the URL |
| Brute-force protection | Login lockouts persist across container restarts (written to disk) |
| Rate limiting | API, config and webhook endpoints are rate-limited |
| Configurable trust proxy | TRUST_PROXY=false disables proxy trust for direct deployments |
| Directory permissions | Config directories created with 0o755 instead of 0o777 |
| Audit logging | Webhook secret and widget API key access are logged |
| Dependency updates | All npm dependencies updated, 0 known vulnerabilities |
Approved feature requests are tracked on the public project board:
Got an idea? Open a feature request — once it's reviewed and approved, it moves onto the board.
Screenshots are from a demo environment with no real data. The live version may look slightly different.
Mobile Views
| Register | Login | Discord | Seerr |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Media Databases | Jellyfin | User Mapping | Role Permissions |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Miscellaneous | Logs |
|---|---|
![]() |
![]() |
docker pull jellyforge/questorr:latest
docker compose up -dThis project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). You are free to use, modify and distribute this software under the terms of the AGPL-3.0. If you run a modified version as a web service, you must make the source code available.
Inspired by openVESSL/Anchorr | Maintained by Jellyforge-Dev | 💬 Discord | Buy me a Coffee






















