Feature release. Adds the AutoPlexx Command Center — a single dashboard over the whole stack, and the first application this repo ships itself — plus optional Jellyfin as a drop-in alternative to Plex. No breaking changes; existing deployments upgrade with docker compose pull && docker compose up -d.
One thing to check before you upgrade: the dashboard publishes port 8090 on all interfaces by default and ships no authentication. If you front this stack with an authenticating reverse proxy, set DASHBOARD_BIND=127.0.0.1 in .env — otherwise the published port lets anyone on your LAN reach the dashboard and skip that proxy. Everything else is safe by default.
AutoPlexx Command Center
A unified dashboard at http://localhost:8090 (DASHBOARD_PORT to change it), in three views:
- Command Center — what's streaming now, active downloads with progress and ETA, pending Seerr requests, the next episodes due, and a merged activity feed of recent grabs and imports. Above them, CPU / memory / storage / network gauges from Prometheus and an
N / M uphealth tile. - Launcher — every service in the stack as a tile with live status, linking to its own UI.
- Setup — where each integration stands, and the one concrete step for anything that isn't connected.
No API keys to paste. Each service already writes its own key to a config file — config.xml for Sonarr/Radarr/Prowlarr, config.ini for Tautulli, settings.json for Seerr, config/config.yaml for Bazarr — and the dashboard reads those through read-only /discover mounts. Discovery re-runs while the dashboard is running, so on a clean install each panel lights up by itself within a minute of the service behind it starting. No restart, no wizard.
It does not mount the Docker socket. Container status comes from a docker-socket-proxy sidecar running with CONTAINERS=1 and everything else off, which permits GET /containers/json and denies the rest. :ro on a socket only affects the file node — it does not make the Docker API read-only — so a direct mount would have been a second root-equivalent exposure alongside Portainer's.
The dashboard is read-only: it issues no mutating calls to any service. The Request button deep-links to Seerr rather than posting, so requests go through Seerr's own accounts and approval rules.
Images are published multi-arch (amd64 + arm64) to ghcr.io/joshdev8/autoplexx-dashboard, now pinnable at :v2.1.0. docker-compose.yml declares both image: and build:, so you pull by default and can build from source if you'd rather.
Jellyfin as an optional Plex alternative
docker-compose.yml now carries a fully-formed but commented-out jellyfin: service directly under plex: (host network, :8096, no claim token). To switch, per the new README section:
docker compose rm -sf plex— first, before editing the file. A commented-out service is invisible to compose, soup -dwould leave the old container running and you'd have both media servers indexing one library.- Comment out
plex:, uncommentjellyfin:. docker compose up -d.
Not everything follows you across. Tautulli, Watchlistarr, Kometa and Maintainerr are Plex-API-specific and won't work against Jellyfin — and since the dashboard's now-playing and poster panels read through Tautulli, those are Plex-bound too. Seerr does support a Jellyfin backend, but only after you re-point it in Settings → Media Server; the compose swap alone doesn't move it. Radarr, Sonarr, Prowlarr, Bazarr and Transmission are unaffected. The README carries the full compatibility table.
Fixes
depends_on: plexremoved from Tautulli — compose rejects a project whosedepends_onnames an undefined service, so commenting outplex:made every compose command fail for all 25 services,downincluded. It bought nothing anyway: Plex is host-network and Tautulli is on a bridge network, so compose could neither link nor order them.- Bazarr's API key is read from the file Bazarr actually writes — it's Python, not .NET, and never writes a
config.xml. Treating it as an *arr left the integration permanentlywaitingwhile advising you to start a Bazarr that was already running. Its own key isauth.apikeyspecifically; Bazarr stores anapikeyunder a dozen sections includingradarr:andsonarr:. - A YAML comment is no longer parsed as part of that key —
apikey: abc123 # generated keypreviously authenticated with the comment attached. - Service tiles no longer link to services that aren't installed, and a temporary polling blip no longer briefly re-links them.
- A failed refresh keeps the last good data on screen instead of blanking the panel.
- Every failing integration names its actual fix rather than a generic error — a rejected credential and an unreachable host give different advice.
- LinuxServer images pull from
lscr.ioinstead of Docker Hub, avoiding Docker Hub's anonymous rate limits. - Dependency bumps:
brace-expansion,fast-uri.
New environment variables
Both optional, both defaulted in compose — existing .env files keep working untouched.
DASHBOARD_PORT— host port for the dashboard (default8090).DASHBOARD_BIND— host interface to publish on (default0.0.0.0). See the note at the top.
Full Changelog: v2.0.1...v2.1.0