
Seerr
Unified request management for Plex, Jellyfin, and Emby
Overview
Seerr is the unified media request manager that merges Overseerr and Jellyseerr into a single application, maintained by the seerr-team. It provides native support for Plex, Jellyfin, and Emby media servers with an intuitive interface for users to discover and request movies and TV shows. Requests are automatically forwarded to Sonarr and Radarr for download. User quota management, approval workflows, and extensive notification support (Discord, Slack, email, Telegram, Pushover) make Seerr the definitive content request tool for shared media servers.
QuickBox Pro installs Seerr per user from the official seerr-team/seerr GitHub repository, building with Node.js 22.11.0 and pnpm 10.24.0. The installer creates isolated virtual environments, configures a per-user systemd service (seerr@username), and allocates a unique public port and internal port for each user so multiple users on the same server can run Seerr side by side without collisions.
Replaces Overseerr and Jellyseerr
Seerr is the canonical replacement for both Overseerr and Jellyseerr in QuickBox Pro. Running qb update overseerr -u username or qb update jellyseerr -u username automatically migrates to Seerr. New installations should use qb install seerr -u username directly.
Multi-user and group-gated
Seerr is a multi-user installable application — each user on the server can have their own Seerr instance with its own port, data directory, and optional subdomain. Whether a given non-admin user is permitted to install Seerr is controlled by their assigned user group. Your server administrator decides which user groups are allowed to install Seerr; administrators can install Seerr for any user regardless of group. If a user attempts to install Seerr and their group does not include it, the install will be blocked with a “package not allowed for user’s group” message.
Key features
🎬 Multi-Server Support
Native integration with Plex, Jellyfin, and Emby with automatic library scanning
📡 Sonarr/Radarr Integration
Automatic request forwarding to media management tools with quality profile selection
👥 User Management
Request quotas, approval workflows, and granular permissions per user
🔔 Rich Notifications
Discord, Slack, email, Telegram, and Pushover notifications for requests and approvals
🔍 Media Discovery
Browse popular, trending, and upcoming content from TMDb with rich metadata
🔄 Built-in Migration
Migrate from Overseerr or Jellyseerr with --migrate --from preserving settings, database, and ports
🧩 Per-User Service
systemd unit seerr@username with isolated Node.js venv and a unique randomized public port per user
👪 Multi-User Installable
Multiple users on the same server can each run their own Seerr instance without port collisions
🔗 Reverse Proxy Ready
nginx fronts each user's public port and proxies to an internal localhost port with automatic path rewriting
🔒 TLS Domain Support
Optional per-user subdomain via the v4 dashboard SSL Control page (or qb install lecert --seerr -d domain -u username)
When to use it
Prerequisites
- Need a unified media request app supporting Plex, Jellyfin, and Emby
- Want to consolidate separate Overseerr and Jellyseerr installations
- Require user quota management and approval workflows for content requests
- Need automated notifications for request status updates across multiple channels
What you get
- Install via
qb install seerr -u usernameto clone seerr-team/seerr and build with pnpm - Each user is assigned a unique public port (randomized from the
5055base) and a derived internal port for the Node.js process - Optional per-user subdomain via the v4 dashboard SSL Control page, or directly with
qb install seerr -u username -d domain/qb install lecert --seerr -d domain -u username - Per-user systemd service
seerr@usernamewith Node.js 22.11.0 venv and auto-start on boot
Installation
Who can install Seerr
Administrators can install Seerr for any user at any time. Non-admin users can install Seerr themselves only if their assigned user group includes Seerr in its allowed software list. If you are a regular user and the install command returns “package not allowed for user’s group”, ask your server administrator to add Seerr to your group’s software permissions. Installs triggered from the v4 dashboard’s Package Management page enforce the same group-based access rules.
Install from the QuickBox CLI
qb install seerr -u usernamePublish Seerr on a per-user subdomain
Each user can optionally have Seerr published on its own subdomain (e.g. https://seerr.user.example.com). The recommended workflow is the SSL Control page in the v4 dashboard, which an administrator uses to issue a Let’s Encrypt certificate and generate a per-user nginx vhost in one step. Under the hood, SSL Control invokes:
qb install lecert --seerr -d domain -u usernameThe same command is available directly from the CLI, and you can also pass -d at install time:
qb install seerr -u username -d 'seerr.example.com'The lecert workflow reads the user’s internal port from /opt/username/Seerr/env.conf, copies the subdomain.nginx.conf template, and writes /etc/nginx/sites-enabled/username.seerr.conf with the provided domain and certificate paths. When DNS credentials are configured (for example Cloudflare, Route53, or DigitalOcean), the installer detects them automatically and uses DNS challenge validation.
Migrate from Overseerr or Jellyseerr
Seerr includes a built-in migration utility that preserves your settings, database, port assignment, nginx configuration, and URL overrides:
# Migrate from Jellyseerr
qb install seerr -u username --migrate --from jellyseerr
# Migrate from Overseerr
qb install seerr -u username --migrate --from overseerrThe migration process:
- Backs up the source application
- Stops the old service
- Copies
settings.jsonanddb.sqlite3to the new Seerr install - Preserves the original port assignment
- Creates new nginx configs from Seerr templates
- Migrates URL override entries
- Removes old database entries, service files, and install directories
- Reloads systemd and nginx
Automatic Migration on Update
Running qb update jellyseerr -u username or qb update overseerr -u username automatically triggers migration to Seerr. No manual intervention is needed.
Initial Configuration
First-Time Setup
On first access, Seerr prompts you to connect your media server:
- Open Seerr web interface at
http://host:port - Select Media Server Type: Choose Jellyfin, Emby, or Plex
- Authenticate: Sign in with your media server account
- Select Server: Pick your media server from the list
- Library Sync: Seerr automatically scans your media libraries
- Admin Assignment: First user to sign in becomes the administrator
QuickBox Dashboard Integration
Seerr is automatically integrated into your QuickBox dashboard. Find it in the Service Control panel with port and status information. Click the LAUNCH icon to open the web interface.
Connect Sonarr and Radarr
Configure media management integrations for automatic request handling:
- Navigate to Settings > Services in Seerr
- Add Radarr Server:
- Default Server - Enable for primary Radarr instance
- Server Name - Descriptive name (e.g., “QuickBox Radarr”)
- Hostname or IP -
localhost - Port - Your Radarr port (default
7878) - Use SSL - Uncheck (reverse proxy handles SSL)
- API Key - Copy from Radarr > Settings > General > API Key
- Quality Profile - Select default profile
- Root Folder - Select default media path
- Minimum Availability - Released, In Cinemas, or Announced
- Click Test to verify connection, then Save
- Add Sonarr Server:
- Follow same steps as Radarr
- Port - Your Sonarr port (default
8989) - API Key - Copy from Sonarr > Settings > General > API Key
- Quality Profile - Select default profile (e.g., “HD-1080p”)
- Root Folder - Select TV shows path
- Season Folder - Enable for organized library structure
- Click Test, then Save
Configure Notifications
Set up notification channels for request updates:
- Go to Settings > Notifications
- Discord Integration (recommended):
- Create Discord webhook in your server
- Enter Webhook URL
- Enable notification types: Media Requested, Media Approved, Media Available, Media Failed
- Click Test to send test notification
- Save Changes
- Email Notifications (optional):
- Configure SMTP Settings (host, port, credentials)
- Set From Email Address
- Enable desired notification types
- Save Changes
Access and authentication
URL / route
- Default:
https://host:<your-public-port>— nginx in/etc/nginx/apps-http/username.seerr.conflistens on the user’s randomized public port and proxies to the internal Node.js port on127.0.0.1. The exact public port is unique per user and recorded in the QuickBox database. - Path-based access: some installations also expose Seerr at
/seerrthrough/etc/nginx/software/username.seerr.confalongside the per-user public port listener. - With a subdomain:
https://domain/served by/etc/nginx/sites-enabled/username.seerr.confwhen installed with-d domainfrom lecert or via the v4 dashboard’s SSL Control page.
Dashboard Quick Access
Find Seerr in the v4 dashboard under Package Management and in the Service Control tile on your app landing page. The tile shows your assigned port and a direct LAUNCH link. You can also read your assigned port from the software_port column of the user_software table or directly from /opt/username/Seerr/env.conf (which stores the internal Node.js port — add or subtract 10000 to map between internal and public).
Security notes
- The service runs as
usernameviaseerr@username.serviceand reads environment settings from/opt/username/Seerr/env.conf - Each user gets a unique public port and a unique internal port; the internal port is
public_port + 10000 - TLS is provisioned when lecert installs certificates into
/etc/nginx/ssl/domain/and binds them in the generated vhost - First user to sign in becomes the administrator with full permissions
- Additional users inherit permissions based on their media server role
- Webpush notifications are enabled by default during installation
Configuration and files
Common tasks
Service Management
Seerr runs as a per-user systemd service seerr@username:
# Start/stop/restart service
systemctl start seerr@username
systemctl stop seerr@username
systemctl restart seerr@username
# Check service status
systemctl status seerr@username
# View live logs
journalctl -u seerr@username -f
# Enable/disable auto-start on boot
systemctl enable seerr@username
systemctl disable seerr@usernameApplication Management
Use QuickBox CLI for application updates and maintenance:
# Update to latest release
qb update seerr -u username
# Reinstall (preserves database)
qb reinstall seerr -u username
# Remove application
qb remove seerr -u username
# View help
qb help seerrHow `qb update seerr` protects your port assignment
Every Seerr update needs to know which public port your instance already owns so nginx, the database row, and the running service stay consistent. The updater resolves that port from multiple sources in priority order and refuses to proceed if none of them yield a valid value:
/opt/username/Seerr/env.conf— thePORT=value written by the last successful install or update. This is the most authoritative source because it is exactly what the runningseerr@usernameservice binds to.- QuickBox database (
user_software.software_portfor this user) — used whenenv.confis missing or unreadable. /etc/nginx/apps-http/username.seerr.conf— the public port parsed from thelistendirective. Fallback of last resort.
Each candidate is validated as a positive integer before it is accepted. If all three sources are missing, empty, or invalid, the update aborts cleanly — no files are rewritten, no services are restarted, and the install lock is released so you can retry after investigating. This guarantees qb update seerr will never silently re-assign your port or corrupt your deployment if the state on disk is partially damaged.
nginx Management
Reload nginx after configuration changes:
# Test configuration
sudo nginx -t
# Reload nginx
sudo systemctl reload nginxFAQ
5055) and a derived internal port equal to the public port plus 10000. The public port is recorded in the user_software.software_port database column and surfaced in the v4 dashboard's app tile. The internal port is written to /opt/username/Seerr/env.conf as PORT= — that's the port the Node.js process actually binds on localhost, and nginx proxies the public port to it. When migrating from Overseerr or Jellyseerr, the original port is preserved.seerr@username), data directory (/opt/username/Seerr/), public port, internal port, and nginx configs. Whether a specific non-admin user is allowed to install Seerr depends on their assigned user group's software permissions; administrators can install Seerr for any user./etc/systemd/system/seerr@username.service. Nginx public-port listener: /etc/nginx/apps-http/username.seerr.conf. Optional path-based proxy: /etc/nginx/software/username.seerr.conf. When installed with -d domain, the subdomain vhost lives at /etc/nginx/sites-enabled/username.seerr.conf.seerr-team/seerr, checks out the latest tagged release, installs Node.js 22.11.0 with pnpm 10.24.0 inside /opt/username/lib/nodejs/Seerr/.venv, runs pnpm install --frozen-lockfile, builds with pnpm build, and starts the application under the target user.qb install seerr -u username --migrate --from overseerr or --from jellyseerr. This preserves your settings, database, port, nginx config, and URL overrides. Alternatively, running qb update jellyseerr or qb update overseerr automatically triggers the migration.settings.json to allow browser push notifications for request updates. You can disable this in Seerr settings if not needed.settings.json and db.sqlite3 from the old application, preserves the port assignment, creates new nginx configs from Seerr templates, and removes the old install. A backup of the source application is created before any changes are made.env.conf, the QuickBox database, or the existing nginx listener. This is an intentional safety guard — it prevents a corrupt or zero-valued port from being written into your nginx config, env.conf, and database row. The install lock is released automatically on abort, so you can retry after repairing the broken source. See the Troubleshooting section above for the exact files to check and how to recover.Best practices
Do
- Use
qb install seerr -u usernamefor new installations (add-d domainwhen needed) - Run
qb update jellyseerr -u usernameorqb update overseerr -u usernameto auto-migrate existing installations to Seerr - Check service health with
systemctl status seerr@usernameand tail logs withjournalctl -u seerr@username -f - Reload nginx after adding or removing a domain:
sudo systemctl reload nginx - Set up Discord or email notifications for request updates to keep users informed
- Configure user quotas to prevent request spam (5-10 requests per week is a good starting point)
- Enable approval workflows for non-admin users to moderate content requests
- Regularly sync media server libraries to keep Seerr metadata updated
- Backup
/opt/username/Seerr/config/before major updates or reinstalls
Don't
- Avoid editing generated nginx files by hand -- rerun
qb reinstall seerr -u usernameto refresh templates - Do not swap the
PORT=value inenv.confdirectly — the internal port must stay in sync with the public port stored in the database and the nginx apps-http listener; useqb reinstall seerr -u usernameinstead - Don't install both Seerr and Jellyseerr/Overseerr for the same user -- use migration instead
- Don't grant admin access to all users -- use request quotas and approval workflows
- Don't configure multiple default servers in Sonarr/Radarr settings -- causes request routing conflicts
- Don't ignore failed notifications -- check logs and fix webhook/SMTP issues
- Don't forget to configure root folders in Sonarr/Radarr -- requests will fail without valid paths
Troubleshooting
Service will not start
Symptom: Seerr service fails to start or crashes immediately.
Checks:
- Check status:
systemctl status seerr@username - View logs:
journalctl -u seerr@username -f - Verify Node.js venv:
/opt/username/lib/nodejs/Seerr/.venv/bin/node --version(should show v22.11.0) - Check permissions:
ls -la /opt/username/Seerr(should be owned byusername:username) - Verify the assigned internal port is free:
ss -tuln | grep "$(grep -oP 'PORT=\K\d+' /opt/username/Seerr/env.conf)"(onlyseerr@usernameshould be bound there)
Resolution: If Node environment is missing or corrupted, reinstall with qb reinstall seerr -u username to rebuild the virtual environment.
404 on Seerr URL
Symptom: Accessing Seerr through the reverse proxy returns 404 Not Found.
Checks:
- Verify the apps-http nginx config exists:
ls -la /etc/nginx/apps-http/username.seerr.conf - Look up the user’s internal port:
grep PORT /opt/username/Seerr/env.conf - Confirm the nginx config’s
proxy_passtarget matches that internal port - Test nginx config:
sudo nginx -t - Check service status:
systemctl status seerr@username(should be active) - Verify the Node.js process is listening on its internal port:
ss -tuln | grep "$(grep -oP 'PORT=\K\d+' /opt/username/Seerr/env.conf)"
Resolution: Reload nginx with sudo systemctl reload nginx. If the internal or public port drifted (for example after a manual edit of env.conf), run qb reinstall seerr -u username to rebuild the nginx templates against the database-stored port. If a domain was installed, ensure /etc/nginx/sites-enabled/username.seerr.conf references the active certificate paths under /etc/nginx/ssl/domain.
Cannot connect to Sonarr/Radarr
Symptom: Seerr reports “Failed to connect to Radarr” or “Failed to connect to Sonarr”.
Checks:
- Verify services are running:
systemctl status sonarr@username systemctl status radarr@username - Test API connectivity:
curl http://localhost:7878/api/v3/system/status?apikey=YOUR_RADARR_API_KEY curl http://localhost:8989/api/v3/system/status?apikey=YOUR_SONARR_API_KEY - Verify API keys match in Seerr settings
- Check hostname configuration: use
localhost(not127.0.0.1or server IP)
Resolution: Update Seerr connection settings with correct API keys and ensure “Default Server” is checked for your primary Sonarr/Radarr instance.
Requests not sending to Sonarr/Radarr
Symptom: User requests are approved but not appearing in Sonarr/Radarr.
Checks:
- View Seerr logs:
journalctl -u seerr@username -f | grep -i error - Verify “Default Server” is configured: Settings > Services > Radarr/Sonarr > Check ‘Default Server’
- Ensure quality profiles exist and are selected
- Verify root folders are configured and paths are valid
Resolution: Test manual request from Seerr UI and watch logs. Ensure quality profile and root folder are properly configured.
`qb update seerr` aborted — could not determine port
Symptom: Running qb update seerr -u username stops early with a message that the public port could not be resolved. The install lock is released automatically — you can retry once the underlying state is fixed.
What this means: The updater intentionally refuses to continue if it cannot recover a valid public port from any of its trusted sources. This is a safety guard that prevents a partially-corrupt deployment from being rewritten with an invalid port (for example, listen 0 ssl; in nginx or a 0 in the database). No files are touched when this guard fires.
Checks:
- Check
env.conf:cat /opt/username/Seerr/env.conf— expect a line likePORT=15055. If the file is missing, empty, or the value is0, the first source has failed. - Check the database port: inspect
user_software.software_portfor this user in the QuickBox database. A value of0,NULL, or a missing row means the second source has failed. - Check the nginx listener:
grep -E '^\s*listen' /etc/nginx/apps-http/username.seerr.conf— expect a real port followed byssl. Alisten 0 ssl;line means the third fallback is also corrupt. - Look for a prior failed install/update that may have left partial state behind.
Resolution:
- If at least one source has a valid (non-zero) port, repair the others to match and retry
qb update seerr -u username. - If all three sources are corrupt, the safest path is to back up
/opt/username/Seerr/config/(your settings and database) and runqb reinstall seerr -u username. The reinstall will allocate a fresh port and rebuild nginx, systemd, andenv.conffrom a clean state while preserving your configuration directory. Open a Discord support ticket if you would like a staff member to walk through recovery with you.
Related Applications
Request Management (Deprecated)
Resources
Official repository for the unified Seerr project
Comprehensive user guides and setup
Community support and discussions
Legacy Overseerr repository (Plex-only, deprecated)
Legacy Jellyseerr repository (now merged into Seerr)
Join the Community
Media server operators sharing configs, getting support, and shaping the future of QuickBox Pro.