A modern, resource-efficient app for analyzing your personal finances built with Rust.
Important
Disclaimer: This was entirely vibe-coded as part of some personal experimentation with this new technology. I know neither Rust nor more than the most basic part of CSS. If that is a deal breaker for you, I understand.
The primary use case is running this program as a self-hosted Docker instance accessed locally or via VPN. Your data stays yours! There is currently no support for multiple users.
- Transaction tracking with categories, tags, and multi-currency support
- Spending analytics with interactive charts (Sankey diagrams, category breakdowns, time series)
- Investment portfolio tracking with positions, realized/unrealized gains, and market data from Yahoo Finance
- Net worth calculation and historical trends
- Automatic categorization via pattern-matching rules
- Bulk import/export of transactions and trading activities from CSV
- Dark mode and customizable settings
- Progressive Web App installable on Android and iOS
Take it for a spin! To start up an instance with some demo data:
docker run --rm --init -p 7070:7070 \
-e SOLVENCY_PASSWORD_HASH=DANGEROUSLY_ALLOW_UNAUTHENTICATED_USERS \
ghcr.io/adrianvollmer/solvency-demo:latestAlso works with Podman!
Then navigate your browser to http://localhost:7070.
- Web Framework: Axum 0.7
- Templates: Askama (compile-time checked)
- Interactivity: HTMX
- Database: SQLite with SQLx
- UI: Tailwind CSS
- Background Jobs: tokio-cron-scheduler
All environment variables are prefixed with SOLVENCY_. Create a .env
file:
SOLVENCY_DATABASE_URL=sqlite://solvency.db
SOLVENCY_PORT=7070
SOLVENCY_HOST=0.0.0.0
SOLVENCY_PASSWORD_HASH=<argon2-hash>
RUST_LOG=infoThe SOLVENCY_PASSWORD_HASH environment variable is required. Set
it to an Argon2 hash of your password:
# Using argon2 CLI tool
echo -n "your-password" | argon2 $(openssl rand -base64 16) -id -e(Or use https://argon2.online/.)
To explicitly allow unauthenticated access (e.g., for local-only deployments), set:
SOLVENCY_PASSWORD_HASH=DANGEROUSLY_ALLOW_UNAUTHENTICATED_USERSThe app will refuse to start if SOLVENCY_PASSWORD_HASH is unset,
empty, or invalid.
The easiest way to run Solvency is with Docker (or Podman).
docker compose up -dThe app will be available at http://localhost:7070 with persistent storage.
There is a publicly available Docker image:
ghcr.io/adrianvollmer/solvency:latest
To build the image:
docker build -t solvency .Run the container:
docker run --rm -d \
-p 7070:7070 \
-v solvency-data:/app/data \
-e SOLVENCY_DATABASE_URL=sqlite:///app/data/solvency.db \
-e SOLVENCY_PASSWORD_HASH='$argon2id$...' \
-e SOLVENCY_PORT=7070 \
-e SOLVENCY_HOST=0.0.0.0 \
--name solvency \
solvencySOLVENCY_DATABASE_URL: Path to SQLite database (default:sqlite:///app/data/solvency.db)SOLVENCY_PORT: Port to listen on (default:7070)SOLVENCY_HOST: IP address to bind to (default:0.0.0.0)SOLVENCY_PASSWORD_HASH: Required. Argon2 hash for authentication, orDANGEROUSLY_ALLOW_UNAUTHENTICATED_USERSto disable authRUST_LOG: Log level (default:info)
MIT
See CONTRIBUTING.md for how to build from source and contribute to the project.