Masareef (مصاريف, "expenses") is a fast, private, offline-first personal spending tracker — global and multi-currency — with wallets, budgets, insights, subscriptions, trips and a bank-notification auto-capture engine that logs spending by itself, even while the app is closed. Built with Expo SDK 57, React Native 0.86, a local SQLite source of truth, and last-write-wins sync against a Cloudflare Workers API. English and full Arabic with a right-to-left layout.
Masareef (مصاريف) is Egyptian Arabic for expenses. The goal: see where your money goes without the friction of most finance apps — log spending in seconds, let bank notifications fill in the rest, and never fight the tool.
Download
Masareef is live on Google Play — Android-first, global and multi-currency, in light and dark, and fully localized in Arabic with a right-to-left layout.
Privacy Policy · Delete your account
Screens
A tour of Masareef. Sixteen screens, covering every area of the app.
| Home | Activity |
|---|---|
![]() |
![]() |
| Auto-track | How it works |
![]() |
![]() |
| Where it went | Trends |
![]() |
![]() |
| Budgets | Cash flow |
![]() |
![]() |
| Nearby ATMs | Wallets |
![]() |
![]() |
| Quick add | Add |
![]() |
![]() |
| Subscriptions | Recurring |
![]() |
![]() |
| Worth a look | Habits |
![]() |
![]() |
Why Masareef
Most finance apps make you fight for every entry, then ask you to trust the cloud with your raw transactions. Masareef flips both: logging is a couple of taps, your bank's own notifications do the data entry, and everything lives on your device first.
- Offline-first, instant — a local SQLite database is the single source of truth, so every read and write is immediate and works with no signal. Cloud sync is a best-effort background reconciler, never a blocker.
- Auto-capture, not auto-trust — Masareef parses a bank notification or SMS into amount, merchant, bank, card tail and reference, and lands it in a review queue. High-confidence captures can post on their own with one-tap undo; nothing else touches a balance until you confirm.
- Privacy by design — an optional app lock, hidden contents in the app switcher, a one-tap Hide balances mask, and analytics that never carry amounts, merchants, or balances — structural events only.
- Polished in light & dark, English & Arabic — a "Slate Teal" identity in both themes, and a full right-to-left layout where every screen mirrors.
Features
Automatic spending capture
- A notification-listener bridge (Play-safe) plus an optional SMS parser reads payment alerts from banks and wallets across many countries
- Card payments, transfers, top-ups, ATM withdrawals and incoming money, each routed to the right wallet by name
- Keeps capturing while the app is closed — a headless task can parse, accept and notify with nothing on screen
- Recovers alerts Android redacts or hides, in every language, and says why a message went to review instead of posting
- A bank-only allowlist gate plus word-bounded Arabic-aware matching, so an OTP, a promo, or a customer named مبروك never becomes (or deletes) a transaction
- Reference-based dedupe: one bank SMS relayed by three apps is one transaction, not three
- Learns merchant → category rules as you confirm, and auto-categorizes on the next match
Add in seconds
- A purpose-built numpad with categories, wallets, notes and any date, for expense, income or transfer
- Or just type it: "spent 250 coffee", in English or Arabic, posts instantly
- Reply straight from the notification to log without opening the app; paste or share a bank message in; attach a receipt photo
- Money is stored as integer minor units end to end — never floats — and rendered through one formatting path
Wallets & multi-currency
- Cash, bank accounts, cards and mobile wallets side by side, each with its own balance, colour and history
- Pick any country and currency and the app adapts symbols, formatting and the banks it recognizes
- Net worth across every wallet, with a trend for recent months
- Count your cash reconciles the notes in your pocket; balance check compares your bank's own figure and shows the drift
Budgets & planning
- Per-category monthly limits with on-track, near-limit and over states, and optional alerts before one tips over
- A monthly spending target that answers what is safe to spend today
- Cash flow that answers whether the balance lasts to payday, not just to month end
- A coming up list of everything scheduled in the next 30 days
Subscriptions, bills & debts
- Subscriptions detected from your own history, with brand logos and yearly cost; overdue and price-raised ones flagged
- Recurring rent, salary and bills that post on schedule, with catch-up, pause and skip
- Planned one-off income or expense held pending until you confirm it
- Debts you owe or are owed, and savings goals
Insights
- Where it went: a donut ranking every category, tappable straight through to its transactions
- Income vs. expense over six months, this month vs. last, and your biggest movers
- Spending calendar heatmap, day-of-week and time-of-day patterns
- Savings rate, financial health, and the share of spending that logged itself
- Price creep on your regular buys, no-spend streaks, top merchants, and a shareable money-story recap
Catch mistakes
- Double charges — the same amount hitting the same merchant twice
- Refunds matched back to the purchase they reversed
- Charges above what a merchant normally costs you
Trips & ATMs
- Track a trip in its own currency and exchange rate, without polluting your normal months
- Find cash machines around you on a map or list, sorted by distance, filtered by bank or exchange (keyless Overpass)
Backup & sync
- Sign in and your wallets, transactions, budgets, categories and trips follow you to a new phone
- Fully offline-first: edits happen locally and instantly, then reconcile in the background (last-write-wins by timestamp)
- Two clocks kept separate — a client clock decides who wins, a server cursor decides what's new — so sync is immune to device clock skew; deletes propagate as tombstones and the network layer never throws
- CSV export and a full JSON backup/restore (file pick, paste, or share intent)
How it's built
Offline-first by design: the local SQLite database is the single source of truth for the UI, so every read and write is instant and works with no signal. Derived answers — totals, pace, runway, habits — come from a dedicated ledger layer that returns answers rather than rows, so no screen recomputes the same aggregate twice.
Cloud sync runs as a best-effort background reconciler against a Cloudflare Workers API (Hono + Drizzle over Neon Postgres, with D1 for the small hot tables): local changes are flagged and pushed, remote changes pulled page by page, and conflicts resolve last-write-wins by timestamp. Session lives in SecureStore via better-auth + @better-auth/expo, and key derivation runs on the device.
Auto-track is the part that can silently lose money, so it is the most defended piece of the app: a durable native spool that survives the process being killed, a bank-only allowlist, word-bounded matching for the Arabic drop markers, reference-based dedupe, and a trace log that records why any message was dropped or held.
Tech stack
| Layer | Choice |
|---|---|
| Framework | Expo SDK 57 + Expo Router (typed routes, declarative auth guards) |
| Runtime | React Native 0.86 / React 19, React Compiler enabled |
| Language | TypeScript, strict mode |
| UI | NativeWind 4 (Tailwind) + a dual light/dark palette (usePalette()) |
| Client state | Zustand, persisted to MMKV |
| Local data | expo-sqlite — source of truth, offline-first |
| Cloud sync | custom last-write-wins engine over a typed pull/push contract |
| Backend | Cloudflare Workers + Hono + Drizzle · Neon (Postgres) + D1 |
| Server state | TanStack Query |
| Auth | better-auth + @better-auth/expo (session in SecureStore, Google Sign-In) |
| Auto-track | notification-listener bridge (Play-safe) + SMS parser + native spool |
| Maps | MapLibre + keyless Overpass for the ATM finder |
| Animation | react-native-reanimated · SVG via react-native-svg |
| Icons | lucide-react-native |
| i18n | i18next / react-i18next — English + Arabic with RTL |
| Analytics | PostHog (privacy-safe — no amounts, merchants, or balances) |
Non-negotiables
- Offline-first. The local SQLite DB is the source of truth; the app is fully usable with no connection and sync is never a blocker.
- Money is integer minor units. Never floats, end to end — one formatting path renders every amount.
- Auto-capture never silently loses a transaction. A dropped capture is the one outcome a user can't recover, so every drop rule is word-bounded, traced, and covered by a "never miss a real transaction" test.
- Analytics carry no financial data. Structural events only — never amounts, merchants, or balances.

















