Skip to Content
Seerr

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 username to clone seerr-team/seerr and build with pnpm
  • Each user is assigned a unique public port (randomized from the 5055 base) 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@username with 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 username
Command
qb install seerr -u username
Description
Install Seerr for the user; accepts -d domain for nginx + SSL
Command
qb install seerr -u username -d domain
Description
Install with domain and TLS certificate support
Command
qb reinstall seerr -u username
Description
Reinstall while preserving database and settings
Command
qb update seerr -u username
Description
Update to the latest tagged release from seerr-team/seerr
Command
qb remove seerr -u username
Description
Stop service, clean nginx, and remove files
Command
qb install seerr -u username --migrate --from jellyseerr
Description
Install Seerr and migrate settings/database from Jellyseerr
Command
qb install seerr -u username --migrate --from overseerr
Description
Install Seerr and migrate settings/database from Overseerr
Command
qb help seerr
Description
Show CLI help for flags and examples

Publish 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 username

The 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 overseerr

The migration process:

  1. Backs up the source application
  2. Stops the old service
  3. Copies settings.json and db.sqlite3 to the new Seerr install
  4. Preserves the original port assignment
  5. Creates new nginx configs from Seerr templates
  6. Migrates URL override entries
  7. Removes old database entries, service files, and install directories
  8. 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:

  1. Open Seerr web interface at http://host:port
  2. Select Media Server Type: Choose Jellyfin, Emby, or Plex
  3. Authenticate: Sign in with your media server account
  4. Select Server: Pick your media server from the list
  5. Library Sync: Seerr automatically scans your media libraries
  6. 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:

  1. Navigate to Settings > Services in Seerr
  2. 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
  3. 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:

  1. Go to Settings > Notifications
  2. 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
  3. 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.conf listens on the user’s randomized public port and proxies to the internal Node.js port on 127.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 /seerr through /etc/nginx/software/username.seerr.conf alongside the per-user public port listener.
  • With a subdomain: https://domain/ served by /etc/nginx/sites-enabled/username.seerr.conf when installed with -d domain from 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 username via seerr@username.service and 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

/opt/username
Seerr/# Application root
├── env.conf# Holds PORT=<internal> — the localhost port the Node.js process binds (public port + 10000)
├── config/# Persistent app data
│ ├── settings.json# Primary application settings
│ └── db/# SQLite database storage
│ │ └── db.sqlite3# Application database
└── dist/# Built application served by Node
lib/# Isolated runtime environments
├── nodejs/
│ └── Seerr/
│ │ └── .venv/# Node.js 22.11.0 environment with pnpm 10.24.0
└── python/
│ └── Seerr/
│ │ └── .venv/# Python 3.11 helper venv for nodeenv
/home/username/.config
Seerr/# Symlinks to /opt/username/Seerr/config/ contents
/etc/nginx
apps-http/
└── username.seerr.conf# Per-user public port listener; proxies to the internal Node.js port on 127.0.0.1
software/
└── username.seerr.conf# Optional path-based reverse proxy (exposes Seerr at /seerr)
sites-enabled/
└── username.seerr.conf# Domain vhost created by lecert (when -d domain is used)
/etc/systemd/system
seerr@username.service# Per-user systemd service unit

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@username

Application 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 seerr

How `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:

  1. /opt/username/Seerr/env.conf — the PORT= value written by the last successful install or update. This is the most authoritative source because it is exactly what the running seerr@username service binds to.
  2. QuickBox database (user_software.software_port for this user) — used when env.conf is missing or unreadable.
  3. /etc/nginx/apps-http/username.seerr.conf — the public port parsed from the listen directive. 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 nginx

FAQ

Each user gets a unique public port randomized at install time (seeded from the default 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.
Yes. Seerr is multi-user installable — each user gets their own systemd unit (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.
Your user account belongs to a group whose software allowlist does not include Seerr. Ask your server administrator to add Seerr to your group's software permissions (Group Management in the v4 dashboard), or to install Seerr for you. Administrators bypass this check entirely.
Systemd unit: /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.
QuickBox clones 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.
Seerr supports Jellyfin, Emby, and Plex, but you choose one media server type during initial setup. You can connect to multiple Sonarr and Radarr instances for content management. To switch media server types, reconfigure or reinstall.
Use the built-in migration: 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.
Seerr is the official merger of Jellyseerr and Overseerr into a single application maintained by seerr-team. It combines Jellyseerr's Jellyfin/Emby support with Overseerr's Plex support. Both Jellyseerr and Overseerr are deprecated in QuickBox Pro and will auto-migrate to Seerr on update.
The QuickBox installer automatically enables webpush notifications in settings.json to allow browser push notifications for request updates. You can disable this in Seerr settings if not needed.
The migration copies 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.
The updater refuses to proceed if it cannot recover a valid public port from 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 username for new installations (add -d domain when needed)
  • Run qb update jellyseerr -u username or qb update overseerr -u username to auto-migrate existing installations to Seerr
  • Check service health with systemctl status seerr@username and tail logs with journalctl -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 username to refresh templates
  • Do not swap the PORT= value in env.conf directly — the internal port must stay in sync with the public port stored in the database and the nginx apps-http listener; use qb reinstall seerr -u username instead
  • 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:

  1. Check status: systemctl status seerr@username
  2. View logs: journalctl -u seerr@username -f
  3. Verify Node.js venv: /opt/username/lib/nodejs/Seerr/.venv/bin/node --version (should show v22.11.0)
  4. Check permissions: ls -la /opt/username/Seerr (should be owned by username:username)
  5. Verify the assigned internal port is free: ss -tuln | grep "$(grep -oP 'PORT=\K\d+' /opt/username/Seerr/env.conf)" (only seerr@username should 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:

  1. Verify the apps-http nginx config exists: ls -la /etc/nginx/apps-http/username.seerr.conf
  2. Look up the user’s internal port: grep PORT /opt/username/Seerr/env.conf
  3. Confirm the nginx config’s proxy_pass target matches that internal port
  4. Test nginx config: sudo nginx -t
  5. Check service status: systemctl status seerr@username (should be active)
  6. 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:

  1. Verify services are running:
    systemctl status sonarr@username systemctl status radarr@username
  2. 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
  3. Verify API keys match in Seerr settings
  4. Check hostname configuration: use localhost (not 127.0.0.1 or 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:

  1. View Seerr logs: journalctl -u seerr@username -f | grep -i error
  2. Verify “Default Server” is configured: Settings > Services > Radarr/Sonarr > Check ‘Default Server’
  3. Ensure quality profiles exist and are selected
  4. 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:

  1. Check env.conf: cat /opt/username/Seerr/env.conf — expect a line like PORT=15055. If the file is missing, empty, or the value is 0, the first source has failed.
  2. Check the database port: inspect user_software.software_port for this user in the QuickBox database. A value of 0, NULL, or a missing row means the second source has failed.
  3. Check the nginx listener: grep -E '^\s*listen' /etc/nginx/apps-http/username.seerr.conf — expect a real port followed by ssl. A listen 0 ssl; line means the third fallback is also corrupt.
  4. 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 run qb reinstall seerr -u username. The reinstall will allocate a fresh port and rebuild nginx, systemd, and env.conf from 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.
🎬

Media Servers

📡

Media Management

Resources


Join the Community

Media server operators sharing configs, getting support, and shaping the future of QuickBox Pro.

Dedicated Support
Feature Previews
Community Configs
Active Discussions
Join Discord Server