Offline-first · Android
Your spending,
without the typing.
Your bank already texts you for every rupee that moves. SpendPot reads those alerts on your phone, turns them into a categorised ledger, and shows you where the money actually went — starting with the six months you already have.
- No internet permission
- No account, no cloud
- Android 8.0 and up
01 / The problem
You know what you earn.
You have no idea where it goes.
The data is already on your phone. Every UPI payment, card swipe, ATM withdrawal, salary credit and EMI debit arrives as a message you have already been sent — sitting in your inbox, unstructured and unusable.
Manual entry apps
Abandoned in two to three weeks
Logging every coffee is a second job. The app survives exactly as long as the enthusiasm does.
Account aggregators
Want your bank credentials
They ask for a login or a consent flow before they show you anything. Most people close the tab, and they are right to.
Cloud auto-trackers
Your history lives on their server
They read the same messages SpendPot does — and then upload the results. Every rupee you have ever spent, on someone else’s machine.
SpendPot takes the fourth option: read the messages, keep the answers, and never have the ability to send them anywhere.
02 / The ledger
A month, answered
in one screen.
The dashboard opens on the single figure you came to check, then explains it: what you received, what is left, which categories moved, and what is still waiting for you to confirm.
Total spent · August 2026
₹48,240
₹6,180 less than last month (down 11%)
- Received
- ₹62,500
- Left over
- ₹14,260
- Savings rate
- 23%
Top categories
- Rent₹18,00037%
- Food & Dining₹9,46020%
- Groceries₹6,24013%
- Transport₹4,1809%
- Subscriptions₹2,8906%
- Shopping₹2,3405%
What came in
Salary, refunds, cashback, money from people — separated from spend, not netted against it.
What went out
Twenty categories out of the box, sub-categories one level deep, and any of your own.
What is left
Left over, or short by. Plus a savings rate, and what the month before looked like.
How it moved
Trends over six and twelve months, top merchants, and which day of the week costs you most.
03 / The engine
Eight steps between a text message and a number you can trust.
Every message below is taken verbatim from SpendPot’s own parser corpus — the labelled set that was written before the rules, so it could not be tuned to them. Two of them are meant to be thrown away.
Incoming
Pipeline
- Allowlist filter
- Persist raw
- Exclusion scan
- Rule pack
- Merchant normalisation
- Confidence score
- Deduplication
- Categorisation
Sender and package are checked natively first. Indian DLT headers vary by telecom circle, so the match is on the six-character entity code — VM-HDFCBK and AD-HDFCBK are the same bank.
- amount
- ₹499.00
- direction
- DEBIT
- merchant
- Swiggy
- instrument
- Bank account ••1234
- category
- Food & Dining
- reference
- 123456789012
Confidence
0
- Sender on allowlist+30
- Amount extracted+25
- Direction determined+20
- Last-4 matched to an account+15
- Merchant extracted+10
When a bank changes its message format, the score drops and the transaction lands in the review queue instead of disappearing. Confirming it once writes a local rule, and the next message like it parses on its own.
04 / The pot
What is left over
stops being a surprise.
Every month SpendPot computes the same three numbers the same way: what came in, what actually moved, and what stayed. Transfers between two of your own accounts are detected and excluded, so moving money to savings never reads as spending it.
Kept this month
₹14,260
23% of ₹62,500 received
Drag the pot to turn it
Six months
- Mar
- Apr
- May
- Jun
- Jul
- Aug
KeptSpent
Illustrative figures. On your phone these come from your own messages, and nothing about them is ever sent anywhere.
05 / What it does
Ten things it does, and nothing it pretends to.
Every item here is built and shipping. The requirement each one answers is printed beside it, because a feature list is only worth reading if it can be checked.
Bank SMS
Direct APK buildA broadcast receiver catches transaction alerts as they arrive, and a one-time backfill reads the inbox you already have.
Bank-app notifications
Both buildsA notification listener reads alerts from a fixed allowlist of bank, wallet and UPI apps. Only the title and text cross the bridge — everything else is discarded natively.
- PRD §5.1
Capture that never asks you to type
SMS and the notification listener run in parallel and deduplicate against each other, so coverage holds even when one channel is unavailable.
- ON-5, ON-6
Six months of history in the first minute
Choose 3, 6 or 12 months — or everything. The backfill runs on a native thread with live counters, and resumes from its cursor if it is interrupted.
- RQ-1 … RQ-4
A review queue instead of silent mistakes
A parse it is unsure of is held, shown beside the original message, and never counted in a total until you confirm it. Confirming teaches it the sender.
- PRD §5.8, F-3
Every correction becomes a rule
Rename a merchant or move a category once and SpendPot writes a local override that outranks anything bundled — and offers to apply it to the transactions you already have.
- AC-1 … AC-10
Accounts and cards it finds by itself
Instruments are discovered from the last-4 digits in your messages. Credit cards carry a billing cycle, outstanding and utilisation; transfers between two of your own accounts are detected and excluded from spend.
- BG-1 … BG-8
Budgets that follow your salary date
Per category or overall, monthly or weekly, with a custom cycle start day. Thresholds at 50, 80 and 100 percent fire as local notifications the moment ingestion crosses them.
- RC-1 … RC-8
Subscriptions you had forgotten about
Repeating charges are detected from interval clustering and amount variance, with the next expected date, the total paid so far, and a flag when the price moves more than ten percent.
- RP-1 … RP-9
Reports, and insights that stay quiet
Savings rate, month-over-month category deltas, six and twelve month trends, top merchants, day-of-week patterns — plus insight cards that only appear when something genuinely changed.
- SC-1 … SC-9
Encrypted at rest, locked on your terms
SQLCipher with a 256-bit key wrapped by Android’s hardware keystore, a PIN with optional biometric unlock, configurable auto-lock, and FLAG_SECURE so the app switcher shows nothing.
- BK-1 … BK-6
Your data, in formats you own
An encrypted local backup with its own passphrase, CSV export with column selection, a PDF monthly statement, and CSV import for migrating in.
All of it works with the phone in aeroplane mode.
There is no step where SpendPot needs a network, because there is no step where it could use one.
06 / The guarantee
It cannot phone home.
The release APK is built without android.permission.INTERNET. There is no account, no sync and no server, because there is no socket to open one with. This is not a policy you have to trust — it is a capability the binary does not have.
No internet permission
Omitted from the release manifest entirely. It costs the app OTA updates and crash reporting; both were traded away on purpose.
No account, no cloud
Nothing to sign up for. Your ledger exists on exactly one device.
Messages from people are never read
Only senders on the bank allowlist are looked at, and only notifications from a fixed list of banking packages.
Android Auto Backup is disabled
Left on, it would quietly copy the database to Google Drive. The manifest sets allowBackup to false.
Every permission is listed in the app
Settings → Privacy names each one and what it accesses, including the two inherited from Android support libraries.
Deleting means deleting
Erase all data destroys the encryption key with it. There is no copy anywhere else.
Check it yourself
npm run verify:no-internet
Reads the merged release manifest (or a built APK) and fails on INTERNET, ACCESS_NETWORK_STATE, ACCESS_WIFI_STATE, WAKE_LOCK, RECORD_AUDIO, SYSTEM_ALERT_WINDOW or c2dm.RECEIVE — and on Android Auto Backup being enabled.
npm run verify:deps
Audits every dependency, transitive ones included, for network capability. A package that can open a socket cannot enter the build.
The cost of this is real and worth naming: no over-the-air updates, and no crash reporting. Fixes ship as a new build, and crashes are written to a local log you can read in Settings → Diagnostics.
07 / Inside the app
Five screens, doing the work.
DB-1 … DB-8
The one figure you opened the app for
Total spent for the month, what it was last month, what came in, and what is left — then the categories, the budgets and anything waiting to be reviewed.
Rendered live from the app’s own tokens and copy. Figures are illustrative.
08 / Get it
Put your money
on the map.
Grant one permission once, and the last six months of your spending are waiting for you before you have typed anything.
Direct APK
Downloaded from the site- Capture
- SMS and notifications
- Backfill
- Available
Full coverage — every bank SMS your phone receives.
Play build
Google Play- Capture
- Notifications only
- Backfill
- Not available
READ_SMS is a restricted permission and expense tracking is not an approved use case, so this build never asks for it — and never shows SMS screens.