South African personal finance app. Parses and categorises bank statements entirely client-side so financial data never reaches a server, with a verification layer that prevents the AI coach from stating any figure it was not given.
# Sifa
A South African personal finance app. You drop in a bank statement; it reads it,
sorts every transaction, and tells you what actually happened to your money.
No manual data entry. No spreadsheet. Nothing uploaded.
---
## How someone actually uses it
1. Download a statement from their banking app (CSV preferred, PDF works)
2. Drag it onto the import screen
3. Sifa parses and categorises it **in the browser**, then shows a review table
4. They fix anything wrong — Sifa remembers those corrections permanently
5. The dashboard tells them what stands out
Step 4 is the compounding bit. People shop at the same twenty places, so after
a couple of imports the categoriser is effectively tuned to that person and
corrections stop being necessary.
## Structure
```
app/src/frontend/ TanStack Start + React 19 + Tailwind v4 (port 5174)
app/src/backend/ Express — one endpoint, the AI coach (port 3001)
```
The backend does one job: turn a sheet of pre-computed figures into a
paragraph of prose. Everything else — parsing, categorising, every metric —
runs client-side.
### Commands
```bash
# frontend
cd app/src/frontend
npm install && npm run dev #
localhost
npm run build # production build
npx tsc --noEmit # typecheck
# backend
cd app/src/backend
npm install && npm run dev #
localhost
npm run typecheck
```
### Tests
Dependency-free smoke suites, runnable with `tsx`:
```bash
cd app/src/frontend/src/lib/sifa
npx tsx import/parse.smoke.ts # date/amount/CSV parsing
npx tsx import/import-selection.smoke.ts # duplicate detection + import-count correctness
npx tsx categorize/smoke.ts # merchant matching + correction learning
npx tsx coach/facts.smoke.ts # metric correctness + privacy assertions
npx tsx insights.smoke.ts # deterministic insight rules
cd app/src/backend/src/routes
npx tsx coach.smoke.ts # anti-hallucination guard
```
## The t …