Back

Money Check

Tech stack: Kotlin and Jetpack Compose on Android, SQLite on the phone, an Android accessibility service for the cart reader, and a Python receiver on my Mac that the phone syncs to over Wi-Fi. Built with Claude Code.

I knew I've been ordering a lot, I just didn't know how much. Apps that I tried in the past weren't giving me the accountability and granularity I was looking for to really incite a change. So, Claude and I got to work and whipped up an app that reads my bank SMS and works it out.

It's completely personalized for me. It knows my bank, the four apps I order most from, how much rent I pay and keeps me accountable.

The numbers it exposed have been eye opening to say the least, but it helped me get my act together.

01

Free guilt trips

Every payment I make comes as an SMS. The app reads it, labels it if it's obvious (Zomato = food delivery), and asks me if it's not.

Immediately when I open a cart on Zomato or Blinkit, before I pay, I get a notification. Cart total, where the week stands against the cap that I've set (8500), and a count of my repeat offenders. "4 soft drinks (21 this week)". 21. I can still proceed with the payment, I just feel bad about it now.

blinkitDelivery in 8 minutes · Home
8 items
Diet Coke Can300 ml
− 4 +₹200
Red Bull Sugar Free250 ml
− 2 +₹250
Amul Taaza Toned Milk500 ml
− 1 +₹34
Farm Eggs6 pieces
− 1 +₹60
Bill details
Items total₹544
Delivery charge₹25
Handling charge₹18
Grand total₹587
₹587Proceed to Pay ›
Money Check · now

This cart: ₹587 on Blinkit · 8 items

Takes this week to ₹3,574 of ₹8,500 (42%)

2 energy drinks (17 this week) · 4 soft drinks (21 this week)

02

The cart reader

The bank SMS only says ₹643 at Zomato. I wanted to know it was butter chicken and garlic naan at 11pm.

Delivery apps don't send receipts, so the app reads the screen instead. No screenshots, no recording. It uses the same access a screen reader for blind users gets, which is the text on the screen, and when a checkout page opens it picks out the items, quantities and prices from that text.

It doesn't care whose app it is. On Zomato, Blinkit, Zepto and Swiggy it kicks in on its own the moment the checkout opens. For everything else there's a Read cart button in the phone's quick settings, the pull-down toolbar next to Wi-Fi and torch. Open any cart, pull down, tap it, and it reads whatever is on screen.

When one of the apps redesigns its checkout I push a fix from my Mac over the next sync.

It's been wrong. It once logged my delivery address as an item, and another time it read the restaurant menu hiding behind Zomato's payment sheet as my order. Every one of those screens is now a test, 14 real ones from my phone.

Zomato Money Check
zomatoVasant Kunj · 15–20 mins
Flaming Chilli Pepper2 items · Your cart
Butter Chicken (boneless)Quarter · 4 pcs
−1+
₹560
Garlic Naan
−1+
₹155
Item total₹715
Delivery · platform fee · GST₹113.68
Coupon YUMMBITE200−₹185
To pay₹643.68
₹643.68TOTAL
Place Order
11:1578%
InternetHome Wi-Fi
BluetoothPixel Buds
Flashlight
Do Not Disturb
Read cartTap at checkout
Battery Saver
Reading this screen…
Money Check · now

Read 2 items · ₹643.68 on Zomato

Butter Chicken (boneless), Garlic Naan

11:1778%
Mon 19 Oct – Sun 25 Oct

This week

Delivery and quick commerce
₹2,987 of ₹8,500
35% · 6 orders₹5,513 left · 6 days to go
Today
ZomatoFood delivery · 11:16 pm · 2 items
₹643.68
ZeptoQuick commerce · 10:23 pm · 6 items
₹956
BlinkitQuick commerce · 2:45 pm · 4 items
₹412
HomeInsightsLabelsSettings
03

What you bought

Every item the cart reader picks up gets sorted into a group: energy drinks, soft drinks, protein bars, sweets, cat stuff, household and so on. The panel adds up each group for the current payday period, both how much I spent and how many I bought. That's what turns a pile of orders into habits I can actually see.

Tapping a group shows every purchase behind it, with the app and the date. That's how I found out that my soft drink spend is basically all Diet Coke from Zepto, bought every couple of days in packs of two or four, ₹2,694 since payday.

9:3378%
Mon 28 Sep – Tue 20 Oct · since payday

Insights

What you bought
From 63 carts read at checkout
⚡Energy drinks
₹5,06156 units
🍗Meat, eggs & dairy
₹3,64425 units
🥤Soft drinks
₹3,26065 units
🐱Cat
₹3,11631 units
💪Protein bars
₹1,76923 units
🧻Household
₹1,30918 units
🍔Food delivery
₹1,06543 units
HomeInsightsLabelsSettings
9:3378%
‹ Since payday · Mon 28 Sep – Tue 20 Oct

Soft drinks

65 bought · ₹3,260
🥤
4 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Sun 19 Oct
₹200
🥤
2 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Sat 18 Oct
₹100
🥤
2 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Tue 14 Oct
₹100
🥤
4 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Sat 11 Oct
₹200
🥤
2 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Thu 9 Oct
₹100
🥤
4 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Wed 8 Oct
₹200
🥤
2 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Tue 7 Oct
₹100
🥤
4 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Mon 6 Oct
₹200
🥤
4 × Diet Coke Can | Cola Sparkling Soft DrinkZepto · Sun 5 Oct
₹200
HomeInsightsLabelsSettings
Real purchases. The dates are from the carts, the prices from Zepto.
04

How Claude fixes it

The app syncs to my Mac over Wi-Fi every 30 min and after every payment, so Claude sees what I see. I complain in chat ("latest order still has wrong quantities and my address"), it reads the saved screen, fixes the parser, adds a test, builds, publishes. The phone installs it on the next sync. Data fixes show up in the app under "Changed by Claude" with an Undo button.

That's 25 versions in two days. The last few were because scrolling felt laggy. A CPU profile showed the app rebuilding its accessibility tree every frame because of its own cart reader, which 0.24 fixed.

9:3378%

Labels

Changed by Claude
Fixed this morning's Zomato order: 1 × Hummus & Za'atar Sandwich (you confirmed; the reader had taken the description lines as names)Tue 20 Oct, 8:40 am
Undo
Labelled ₹1,250 ZOMATO (Sat 17 Oct) as Eating outTue 20 Oct, 2:31 am
Undo
Added items for 57 past orders from ZomatoTue 20 Oct, 2:19 am
Undo
Fixed tonight's Zomato order: items were read off the menu behind the payment sheetMon 19 Oct, 11:24 pm
Undo
Fixed tonight's Zepto order: dropped the address and the suggestion card that were read as itemsMon 19 Oct, 11:15 pm
Undo
HomeInsightsLabelsSettings
Real entries from the log, 19 and 20 Oct.
05

Teaching it how I live

I gave it a dataset worth three months of statements and a few hundred SMS'es. Rent shows up as a ₹42,000 transfer with no name on it. Card bills get paid from savings on salary day, and it matches both sides so that doesn't count as spending. Salary is income, work pays for the AI subscriptions so those are excluded, and one-off stuff stays out of the averages.

Every time I answer a question, that answer shows up first next time. "Always label this like that" turns it into a rule, which I can see and delete under Labels.

6:4162%

Labels

To sort · 1
₹350 to 98XXXXXX21₹350
Thu 16 Oct, 6:40 pm · first payment to this number
FriendsEating outOther…
☐ Always label this number like this
Automatic rules
Landlord → RentAbout ₹42,000 around the 1st · you confirmed 1 Oct
›
ETERNAL → Zomato · Food deliveryBuilt in
›
KIRANAKART → Zepto · Quick commerceBuilt in
›
Card bill from savings → TransferPaired with the card's "payment received"
›
HomeInsightsLabelsSettings
Drawn in the app's style; the number is made up.