Privacy-first Android expense tracker. Import PhonePe / GPay / bank payment screenshots and bank SMS. Your data stays on your phone — no cloud account, no server required.
- Download the latest APK from Releases.
- On your phone, open the file and allow Install unknown apps if Android asks.
- Open Spentd → create a username and 6-digit passcode.
Spentd requests SMS permission so it can read payment alerts. Apps outside the Play Store often trigger a warning:
- Choose More details → Install anyway when offered, or
- Temporarily turn off Scan apps with Play Protect, install, then turn it back on.
| Goal | What to do |
|---|---|
| Unlock later | Enter your 6-digit passcode (username is remembered) |
| Import bank SMS | Grant SMS when asked, or turn on SMS auto-import in Settings |
| Import a screenshot | Import → pick a payment screenshot |
| Forgot passcode | On the lock screen → recovery → unlock with phone lock / biometrics → set a new PIN or wipe data |
- On-device only — expenses live in an encrypted vault on your phone; works offline
- Screenshot import — OCR for UPI / bank payment screenshots
- SMS import — parse bank and UPI alerts (with review before saving)
- Search & filters — find expenses by merchant, amount, category, source, date
- Smart categories — optional server inference (
spentd-api) plus on-device rules; when you fix a category, Spentd remembers it for that merchant - Payment notifications — after auto-import, confirm the guessed category with Yes or open the app to pick another
- Budgets & cash — monthly limits and cash / account balances
- Export — share history as CSV or JSON
- Themes — system, light, or dark
- Passcode unlocks a local vault; the PIN is not stored in plain text
- No cloud login — there is nothing to “reset password” for remotely
- Screenshots and SMS stay on the device
- Leaving the app locks it again (so others can’t open your ledger)
Need: Node.js 20+, and an Android phone or emulator.
git clone https://github.com/srineshr1/Paymenttracker.git
cd Paymenttracker
npm install
npm run build -w @paymenttracker/shared
npm run mobileThen press a for an emulator, or scan the QR with Expo Go.
Expo Go limits: no SMS inbox, slower screenshot OCR. Full SMS + fast OCR need a native build (below).
npm run mobile:android
# or:
cd apps/mobile && npx expo run:androidThis builds Spentd as a real app on the device/emulator (SMS + ML Kit work).
apps/mobile Spentd (Expo / React Native) — local-first app
packages/shared Shared types + payment / SMS parsers
There is no backend in this repository. The optional sync API lives separately at
~/Projects/spentd-api (not required for the app).
More detail for contributors: CONTRIBUTING.md.
Does this send my expenses to a server?
No. The shipped app stores everything on the device.
Why does it need SMS permission?
Only to read payment-related messages you choose to import. You can use screenshots or manual entry without SMS.
Can I use it without installing the APK?
You can run the JS app in Expo Go for a limited demo, but SMS import will not work. Prefer the release APK.
Is there a cloud API?
An optional server lives at ~/Projects/spentd-api. The app can call POST /categories/infer for category suggestions when EXPO_PUBLIC_API_URL is set; expenses and passcodes stay on-device. Without the URL, categorization uses the same rules offline.
I want to contribute
See CONTRIBUTING.md, Code of Conduct, and Security. Changelog: CHANGELOG.md.
MIT © 2026 Srinesh R