Skip to content

First login & admin

Your Haven is up and you’ve made an account. Now let’s make you its keeper — an admin — and look around.

There are two ways to sign in, and they coexist:

  • Mnemonic (12-word phrase). No email, no password, no mail server needed. Your account is a key derived from the phrase, entirely on your device. Best for getting started. Lose the phrase, lose the account — there is no reset.
  • Email + password. Familiar, and supports verification + password reset — but it needs an SMTP mail server configured (see Backend environment).

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.

Admin powers (user management, minting invites, forcing metadata re-syncs, health stats) are granted 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.

  1. Configure SMTP and register an email account — see Backend environment → SMTP.
  2. Add that email to your backend .env:
    ADMIN_EMAILS=you@example.com
  3. Recreate the backend container so it picks up the change:
    Terminal window
    docker compose up -d
  4. Log in with that account — you’re now an admin. The Admin entry appears in the site, and GET /account/me returns "is_admin": true.

Once you’re an admin, the dashboard gives you:

  • Users — list, promote/demote admins, manage accounts.
  • Security — the gatekeeper’s 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 every member still needs an individual grant on the Users tab.
  • Invites — mint shared or single-use invite codes to let new members in.
  • Metadata — force a re-sync of the TMDB↔AniList mapping, or trigger a catalogue backfill.
  • Health — runtime stats, database-pool usage, and the Source Health view (which only shows your operator-owned sources — Local / Cache / Jellyfin — since the backend itself scrapes nothing).
  • Proxy — if you’ve configured the CORS proxy, a live view of which edge hosts are healthy.

Two ways to let people in:

  • A shared code — set SIGNUP_INVITE_CODE to 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 one trusted operator can mint them with a chat command. Each works exactly once.