Skip to content

Your first runBeta

Open Net Worth splits first-time setup into two jobs. First run configures the machine — three quick screens. Lucius then onboards the book — a conversation where he asks about your accounts, income, and holdings, and builds them for you. First run is quick; the conversation with Lucius afterward is the real setup.

Screen 1 — Welcome

Pick the currency you think in. Every total and report displays in it; accounts held in other currencies still convert automatically. The default is guessed from your browser locale — pick anything. This is your base currency; you can change it later in Settings, though changing it is a bigger decision than it sounds (that page explains why).

Screen 2 — Connect Lucius

Give the app a way to talk to an AI model:

  • Existing CLI login — if Open Net Worth detects a Claude Code CLI or Codex login already on your machine, one click (“Use this”) reuses it. No API key needed.
  • API key — pick a provider (Anthropic, OpenAI, or a local Ollama server) and paste in a key. Stored server-side, never shown again.

Skip this screen (“Not now”) and chat, reading PDF statements, auto-categorization, automations, and memory stay off — but accounts, budgeting, investments, and CSV/OFX/QIF import still work. See Connecting an AI provider for the full provider list and what it costs.

Screen 3 — Set a password?

Only matters if you’ll open the app from a different device than the one it runs on — on the machine itself you’re already trusted. Set one here, or skip and add it later in Settings → Security.

Docker

The trust check above needs the request to look like 127.0.0.1. Docker’s bridge networking breaks that — every request reaching the container, including your own browser on the same machine, arrives looking like the Docker gateway instead. The app can’t tell that apart from another LAN device, so it correctly refuses to trust it. Skip screen 3 under Docker and you can lock yourself out entirely: the app looks fine, then every action fails, because no browser request counts as “the operator” until a password exists.

Set a password before your first docker compose up and this never comes up: copy .env.example to .env, set AUTH_PASSWORD=, uncomment the env_file block in docker-compose.yml, then start the container. It seeds your password on first boot, so the first screen you see is the normal login — log in and first run continues as described above (screen 3 is already satisfied).

Already ran docker compose up without setting one? You’re not locked out — the app logs a one-time bootstrap token on startup for exactly this case:

Terminal window
docker compose logs app | grep "Temporary API token"

Use it to set a password directly — a bearer token, unlike a browser request, is trusted regardless of how it arrives:

Terminal window
curl -X POST http://localhost:8080/api/auth/change-password \
-H "Authorization: Bearer <token from the log line above>" \
-H "Content-Type: application/json" \
-d '{"new_password": "<your new password>"}'

Reload the app and log in with the password you just set.

The published port is bound to your machine’s loopback only by default (127.0.0.1:8080:8080 in docker-compose.yml) — none of this is reachable from your LAN unless you deliberately widen that binding (see the comment beside it in that file for what that costs). Full seed-variable list: Environment variables.

What happens next: Lucius onboards the book

Finishing (or skipping) screen 3 drops you into a chat with Lucius. An empty book means he leads with setup instead of waiting for you to ask something:

  1. Asks your name and what to call you, and remembers it.
  2. Double-checks the base currency you picked looks right.
  3. Asks where your money currently is — a linked provider, a statement file (CSV/OFX/QIF/XLSX/PDF and a few bank-statement formats), a backup you’re restoring, or just describing your accounts — and creates each account as you describe it.
  4. If you hold investments (skippable): looks up the instrument and proposes the position for your confirmation before anything is written.
  5. Asks your approximate monthly income to prime the budgeting side of the app.

Not a rigid script — ask him something unrelated at any point and he’ll answer that first. See Adding your first account to do this by hand in the UI instead; both paths write to the same data.

If you skip Lucius entirely

All of it is optional — close the chat panel and add accounts and transactions by hand from the Accounts tab. See Adding your first account and transactions.

Status note

First run is new. The mechanics here (the three screens, what Lucius asks) are implemented and tested, but haven’t been through a full end-to-end sign-off yet — if the screen doesn’t match this page, the screen is correct and this page needs an update.