Balboa Finance
Personal financial assistant. Ingests credit card statements from Gmail, captures physical receipts via Claude Vision, categorizes across 11 fixed spending buckets, and surfaces pending transactions for one-tap confirmation before anything gets persisted.
What it does
- Hourly Gmail poll picks up credit card PDF statements via Gmail API + OAuth2 and extracts transactions with pdf-parse
- Camera screen captures physical receipts — Claude Vision reads merchant, amount, date, and suggests a category
- Every extracted transaction lands in a Pending inbox: review, edit, or reject before anything gets written
- One-tap confirmation persists the finalized transaction to the database
- Chat tab answers spending questions in natural language — "how much did I spend on restaurants this month?" — with streaming responses
- Weekly and billing-cycle analysis shows spending by category, top merchants, and period-over-period movement
- 11 fixed spending categories (Supermercado, Restaurante, Transporte, Salud, Entretenimiento, Ropa, Hogar, Educacion, Servicios, Viajes, Otro) — Claude classifies, the user confirms
Why it matters
- Replaces a fragile n8n prototype that carried a dual-write risk — the rewrite eliminated that failure mode before it ever reached the permanent record
- Zero manual categorization per transaction — Claude classifies, the user confirms in one tap; the full review loop takes under 5 seconds per transaction
- Physical receipt capture closes the gap that bank-statement-only tools miss — in Panama, a significant share of everyday spending (restaurants, local markets, transport) never appears in a card statement
Architecture
- Expo monorepo: mobile app (React Native + NativeWind + Expo Router v4) and API (Next.js 15 on Vercel) share types via a `packages/shared` workspace package
- Supabase stores operational state — pending transactions, dedup log, learned merchants, billing cycles
- GitHub Actions runs the hourly Gmail poll cron — the cron secret can queue transactions but cannot write to the database; only the DEVICE_TOKEN-authenticated confirm endpoint can
- Claude Sonnet 4.6 handles both receipt OCR (vision) and conversational queries (streaming); the 11 categories are injected as the only valid classifier outputs so Claude cannot invent new ones
- Replaces a fragile n8n prototype: every integration has a first-class Node SDK; n8n was adding complexity, not capability, and carried a dual-write risk that could not be silently rolled back
Philosophy
- The confirmation invariant is the first principle: zero writes to the permanent record without an explicit user tap. The cron, the classifier, the OCR — none of them can touch it
- Physical receipts matter in Panama more than most places — a lot of everyday spending never lands in a bank statement
- Expo
- React Native
- Next.js
- Claude API
- Notion API
- Supabase
- Gmail API