First login & admin
Your Haven is up and you have an account. This page makes you its keeper (an admin) and walks through the dashboard.
Accounts, briefly
Section titled “Accounts, briefly”There are two ways to sign in, and they coexist:
| Type | Needs | Recovery |
|---|---|---|
| Mnemonic (12-word phrase) | Nothing: no email, no password, no mail server. The account is a key derived from the phrase on your device. Best for getting started. | None. Lose the phrase, lose the account. |
| Email + password | An SMTP mail server (see Backend environment). | Verification and password reset. |
Both are invite-gated: nobody can register without a valid invite code, so your site stays private. See Accounts & the login wall for the full model.
Becoming an admin
Section titled “Becoming an admin”Admin powers (user management, minting invites, forcing metadata re-syncs, health
stats) go to accounts whose email is listed in the backend’s ADMIN_EMAILS
setting. Because admin seeding is by email, the admin account must be an email +
password account.
- Configure SMTP and register an email account; see Backend environment → SMTP.
- Add that email to your backend
.env:ADMIN_EMAILS=you@example.com - Recreate the backend container. Promotion runs at startup and only applies to
accounts that already exist:
Terminal window docker compose up -d - Log in with that account. The Admin entry appears on the site, and
GET /account/mereturns"is_admin": true.
The admin dashboard
Section titled “The admin dashboard”| Tab | What it does |
|---|---|
| Users | List users, promote or demote admins, manage accounts. |
| Security | The security ledger: failed logins, invalid invite codes, rate-limit trips and admin actions, with threat tiles, an activity chart and the top offending IPs (see the security ledger). |
| Lumi | The optional in-app chatbot: the master switch, which provider and model answers, the spend guards, and what she has cost so far. Asleep until you wake her, and each member still needs an individual grant on the Users tab. |
| Invites | Mint shared or single-use invite codes. |
| Metadata | Force a re-sync of the TMDB↔AniList mapping, or trigger a catalogue backfill. |
| Health | Runtime stats, database-pool usage, and Source Health, which only shows your operator-owned sources (Local, Cache, Jellyfin) because the backend itself scrapes nothing. |
| Proxy | If you configured the CORS proxy, a live view of which edge hosts are healthy. |
Inviting your first members
Section titled “Inviting your first members”- A shared code: set
SIGNUP_INVITE_CODEto one or more codes (comma-separated). Reusable; hand it to whoever you trust. - Single-use codes: mint them from the admin dashboard, or run the optional Discord invite bot so a trusted operator can mint them with a chat command. Each works exactly once.
Next steps
Section titled “Next steps”- Make playback real: Adding your own sources.
- Offload video bandwidth: The CORS proxy and The companion extension.
- Go to production: Single host, then Swarm.
