All apps · 0 apps
Nexview
Docker app from DerKezorm's Repository
Overview
Readme
View on GitHubNexview
Find something to watch — and request it straight from Radarr and Sonarr.
Nexview is a self-hosted media discovery dashboard for a household — family, flatmates, a circle of friends. It shows new releases from TMDB, marks what is already in your library, and hands requests to Radarr (movies) and Sonarr (shows). Everyone gets their own account, with roles, approvals and quotas.
It downloads nothing itself and stores no media. It is the front door to a setup you already run — it does not replace any part of it.
Without a TMDB key Nexview starts with sample data, so you can look around before deciding anything.

The home page. What each person marks as a favourite shapes what they get suggested.

Requesting a title, and the same installation seen by a child.
The full tour is on the project site — every area with its own page and more screenshots.
What it does
Finding something
- Separate areas for movies and shows, each with its own logic
- Filter by period, language, region, genre, rating and studio; cards or list
- Detail pages with cast photos, directing and writing credits, studios, keywords, similar titles and the trailer in a window
- Ratings from IMDb, Rotten Tomatoes and Metacritic on the title itself
- Where a title is currently streaming in your region, split into subscription, free, rent and buy (data from JustWatch)
- Browse people — actors, directors, writers — and mark them as favourites; your favourites, titles and people alike, shape what gets suggested on your home page
- A release calendar, one week at a time: your own titles kept apart from new releases, with cinema and digital dates read for your region
Requesting
- Pick quality profile and target folder, or let the approver pick them instead
- Request whole shows or single seasons, optionally following future ones
- Optionally a second Radarr and Sonarr instance for 4K: the same title once in 1080p and once in 4K, with separate folders, profiles and per-user permissions
- The state sits on the poster — not requested, requested, searching, already downloaded, in library, blocked — and updates itself as Radarr and Sonarr work
Who may do what
- Three roles: administrator, approver, user. An approver decides on requests without ever getting near your API keys
- Approve automatically or by hand, set separately for movies, shows and 4K
- Quotas per day, week or month — or, instead of counting titles, by disk space in gigabytes, which is the thing that actually runs out
- Child accounts: a parent creates a login for their child, with an age, a set of categories and a language. The child gets a separate, simpler app and does not request but wishes — nothing happens until the parent approves, and the request then runs in the parent's name
- A block list for titles that should stay out: visible, but not requestable
With a media server
Plex is optional. Connect one and four things arrive:
- Sign in with a Plex account, checked against your server — no second password
- Titles already in the library are recognised even if they never came through Radarr or Sonarr, and cannot be requested twice
- Your Plex watchlist appears inside the catalogue, requestable with one click. Nothing happens on its own; every title takes a click
- What each person has already watched carries a marker, and everyone sees only their own
Staying informed
- A bell in the app, and per-event e-mail if you want it
- Seven notification channels for the installation as a whole: ntfy, Gotify, Telegram, Discord, a plain webhook, Apprise and e-mail. Each inbox picks its own events, language and urgency
- A ticket centre where people report problems and get an answer, with state and history
- Statistics and an error log for the administrator
And
- German and English throughout, including titles and descriptions
- A dark interface that works on a phone
Built with
- Frontend: React 19, Vite, Tailwind CSS 4
- Backend: Python, FastAPI
- Database: SQLite — accounts, settings and requests only, never media files
- Sessions: JWT, passwords hashed with bcrypt
- Deployment: a single Docker container serving both the API and the interface
Running with Docker
Nexview runs as one container: FastAPI serves the API and the built interface together. No extra web server is needed.
The image is on the GitHub Container Registry and is built for Intel/AMD and ARM, so nothing has to be compiled:
docker compose up -d
Nexview is then reachable at http://<your-server>:5173.
To build from source instead, replace image: ghcr.io/derkezorm/nexview:latest in
docker-compose.yml with build: . and add --build when starting.
What to back up
Everything that matters lives in the directory mapped to /data:
| File | Contents |
|---|---|
nexview.db |
accounts, requests, feedback, settings |
secret.key |
the key your stored API keys are encrypted with |
avatars/ |
profile pictures |
logs/ |
error log |
secret.key belongs with the database. Without it the stored TMDB, Radarr, Sonarr
and SMTP credentials cannot be decrypted. Back both up together — and never put that
backup in a public repository.
On a Synology
In Container Manager under Project → Create, pick the project folder and use the
docker-compose.yml. Two adjustments are worth making:
ports:
- "5173:8000" # change the left number if 5173 is taken
volumes:
- /volume1/docker/nexview/data:/data
A fixed path instead of ./data makes backing up through Hyper Backup easier.
You do not need to sort out permissions on that folder — the container sets them on
start. If you want the files to belong to a particular user, put their numbers in
PUID/PGID (find them over SSH with id username).
Updating
docker compose pull
docker compose up -d
The database is kept. Nexview brings it up to date itself on start: missing tables,
columns and indexes are added. Before anything is changed it writes a copy to
/data/sicherungen/, keeping the five most recent — so if something does go wrong, the
previous state is still there.
Image tags
Nexview follows the usual MAJOR.MINOR.PATCH numbering:
| Image | Contents |
|---|---|
ghcr.io/derkezorm/nexview:latest |
the latest released version — the recommendation |
ghcr.io/derkezorm/nexview:0.16.1 |
exactly that one version, never changes |
ghcr.io/derkezorm/nexview:main |
the current development state, may be broken |
The running version is in the footer and in detail under About Nexview, which also reports when a newer one exists. For that it asks GitHub at most once a day. The check sends nothing out of Nexview and can be switched off on the same page.
Configuration
Every setting is optional — Nexview runs without a configuration file. For production,
copy .env.example to .env:
| Variable | Meaning |
|---|---|
NEXVIEW_SECRET_KEY |
Secret for sessions and for encrypting the API keys. Generated automatically and stored in data/secret.key if unset. |
NEXVIEW_DATA_DIR |
Directory for the database and key file (default: ./data) |
NEXVIEW_ACCESS_TOKEN_MINUTES |
How long a sign-in stays valid (default: 30) |
NEXVIEW_REFRESH_TOKEN_DAYS |
How long you stay signed in (default: 30) |
NEXVIEW_CORS_ORIGINS |
Allowed origins in development |
NEXVIEW_STATIC_DIR |
Folder with the built frontend (the container sets this itself) |
NEXVIEW_LOG_LEVEL |
Overrides the log level chosen in the app (quiet, normal, detailed, trace). Emergency exit for when Nexview does not start. |
No TMDB, Radarr or Sonarr keys belong in .env — you enter those in the app.
Development
Requirements: Python 3.12+ and Node.js 20+
Backend
cd backend
python -m venv .venv
.venv/Scripts/activate # Linux/macOS: source .venv/bin/activate
pip install -r requirements-dev.txt
python -m uvicorn app.main:app --reload --port 8000
The API then runs on http://127.0.0.1:8000, with interactive documentation at
http://127.0.0.1:8000/docs.
Frontend
In a second terminal:
cd frontend
npm install
npm run dev
The interface opens at http://localhost:5173. Requests to /api are forwarded to the
backend automatically.
First run
A one-time wizard appears on first launch:
| Step | Required | For |
|---|---|---|
| Account | yes | administrator with username, e-mail address and password |
| Picture | no | profile picture — without one, Nexview shows initials |
| TMDB | no | titles, posters, descriptions. Without a key you get sample data |
| Radarr | no | movies. Without Radarr, movies cannot be requested |
| Sonarr | no | shows. Without Sonarr, no show requests |
| Address | yes | the address Nexview is reachable at; it goes into every link |
| yes | SMTP server for invitations and password recovery |
The last two cannot be skipped, and Continue only unlocks after a successful connection test. The reason: straight afterwards Nexview sends you a confirmation mail — and without a confirmed address you cannot get back in. A mail server that does not work would leave a fresh installation unusable.
If the confirmation never arrives, the sign-in page helps: with the right password it offers Resend confirmation and Correct address, so a typo is not fatal.
Further accounts come from invitations — or through the media server. The administrator sets only the address and the role; the invitee picks their own username, display name and password through the link in the mail. Nobody else learns that password, not even the administrator.
Tests
cd backend
.venv/Scripts/python.exe -m pytest
Starting over
To discard all accounts and settings, delete the data/ directory. The next start runs
the wizard again.
Credits
Metadata comes from TMDB. This project is neither endorsed nor certified by TMDB.
Sign-in, library matching and the watched state run through Plex, when a server is connected. Nexview is neither endorsed by nor affiliated with Plex.
Downloads are handled by Radarr and Sonarr; ratings come from IMDb, Rotten Tomatoes and Metacritic, streaming availability from JustWatch. Notifications can go through ntfy, Gotify, Telegram, Discord, a plain webhook or Apprise.
Seerr, which grew out of Overseerr and Jellyseerr, was the model: the idea of what a request interface for Radarr and Sonarr can look like comes from there, from the second instance for 4K down to matching against the media server. Nexview is an independent implementation and takes no source code from it, but owes it a great deal.
Licence
Nexview is under the GNU Affero General Public License, version 3 or later (AGPL-3.0-or-later) — see LICENSE. The source may be used, modified and passed on, commercially too. What the AGPL asks in return: if you change Nexview and let other people use your changed version — including over a network, without handing out any files — you have to make your changed source available to them too. Running Nexview unchanged asks nothing of you. There is no warranty.
Versions up to and including 0.17.0 were released under the MIT licence. That grant is perpetual and is not being withdrawn — anyone who received those versions keeps them under MIT. From 0.18.0 on, the AGPL applies.
The licence covers this project's source. It does not cover:
- Metadata, posters and images from TMDB. Those fall under the TMDB terms of use; running Nexview needs your own API key.
- Plex, Radarr, Sonarr, Docker, Synology, IMDb, Rotten Tomatoes, Metacritic, JustWatch, ntfy, Gotify, Telegram, Discord and Apprise. Trademarks of their respective owners, named here descriptively only.
- The dependencies in
frontend/package.jsonandbackend/requirements.txt, which carry their own licences.
Install Nexview on Unraid in a few clicks.
Find Nexview in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/derkezorm/nexviewRuntime arguments
- Web UI
http://[IP]:[PORT:8000]/- Network
bridge- Shell
sh- Privileged
- false
Template configuration
Port you reach Nexview at. Container port: 8000
- Target
- 8000
- Default
- 5173
- Value
- 5173
Holds the SQLite database, the encryption key for your stored API credentials, and profile pictures. Back up this folder.
- Target
- /data
- Default
- /mnt/user/appdata/nexview
- Value
- /mnt/user/appdata/nexview
User id that should own the files in /data. 99 is the Unraid default.
- Default
- 99
- Value
- 99
Group id that should own the files in /data. 100 is the Unraid default.
- Default
- 100
- Value
- 100
Time zone used for the log and for dates in the interface, for example Europe/Berlin.
- Target
- TZ
- Default
- Etc/UTC
- Value
- Etc/UTC
Signs login tokens and encrypts your stored Radarr, Sonarr and TMDB credentials. Leave blank: Nexview generates one on first start and keeps it in /data/secret.key.
- Target
- NEXVIEW_SECRET_KEY
Emergency override: quiet, normal, detailed or trace. Leave blank - the level is set inside the app and turns itself back down after troubleshooting. Only set this if Nexview will not start at all.
- Target
- NEXVIEW_LOG_LEVEL
How long a sign-in stays valid before it is refreshed.
- Target
- NEXVIEW_ACCESS_TOKEN_MINUTES
- Default
- 30
- Value
- 30
How long someone stays signed in without entering their password again.
- Target
- NEXVIEW_REFRESH_TOKEN_DAYS
- Default
- 30
- Value
- 30