A comprehensive expense tracking web application built with React, Express.js, and MySQL. Features include expense management, visual analytics, reporting, and a recycle bin for deleted items.
- π Dashboard with summary cards and interactive charts
- π° Expense Management - Add, edit, delete expenses with instant actions
- π Visual Analytics - Charts showing spending trends (30/90 days)
- π Reports - Payment method breakdown with CSV export
- ποΈ Recycle Bin - Restore or permanently delete expenses
- π Dark/Light Theme - Toggle between themes with font size options
- π± Indian Rupee Support - Native currency formatting
- π± Responsive Design - Works on desktop and mobile
- Frontend: React, TypeScript, Tailwind CSS, Shadcn/ui
- Backend: Express.js, TypeScript
- Database: MySQL with Drizzle ORM
- Charts: Chart.js
- State Management: TanStack Query
- Node.js 18+
- MySQL 5.7+ or MySQL 8.0+
- npm or yarn
git clone <repository-url>
cd expense-trackernpm install- Install MySQL on your system
- Create a new database:
CREATE DATABASE expense_tracker;docker run --name mysql-expense-tracker \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=expense_tracker \
-p 3306:3306 \
-d mysql:8.0- Copy the example environment file:
cp .env.example .env- Update the
.envfile with your MySQL connection details:
DATABASE_URL=mysql://username:password@localhost:3306/expense_tracker
NODE_ENV=development
PORT=5000Replace the following in your DATABASE_URL:
username- Your MySQL username (e.g.,root)password- Your MySQL passwordlocalhost:3306- Your MySQL host and portexpense_tracker- Your database name
Run the database migrations to create tables:
npm run db:pushnpm run devThe application will be available at: http://localhost:5000
npm run buildexport DATABASE_URL="mysql://username:password@your-mysql-host:3306/expense_tracker"
export NODE_ENV=production
export PORT=5000npm run db:pushnpm startThe application uses three main tables:
- expenses - Main expense records
- deleted_expenses - Recycle bin for deleted expenses
- users - User accounts (for future authentication)
| Variable | Description | Example |
|---|---|---|
DATABASE_URL |
MySQL connection string | mysql://user:pass@localhost:3306/db |
NODE_ENV |
Environment mode | development or production |
PORT |
Server port | 5000 |
GET /api/expenses- Get all expensesPOST /api/expenses- Create expensePUT /api/expenses/:id- Update expenseDELETE /api/expenses/:id- Delete expense (moves to recycle bin)
GET /api/expenses/analytics/summary- Get expense summaryGET /api/expenses/analytics/daily?days=30- Get daily analytics
GET /api/deleted-expenses- Get deleted expensesPOST /api/deleted-expenses/:id/restore- Restore expenseDELETE /api/deleted-expenses/:id- Permanently deleteDELETE /api/deleted-expenses- Clear recycle bin
GET /api/expenses/export/csv- Export expenses as CSV
To use a different MySQL database, simply update the DATABASE_URL in your .env file:
DATABASE_URL=mysql://new_user:new_password@new_host:3306/new_databaseEdit the category options in:
client/src/components/add-expense-modal.tsxclient/src/components/edit-expense-modal.tsxclient/src/pages/dashboard.tsx
Edit payment method options in the same modal files to add or modify payment types.
- Verify MySQL is running:
mysql -u username -p - Check database exists:
SHOW DATABASES; - Verify connection string format
- Check firewall settings for MySQL port (3306)
- Clear node_modules:
rm -rf node_modules && npm install - Clear build cache:
npm run clean - Check Node.js version:
node --version(should be 18+)
- Check database permissions
- Run:
npm run db:generatethennpm run db:push - Manually create database if needed
MIT License - see LICENSE file for details.