Building (and Using) a Local-First Personal Finance App with Java 21, Spring Boot, and React
Most personal finance tools force you to choose between "modern but SaaS" (your data on their servers) and "private but dated" (GnuCash-style UIs). This article walks through Open-Finance, an open-source alternative that gives you both: a polished web interface and complete data sovereignty.
Why Local-First Matters
Financial data is uniquely sensitive. Every cloud finance app is a potential target — and even "anonymous" usage data reveals your net worth, spending habits, and investment strategy. Open-Finance stores everything in a local SQLite database (WAL mode, encrypted), runs entirely on your machine, and never phones home.
Architecture Overview
React 19 UI → REST API → Spring Boot Services → JPA → SQLite (encryption at rest)
↓
External Integrations
(Yahoo Finance, ECB, Ollama)
- Backend: Java 21, Spring Boot 3.2, Hibernate/JPA, Flyway migrations, SQLite via Xerial JDBC
- Frontend: React 19 + TypeScript 5, Vite, Tailwind 4, shadcn/ui, Radix UI
- State: TanStack Query (server), Zustand (client), react-hook-form + zod
- AI: Local Ollama integration — no API keys, no data leakage
- Market Data: Yahoo Finance wrapper with caching and rate limiting
- Exchange Rates: Daily ECB rate fetch
Key Features
1. Import Pipeline
Support for QIF, OFX, QFX, CSV, JSON, and even Skrooge exports. The import engine includes duplicate detection, per-file account mapping, and an interactive preview so you can see what lands before committing.
2. Multi-Currency
Transactions support any currency with automatic ECB rate conversion. The dashboard shows consolidated net worth in your base currency with historical trends.
3. Local AI Assistant
Connected to Ollama, the AI analyzes your actual portfolio and spending patterns — no context window limitations from cloud APIs, and zero data exposure. It can simulate scenarios ("what if I increase my monthly investment by 20%?") against real data.
4. Rich Financial Instruments
Track stocks, crypto, real estate, vehicles, and liabilities with amortization schedules. Market prices auto-update for tradable assets.
Quick Start
git clone https://github.com/openfinance-app/open-finance.git
cd open-finance
cp .env.example .env
# Edit JWT_SECRET in .env (or generate with openssl rand -base64 48)
docker compose up -d
# Open http://localhost:8080 — demo/demo123
Development Setup
The repo includes a DevContainer with Java 21, Maven, Node.js, and SQLite pre-configured. Open it in VS Code with the Dev Containers extension and you're ready to contribute.
mvn spring-boot:run # Backend on :8080
npm run dev # Frontend on :5173
Comparison to Alternatives
| Feature | Open-Finance | GnuCash | Finary | Wealthfolio |
|---|---|---|---|---|
| Modern UI | ✅ | ⚠️ | ✅ | ✅ |
| Local-first | ✅ | ✅ | ❌ | ✅ |
| AI Assistant | ✅ | ❌ | ❌ | ✅ |
| QIF/OFX Import | ✅ | ✅ | ❌ | ⚠️ |
| Encrypted | ✅ | ⚠️ | ❌ | ✅ |
| Multi-currency | ✅ | ✅ | ✅ | ✅ |
| FOSS | ✅ | ✅ | ❌ | ✅ |
Try It
The project is on GitHub at github.com/openfinance-app/open-finance under Elastic License v2 — free to self-host and modify.
If you're interested in the architecture, I've written about specific components:
Have questions? Drop them in the comments or open a GitHub issue.
Top comments (0)