A full-stack personal finance tracker built as part of the ITC Web Convener Assignment (Tasks 2, 3 & 4).
├── task2-finance-ui/ # React frontend (localStorage version)
├── task3-api/ # Node.js + Express + SQLite REST API
└── task4-integration/ # React frontend integrated with Task 3 API
- Add, delete income and expense transactions
- Summary cards showing total income, expenses, and balance
- Filter transactions by type and category
- Search transactions by description
- Category-wise spending pie chart
- Income vs expense bar chart
- JWT-based authentication (register & login)
- Data persisted in SQLite database (Task 3 & 4)
- React 19 + Vite
- Recharts (for pie and bar charts)
- CSS custom properties (dark theme)
- Node.js + Express 5
- PostgreSQL
- JWT authentication via
jsonwebtoken - Password hashing via
bcryptjs
cd task3-api
npm install
npm run devAPI will start at http://localhost:3000
Endpoints:
GET / # Health check
POST /auth/register # Register a new user
POST /auth/login # Login and get JWT token
GET /transactions # Get all transactions (requires JWT)
POST /transactions # Add a transaction (requires JWT)
DELETE /transactions/:id # Delete a transaction (requires JWT)
cd task2-finance-ui
npm install
npm install recharts
npm run devOpens at http://localhost:5173 — uses localStorage, no backend needed.
Make sure Task 3 API is running first, then:
cd task4-integration
npm install
npm install recharts
npm run devOpens at http://localhost:5173 — login or register, then manage your finances via the API.
- User registers via
POST /auth/registerwith username and password (min 6 chars) - API returns a JWT token valid for 7 days
- Token is stored in
localStorage - Every subsequent request to
/transactionssends the token asAuthorization: Bearer <token> - Logout clears the token and returns to the login screen
-- Users table
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL, -- bcrypt hashed
createdAt TEXT DEFAULT (datetime('now'))
);
-- Transactions table
CREATE TABLE transactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, -- foreign key to users
amount REAL NOT NULL,
type TEXT NOT NULL, -- "income" or "expense"
category TEXT NOT NULL,
note TEXT DEFAULT '',
timestamp TEXT NOT NULL,
createdAt TEXT DEFAULT (datetime('now')),
FOREIGN KEY (user_id) REFERENCES users(id)
);Create a .env file in task3-api/:
PORT=3000
JWT_SECRET=your_secret_key_here| Service | What to deploy |
|---|---|
| Vercel | task4-integration (React frontend) |
| Render | task3-api (Express backend) |
After deploying the backend, update API_BASE in task4-integration/src/api.js to your Render URL.
- The edit transaction feature is available in Task 2 (localStorage) but disabled in Task 4 since the Task 3 API does not have a
PUT /transactions/:idroute - Task 4 uses a Vite proxy (
vite.config.js) to forward/authand/transactionsrequests tolocalhost:3000during development, avoiding CORS issues
Sarbjeet Singh Pal
Economics, IIT Bombay
ITC Web Convener Application — 2026