Advanced Finance Tracker — offline-first personal finance app
An offline-first personal finance app built with Expo React Native and SQLite on the device, plus a NestJS and PostgreSQL API for multi-device sync.
The problem
Most finance apps keep the user's ledger only in the cloud, so the app is slow without a connection and the data depends on a remote server.
Advanced Finance Tracker keeps the ledger on the phone and treats the cloud as an optional sync target.
Architecture and approach
- Mobile client in React Native with Expo and Expo Router, storing every record in an embedded SQLite database with schema migrations.
- NestJS API with Prisma and PostgreSQL acting as the sync engine for multiple devices, with offline change queuing.
- pnpm monorepo with shared packages for TypeScript types, Zod validation schemas, a typed API client and configuration.
Key features
- Accounts (bank, cash, cards, savings), multi-currency balances and transfers between accounts.
- Income/expense ledger with recurring rules, budgets per category and savings goals.
- Lending and borrowing tracking.
- Scoped soft-deletion (month, year or all-time) that propagates through sync.
Engineering decisions
- Money is handled as integer/scaled-decimal strings rather than floating point, so totals never accumulate rounding errors.
- Deletions are soft-delete tombstones (deleted_at) that sync to the server, so a record deleted on one device cannot be resurrected by another device's sync.
- Parameterised SQL everywhere on the device database.
Technology stack
- Mobile
- React Native
- Expo
- Expo Router
- TypeScript
- SQLite (expo-sqlite)
- Backend
- NestJS
- Prisma
- PostgreSQL
- Redis
- Tooling
- pnpm workspaces
- Zod
- Jest
- ESLint