Skip to content

Seanime -- Setup

Anime auto-downloader and AniList tracker. Browse seasonal anime, create download rules, and auto-grab new episodes via qBittorrent. Runs on a dedicated Debian LXC (134) with PocketID SSO at the proxy level. Downloaded anime flows into Jellyfin via Shoko/Shokofin.

  • GitHub: https://github.com/5rahim/seanime
  • Docker image: https://hub.docker.com/r/ju1js/seanime (community)
  • Docs: https://seanime.app/docs

Infrastructure

Host LXC ID Internal External CPU RAM Disk
Debian LXC 134 192.168.1.134:43211 https://seanime.eva-00.network 2 cores 2 GiB 4 GiB

How It Works

Seanime is an AniList-first anime manager. The workflow:

  1. AniList OAuth -- Log in with your AniList account. Seanime syncs your watching list and seasonal calendar.
  2. Browse seasonal anime -- See what's airing this season via the built-in calendar.
  3. Create auto-download rules -- Select shows, configure quality/release group filters. Rules can be batch-created.
  4. Auto-download -- Seanime polls torrent sources (Nyaa) every 20 min, matches against rules, and sends to qBittorrent. With library.autoScan: true Seanime's own UI also re-reads /downloads/seasonal so each show's page reflects the latest downloaded episode without a manual rescan.
  5. Media flow -- Downloaded files land in /dlbox/normal/seasonal on LXC 110 (seedbox). Shoko indexes them and emits a SignalR event, Shokofin creates VFS entries in response, and Jellyfin's RealtimeMonitor on the Seasonal library picks up the new symlink. End-to-end latency is seconds, not the next scheduled scan.
AniList watchlist --> Seanime auto-downloader --> qBit-normal (LXC 110, seasonal category)
  --> /dlbox/normal/seasonal --> Shoko WatchForNewFiles indexes
  --> Shoko SignalR --> Shokofin (SignalR_AutoConnectEnabled + RefreshEnabled) regenerates VFS
  --> Jellyfin RealtimeMonitor --> "Seasonal" library

Required settings for the pipeline to be seamless:

Layer Setting Value
Seanime autoDownloader.downloadAutomatically true (else torrents pile up in the queue)
Seanime library.autoScan true (else the show page lags behind disk)
Shoko Import folder WatchForNewFiles true for /seasonal (default)
Shokofin SignalR_AutoConnectEnabled true (else new files only show after a manual library scan)
Shokofin SignalR_RefreshEnabled true
Shokofin per-library IsFileEventsEnabled true (else SignalR file event doesn't regenerate VFS symlink)
Shokofin per-library IsRefreshEventsEnabled true (else Shokofin regenerates the VFS but doesn't tell Jellyfin to scan it)
Jellyfin Library EnableRealtimeMonitor true (default for libraries created via the playbook)

See services/jellyfin/setup.md "Realtime anime pipeline" for the deeper explanation of each setting and services/jellyfin/runbook.md for step-by-step troubleshooting when episodes don't appear.

Authentication

Seanime has no native OIDC/SSO. External access is gated entirely at the proxy layer:

  1. Proxy level (PocketID): oauth2-proxy on LXC 119 gates external access. Only authenticated PocketID users can reach Seanime. Caddy uses forward_auth to check auth before proxying.
  2. App level (password): Intentionally empty. The playbook keeps password = '' in config.toml and the API stops requiring the X-Seanime-Token header in that state. The Vault secret/seanime path was removed. With no password set, Seanime's local-security middleware rejects API calls unless the Host/Origin is loopback, private IP, or in Server.AccessAllowlist — the playbook seeds the allowlist with seanime.eva-00.network plus the seanime and oauth2-proxy LXC IPs (192.168.1.134, 192.168.1.119).
  3. AniList OAuth: Required for the app to function. Users authenticate via AniList's OAuth flow in the browser.

The Caddy config passes /oauth2/* requests to the proxy and uses forward_auth for everything else.

qBittorrent Integration

Seanime connects to qbittorrent-normal on LXC 110 (the seedbox instance behind ProtonVPN/Gluetun).

Configure in the Seanime web UI under torrent client settings:

Setting Value
Client qBittorrent
Host 192.168.1.110
Port 8080 (qBit WebUI port inside Gluetun network)
Username From Vault: secret/gluetun/protonvpn-normal
Password From Vault: secret/gluetun/protonvpn-normal

Downloads are saved to /data/normal/seasonal on LXC 110, which maps to /dlbox/normal/seasonal on LXC 134 (Seanime) and LXC 116 (Shoko) via bind mounts.

Observability

Logs

Container logs are collected via Alloy Docker discovery and shipped to Loki.

Query Purpose
{container_name="seanime"} All container output
{container_name="seanime"} \|= "error" Errors only
{container_name="seanime"} \|= "download" Download activity
{job="seanime"} All containers on this LXC

Access: Grafana > Explore > Loki > Enter query

IaC

Artifact Path
Playbook ansible/playbooks/seanime.yml
Workflow .forgejo/workflows/seanime.yml
Docker Compose services/seanime/docker-compose.yml
Caddy entry services/caddy/Caddyfile > seanime.eva-00.network
OAuth2 proxy services/external-proxies/docker-compose.yml > oauth2-proxy-seanime
Glance entry services/glance/glance.yml > Media section + monitor

The playbook manages the full lifecycle:

  1. Provisions LXC 134 on Proxmox (via create-lxc.yml)
  2. Installs Docker
  3. Deploys Seanime container
  4. Deploys Alloy for log collection

Secrets

Vault Path Key Purpose
secret/external-oauth2-proxies seanime_client_id PocketID OIDC client ID
secret/external-oauth2-proxies seanime_client_secret PocketID OIDC client secret
secret/external-oauth2-proxies seanime_cookie_secret oauth2-proxy cookie encryption (16/24/32 raw chars)

Backup

  • PBS: LXC 134 included in weekly non-critical backup job (Monday 4am)
  • Data: Config stored at /opt/seanime/config on the LXC rootfs (backed up by PBS)
  • Media: Downloaded anime lives on LXC 110's /data/normal/seasonal -- backed up with the seedbox LXC, not this one
  • AniList: Watch history synced to AniList cloud, no local backup needed

First-Run Setup

After deployment, complete the initial setup in the web UI:

  1. Navigate to https://seanime.eva-00.network
  2. Authenticate via PocketID (proxy level — that's the only password)
  3. Log in with AniList OAuth (required)
  4. Set library path to /data/seasonal
  5. Configure qBittorrent connection (see table above)
  6. Browse seasonal anime and create auto-download rules