You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Lumen is part of SeerrNG: it was merged into snapetech-org/seerrng and is built from there. This page shows what it looks like and walks you through installing it, step by step. The code is in lumen/ here, kept identical to SeerrNG's main by an automatic sync (UPSTREAM names the commit), but always install from SeerrNG (the commands below do that). Testing Lumen or sending a change? See CONTRIBUTING.md.
See it
Screenshots follow GitHub's theme: switch GitHub between light and dark to see Lumen's two themes. Lumen also has a Device setting that follows the phone or computer.
Discover
Movies and series, with what's already on your server marked
Movies. Filter by genre, sort, or show only what's on your server. Hover a poster to request it.
Series. Request the whole show or pick seasons.
Title pages. One big Request button, trailer, cast and details.
Season picker. Entire series, latest season only, or tick the ones you want.
Search across movies, series and books, or just the section you came from.
Requests. Everything you've asked for, and what's ready to watch.
Coming soon. Request ahead and it downloads the day it's out.
Admins choose the server, quality and folder when they request from a poster. Everyone else gets one-click requests.
Books, music, comics, magazines and games
These appear only when your SeerrNG has a service connected for them.
Books and audiobooks, with a narrator picker for audiobooks.
Music: albums, EPs and singles.
Games for PC, retro and modern consoles.
Comics and magazines: follow a series and new issues arrive on their own.
On a phone
Lumen is built for phones first, with a bottom tab bar, big tap targets and a + on every poster. It works in any phone browser, can be added to the home screen, and also works inside the SeerrNG Android app.
Settings
You. Each person sees their request limits and picks their theme, rows and request style.
Lumen settings for everyone (admins). Set defaults, lock them, add your logo, then download the config file.
Why Lumen
SeerrNG is powerful, and that power shows: settings, issues, users and many options everywhere. Most people in your house only want to find something and ask for it. Lumen gives them exactly that.
Simple for everyone. Discover, Movies, Series, Search, Requests and You. No admin screens, nothing to break.
Great on phones. A bottom tab bar, a + on every poster, a sheet for choosing seasons, and Back that does what you expect.
Knows what you already have. A green check on everything already on your server, and a filter to show only what's there (or only what isn't).
One-click requests, or a season picker for series. Admins and request managers can choose the server, quality and folder.
Plex, Jellyfin and Emby. Lumen follows the media server SeerrNG uses and names it everywhere. For Jellyfin and Emby there's a plain sign-in page with just username and password, so family members don't need to know what Jellyfin is.
Your name and logo. Replace the name, logo and browser tab icon.
Light, dark or Device theme, chosen by each person.
More than movies and TV. Books and audiobooks (with narrator choice), music, comics, magazines, games and sports, each shown only when your server is set up for it.
Each person picks how it works: Discover rows, quick request, whole-series requests, narrator choice and books on or off. Admins set the defaults and can lock any of them.
Safe to try. Lumen has no database and changes nothing in SeerrNG. Run it next to SeerrNG for as long as you like, and remove it any time: SeerrNG carries on exactly as before.
Same accounts, same rules. People sign in with the account they already use. Permissions, approvals and request limits all still come from SeerrNG.
family (browser / phone) ──► Lumen :5080 ──► SeerrNG :5055 ──► Plex / Jellyfin / Emby, Sonarr, Radarr…
you, the admin ────────────────────────────► SeerrNG :5055 (setup and settings, as today)
Install
You'll need about 15 minutes. Open the sections that match your setup. Each one shows only the steps for that choice.
Already comfortable with Docker? Add this to your compose file next to SeerrNG, run docker compose up -d, then turn on Trust Reverse Proxy in SeerrNG (Settings → Network) and restart it:
lumen:
image: ghcr.io/snapetech-org/seerrng-lumen:latestcontainer_name: lumenenvironment:
SEERR_INTERNAL_URL: http://seerrng:5055 # how Lumen talks to SeerrNG behind the scenesSEERR_BROWSER_URL: http://192.168.1.50:5055 # the address you'd type in your browser to open full SeerrNGLUMEN_TRUSTED_PROXIES: ''# your reverse proxy's IP/subnet, if anyLUMEN_REAL_IP_HEADER: X-Forwarded-For # CF-Connecting-IP for Cloudflare Tunnelports: [5080:80]restart: unless-stopped
Lumen is a prebuilt image for amd64 and arm64: ghcr.io/snapetech-org/seerrng-lumen. The examples use :latest, which follows SeerrNG's releases. To stay on one release, use its version instead, for example :v3.72.23.
Step 1: Pick your system
Open your system, then choose New install if you don't have SeerrNG yet, or SeerrNG already running to add Lumen next to the one you have. Adding Lumen leaves your SeerrNG and its settings as they are, apart from one switch in Step 3.
Linux (Ubuntu, Debian, Fedora, Raspberry Pi OS…)
Get Docker. Install Docker Engine and the Compose plugin (docker-compose-plugin). Check it's ready:
docker compose version
New install: SeerrNG and Lumen together
mkdir ~/seerrng &&cd~/seerrng
curl -o compose.yaml https://raw.githubusercontent.com/snapetech-org/seerrng/main/lumen/compose.yaml
mkdir seerrng-config
sudo chown 1000:1000 seerrng-config # SeerrNG runs as user 1000
nano compose.yaml # set TZ and SEERR_BROWSER_URL, then Ctrl+O, Enter, Ctrl+X
docker compose up -d
docker compose ps # both seerrng and lumen should say "running"
Then open http://<this-machine>:5055 and finish SeerrNG's setup wizard (guide). Lumen is at http://<this-machine>:5080.
SeerrNG already running: add Lumen
If SeerrNG is in a compose file, add the lumen block from the quick start above under services:, lined up with seerrng:, then run docker compose up -d in that folder.
Otherwise, give Lumen its own folder:
mkdir ~/lumen &&cd~/lumen
curl -o compose.yaml https://raw.githubusercontent.com/snapetech-org/seerrng/main/lumen/compose.lumen-only.yaml
nano compose.yaml # set SEERR_INTERNAL_URL and SEERR_BROWSER_URL
docker compose up -d
Open http://<this-machine>:5080.
🪟 Windows (Docker Desktop)
Get Docker. Install Docker Desktop and start it (whale icon in the tray). Open PowerShell and check:
docker compose version
🪟 New install: SeerrNG and Lumen together
mkdir $HOME\seerrng; cd $HOME\seerrng
curl.exe-o compose.yaml https://raw.githubusercontent.com/snapetech-org/seerrng/main/lumen/compose.yaml
mkdir seerrng-config
notepad compose.yaml # set TZ and SEERR_BROWSER_URL, save, close
docker compose up -d
docker compose ps
For SEERR_BROWSER_URL, use your PC's IP (run ipconfig, look for IPv4 Address), for example http://192.168.1.50:5055. Then open http://localhost:5055 and finish SeerrNG's setup wizard (guide).
🪟 SeerrNG already running: add Lumen
mkdir $HOME\lumen; cd $HOME\lumen
curl.exe-o compose.yaml https://raw.githubusercontent.com/snapetech-org/seerrng/main/lumen/compose.lumen-only.yaml
notepad compose.yaml # set SEERR_INTERNAL_URL and SEERR_BROWSER_URL
docker compose up -d
SeerrNG installed directly on Windows (not in Docker)? Use SEERR_INTERNAL_URL: http://host.docker.internal:5055.
Open Lumen at http://localhost:5080 on the PC, or http://<PC's IP>:5080 from a phone. If phones can't connect, allow port 5080 through Windows Firewall when prompted.
mkdir ~/seerrng &&cd~/seerrng
curl -o compose.yaml https://raw.githubusercontent.com/snapetech-org/seerrng/main/lumen/compose.yaml
mkdir seerrng-config
open -e compose.yaml # set TZ and SEERR_BROWSER_URL, save
docker compose up -d
docker compose ps
Then open http://localhost:5055 and finish SeerrNG's setup wizard (guide).
SeerrNG already running: add Lumen
mkdir ~/lumen &&cd~/lumen
curl -o compose.yaml https://raw.githubusercontent.com/snapetech-org/seerrng/main/lumen/compose.lumen-only.yaml
open -e compose.yaml # set SEERR_INTERNAL_URL and SEERR_BROWSER_URL
docker compose up -d
Open Lumen at http://localhost:5080, or http://<Mac's IP>:5080 from a phone (System Settings → Wi-Fi → Details shows the IP).
Unraid
Each choice below has two routes:
With Compose Manager Plus (GitHub), the easy route: paste one block of text and press a button. Install it from the Apps tab. It replaces the older Compose Manager plugin (remove that first) and keeps any stacks you already have.
Without Compose: use Add Container with the published image.
SeerrNG already running: add Lumen (the usual case)
With Compose Manager Plus (easy route, recommended)
Docker tab → Compose section → Add Stack → name it lumen → OK. The editor opens.
On the Compose tab, paste this and change both IP addresses to your Unraid server's IP. Press Ctrl+S to save.
services:
lumen:
image: ghcr.io/snapetech-org/seerrng-lumen:latestcontainer_name: lumenenvironment:
SEERR_INTERNAL_URL: http://192.168.1.50:5055 # how Lumen talks to SeerrNG behind the scenes: your Unraid IP + SeerrNG's portSEERR_BROWSER_URL: http://192.168.1.50:5055 # the address you'd type in your browser to open full SeerrNG (or your SeerrNG domain)LUMEN_TRUSTED_PROXIES: ''# filled in at Step 2 if you use a reverse proxy or tunnelLUMEN_REAL_IP_HEADER: X-Forwarded-Forports:
- 5080:80cap_drop: [ALL]security_opt: [no-new-privileges:true]# Optional: your settings file and logo. See "Settings for everyone" further down; leave these# lines as they are until you've downloaded lumen-config.json. (":ro" means read-only; it isn't# part of the file name.)# volumes:# - /mnt/user/appdata/lumen/lumen-config.json:/usr/share/nginx/html/lumen-config.json:ro# - /mnt/user/appdata/lumen/branding:/usr/share/nginx/html/branding:rorestart: unless-stopped
Press Compose Up. Docker downloads Lumen and starts it.
Open http://<Unraid IP>:5080.
If SeerrNG and your reverse proxy sit on a custom Docker network (for example proxynet), you can add Lumen to it with networks: [proxynet] plus a top-level networks: { proxynet: { external: true } }, and use SEERR_INTERNAL_URL: http://seerrng:5055.
Updating: press Update Stack on the lumen stack. It downloads the new image and restarts Lumen.
Docker tab → Compose section → Add Stack → name it seerrng → OK.
On the Compose tab, paste this, set your time zone and Unraid IP, and press Ctrl+S:
services:
seerrng:
image: ghcr.io/snapetech-org/seerrng:latestcontainer_name: seerrngenvironment:
LOG_LEVEL: infoPORT: 5055TZ: America/New_York # your time zoneports:
- 5055:5055volumes:
- /mnt/user/appdata/seerrng:/app/configrestart: unless-stoppedlumen:
image: ghcr.io/snapetech-org/seerrng-lumen:latestcontainer_name: lumendepends_on: [seerrng]environment:
SEERR_INTERNAL_URL: http://seerrng:5055 # how Lumen talks to SeerrNG behind the scenes (leave as is)SEERR_BROWSER_URL: http://192.168.1.50:5055 # the address you'd type in your browser to open full SeerrNG: your Unraid IPLUMEN_TRUSTED_PROXIES: ''LUMEN_REAL_IP_HEADER: X-Forwarded-Forports:
- 5080:80cap_drop: [ALL]security_opt: [no-new-privileges:true]restart: unless-stopped
Press Compose Up.
Open http://<Unraid IP>:5055 and finish SeerrNG's setup wizard (guide). Lumen is at http://<Unraid IP>:5080.
Without Compose (Add Container)
Add SeerrNG: in Terminal run mkdir -p /mnt/user/appdata/seerrng && chown 1000:1000 /mnt/user/appdata/seerrng, then Docker tab → Add Container:
Container Manager → Project → Create: name seerrng, path docker/seerrng, source Create docker-compose.yml. Paste compose.yaml and set TZ and SEERR_BROWSER_URL (http://<NAS IP>:5055).
Next → Done. It downloads and starts.
Open http://<NAS IP>:5055 and finish SeerrNG's setup wizard (guide). Lumen is at http://<NAS IP>:5080.
SeerrNG already running: add Lumen
File Station → in the docker share, create a folder lumen.
Container Manager → Project → Create: name lumen, path docker/lumen, source Create docker-compose.yml. Paste compose.lumen-only.yaml and set SEERR_INTERNAL_URL and SEERR_BROWSER_URL to http://<NAS IP>:5055.
Next → Done. It downloads and starts.
Open http://<NAS IP>:5080.
TrueNAS SCALE
New install: SeerrNG and Lumen together
Create a dataset for SeerrNG's settings, for example /mnt/tank/apps/seerrng, owned by user 1000.
Apps → Discover Apps → ⋮ → Install via YAML. Name it seerrng.
Paste compose.yaml, change ./seerrng-config to your dataset path, set TZ and SEERR_BROWSER_URL (http://<TrueNAS IP>:5055) → Save.
Open http://<TrueNAS IP>:5055 and finish SeerrNG's setup wizard (guide). Lumen is at http://<TrueNAS IP>:5080.
SeerrNG already running: add Lumen
Apps → Discover Apps → ⋮ → Install via YAML. Name it lumen.
Paste compose.lumen-only.yaml and set SEERR_INTERNAL_URL and SEERR_BROWSER_URL to http://<TrueNAS IP>:5055 → Save.
Open http://<TrueNAS IP>:5080.
❓ Which addresses go in the file? (TZ, SEERR_INTERNAL_URL, SEERR_BROWSER_URL)
TZ (new install): your time zone, for example America/New_York or Europe/Berlin.
SEERR_BROWSER_URL: the address you'd type in your browser to open full SeerrNG. Lumen sends people there for pages it doesn't have, like Settings, Users and Issues. Pick the one that matches your setup:
Your setup
SEERR_BROWSER_URL
Full SeerrNG is only used at home
the machine's IP and port, e.g. http://192.168.1.50:5055
Full SeerrNG has its own admin domain (protected, see Step 3)
that domain, e.g. https://seerr.example.com
With the IP, those links only work on your home network. With a domain, they work from anywhere. The domain must be a different one from Lumen's (see Step 2).
SEERR_INTERNAL_URL: how Lumen talks to SeerrNG behind the scenes. Nobody types this one into a browser; it can be a container name that only works between containers.
How SeerrNG runs
SEERR_INTERNAL_URL
Docker Compose, and you added Lumen to the same file
http://seerrng:5055 (your SeerrNG service name)
Docker, in a different compose file or docker run (Unraid templates too)
http://<machine's LAN IP>:5055, e.g. http://192.168.1.50:5055
Installed directly on the same machine (Windows, Linux package, Snap)
http://host.docker.internal:5055 with Docker Desktop, otherwise the LAN IP
On another machine
http://<that machine's IP>:5055
If you changed SeerrNG's port, use yours instead of 5055.
Installed Lumen before these names? The older SEERR_URL (now SEERR_INTERNAL_URL) and SEERR_FULL_URL (now SEERR_BROWSER_URL) still work. If both are set, the new name wins.
Step 2: How do people reach it?
If people reach SeerrNG through a domain today, point that domain at Lumen instead, so your family keeps the address they know. Full SeerrNG then needs an address of its own: a second domain for admins, or home network only. Set SEERR_BROWSER_URL to that address. For example:
Address
Goes to
Who uses it
https://requests.example.com
Lumen
everyone
http://192.168.1.50:5055 (simplest and safest), or a second domain such as https://seerr.example.com that only admins can get through (e.g. Cloudflare Access)
full SeerrNG, and SEERR_BROWSER_URL
admins
Don't point both at Lumen: the Settings and Users links would just loop back into Lumen.
🏠 Only at home (no domain, no reverse proxy)
Nothing more to do. Share http://<this-machine>:5080 with your family. Leave LUMEN_TRUSTED_PROXIES empty.
Cloudflare Tunnel
Cloudflare dashboard → Zero Trust → Networks → Tunnels → your tunnel → Public Hostname.
Edit the hostname that pointed at SeerrNG (or add one) and change the Service to:
http://lumen:80 if cloudflared runs in Docker on the same network as Lumen, or
http://<LAN IP>:5080 otherwise.
Keep full SeerrNG home-network only, or give it its own admin hostname (for example seerr.example.com → http://seerrng:5055) protected with a Cloudflare Access policy so only admins get through. Set SEERR_BROWSER_URL to that address.
Tell Lumen to trust the tunnel. Set these on the Lumen service and run docker compose up -d:
LUMEN_TRUSTED_PROXIES: 172.18.0.0/16 # cloudflared's IP or Docker subnet (see below)LUMEN_REAL_IP_HEADER: CF-Connecting-IP
Nginx Proxy Manager
Hosts → Proxy Hosts → edit the host that pointed at SeerrNG (or Add Proxy Host).
Schemehttp, Forward Hostname / IPlumen (same Docker network) or the LAN IP, Forward Port80 (or 5080 with the LAN IP). Keep your SSL tab as it was.
Set on the Lumen service, then docker compose up -d:
LUMEN_TRUSTED_PROXIES: 172.18.0.0/16 # NPM's IP or Docker subnet (see below)LUMEN_REAL_IP_HEADER: X-Forwarded-For
Caddy
requests.example.com {
reverse_proxy lumen:80 # or 192.168.1.50:5080
}
Reload Caddy, then set on the Lumen service and docker compose up -d:
LUMEN_TRUSTED_PROXIES: 172.18.0.0/16 # Caddy's IP or Docker subnet (see below)LUMEN_REAL_IP_HEADER: X-Forwarded-For
Traefik
Move your router labels from SeerrNG to Lumen:
lumen:
# ...environment:
LUMEN_TRUSTED_PROXIES: 172.18.0.0/16 # Traefik's IP or Docker subnet (see below)LUMEN_REAL_IP_HEADER: X-Forwarded-Forlabels:
- traefik.enable=true
- traefik.http.routers.lumen.rule=Host(`requests.example.com`)
- traefik.http.routers.lumen.entrypoints=websecure
- traefik.http.routers.lumen.tls.certresolver=letsencrypt # your resolver's name
- traefik.http.services.lumen.loadbalancer.server.port=80networks: [proxy] # Traefik's network
SWAG or plain nginx
In your site config (for SWAG, the proxy-conf you used for SeerrNG), change the upstream:
Use bridge for the default network, or <folder>_default for a compose project (e.g. seerrng_default). You'll get something like 172.18.0.0/16.
List several with commas. Never use 0.0.0.0/0. If you skip this, everything still works, but SeerrNG sees every visitor as the proxy, so everyone shares one sign-in limit.
Step 3: One switch in SeerrNG
In full SeerrNG go to Settings → Network, turn on Trust Reverse Proxy, save, and restart SeerrNG (docker compose restart seerrng, or restart the container).
Why?
SeerrNG limits wrong-password attempts per visitor. With Lumen in front, every request reaches SeerrNG from Lumen, which passes on the real visitor's address. SeerrNG only reads it with this switch on. Without it, a few wrong passwords from one person could lock out everyone for a while.
Keep full SeerrNG off the open internet: don't port-forward 5055, and if it has its own domain, put a sign-in wall in front of it (for example Cloudflare Access) so only admins can reach it. Your family uses Lumen.
Step 4: Sign in and share it
Open Lumen, sign in with your usual Plex, Jellyfin, Emby or SeerrNG account, and look around. Lumen and full SeerrNG work side by side, so you can try it as long as you like before telling anyone. When you're happy, share the Lumen address (or point your domain at it in Step 2). Your family keeps the same accounts.
Settings for everyone (optional)
Every person can change how Lumen works on their You page. As an admin you can set the defaults, lock any of them, change the sign-in page and add your own name and logo.
Sign in as an admin → You → Lumen settings for everyone.
Pick what you want and press Download lumen-config.json.
Put the file next to your compose.yaml. For a logo or tab icon, put the images in a branding folder there too.
In compose.yaml, remove the # in front of these lines under lumen, then run docker compose up -d:
Create the file before adding the lines: if it's missing, Docker makes a folder with that name and Lumen ignores it.
:ro at the end of each line means read-only (Lumen can read the files but never change them). It isn't part of the file name: the file is just lumen-config.json.
No permissions to change. Lumen only reads these files, so the usual defaults are fine. (The chown 1000:1000 in the install steps is only for SeerrNG's own config folder.)
Use the downloaded file rather than an empty one. If you want to mount the folder before you've chosen anything, put {} in it.
On Unraid
In Terminal (>_), make the folder: mkdir -p /mnt/user/appdata/lumen/branding
Copy the downloaded lumen-config.json into /mnt/user/appdata/lumen/, for example over the network share \\<Unraid IP>\appdata\lumen (with the appdata share exported) or with the Dynamix File Manager plugin. Put a logo or icon in branding if you want one.
Open the lumen stack → Edit Stack, remove the # in front of the three volumes lines, Ctrl+S, then Compose Up.
Without Compose: edit the container and Add another Path for each: container /usr/share/nginx/html/lumen-config.json → host /mnt/user/appdata/lumen/lumen-config.json (Access Mode Read Only), and container /usr/share/nginx/html/branding → host /mnt/user/appdata/lumen/branding.
"form" shows username and password straight away for Jellyfin and Emby, with no server names.
branding
Your name, logo and browser tab icon (files in ./branding or https:// addresses).
defaults
What everyone starts with. theme can be dark, light or system (follows the device).
requestOptions
Admins and request managers choose server, quality and folder when requesting from a poster.
locked
Settings people can't change, e.g. ["showBooks"].
seerrPublicUrl
The "Open full SeerrNG" link on the You page.
Updating
In the folder with compose.yaml:
docker compose pull
docker compose up -d
pull downloads the latest SeerrNG and Lumen images. People get the new version the next time they open or refresh Lumen. Watchtower, Unraid's Update All and other image updaters update Lumen too.
Set up before v3.72.23? Your Lumen service probably still has build: and image: seerrng-lumen:local. Replace those two lines with image: ghcr.io/snapetech-org/seerrng-lumen:latest, then run the two commands above. On Unraid without Compose, edit the lumen container and change Repository to the same address.
Switching back
Lumen changes nothing in SeerrNG. Point your proxy back at SeerrNG (or share the old address), then docker compose stop lumen. That's it.
Troubleshooting
I still see the old page after switching.
Your browser cached it. Refresh. On a phone, close the tab or home-screen app completely and reopen it.
"502 Bad Gateway", or sign-in fails straight away.
Lumen can't reach SeerrNG, so SEERR_INTERNAL_URL is wrong. Test from inside Lumen (use your SEERR_INTERNAL_URL):
It should print SeerrNG's version. If not, try the LAN IP instead of the container name, or the other way round.
Everyone got "too many attempts" at once.
SeerrNG sees everyone as one visitor. Turn on Trust Reverse Proxy (Step 3) and, behind a proxy, set LUMEN_TRUSTED_PROXIES (Step 2).
Lumen stops right after starting.
Run docker compose logs lumen. A message about LUMEN_TRUSTED_PROXIES or LUMEN_REAL_IP_HEADER means a value isn't allowed: proxies must be IPs or ranges separated by commas, and the header must be X-Forwarded-For, CF-Connecting-IP or X-Real-IP.
SeerrNG won't start: "permission denied" on /app/config.
The config folder doesn't belong to user 1000. Run sudo chown -R 1000:1000 seerrng-config.
Settings, Users or Issues open the wrong address.
Those pages live in full SeerrNG. Set SEERR_BROWSER_URL to the address people use for it and run docker compose up -d.
Books, Music, Games… don't show up.
Each section appears only when SeerrNG has it switched on (Settings → General → Media categories) and a service connected for it (for example ChaptarrNG for books).
Book Recommendations says "Connect Hardcover by adding an API token…"
The Hardcover token in ChaptarrNG or BookshelfNG is only used for book details. Recommendations use each person's own token, saved in SeerrNG:
In full SeerrNG, open your profile → Settings → General → External request lists.
Choose Hardcover Want to Read, paste your token from hardcover.app/account/api into Hardcover API token, and select Connect Hardcover.
This also connects your Hardcover Want to Read shelf: SeerrNG checks it daily and requests new books on it, through your normal permissions and approvals.
Lumen was designed and built by Ncbudd and merged into SeerrNG by the SeerrNG maintainers, who also hardened it. SeerrNG builds on Seerr and Overseerr. MIT licensed, see LICENSE.
Screenshots are from a test server; posters and artwork come from TMDB.
About
Lumen: a friendly, request-first front end for SeerrNG. Screenshots, features and a step-by-step install guide.