FinanceFlow
A personal finance dashboard that imports real bank data
Multi-bank CSV import
200+ merchant rules
5-year net worth forecast
Claude AI insights
01The Problem
Most personal finance tools want you to connect your bank via Plaid (expensive, privacy-invasive) or enter data manually (tedious). Real bank statement CSVs are right there in your downloads folder — I wanted to parse those directly, categorize automatically, and surface insights without a middleman.
02The Approach
Built a full-stack finance app with Supabase for auth and data persistence. The CSV importer handles ANZ, BNZ, and generic bank formats. A rule-based categorization engine maps merchant names to categories (groceries, transport, dining, etc.). Claude API provides AI-powered insights on spending patterns.
03Architecture Decisions
Pattern-based CSV categorization
A merchant-to-category ruleset covers 200+ common merchants. When a transaction doesn't match, it's flagged for manual categorization. Over time, user corrections build a personalized ruleset stored in Supabase.
Subscription auto-detection
The /subscriptions page scans transactions for recurring charges using merchant name + amount pattern matching. Finds Netflix, Spotify, SaaS tools, and gym memberships without any manual setup.
Multi-currency display layer
All data is stored in NZD. A currency provider wraps the entire app and applies real-time exchange rates to every displayed value. Switch from NZD to USD to EUR and all figures update instantly.
Supabase RLS for data isolation
Every transaction, expense, and financial record is scoped to the authenticated user via Row-Level Security. Users can only see their own data — the schema enforces this at the database level, not just the application layer.
Forecast modeling
The /forecast page runs a 5-year projection of net worth using current income, expenses, savings rate, investment growth, and loan amortization. Adjustable assumptions let users model different scenarios.
04Key Insight
Bank CSV formats are surprisingly inconsistent. ANZ exports with the payee in column 2, BNZ puts it in column 3, and Westpac wraps it in quotes with embedded commas. Building a robust multi-bank parser required handling encoding issues, different date formats, and irregular header rows before any categorization logic could run.
05Why It Matters
The most feature-complete project in the portfolio — it has auth, a real data pipeline, AI integration, complex state, and financial modeling. It's the app I'd actually use as my personal finance tool.