Self-hosted, open-source personal accounting for New Zealand: keep a double-entry ledger, reconcile against your bank, produce standard reports, and prepare your NZ tax return (IR3 + GST101A) — locally, no cloud, no subscription.
Status: Phase 0 (walking skeleton). A double-entry ledger core, manual journal entries, and a trial balance. See docs/PRD.md for the full product plan, the verified NZ tax/GST research, and the roadmap.
OpenPenny runs as a native desktop app (a real window, not a browser tab) backed by the same Go
engine. There are two builds from one codebase, selected by a desktop build tag:
- Desktop app (
-tags desktop, Wails) — the OS-native window, the way you'd normally run it. - Headless server (default
go build) — serves the UI in your browser; fully CGO-free and cross-compiles to every OS from one runner. Good for Docker / CLI / power users.
make run-desktop # native window (needs CGO + a webview: Xcode CLT / WebView2 / WebKitGTK)
make run # headless: serve on http://127.0.0.1:7777 and open your browser
make build-mac-app # build build/bin/OpenPenny.app (double-clickable)Your data is a single SQLite file under your per-user config dir (…/openpenny/openpenny.db) —
back it up by copying that one file. Headless flags: --addr, --db, --open=false, --version.
Requires Go 1.25+. The HTML templates are compiled with templ,
pinned as a go tool dependency so there's nothing extra to install:
go tool templ generate # regenerate *_templ.go after editing any *.templ
go test ./...
go build ./cmd/openpenny- CGO-free default build — pure-Go SQLite (
ncruces/go-sqlite3) so the headless build cross-compiles every OS from one runner. The native desktop build adds CGO (Wails) but keeps it isolated behind thedesktoptag, so the default build never pulls it. - Money is integer cents — never floats.
- Double-entry — every entry's postings sum to zero, enforced at write; reports are pure aggregation over the ledger.
- Server-rendered UI (
templ); richer interactivity (htmx/Alpine) arrives with bank reconciliation.