React 19
Node.js
Express
PostgreSQL
Prisma
JWT
Recharts
Swagger

FinTrack Financial Planner

Full-stack expense, budget, and savings-goal tracker with a React 19 frontend, Express/Prisma REST API, PostgreSQL persistence, JWT auth, and interactive Swagger docs. Budget enforcement is two-tiered: soft warnings at defaultBudget and hard rejections at maxBudget.

15

API endpoints

4

Data models

JWT

Auth strategy

Prisma

ORM

🔐
JWT Authentication

Register / login flow. Token persisted in localStorage and attached via Authorization: Bearer on every protected request.

🏷️
User-Scoped Categories

Each category holds a defaultBudget (soft limit) and maxBudget (hard limit). Names are unique per user via a composite DB constraint.

💸
Expense Tracking (Full CRUD)

Create, read, update, delete. On create: category ownership is verified, cumulative spend is checked against both tiers, and a warning flag is returned.

🎯
Savings Goals

Create goals with a target amount. Funds are added incrementally via PATCH /:id/add-funds. Goals can be updated or deleted at any time.

📊
Spending Dashboard

Aggregated spend per category for the logged-in user, rendered with Recharts bar and pie charts on the React frontend.

📖
Swagger API Docs

Full OpenAPI 3.0 spec auto-served at /api-docs. Every endpoint, schema, and response code is documented and interactively testable.

Tech Stack
Frontend
React 19
React Router v7
Bootstrap 5
Axios
Chart.js
Recharts
Backend
Node.js
Express.js
Prisma ORM
Database
PostgreSQL
Auth
JWT (localStorage)
Docs
Swagger UI (OpenAPI 3.0)
Two-Tier Budget Enforcement
⚠️

defaultBudget: Soft Warning

When cumulative spend crosses defaultBudget, the API returns HTTP 200 with the expense plus a warning flag. The expense is still created.

🚫

maxBudget: Hard Reject

When cumulative spend would exceed maxBudget, the API returns HTTP 400 and the expense is not created. The controller computes currentSpent + newAmount before writing.