Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
翻訳待ち
A personal wealth tracking application for monitoring savings, investments, assets, debts, and portfolio performance. Built with Go and a web-based frontend, deployable via Docker.
翻訳待ち
Loading the full README.
Read the full README ↗A personal wealth tracking application for monitoring savings, investments, assets, debts, and portfolio performance. Built with Go and a web-based frontend, deployable via Docker.
Website · Live demo (runs in your browser with sample data)
make build # build frontend + Go binary
make serve # build and run the server
make dev # run Go server + frontend dev server concurrently
make test # run tests with race detector
make lint # run linter
make fmt # format Go source files
make web-dev # frontend dev server only
make web-build # build frontend only
make clean # remove build artifacts
The dev server listens on http://localhost:8080 by default.
The demo runs entirely in the browser: an in-memory mock API (web/src/lib/demo/)
replaces the Go backend and serves generated sample data from Jan 2021 to the current month. Nothing is
persisted; changes reset on reload.
make demo # build the demo and serve it at http://localhost:8199
make demo-dev # same, with the Vite dev server and hot reload
npm run build:demo (in web/) outputs a static site to web/dist-demo/ with
relative asset paths, so it can be hosted under any subpath.
The project page lives in site/ (plain HTML, screenshots in site/img/).
On GitHub Pages it is served at the root with the demo under /demo/.
make site # assemble dist-site/ (landing + demo) and serve at http://localhost:8199/
make site-build # assemble dist-site/ only
The Deploy site to GitHub Pages workflow runs make site-build and publishes
dist-site/ to the gh-pages branch on every v* tag or manual run.
The mock mirrors the server handlers; when an endpoint changes in pkg/,
update web/src/lib/demo/mockApi.ts to match. Benchmark index prices in the
demo are synthetic.
make up # docker compose up -d
make down # docker compose down
make logs # docker compose logs -f
The database is persisted on the host in DATA_DIR (default ./data), bind-mounted to /data/wealth.db in the container.
Override compose settings in a .env file next to docker-compose.yml:
DATA_DIR=${HOME}/Library/Application Support/WealthMe
HOST_PORT=8080
DB_KEY=your-secret-encryption-key
Compose publishes the app on 127.0.0.1 only. For machine-specific additions (e.g. an external reverse-proxy network), use a gitignored docker-compose.override.yml; Compose merges it automatically.
All configuration is done via environment variables:
| Variable | Description | Default |
|---|---|---|
DB_PATH | Path to the SQLite database file | <user config dir>/WealthMe/wealth.db (macOS: ~/Library/Application Support, Linux: ~/.config) |
DB_DISPLAY_PATH | DB path shown in Settings → About (host path when containerized) | value of DB_PATH |
DB_KEY | Encryption key for SQLCipher AES-256 | (empty — encryption disabled) |
PORT | HTTP server port | 8080 |
LOG_LEVEL | debug for verbose logs | (info) |
LOG_FORMAT | json for JSON logs | (text) |
:PORT). Run it on localhost, or put it behind a reverse proxy that adds
authentication (and TLS) before exposing it to a network.The database is encrypted at rest using SQLCipher (AES-256) when DB_KEY is set.
DB_KEY with Docker ComposeCreate a .env file next to docker-compose.yml:
DB_KEY=your-secret-encryption-key
Start the app:
docker compose up -d
Docker Compose automatically reads .env and injects DB_KEY into the container.
Important: Add
.envto your.gitignoreto avoid committing secrets.
openssl rand -base64 32
Use the output as your DB_KEY value.
If you set DB_KEY on a database that was previously unencrypted, the app automatically migrates it to encrypted format on startup. The original file is kept as a .bak backup.
This is the beginning of the README. Read the rest at the original. Read the full README ↗