A self-hosted, Netflix-style discovery front-end for your media stack.
▶️ Live demo →A keyless, read-only tour running on static fixtures - no TMDB key, no database, no requests.
Browserr turns "what can I watch?" into a cinematic browse experience - rotating hero billboards, genre and per-service rails, and "Because you watched…" recommendations across every streaming service available in your region. When you find something you don't have yet, it hands off to Seerr for live "what's in my library" status and one-click requests.
The name follows the *arr/Seerr convention: a browser for everything you can stream.
Try the live demo, or regenerate these locally with
npm run build:demo && npm run screenshots.
| Title detail | Settings |
|---|---|
![]() |
![]() |
- Netflix-style home - a full-bleed rotating hero, lazy horizontally-scrolling rails, and a rich detail view with trailer, cast, seasons, and where-to-watch.
- Region & service aware - only ever shows streaming services TMDB lists for your region. Change region and the whole catalog and service list re-derive.
- Seerr integration - every title shows live library availability; request via redirect (open Seerr) or proxy (submit on your behalf).
- Self-learning recommendations - a taste profile that seeds from your library and shifts as you browse, with "Because you watched X" rails and a "Why am I seeing this?" explainer.
- Configure however you like - env vars seed defaults; the in-app Settings screen overrides them. No secrets or internal URLs ever reach the browser.
- One Docker image - drops into an existing
*arr/Seerr stack viadocker-compose. - Accessible & responsive - keyboard/remote navigable, reduced-motion honored, dark-first theming. Works desktop -> tablet -> mobile -> 10-foot TV.
cp .env.example .env
# edit .env: add TMDB_API_KEY, SEERR_API_KEY, SEERR_EXTERNAL_URL, DEFAULT_REGION…
docker compose up -dOpen http://localhost:3000. The bundled docker-compose.yml also starts Seerr and wires
Browserr to it on the Docker network (SEERR_INTERNAL_URL=http://seerr:5055).
Prefer the prebuilt multi-arch image over building locally:
# docker-compose.yml
services:
browserr:
image: ghcr.io/janpuc/browserr:latest # or pin a release, e.g. :1.0.0 (:edge = latest main)You only need a TMDB API key to start browsing. Seerr is optional - without it the catalog still browses and availability badges show "Unknown".
npm install
cp .env.example .env # at minimum set TMDB_API_KEY
npm run dev # http://localhost:3000Precedence (lowest -> highest): built-in defaults -> environment variables ->
GUI settings. The in-app Settings screen edits connections, region, services, feature
toggles, and appearance; set LOCK_CONFIG=true to freeze everything to env and make the GUI
read-only.
⚠️ Seerr uses a separate internal URL for server-to-server calls and external URL for browser redirects. The internal URL never reaches the client.
The full environment-variable reference lives in docs/CONFIGURATION.md.
- Configuration - every env var, the Seerr internal/external split, and how region & service selection works.
- Architecture - the stack, source layout, BFF API, recommendations engine, and security model.
- Releasing - the hands-off release pipeline and image tags.
- Contributing - local setup, branch model, and the test gate.
PRs welcome! The gate is npm run typecheck + npm test + npm run build. See
CONTRIBUTING.md. Please report security issues privately via a
security advisory.
MIT © Jan Puciłowski.


