--- name: manage-accounts description: Use when adding, removing, or changing dashboard login accounts for Arr Summary (Media Centre), or explaining the difference between its multi-user and legacy single-shared-password login modes. --- Two modes, chosen by whether `settings.json` holds a non-empty `users` map: - **Multi-user** (once any account exists): username + password, each password stored as a salted pbkdf2 hash under `users` in `settings.json`. `verify_credentials()` is the only entry point; `load_users()` re-reads the file per check, so adding a user or changing a password is live immediately in every gunicorn worker — no restart, unlike the API keys. - **Legacy single shared password** (no accounts yet): the original `LOGIN_PASSWORD` / `settings.json.login_password` path, username ignored. This fallback exists so deploying multi-user support can't lock an existing install out; the login page hides the username field entirely until accounts exist. Manage accounts with `manage_users.py`, which prompts for passwords (never echoed, never a CLI argument, so they stay out of shell history) and only ever writes hashes: ```bash docker exec -it arr-summary python3 manage_users.py list docker exec -it arr-summary python3 manage_users.py add docker exec -it arr-summary python3 manage_users.py passwd docker exec -it arr-summary python3 manage_users.py remove ``` **Adding the first account switches the whole dashboard to per-user logins and the shared password stops working** — verify you can sign in as that user before closing the shell. `remove` refuses to delete the last account for the same reason. Users live in `settings.json` rather than an env var deliberately: a pbkdf2 hash contains `$`, which docker compose interpolates when reading `.env`. `PASSWORD_HASH_METHOD` is pinned to pbkdf2 rather than Werkzeug's default scrypt, which needs a hashlib built against OpenSSL and is absent on the macOS system Python.