All projects
Live

FinanceFlow

A personal finance dashboard that imports real bank data

Built in 2 weeks
Next.jsTypeScriptRechartsClaude APISupabase

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.