Elliot Seeds

Note

A daily budget from Monzo

I built a finance dashboard and a daily phone notification to change how I spend, then gave my assistant the data to ask better questions.

Abstract editorial line artwork for “A daily budget from Monzo”. Decorative cover, no text.

Every morning, a Pushover notification puts my safe spending amount on my lock screen. Underneath, it shows how long until payday, what I spent yesterday and where it went. I built a dashboard too, but the phone message is the part I actually use every day.

I built it because I was spending more than I thought, then topping up my current account to make the month work. Monzo showed me every transaction, but checking my balance didn’t tell me whether I could keep spending at the same rate. By the time I’d worked that out, the money was already gone.

The app takes Monzo’s live spreadsheet export, sets aside upcoming bills and a buffer I don’t want to touch, and spreads what’s left across the days until payday. I started with reports by email but worried I’d stop reading them. So I made the daily Pushover alert lead with the one number I needed, with yesterday’s spending and top merchants underneath. It reaches me before I make the next decision. If yesterday was expensive, today’s allowance makes that visible without my having to open a spreadsheet. It helped me stop treating a healthy-looking balance as permission to spend it.

The safe-spend calculation with illustrative figures: a £1,200 balance less £400 held back and £250 of bills leaves £550, or £36.67 a day over 15 days.

Once I had the daily number, I wanted to know what would happen if I kept spending at the same pace. I exposed the transaction database through a read-only MCP server, so I can ask Hermes or Cursor how this week compares with earlier weeks, whether that pace will last until payday, and which merchants are driving a category. One useful question was whether a bigger Monday grocery shop actually mattered if I spent nothing on Sunday. Looking at the whole week, rather than judging one transaction, gave me an answer I could use. The same comparisons made it harder to wave away what I was spending on nights out and eating out.

There was a less glamorous side to getting that feedback loop working. The first version reserved a bill that had already been paid and made the daily allowance look worse than it was. Refunds and corrected transactions could also leave the dashboard’s balance out of step with Monzo. If I was going to change my spending based on a number on my lock screen, I had to trust it. Much of the work with Cursor went into reconciling the import, separating fixed bills and transfers from discretionary spending, and testing the awkward pay periods that don’t line up with calendar months.

It’s a small self-hosted FastAPI and Postgres app in Docker. It reads Monzo’s paid live-sheet export rather than using a bank API, and it can’t move money. The code is on GitHub; my transactions aren’t. I now see my limit before I spend and can ask why it moved. That’s helped me get the overspending under control.

All notes