A personal finance management application for tracking wallets, transactions, and categories.
# Dev stack (auto-includes docker-compose.override.yml)
docker compose up -d --build# Base compose only (prod-like)
docker compose -f docker-compose.yml up -d --build# Start Postgres only (option A)
docker compose up -d --build postgres
# Start Postgres only (option B, use 5433 to avoid conflicts)
docker run --name moneytracker-db \
-e POSTGRES_DB=moneytracker \
-e POSTGRES_USER=moneytracker \
-e POSTGRES_PASSWORD=localdev123 \
-p 5433:5432 \
-d postgres:16-alpine
# Run backend (CLI)
cd backend
./mvnw spring-boot:runIf you use the 5433 mapping above, set:
SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5433/moneytracker
SPRING_DATASOURCE_USERNAME=moneytracker
SPRING_DATASOURCE_PASSWORD=localdev123
You can also run the backend from IntelliJ using the Spring Boot run configuration.
cd web
npm install
npm run devSee web/.env.example for API mode switches (mock/api/hybrid).
MoneyTracker is a modern full-stack web app designed to help users track finances with a clear dashboard, wallet categories, and transaction history.
- Record income and expenses
- Track transactions per wallet
- Date filtering and balance summaries
- System categories (income/expense)
- Custom categories
- Category-based breakdowns
- Wallet groups by category
- Favorites and ordering
- Category-specific wallet views
- Summary metrics
- Net worth history
- Recent activity
- Framework: Java 25 + Spring Boot 4.0.1
- Database: PostgreSQL
- ORM: Spring Data JPA / Hibernate
- Security: Spring Security + JWT
- Migrations: Flyway
- Build Tool: Maven
- Framework: React 19 with TypeScript
- State Management: Redux Toolkit
- UI Components: MUI 7
- Router: React Router 7
- HTTP Client: Axios
- Build Tool: Vite (rolldown-vite)
- Containerization: Docker & Docker Compose
- Testing: JUnit 5, Mockito, React Testing Library
MoneyTracker/
βββ backend/ # Spring Boot application
β βββ src/
β β βββ main/
β β β βββ java/
β β β β βββ com/moneytracker/
β β β β βββ config/ # Configuration classes
β β β β βββ controller/ # REST controllers
β β β β βββ dto/ # Data Transfer Objects
β β β β βββ entity/ # JPA entities
β β β β βββ exception/ # Custom exceptions
β β β β βββ mapper/ # Entity-DTO mappers
β β β β βββ repository/ # Data repositories
β β β β βββ security/ # Security configuration
β β β β βββ service/ # Business logic
β β β βββ resources/
β β β βββ db/migration/ # Flyway migrations
β β β βββ application.yml
β β βββ test/
β βββ pom.xml
βββ web/ # React application
β βββ src/
β β βββ components/ # Reusable UI components
β β βββ features/ # Feature-based modules
β β βββ hooks/ # Custom React hooks
β β βββ pages/ # Page components
β β βββ api/ # API services
β β βββ store/ # Redux store configuration
β β βββ types/ # TypeScript type definitions
β β βββ utils/ # Utility functions
β βββ package.json
β β βββ vite.config.ts
βββ Documents/ # Project documentation
βββ docker-compose.yml
βββ docker-compose.override.yml
βββ README.md
Base paths below are without a global /api prefix.
| Method | Endpoint | Description |
|---|---|---|
| POST | /auth/register |
User registration |
| POST | /auth/login |
User login |
| POST | /auth/refresh |
Refresh access token |
| POST | /auth/logout |
Logout |
| GET | /auth/me |
Current user (token) |
| Method | Endpoint | Description |
|---|---|---|
| GET | /users/me |
Current user profile |
| PUT | /users/me |
Update current user |
| Method | Endpoint | Description |
|---|---|---|
| GET | /dashboard |
Dashboard summary |
| GET | /dashboard/net-worth-history |
Net worth history by period |
| Method | Endpoint | Description |
|---|---|---|
| GET | /wallets |
List wallets |
| GET | /wallets/favorites |
Favorite wallets |
| GET | /wallets/{walletId} |
Wallet by ID |
| POST | /wallets |
Create wallet |
| PUT | /wallets/{walletId} |
Update wallet |
| DELETE | /wallets/{walletId} |
Delete wallet |
| Method | Endpoint | Description |
|---|---|---|
| GET | /transactions |
List all transactions |
| POST | /transactions |
Create transaction |
| DELETE | /transactions/{transactionId} |
Delete transaction |
| GET | /wallets/{walletId}/transactions |
Wallet transactions |
| GET | /wallets/{walletId}/transactions/range |
Wallet transactions by date range |
| GET | /wallets/{walletId}/transactions/balance |
Wallet balance |
| Method | Endpoint | Description |
|---|---|---|
| GET | /categories |
List all categories |
| GET | /categories/{categoryId} |
Category by ID |
| GET | /categories/income |
Income categories |
| GET | /categories/expense |
Expense categories |
| GET | /categories/system |
System categories |
| POST | /categories |
Create category |
| PUT | /categories/{categoryId} |
Update category |
| DELETE | /categories/{categoryId} |
Delete category |
cd backend
./mvnw testcd web
npm run testThis project is licensed under the MIT License.
MoneyTracker Team