DEV Community

Cover image for Open-Finance: Local-first, privacy-focused personal finance application.
albilu
albilu

Posted on Edited on

Open-Finance: Local-first, privacy-focused personal finance application.

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

Open Finance Dashboard

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

  1. Self-host with Docker — SQLite file you can back up, no vendor DB.
  2. JWT auth + session-scoped encryption key (X-Encryption-Key header from sessionStorage). Server never sees plaintext amounts.
  3. 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
Enter fullscreen mode Exit fullscreen mode

With local AI:

docker compose --profile ai up -d
docker compose --profile ai exec ollama ollama pull qwen2.5:0.5b
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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!"}'
Enter fullscreen mode Exit fullscreen mode

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=10000 for writer contention, migrations run on startup. Postgres driver included for cloud deployments.
  • Spring Boot: interfaces + impls, constructor injection, MapStruct, BigDecimal everywhere for money, @ControllerAdvice error 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)