Seerr¶
Install¶
services:
seerr:
image: ghcr.io/seerr-team/seerr:latest
init: true
container_name: seerr
environment:
- LOG_LEVEL=info
- TZ=America/Vancouver
- PORT=5055
ports:
- 5055:5055
volumes:
- seerr_data:/app/config
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1
start_period: 20s
timeout: 3s
interval: 15m
retries: 3
restart: unless-stopped
volumes:
seerr_data:
name: seerr_data
- Docker volumes used for permission
- changed healthcheck intervals
Usage¶
Follow the onboarding process
- Jellyfin settings
- Radarr settings
Arrs¶
Multiple Arrs Server can be added
By default Seerr mark request as monitored
If a movie is added to Seerr, but deleted in Radarr manually, it will still show in Seerr and have to be re-requested
- clear the data first (if the movie is already in a watchlist, must be re-added)
Status¶
Request
- 1 = PENDING APPROVAL, 2 = APPROVED, 3 = DECLINED, 5=AVAILABLE/DELETED
Media
- 1 = UNKNOWN, 2 = PENDING, 3 = PROCESSING, 4 = PARTIALLY_AVAILABLE, 5 = AVAILABLE, 6 = DELETED, 7 = DELETED?
Manual Modification (available, deletion)
When a movie has been marked as available (in Seerr), even if it doesn’t exist in Jellyfin/Radarr, it will be marked with status of 5, or available. Later during a scan
Other Behavior
If a movie exists in Jellyfin, but has been deleted from disk
- it will be of status
deletedon the next scan
However to trigger a deleted status on movie not available in the library (e.g. for watched media tracking), workaround
Alternative Approach: database?
- better to update the DB
- requires docker cp and full restart (stop/start, restart is not sufficient)
insert into media (mediaType,tmdbId,status,createdAt,updatedAt,lastSeasonChange,mediaAddedAt) values ("movie",347375,7,"2023-01-01 00:00:00","2023-01-01 00:00:00","2023-01-01 00:00:00","2023-01-01 00:00:00");
- parameters:
tmdbId, date it was watched (use for all 4)
States¶

On these events, notifications can be sent, some useful ones include
- pending requests (manual or auto approved)
- when request is available
- when an issue is raised or closed
There are 2 flows of requests processing. It ensures both manual control for admin with unique movie requirements and instant availability for non-technical users.
- for family members flow
- requests required manual processing and sent to Radarr for immediately processing when approved
- default location set to movie directory and will download instantly with
Anyprofile to optimize fast availability
- for personal admin flow
- requests are automatically approved but uses a
manualtag and unmonitored for manual processing - default location set to SSD scratch disk (for more manual processing), it uses 4K profile and do not auto download
- requests are automatically approved but uses a
User Flow¶
To use Seerr, login to the Seerr account with your Jellyfin username.

On the left, the tabs are broken into
- Discover: a overview page that consists of a mixture of popular, trending movies and TV series
- Movies: dedicated section just for movies
- Requests: pending or approve requests you’ve made
To make a request
- click the
Requesticon and it will be processed - the request may need manual approval
To raise an issue regarding playback

- search for the movie
- click the yellow icon to report issue
- describe and issue and submit
Scripting¶
For documentation only, scripts used to integrate with Seerr and Arrs. These are handled via Radarr, not Seerr and not included in documentation. These are Radarr Connect manual scripts that occurs when an event has happened, and are placed in Radarr folder. These environment variables are needed (for the Radarr container).
Automatically delete watchlist items (admin only) and requests once a movie is available, seerr.py
- movies that are in watchlist still persist even when it became available
- delete these from watchlist once available
Unmonitor movies in Radarr for requests of specific tags added.py
- by default, when Seerr requests, it will be added as monitored
- scripts will trigger on Radarr movie add and change these to unmonitored, but only if
manualtag has been applied
Backup Restore Upgrade¶
Backing up the volume, specifically the db.sqlite3 which contains everything.
docker run --rm -v seerr_data:/data -v $(pwd)/seerr_data:/backup busybox /bin/sh -c "tar -czvf /backup/seerr_data.tar.gz /data; chown -R ${PUID}:${PGID} /backup"
The result folder structure
Restore¶
docker run --rm -v seerr_data:/data -v $(pwd)/seerr_data:/backup busybox /bin/sh -c "tar xvf /backup/seerr_data.tar.gz -C /data --strip-components=1; chown -R 1000:1000 /data"
- the
strip-components=1ensure data is saved to/data/*not/data/data/*which is require for Seerr to function - Seerr requires
1000for UID and GID
Update¶
Deployment¶
Seerr do not support base URL for reverse proxying, a subdomain is needed.
Seerr do not support Authelia or OIDC as of now. Only Jellyfin accounts are allowed.
The process for Nginx Proxy Manager is the same. However, change this after running the site in HTTPS
- General > Application URL