Skip to content
Live — Shipped and running in production2026

Solo build

Three readings
Client
A personal finance tracker for Pakistan that you never have to type into: it reads the SMS your bank already sends, files each transaction, and only asks when it genuinely does not know.
Recruiter
Solo build across web and mobile: a Vite and React 19 PWA and an Expo Android app sharing one TypeScript core, on Supabase with row-level security, plus a native Kotlin SMS capture module and over-the-air updates.
Engineer
There is no bespoke API: both apps talk to Postgres directly behind row-level security, and bank SMS reach one ingest function through a native receiver, a notification-listener fallback and a retry queue.

What it does

  • Spending logged automatically from the bank SMS you already receive
  • Transactions categorised from what you have taught it, with a review inbox for anything new
  • Installable on the web, with a native Android app
  • Multi-user, with every person's data private to them

Under the hood

  • An npm-workspaces monorepo: the PWA and the Android app share one core — types, money handling, the Supabase client and the whole React Query data layer
  • Android capture through a manifest-registered SMS receiver, a notification-listener fallback and a WorkManager retry queue, all posting to one Edge Function
  • Money stored as numeric(14,2), always positive, with direction taken from the transaction type — never a signed float
  • iOS has no SMS API, so capture there is deliberately manual rather than faked

Built with

  • React 19
  • TypeScript
  • Vite PWA
  • Expo (React Native)
  • Kotlin
  • Supabase
  • PostgreSQL
  • Row-Level Security
  • React Query
  • EAS Update

Signal path

architecture
SMSPOSTofflineunsuresyncBank SMSevery transactionAndroid appKotlin receiverRetry queueWorkManagersms-ingestcategorisesSupabaseRLS · per userReview inboxonly the unknownsWeb PWAinstallable