Single-user CSV import and dashboard MVP built with Next.js App Router + PostgreSQL + Prisma.
- Next.js 16 App Router
- PostgreSQL 16
- Prisma ORM
- TypeScript CSV parsing with
csv-parse - Recharts for dashboard visualizations
- Vitest for utility tests
-
Install dependencies:
pnpm install
-
Copy env vars:
cp .env.example .env
-
Start PostgreSQL:
docker compose up -d
-
Create tables and Prisma client:
pnpm db:generate pnpm db:migrate --name init
-
Seed the default account and categories:
pnpm db:seed
-
Start the app:
pnpm dev
Open http://localhost:3000/import and upload samples/sample-bank-export.csv.
You can also test the Amex adapter with samples/amex-ca-export.csv.
The MVP supports two explicit templates:
sample_bank_v1amex_ca_v1rbc_credit_v1
Expected headers:
Date,Description,Amount
2026-03-05,STARBUCKS,-6.25
2026-03-10,Payroll,2450.00Rules:
Datemust beYYYY-MM-DD- Negative
Amountmeans expense - Positive
Amountmeans income - UTF-8 encoding only
- Maximum file size is 5 MB
Amex Canada assumptions:
- Uses the
Datecolumn as the transaction date - Accepts
MM/DD/YYYYorYYYY-MM-DD - Positive
Amountmeans card spend - Negative
Amountmeans refund or payment
RBC credit card assumptions:
- Uses
Transaction Date - Accepts
M/D/YYYY - Uses
CAD$when available, otherwiseUSD$ - Negative amount means card spend
- Positive amount means payment or refund
/import/dashboard/transactions/importsPOST /api/imports/uploadGET /api/analytics/summary?month=YYYY-MMGET /api/analytics/by-day?month=YYYY-MMGET /api/analytics/by-category?month=YYYY-MM
- Single user only
- One bank CSV template only
- No auth
- No transaction editing
- No CSV file retention after import
- No RAG or AI analysis yet