CashFlow

A production-ready React Native fintech app with 20+ features including AI receipt OCR, budget analytics, bill reminders, subscription tracking, and an offline-first data layer.

React NativeTypeScriptExpoZustandOpenAISupabaseSQLite

The Problem

Personal finance apps either lock essential features behind subscriptions or require constant internet connectivity. I wanted a comprehensive money management tool that works offline-first — capturing expenses on the subway, syncing when back online — with AI-powered receipt scanning to eliminate manual data entry.

The Solution

I built CashFlow as a React Native app with Expo, featuring 20+ financial management capabilities.

  • AI receipt OCR — Snap a photo of any receipt and OpenAI extracts the merchant, amount, date, and category automatically.
  • Budget analytics — Visual breakdowns of spending by category, time period, and trend analysis.
  • Bill reminders and subscription tracking — Recurring expense monitoring with notification alerts.
  • Savings gamification — Goal-based savings with progress tracking and milestone rewards.
  • Offline-first data layer — SQLite for local persistence with Zustand for state management. Full CRUD operations work without internet.

What Went Wrong

The offline-online sync was the hardest problem. When a user edits an expense offline on their phone and also edits it on another device, the sync produces a conflict. The initial implementation used "last write wins," which silently dropped edits.

The fix: I implemented a conflict resolution strategy with vector clocks on each record. During sync, conflicting records are detected and merged field-by-field (later timestamp wins per field, not per record). A batch sync queue accumulates offline changes and replays them in order during reconnection, ensuring zero data loss across devices.

Results

  • 20+ features in a single cohesive app
  • Offline-first with zero data loss across devices
  • CRUD for 12+ entity types with conflict resolution
  • Batch sync queues for seamless cross-device usage

Interested in working together?

Let's Talk