Expense Tracker is a full-stack finance app with a React frontend, an Express/Prisma backend, Supabase integration, offline-first local storage, and AI-assisted import and receipt flows.
frontend/: React app, IndexedDB/Dexie layer, scanners, importers, voice flow, and UIbackend/: Express API, auth, sync, Prisma models, sockets, and security middlewaredatabase/: raw SQL schemas and direct DB helper scriptsapi/: lightweight serverless endpointssupabase/: Supabase migrations, edge functions, and setup notestests/: fixtures, manual browser checks, runners, and scenario notessamples/: place for demo receipts, imports, and document examplesscripts/: top-level automation helpersdocs/: project structure, env reference, testing guide, and historical implementation docsresources/archive/frontend-experiments/: archived frontend backup files
- Frontend reads and writes locally first through Dexie, then syncs with the backend.
- Backend is the authority for auth, role resolution, PIN state, sync identity, and protected mutations.
- Prisma owns the application data model in
backend/prisma/. - Supabase provides hosted Postgres/Auth/Storage concerns and SQL migrations in
supabase/. - AI-related ingestion currently includes receipt OCR, JSON import normalization, bank statement parsing, and voice-based transaction parsing.
npm install
npm run db:generate
npm run buildFor day-to-day work:
npm run dev
npm run dev:backend
npm --prefix frontend run test:unit
npm --prefix backend test- Import validation fixtures now live under
tests/fixtures/imports/ - Auth payload samples live under
tests/fixtures/auth/ - Manual browser/debug helpers live under
tests/manual/ - External real receipt samples used during verification currently live outside the repo at
C:\Users\USER\OneDrive\Documents\sample
- Client-side env-based role assignment and local PIN authority have been removed; backend profile and PIN services are now authoritative.
- The repo still contains historical docs and some one-off backend helper files. The README files added in this pass are the current navigation layer.