
SaveYoRupeePersonal Finance and Expense Tracker
Double-entry rigour and AI receipt capture in a mobile-first tracker.
Mobile-first personal finance platform covering income, expenses, budgets, recurring payments, savings goals, dues, repayments, and financial milestones.
What I built
- Account-based ledger with transfers, balance snapshots, monthly reconciliation, immutable audit records, and transaction ownership controls
- AI-assisted receipt scanner that extracts and categorises transaction splits, requiring user review before atomic persistence
- Secure receipt storage using short-lived upload tokens, private Supabase Storage, file validation, and automatic stripping of image EXIF and location metadata
- CSV import/export, validated full-account backup and restore, monthly PDF reports, privacy controls, and multi-currency display
- Location-aware spending built on MapLibre and OpenStreetMap: Kathmandu-bounded place search, saved locations, clustered transactions, and spending trends
- Financial calculators for budget allocation, emergency funds, debt payoff, and savings planning, using minor-unit arithmetic to avoid floating-point error
- Database-backed auth, password recovery, session management, per-user authorization, and password-protected privacy controls
- Nepali calendar support, plus bank SMS processing that turns transaction alerts into entries the user reviews before saving
Stack
- Next.js 16
- React 19
- TypeScript
- Prisma
- PostgreSQL
- Supabase
- Gemini
- Better Auth
- Zod
- React Hook Form
- Recharts
- MapLibre
- Vitest
Case study
The problem
Most finance apps assume Gregorian dates, dollars, and bank APIs. In Nepal, money shows up as SMS alerts from dozens of banks and wallets, the fiscal year runs Shrawan to Ashadh, and the biggest spending spikes are Dashain and Tihar. I wanted a tracker that works in that world and still keeps books I can trust.
What I built
- Bikram Sambat dates throughout, a Shrawan-to-Ashadh fiscal year, and Dashain and Tihar spending comparisons
- One-paste capture for bank and wallet SMS, plus receipt photos that Gemini splits into line items
- Accounts, transfers, dues, budgets, recurring entries, and savings goals, with money stored as integer minor units
- Monthly reconciliation that locks a month once its balance is approved, plus validated CSV backup and restore
How an entry moves through it
- 01CaptureSMS paste, receipt photo, or manual entry
- 02ParseOn-device parser first, Gemini only as a fallback
- 03ReviewLow-confidence fields wait for a person
- 04SaveOne database transaction, safe to retry
- 05ReconcileApproved months lock
What was hard
Books that stay right after the fact
Balances are a snapshot plus the activity since. Approving a reconciliation runs in a Serializable transaction that recomputes the expected balance, records any adjustment (a non-zero one needs a note), writes the audit row, and moves the snapshot forward. Any edit that would touch a reconciled month is rejected.
AI that never writes on its own
Gemini returns a schema-shaped split of the receipt, but nothing is saved until the user reviews it. The server then re-checks that the splits add up to the total, that categories and accounts belong to the user, and that the uploaded file exists, and writes the scan and every split in one transaction. A retry that collides on the stored file path counts as already saved, so a double tap cannot duplicate expenses.
Reading bank SMS without trusting it
An on-device parser pulls out amount, direction, date, merchant, account ending, and balance, and understands NPR, Rs, and रू. Confidence starts at 0.5 and climbs with each field it recovers; anything under 0.6 goes to review. Gemini is only asked when nothing on the device can read the message.
Receipts that do not reveal where you were
Photos are redrawn through a canvas into a fresh JPEG, which drops EXIF and GPS data before upload. Files go to a private Supabase bucket through short-lived signed URLs scoped to the user’s own folder, capped at 3 MB.
Result
- 256
- automated tests across 37 Vitest files
- 24
- data models behind 19 API routes
- 40
- banks and wallets in the account picker
- 11 wk
- built solo, July to September 2026
Live and public. Every way money enters the app, whether pasted, photographed, or typed, ends up in the same reviewed, reconcilable ledger.