Solvia is a local-first wealth tracking application for personal finance data.
Solvia tracks account balances, savings products, listed investments, crypto-assets, non-listed assets, cashback and other gains through immutable historical entries.
The application intentionally separates:
- entered values;
- money flows;
- calculated valuations and performance metrics.
This prevents deposits, withdrawals, dividends and transfers from being confused with actual investment performance.
The first version focuses on manual data entry and reliable calculations:
- accounts and envelopes;
- assets and positions;
- account and position snapshots;
- important cash flows;
- net-worth history;
- period-based charts;
- custom aggregation steps;
- CSV/JSON export and backup foundations;
- local-first security defaults.
Out of scope for V1: bank synchronization, order placement, investment advice, complete tax automation, mobile applications, multi-user cloud hosting and real-time market data.
| Area | Decision |
|---|---|
| Language | Java 25 |
| Backend | Spring Boot 4 |
| Desktop | JavaFX + AtlantaFX |
| Database | PostgreSQL |
| Migrations | Flyway |
| Persistence access | Spring JDBC JdbcClient |
| API style | REST, validation, repository-backed adapters, static OpenAPI |
| Build | Maven multi-module |
| Security stance | Local-first, no external telemetry |
Solvia/
├─ solvia-domain/
├─ solvia-application/
├─ solvia-infrastructure-persistence/
├─ solvia-backend/
├─ solvia-desktop/
├─ docs/
│ ├─ adr/
│ └─ analysis/
├─ compose.yaml
└─ pom.xml
mvn clean verifydocker compose up -d postgresDefault local credentials are development-only and must not be reused outside local developer machines.
mvn -pl solvia-backend -am spring-boot:runThe -am flag is required when launching from the root workspace because the
backend depends on sibling reactor modules. The backend binds to 127.0.0.1 by
default.
Equivalent helper:
./scripts/run-backend.shGET /api/accounts
POST /api/accounts
GET /api/accounts/{id}
PUT /api/accounts/{id}
DELETE /api/accounts/{id}
GET /api/assets
POST /api/assets
GET /api/assets/{id}
PUT /api/assets/{id}
DELETE /api/assets/{id}
GET /api/accounts/{accountId}/positions
POST /api/positions
GET /api/positions/{id}
PUT /api/positions/{id}
DELETE /api/positions/{id}
POST /api/account-snapshots
GET /api/accounts/{accountId}/snapshots
POST /api/position-snapshots
GET /api/positions/{positionId}/snapshots
POST /api/cash-flows
GET /api/accounts/{accountId}/cash-flows
GET /api/net-worth
GET /api/net-worth/series
GET /api/performance
GET /api/allocation
GET /api/openapi.yaml
mvn -pl solvia-desktop -am javafx:runEquivalent helper:
./scripts/run-desktop.sh