Docs

Documentation

Written for someone who tried the demo and wants their own copy running. Setup first, then a tour of the screens, then where things live in the code.

What it is

A double-entry ledger for your own money, with a dashboard over it. Transactions arrive from your bank through Akahu or by hand, get sorted into accounts by rules you control, and post as balanced journal entries in Postgres. Every figure on screen traces back to those entries. The demo is the same application running on sample transactions.

Setting it up

You need Docker and the Supabase CLI. From the repository root, supabase start brings up Postgres, Auth and Studio locally, and supabase db reset applies the migrations. Then cd frontend, pnpm install, and pnpm dev serves it on localhost:3000. The frontend defaults point at the local stack, so there is nothing to configure for a first run. Full steps, including the proxy workaround, are in the README.

A one-file install is not ready yet

Getting it running means a terminal, a container runtime and about ten minutes. A packaged version — most likely a container image first — is the next piece of work. Until it lands, the setup above is the only route, and it is a real barrier rather than a formality.

First run

  • Create your account at /signup. On your own instance you are the only user, so sign-up is open — nobody else is pointed at your database.
  • Name your workspace in onboarding. That's the tenant every row is scoped to.
  • Then pick one: load the sample transactions to see the whole thing working, type in a balance by hand, or connect a bank.

The screens

  • Home — one sentence on how you're doing, the few numbers behind it, and anything that needs you.
  • Accounts — every place money sits, synced and hand-entered in one list, plus the bank connection.
  • Activity — what happened, and the short queue of transactions the rules couldn't categorise.
  • Spending and Net worth — where the money went, and whether the total is moving.
  • Pinboard — a grid you fill with whatever cards you want to keep an eye on.
  • Settings is your account. Workshop holds the ledger's machinery: sorting rules, account mappings, the sync log.

Connecting a bank

Live sync uses Akahu, New Zealand's open-finance provider, with your own app credentials — there is no shared key. Access is read-only, you choose which accounts to share, and you can revoke it from Akahu at any time. Your enduring token is stored encrypted in Supabase Vault and never returned to the browser. Without Akahu credentials everything else still works; the app just says live sync isn't enabled.

Sorting, and the things it can't place

Each transaction is matched against your sorting rules in priority order, and the first rule that fits wins. Anything nothing matches goes to a short list on Activity for you to categorise, rather than being guessed at. Correcting one posts a real correction entry, so the history stays honest.

Getting your data out

The full history exports as hledger-compatible plain-text journals, so it stays readable in other tools. It's your database: back it up, move it, or drop it without asking anyone.

Where things live

  • frontend/ — TanStack Start (React 19 + Nitro). Routes in src/routes, ledger reads and writes in src/server, dashboard cards in src/components/widgets.
  • supabase/migrations/ — schema, row-level security policies and the security-definer functions. The source of truth for the data model.
  • frontend/CLAUDE.md — working notes on how the frontend fits together, kept current for whoever edits it next.
Open the demo