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.

Advanced Finance Tracker — project screenshot

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