Rekenraam is a self-hosted, single-user personal finance app. It combines a versioned double-entry ledger with accounts, imports, reconciliation, reports, budgets, recurring transactions, investments, and backups. The Go backend serves a static SvelteKit frontend from one binary; SQLite is the primary database. Docker Compose runs the same app shape.
The app is still a pre-release candidate. Investment buy, sell, dividend, reinvestment, and write-off workflows exist. Investment-native correction, in-kind transfers, basis actions, and named short sales are still being built; see the R16 plan and the feature ledger for the exact boundary.
Use Go 1.27, Node 24, and the pinned pnpm version in package.json.
From the repository root:
pnpm install
pnpm devOpen http://localhost:1888. The frontend development server proxies /api
to the backend on 127.0.0.1:16888. The development server binds to localhost;
for a browser on another machine, use the SSH forward described in the
developer workflow.
The unused v0.1 candidate schema has been redesigned for R16. If an older disposable development database reports a migration checksum mismatch, follow the reset instructions. Do not apply that reset to a database containing data you need to keep.
./scripts/test-backend.sh # Go formatting, vet, race tests (15m/package)
./scripts/test-frontend.sh # generated API types, Svelte checks, unit tests
./scripts/test-e2e-smoke.sh # integrated browser smoke suite
pnpm build # static frontend + embedded Go binaryThe build writes dist/rekenraam. Use ./scripts/test-e2e.sh for the full
browser suite and pnpm test:release-preflight for the serial release journeys.
Commands, test scope, and environment settings are in the
developer workflow.
Set a random SETUP_TOKEN of at least 32 characters before first production
startup. Set a durable
REKENRAAM_SECRET_KEY before using online connections or enrolling in two-factor
authentication; keep it outside the SQLite backup directory. The binary listens
on port 16888 by default. The provided Compose example binds only to
127.0.0.1:16888:
docker compose -f deploy/docker/compose.yaml up --buildFor LAN or internet access, put the app behind HTTPS and follow the deployment security guide. Before exposing real financial data to the public internet, enrol the owner in two-factor authentication. Use the upgrade and restore guide before changing a populated installation. Local password recovery commands are in the developer workflow.
| Path | Purpose |
|---|---|
backend/ |
Go server, application services, SQLite migrations, tests |
frontend/ |
SvelteKit app compiled for Go embedding |
api/ |
OpenAPI contract and Bruno requests |
e2e/ |
Playwright browser journeys |
deploy/ |
Docker build and Compose example |
scripts/ |
Development, validation, and build commands |
docs/ |
Product rules, decisions, plans, and current status |
Start with the documentation map. The roadmap gives the work order, todo lists immediate next steps, GitHub Issues tracks open work, backlog maps legacy IDs to those issues, and implemented records what ships. Product and architecture decisions live in the requirements, conventions, and ADRs.
No legacy databases exist. The pre-release schema is consolidated into
0001_initial_schema.sql, including source revisions, authoritative journal
links, separate immutable lot identity/mutable lot state, and immutable disposal
proceeds portions tied to clearing postings. Projected basis has explicit
known/unknown knowledge and nullable unknown amounts. The checksum and seeded equivalence
tests are updated together; see the migration workflow.