Skip the intro
SpendPot

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

  1. Allowlist filter
  2. Persist raw
  3. Exclusion scan
  4. Rule pack
  5. Merchant normalisation
  6. Confidence score
  7. Deduplication
  8. 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
Committed automaticallyScore 80 or above. It appears in your ledger without asking you anything.

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

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 build

A broadcast receiver catches transaction alerts as they arrive, and a one-time backfill reads the inbox you already have.

Bank-app notifications

Both builds

A 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.