I got tired of handing my bank credentials to hosted finance apps.
Finary, Monarch, Maybe — great dashboards, but your most sensitive data lives on someone else's server, export is painful, and bank-file import is an afterthought. Desktop tools like GnuCash, HomeBank, and Skrooge keep data local, but feel stuck in 2005.
So I built Open-Finance: a local-first personal finance manager. All your accounts, assets, liabilities, and transactions in one secured dashboard — that you self-host.
Stack: Java 21 + Spring Boot + SQLite (WAL) + Flyway on the backend, React 19 + TypeScript + Vite + Tailwind 4 + shadcn/ui on the frontend. Licensed Elastic v2 — free to self-host and modify.
Repo: https://github.com/openfinance-app/open-finance
What it does
Open the dashboard and you immediately know where you stand: net worth, cash flow, budget health, portfolio movement — then act in seconds.
- Dashboard: customizable card grid (layout persisted in localStorage), privacy eye-toggle to mask amounts
- Accounts & institutions: multi-currency, multi-institution, base + secondary currency conversion
- Transactions: income / expense / transfer, splits, tags, attachments, global search, auto-categorization rules, recurring transactions
- Assets & market data: portfolio tracking with Yahoo Finance + ECB rates refresh
- Liabilities & real estate: amortization schedules, property management — things hosted PFAs charge extra for
- Budgets: monthly budgets with alerts and progress
- Import that actually works: QIF / OFX / QFX / CSV / JSON wizard with duplicate detection and rule application
- Undo / redo + full audit history: every operation is reversible, with backup / restore
- Planners: FIRE, compound interest, loan, buy-vs-rent, early payoff calculators
- Financial news + AI assistant (opt-in): RSS news feed, floating chat + generated insights powered locally by Ollama via LangChain4j — no data leaves your box
- Bilingual EN/FR: every string exists in both locales, enforced by tests
How it compares to the usual suspects:
Full dashboards, QIF/OFX import, real-estate mgmt, file attachments, undo/redo, financial planning, multi-currency, local AI, and client-side encryption — while staying FOSS and self-hosted.
Full user guide: docs/wiki/HOME.md in the repo.
Privacy is the feature
- Self-host with Docker — SQLite file you can back up, no vendor DB.
- JWT auth + session-scoped encryption key (
X-Encryption-Keyheader fromsessionStorage). Server never sees plaintext amounts. - AI is 100% optional via
docker compose --profile ai(Ollama ~4.7GB + SearXNG). No AI calls unless you enable it.
Run it in 60 seconds
git clone https://github.com/openfinance-app/open-finance.git
cd open-finance
cp .env.example .env
# Generate JWT secret (min 32 chars)
JWT=$(openssl rand -hex 32) && sed -i.bak "s|^JWT_SECRET=.*|JWT_SECRET=${JWT}|" .env && rm .env.bak
docker compose up -d
# Open http://localhost:8080
# demo user: demo / demo123 or register a new account
With local AI:
docker compose --profile ai up -d
docker compose --profile ai exec ollama ollama pull qwen2.5:0.5b
Dev setup (DevContainer recommended — Java 21, Maven, Node 20, SQLite preconfigured):
mvn spring-boot:run # backend :8080, swagger at /swagger-ui.html
cd openfinance-ui && npm install && npm run dev # frontend :3000
API is straightforward REST:
curl -X POST http://localhost:8080/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"alice","email":"alice@example.com","password":"MyP@ss1!","masterPassword":"MasterP@ss1!"}'
GET /api/v1/dashboard, /api/v1/accounts, /api/v1/transactions?accountId=..., /api/v1/assets, /api/v1/budgets, /api/v1/reports/net-worth, POST /api/v1/import/upload, POST /api/v1/ai/chat
Why this stack?
-
SQLite WAL + Flyway: zero-ops for self-hosters,
busy_timeout=10000for writer contention, migrations run on startup. Postgres driver included for cloud deployments. -
Spring Boot: interfaces + impls, constructor injection, MapStruct,
BigDecimaleverywhere for money,@ControllerAdviceerror DTOs, Bucket4j + Caffeine rate-limit/cache. -
React 19: TanStack Query for all server state, Zustand for UI state, react-hook-form + zod, axios
apiClient, Recharts, react-grid-layout. -
Quality gates: JaCoCo (66% line), SpotBugs, OWASP Dependency-Check, Spotless Google-Java-Format, Vitest + Playwright + ESLint + Prettier +
tsc --noEmit. Backend + frontend CI on SQLite, Postgres, and browser.
Current version is 0.4.0-beta. If you do bank-file imports, multi-currency, or self-hosting — I'd love your harsh feedback.
Bug reports and feature requests → GitHub Issues. If you want to contribute, start with CONTRIBUTING.md — architecture, API reference, i18n workflow, and Conventional Commits (feat(scope): ...) are all documented.
Own your ledger. Self-host your net worth.

Top comments (0)