A full-stack transaction management application built with SvelteKit 5 and NestJS, featuring smart auto-categorization, CSV import/export, bulk operations, and a responsive dark/light theme UI.
# Clone the repo
git clone [email protected]:IMChiodo/transaction-manager.git
cd transaction-manager
# Install backend
cd backend && npm install
# Install frontend
cd ../frontend && npm install
Open two terminals:
Terminal 1 - Backend (port 3000):
cd backend
npm run start:dev
Terminal 2 - Frontend (port 5173):
cd frontend
npm run dev
Visit http://localhost:5173
A test.csv file is included in the frontend folder:
frontend/test.csv| Layer | Technology |
|---|---|
| Frontend | SvelteKit 2.x, Svelte 5, TypeScript, Tailwind CSS 4.x |
| Backend | NestJS, TypeScript, class-validator |
| Storage | JSON file (simulates database) |
transaction-manager/
├── README.md
├── backend/
│ └── src/
│ ├── transactions/ # CRUD, import/export, similarity grouping
│ │ └── utils/ # CSV parsing, similarity algorithms
│ ├── categories/ # Category suggestions
│ └── data/ # JSON storage
└── frontend/
├── test.csv # Sample CSV for testing
└── src/
├── lib/
│ ├── components/ # Svelte components
│ ├── stores/ # Svelte 5 runes store
│ ├── services/ # API client
│ └── utils/ # Formatters, colors, selection helpers
└── routes/
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/transactions |
List transactions (with filters & sorting) |
| PATCH | /api/transactions/:id |
Update single transaction |
| POST | /api/transactions/bulk |
Bulk update transactions |
| GET | /api/transactions/groups/similar |
Get similar transaction groups |
| POST | /api/transactions/import |
Import from JSON data |
| POST | /api/transactions/import/csv |
Import from CSV file upload |
| GET | /api/transactions/export |
Export to CSV file |
| GET | /api/categories |
List all categories |
| POST | /api/categories/suggest |
Get category suggestions |
/categories/suggest for suggestionsThis application uses JSON file storage instead of a database. The architecture reflects what would typically be done at the database level:
.filter(), .sort()). In a production system with a database, this would be SQL WHERE and ORDER BY clauses.LIMIT/OFFSET or cursor-based pagination to avoid loading all records into memory.$state, $derived, $effect, $props for reactive state management# Backend
cd backend && npm run build && npm run start:prod
# Frontend
cd frontend && npm run build && npm run preview
MIT