-
Notifications
You must be signed in to change notification settings - Fork 1
FAQ
Short answers to the most common questions. For anything not here, see Troubleshooting or open an issue.
A self-hosted media-asset manager for a Plex + Radarr/Sonarr/Lidarr stack. It bundles a React web UI and a FastAPI backend that orchestrates scheduled modules against your libraries, poster trees, and cloud drives. See Home.
Same module set, different direction. CHUB is a fork of DAPS with a rebranded identity (indigo-led UI redesign, new logos, Manrope/Inter typography) and a dedicated audit pass that added SSE, cancellation, audit trails, security hardening, activity digests, and batch operations. See Credits for the full list of what CHUB adds on top of DAPS.
No. CHUB is a clean break — no data migration, no git history carried over, no compatibility shims. Pull the ghcr.io/chodeus/chub:latest image into a fresh config directory and reconfigure from scratch. Your DAPS install keeps working on its own image.
Not directly. CHUB is built for a private network — a LAN or a VPN. It has built-in auth (bcrypt + JWT), a login rate limiter, and SSRF protection, but no WAF, IP allowlist, or DDoS mitigation. If you need remote access, put it behind a reverse proxy with TLS and ideally a second layer of auth (Authelia, Authentik, etc.). See SECURITY.
Stop CHUB, delete the auth: block from config.yml, restart. First-run form reappears. There is no self-service password reset from the UI — this is intentional for a single-user app.
Yes. Use nestarr for moving items between split libraries based on ARR path mappings, and configure your Plex libraries separately in instances.plex. The poster_renamerr module also accepts a library_names scoping list per Plex instance.
Partially. upgradinatorr has full Lidarr support (album search, artist grouping, wanted / missing / cutoff modes). There are no dedicated Lidarr UI pages — music library browsing / editing is covered by Lidarr itself. If you want a Lidarr-specific workflow built into CHUB, open an issue describing what you'd want to see.
From the UI: Dashboard → New run, pick the module, optionally override any one-shot knobs, Run.
From the API: POST /api/modules/{name}/execute.
From the UI: Settings → Jobs → click the running job → Cancel.
From the API: DELETE /api/modules/{name}/execution/{job_id}.
Cancellation is cooperative — modules have to check is_cancelled() in their loop. Currently wired: upgradinatorr, jduparr, nohl, sync_gdrive, unmatched_assets. Others will hang until their current step finishes; restart the container if you need to stop them immediately.
Everything lives in ${CONFIG_DIR} (default /config in Docker):
-
config.yml— YAML config -
chub.db— SQLite database (users, jobs, media cache, edit history, health snapshots, poster cache) -
logs/— per-module log files -
backups/— zips fromPOST /api/system/backup
Poster and media trees live on the volumes you mount separately.
Two options:
-
API:
POST /api/system/backupreturns a zip ofconfig.yml+chub.db. Also written to$CONFIG_DIR/backups/. - Filesystem: stop the container (for SQLite consistency), tar the config directory, restart. See Deployment → Backup.
docker compose pull
docker compose up -dSchema changes are additive — CHUB runs add_missing_columns on startup so upgrades don't require migrations.
Yes. Multi-instance support is optional — configure only the instances you actually run.
No dedicated API-key system. Use the JWT from POST /api/auth/login as a long-lived token; set auth.token_expiry_hours in config.yml to something long-lived for automation. For webhooks, use general.webhook_secret instead.
No. They solve different problems — Kometa manages Plex metadata/collections, CHUB manages poster file trees + media asset chores. Many users run both. poster_renamerr is specifically designed to consume Kometa's asset output.
Yes — just don't configure them and don't schedule them. Module pages in the UI always render (the sidebar has one per module), but an unconfigured module simply won't do anything when triggered.
The image runs as dockeruser (UID/GID set via PUID/PGID env vars, defaults 100 / 99). Mount paths must be writable by that UID — Unraid's defaults (99:100) match; most Linux setups want 1000:1000.
- Open an issue first for anything non-trivial — alignment on scope saves rework.
- Fork, branch, PR against
main. - Run the linters (
rufffor Python,eslintfor JS) + build the frontend (npm run build) before pushing. - Keep PRs focused; one feature per PR.
Patch-level fixes can skip the issue step.