A self-hosted expense tracking web app built with Flask. Track recurring and one-time expenses across multiple currencies, with a dashboard showing monthly/annual totals and breakdowns by category, frequency, and currency.
- OIDC authentication — works with any OpenID Connect provider (Google, Keycloak, Auth0, etc.)
- Multi-currency — 34 supported currencies with live exchange rate conversion via open.er-api.com
- Flexible frequency — monthly, quarterly, semi-annual, annual, or one-time expenses
- Categories — Housing, Utilities, Insurance, Transportation, Food & Drink, and more
- Dashboard charts — breakdown by category, frequency, currency, and top expenses
- Filtering & search — filter expense list by category, frequency, currency, or active status
TODO
Copy the example env file and fill in your values:
cp .env.example .envdocker compose up -dThe app will be available at http://localhost:5000.
Requirements: Python 3.10+
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# edit .env
flask runAll configuration is done via environment variables (or a .env file):
| Variable | Description | Default |
|---|---|---|
SECRET_KEY |
Flask secret key | dev-secret-change-this |
DATABASE_URL |
SQLAlchemy database URL | sqlite:///expenses.db |
OIDC_DISCOVERY_URL |
OIDC discovery endpoint URL | — |
OIDC_CLIENT_ID |
OIDC client ID | — |
OIDC_CLIENT_SECRET |
OIDC client secret | — |
OIDC_REDIRECT_URI |
OAuth callback URL | http://localhost:5000/auth/callback |
BASE_CURRENCY |
Default base currency (ISO 4217) | USD |
| Provider | OIDC_DISCOVERY_URL |
|---|---|
https://accounts.google.com/.well-known/openid-configuration |
|
| Keycloak | https://<host>/realms/<realm>/.well-known/openid-configuration |
| Auth0 | https://<domain>/.well-known/openid-configuration |
Images are published to the GitHub Container Registry on every push to main and on version tags:
docker pull ghcr.io/ha1fdan/expensetracker:latestVersion tags follow semver (v1.2.3 → 1.2.3, 1.2, 1).
MIT