A distinguished, self-hosted application for the discerning individual who values both privacy and a clear view of their financial standing. Track your assets, liabilities, and accounts without surrendering your data to third parties.
Your financial data is deeply personal. This application was built on the principle that tracking your wealth should not require connecting to banks, sharing data with corporations, or trusting cloud services with your most sensitive information. Everything stays on your server, under your control.
- Complete Privacy - Your financial data remains entirely on your server. No bank connections, no data sharing, no tracking, no telemetry.
- Comprehensive Account Support - Track checking, savings, investments, retirement accounts, real estate, vehicles, credit cards, loans, and more.
- Historical Perspective - Visualize your net worth trajectory over time with elegant, interactive charts.
- Asset Allocation - Understand how your holdings are distributed across account categories.
- Quarterly Reports - Generate detailed quarterly reports with CSV export for thorough record-keeping.
- Financial Projections - Forecast your net worth using compound growth principles with horizons from 1 to 30 years.
- Multi-Factor Authentication - Secure your account with TOTP-based MFA using any authenticator app.
- Multi-User Support - Each user maintains their own isolated financial records.
- Effortless Deployment - Deploy in moments with Docker Compose.
- Lightweight Architecture - Uses SQLite by default; no external database required.
The interface draws inspiration from the timeless elegance of financial publications like The Wall Street Journal, featuring a refined color palette of forest greens, antique golds, and cream backgrounds. Typography is handled by Libre Baskerville, a serif typeface that conveys stability and sophistication.
- Create a
docker-compose.ymlfile:
services:
web:
image: ghcr.io/aaron-lee-hebert/net-worth-tracker:latest
ports:
- "8080:8080"
volumes:
- networth-data:/app/data
environment:
- ASPNETCORE_ENVIRONMENT=Production
volumes:
networth-data:- Start the application:
docker compose up -d- Open http://localhost:8080 in your browser and create an account.
Prerequisites:
- .NET 9 SDK
- Docker (optional)
# Clone the repository
git clone https://github.com/aaron-lee-hebert/net-worth-tracker.git
cd net-worth-tracker
# Build and run with Docker
docker compose up -d --build
# Or run directly with .NET
cd src/NetWorthTracker.Web
dotnet runView application screenshots
The application includes administrative commands for user management:
# Display available commands
dotnet NetWorthTracker.Web.dll --help
# List all registered users
dotnet NetWorthTracker.Web.dll --list-users
# Reset a user's password
dotnet NetWorthTracker.Web.dll --reset-password user@example.com NewPassword123Docker usage:
# List users
docker exec -it <container-name> dotnet NetWorthTracker.Web.dll --list-users
# Reset password
docker exec -it <container-name> dotnet NetWorthTracker.Web.dll --reset-password user@example.com NewPassword123Password requirements:
- Minimum 8 characters
- At least one uppercase letter
- At least one lowercase letter
- At least one digit
| Variable | Description | Default |
|---|---|---|
ASPNETCORE_ENVIRONMENT |
Environment mode | Production |
DatabaseProvider |
Database type (SQLite or PostgreSQL) |
SQLite |
ConnectionStrings__DefaultConnection |
Database connection string | Data Source=/app/data/networth.db |
SeedDemoData |
Seed database with demonstration data | false |
Smtp__Enabled |
Enable email notifications | false |
Smtp__Host |
SMTP server hostname | (none) |
Smtp__Port |
SMTP server port | 587 |
Smtp__UseSsl |
Use SSL/TLS for SMTP connection | true |
Smtp__Username |
SMTP authentication username | (none) |
Smtp__Password |
SMTP authentication password | (none) |
Smtp__FromEmail |
Email address for outgoing messages | (none) |
Smtp__FromName |
Display name for outgoing messages | Net Worth Tracker |
AuditLogging__Enabled |
Enable audit logging for security events | false |
To explore the application with sample data, enable demo seeding:
services:
web:
image: ghcr.io/aaron-lee-hebert/net-worth-tracker:latest
ports:
- "8080:8080"
volumes:
- networth-data:/app/data
environment:
- SeedDemoData=true
volumes:
networth-data:This creates a demonstration account with five years of sample financial history:
- Email:
demo@example.com - Password:
DemoPassword123
The demonstration account includes a realistic portfolio: checking, savings, 401(k), Roth IRA, HSA, brokerage, home equity, mortgage, auto loan, student loans, and credit card—all with quarterly balance history.
For production deployments or multi-user scenarios, PostgreSQL provides additional robustness:
services:
web:
image: ghcr.io/aaron-lee-hebert/net-worth-tracker:latest
ports:
- "8080:8080"
depends_on:
db:
condition: service_healthy
environment:
- DatabaseProvider=PostgreSQL
- ConnectionStrings__DefaultConnection=Host=db;Port=5432;Database=networth;Username=networth;Password=your-secure-password
db:
image: postgres:17-alpine
environment:
- POSTGRES_USER=networth
- POSTGRES_PASSWORD=your-secure-password
- POSTGRES_DB=networth
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U networth -d networth"]
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres-data:PostgreSQL uses snake_case naming conventions for tables and columns (e.g., balance_histories, created_at).
To enable email notifications (password resets, monthly snapshots, alerts), configure SMTP settings:
services:
web:
image: ghcr.io/aaron-lee-hebert/net-worth-tracker:latest
ports:
- "8080:8080"
volumes:
- networth-data:/app/data
environment:
- Smtp__Enabled=true
- Smtp__Host=smtp.example.com
- Smtp__Port=587
- Smtp__UseSsl=true
- Smtp__Username=your-username
- Smtp__Password=your-password
- Smtp__FromEmail=noreply@example.com
- Smtp__FromName=Net Worth Tracker
volumes:
networth-data:The application functions fully without email configuration. When SMTP is not configured, email-dependent features (password reset emails, notification alerts) are gracefully disabled.
For enhanced security monitoring, enable audit logging to track user authentication events and sensitive operations:
environment:
- AuditLogging__Enabled=trueAudit logs are stored in the database and include login attempts, password changes, MFA events, and data exports. This feature is disabled by default for simplicity.
The Forecasts page projects your future net worth using compound growth principles. Projections are available for 1, 2, 5, 10, 20, and 30 year horizons.
| Account Type | Annual Rate | Rationale |
|---|---|---|
| Investments | 7% growth | Historical average for diversified equity portfolios |
| Real Estate | 2% appreciation | Conservative estimate at or below inflation |
| Banking/Savings | 0.5% growth | Minimal interest assumption |
| Business | 3% growth | Conservative business growth |
| Vehicles | 15% depreciation | Floor at 10% of original value (salvage) |
| Liabilities | Paydown to $0 | Uses historical rate or 3% quarterly minimum |
All projections use compound interest where each period builds upon the previous balance. Per the Rule of 72, investments growing at 7% annually will approximately double every ten years.
These projections are estimates for informational purposes only and should not be construed as financial advice.
- Backend: ASP.NET Core 9, NHibernate, FluentNHibernate
- Frontend: Razor Pages, Bootstrap 5, Chart.js
- Database: SQLite (default) or PostgreSQL
- Authentication: ASP.NET Core Identity with MFA support
- Typography: Libre Baskerville
All data resides in a SQLite database file at /app/data/networth.db inside the container. Mount a volume to persist data across container restarts.
Your data never leaves your server. There are no external API calls, analytics, or telemetry.
Contributions are welcome. Please see CONTRIBUTING.md for guidelines.
If you find this project valuable, consider supporting its continued development:
This project is licensed under the MIT License. See the LICENSE file for details.
