You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
π° Minted β Personal Budget & Expense Management
A modern, full-stack personal finance application built with Angular 21 and Spring Boot 3. Track income, expenses, and transfers across multiple accounts with a beautiful dark/light themed UI.
β¨ Features
Transaction Management β Add, edit, and delete income, expenses, and transfers
Multi-Account Support β Track balances across bank accounts, wallets, and credit cards
Custom Categories β Organize transactions with custom categories and icons
Dashboard Analytics β Visualize spending patterns with interactive charts, account filtering, and configurable color palettes
Dark / Light Theme β System-aware dark mode with customizable accent colors
JWT Authentication β Secure login with token-based auth and auto-refresh
AG Grid Data Tables β Powerful, sortable, filterable transaction grids
Responsive Design β Works on desktop and tablet viewports
Docker Ready β One-command deployment with Docker Compose
π₯ Screenshots
See screenshots/README.md for a full annotated gallery with descriptions of every module.
Dashboard
Dark Mode
Light Mode
Transactions & Recurring
Transactions
Recurring
Analytics & Splits
Analytics
Splits
Import & Statements
Bulk Import
Statements
Upload Statement
Settings
Profile
Accounts
Account Types
Categories
Budgets
Dashboard Config
LLM
Admin Panel
User Management
Jobs
Server Settings
π Tech Stack
Layer
Technology
Frontend
Angular 21, PrimeNG, AG Grid, Tailwind CSS, Chart.js
Option B: Run with Docker Hub Images (Recommended for Production)
Pull and run the pre-built images from Docker Hub β no source code or build tools required.
1. Download the compose file and create .env
# Download files
curl -O https://raw.githubusercontent.com/kartikeychoudhary/minted/main/docker-compose.prod.yml
curl -O https://raw.githubusercontent.com/kartikeychoudhary/minted/main/.env.example
# Create your .env
cp .env.example .env
# Edit .env and set MINTED_JWT_SECRET, MINTED_JASYPT_PASSWORD, etc.
2. Start all services
# Pull latest images and start
docker compose -f docker-compose.prod.yml up -d
# Or pin to a specific release
MINTED_VERSION=v1.0.2 docker compose -f docker-compose.prod.yml up -d
# Stop containers (data is preserved)
docker compose down
# Stop AND delete database volume
docker compose down -v
Troubleshooting
Permission denied on ./gradlew (Linux/macOS)
If you are running Docker on a Linux/macOS machine after cloning or copying the project from Windows, you might encounter a Permission denied error for the Gradle wrapper during the backend build. To fix this, grant execute permissions to the wrapper file:
chmod +x minted-api/gradlew
docker compose up --build -d
Minted includes several hardened security measures:
Default-deny authorization β All unmatched routes return 403. Only explicitly listed paths are accessible.
AES-256-GCM encryption for API keys β LLM API keys stored in the database are encrypted at rest using AES-256-GCM with random IVs via a JPA AttributeConverter.
Jasypt AES-256 encryption β Property-level encryption uses PBEWITHHMACSHA512ANDAES_256 with random IVs (upgraded from legacy DES/MD5).
Restricted CORS headers β Only Content-Type, Authorization, X-Requested-With, and Accept headers are allowed.
No stack trace leakage β Generic 500 errors return a safe message; details are logged server-side only.
Force password change β The default admin user must change their password on first login.
Environment Variables for Security
Variable
Purpose
Required
MINTED_JWT_SECRET
JWT signing key (min 256 bits)
Yes
MINTED_JASYPT_PASSWORD
Jasypt property encryption password
Yes (for production)
MINTED_ENCRYPTION_KEY
AES-256 key for DB-stored API keys (falls back to MINTED_JASYPT_PASSWORD)
Recommended
Generate secure values:
openssl rand -base64 64 # for JWT_SECRET
openssl rand -base64 32 # for JASYPT_PASSWORD
openssl rand -base64 32 # for ENCRYPTION_KEY
π¨ Theming
Minted uses a CSS custom property design system (--minted-* tokens) with:
Light mode β Clean white surfaces with subtle borders
Dark mode β Elevated slate palette (not pure black)