- Python 69.6%
- TypeScript 28.1%
- JavaScript 1.4%
- Shell 0.3%
- Dockerfile 0.2%
- Other 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .devcontainer | ||
| .github | ||
| backend | ||
| braid | ||
| docs | ||
| frontend | ||
| openspec | ||
| ops/seerr-routing | ||
| scripts | ||
| .dockerignore | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| docker-compose.seerr-network.yml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| justfile | ||
| LICENSE | ||
| README.md | ||
| SECURITY.md | ||
Tasterr
Self-hosted discovery for TMDB and Seerr, with a learned taste profile for every household member.
Tasterr is a self-hosted, Netflix-style discovery front end for a household media stack. It combines the TMDB catalog with Seerr identity, library state, and requests, then learns a separate taste profile for each signed-in user.
The current source supports Plex or local Seerr sign-in, composed discovery rails, search, title details, availability badges, requests attributed to the signed-in member, per-user taste signals and recommendations, and admin-managed regions, services, rails, and appearance. Plex-backed sessions also learn from bounded watch history, offer Continue Watching, and can request an ephemeral household blend; low-correlation picks keep discovery broad. These features need no Plex URL or token configuration: they reuse the encrypted token created by Plex sign-in and disappear cleanly for local sessions or when Plex is unavailable.
Tasterr intentionally does not bundle Seerr, start or control playback, persist raw history or Plex progress, persist household groups, or run more than one process.
Screenshots
Quick start with an existing Seerr
Prerequisites are Docker with Compose, a running Seerr instance, a TMDB v3 API key, and a Seerr API key. A shared Docker network is not required when Seerr is reachable through a routable LAN hostname or address.
-
Copy
.env.exampleto.env. -
Set
SEERR_INTERNAL_URLto a URL reachable from inside the Tasterr container, such ashttp://seerr.home.arpa:5055. SetSEERR_EXTERNAL_URLto the URL household browsers use for Seerr. -
Fill
TMDB_API_KEY,SEERR_API_KEY, and a randomly generatedTASTERR_SECRET_KEY. -
Start and verify Tasterr:
docker compose up -d --build docker compose ps curl --fail http://127.0.0.1:8000/api/v1/health
Open http://127.0.0.1:8000, sign in with an existing Seerr account, and use the
Settings screen as a Seerr administrator to select the region, streaming services,
rails, theme, and accent. SQLite migrations run automatically on first boot.
Compose publishes Tasterr on host loopback by default. For intentional direct LAN
access, set TASTERR_HTTP_PORT=8000 (or a specific LAN IP and port) in .env and
keep the host firewall closed to the public internet. Internet-facing deployments
must use a TLS reverse proxy or tunnel; see the configuration guide.
When Seerr runs on this same Docker host in another Compose project, an optional external-network override is available; see the configuration guide. It is not used for Seerr on another host.
Run the published image
To deploy a release without cloning the repository, save this as compose.yaml
and create .env from .env.example, using the five configuration
values listed above. Pin the desired version from the
Tasterr GHCR package:
services:
tasterr:
image: ghcr.io/zacharyarthur/tasterr:2.3.1
restart: unless-stopped
ports:
- "127.0.0.1:8000:8000"
env_file:
- .env
volumes:
- tasterr-data:/data
volumes:
tasterr-data:
Tasterr itself reads ordinary process environment variables and does not require a
.env file. The example above asks Compose to load that file. If a service manager
or container platform injects variables directly, set the same names on the Tasterr
process/container and omit env_file. To use exported host variables with Compose,
replace the env_file block with this explicit mapping:
environment:
- TMDB_API_KEY
- SEERR_INTERNAL_URL
- SEERR_EXTERNAL_URL
- SEERR_API_KEY
- TASTERR_SECRET_KEY
Host variables are not passed into a Compose service automatically. Add any optional variables from the configuration table to the mapping when needed.
docker compose pull
docker compose up -d
curl --fail http://127.0.0.1:8000/api/v1/health
Keep the loopback bind when using a reverse proxy or tunnel. Replace it with a specific LAN bind only when direct household-network access is intentional.
Living documentation
- Configuration and operations: every variable, proxy/TLS, first boot, degraded modes, backups, upgrades, rollback, and troubleshooting.
- Architecture: process and module boundaries, auth/request/ taste flows, storage, caches, and generated API types.
- Security policy: supported releases and private vulnerability reporting. The developer threat model lives in docs/SECURITY.md.
- Contributing guide: issue reporting, development setup, change workflow, and pull request expectations.
- Code of Conduct: expected behavior and enforcement.
- Release procedure: deterministic checks, audits, live contracts, image verification, and rollback.
The living OpenSpec specifications under openspec/specs/ define current behavior.
The documents under docs/PRD.md and docs/SPEC.md preserve the founding rationale
and are intentionally frozen.
License
Tasterr is licensed under the GNU Affero General Public License v3.0 only.

