CashPattern
Personal finance automation — without giving up your bank credentials.
CashPattern imports CSV files from virtually any bank — no Plaid, no handing over bank passwords. Transactions are categorized automatically, recurring bills are tracked and reminded, and finances organize around goals instead of rigid budgets.
Under the hood it's a multi-tenant SaaS built end to end: a seven-tier categorization cascade that tries explicit user rules, learned merchant patterns, deterministic transfer parsing, a cross-tenant pattern pool, and brand and keyword matching — before it ever spends a token on an LLM.
The hard part
“The hardest problems weren't the AI — they were the boring correctness problems.”
- AA transfer between your own accounts isn't spending.
- BThe two sides of a credit-card payment aren't duplicate transactions.
- CAn explicit user rule must outrank anything the system has learned.
Get these wrong and every report downstream is quietly corrupted — so the cascade is deterministic first, clever last.
Outcomes
- Status
- Live in production
- Proving ground
- 3 years of real financial history
- Backend tests
- ~390
- Release gate
- Full E2E suite
- Release time
- Cut roughly in half
- LLM usage
- Last resort, by design
Full engineering detail
- Seven-tier categorization cascade — user rules outrank everything
- Learned merchant patterns, per tenant
- Deterministic parsing for UPI / Interac / Zelle transfers
- Cross-tenant pattern pool
- Brand and keyword matching tiers
- LLM fallback as the final tier only
- CSV / Excel import with automatic column detection
- Hard-block duplicate prevention
- Per-batch import undo
- Receipt extraction
- PDF statement extraction using vision models
- Household sharing
- Separate personal / business workspaces
- Stripe billing
- Reporting suite with a custom cash-flow Sankey
- Four-tier Git workflow with automated, E2E-gated releases
Stack
- NestJS 11
- TypeScript
- MongoDB
- Mongoose
- React 19
- Vite
- Tailwind CSS
- Stripe
- Cloudflare R2
- Gemini
- Playwright
- Docker
- Railway
- GitHub Actions