burr1to.

~/work/saveyorupee

SaveYoRupee

SaveYoRupee cover

Live productJul 2026 to PresentPersonal project · Remote

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

  1. 01CaptureSMS paste, receipt photo, or manual entry
  2. 02ParseOn-device parser first, Gemini only as a fallback
  3. 03ReviewLow-confidence fields wait for a person
  4. 04SaveOne database transaction, safe to retry
  5. 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.