AI

The budget dashboard I promised you three years ago

· 3 min read
The budget dashboard I promised you three years ago

In November 2021, I wrote a post about leaving YNAB. Near the end of it I made two promises: that I'd write properly about Buckets once I'd settled on it, and that I'd "branch into Power BI" to keep the historical analysis I was nervous about losing when I left.

I kept neither promise. For five years.

This is me keeping the second one. It just isn't in Power BI.

What I was actually afraid of losing

The thing that made me hesitate about leaving YNAB wasn't the budgeting. By then I'd internalised the lessons — envelope budgeting, accruing for the big annual bills, paying the cards in full — which was rather the point: once you've learnt the fundamentals, you stop paying a subscription to be reminded of them.

What I didn't want to lose was the history. Years of categorised spending is a genuinely useful dataset, and budgeting tools are surprisingly bad at letting you interrogate it. They'll show you this month. They're far less interested in what your money has actually been doing over three years.

BudgetWithBuckets won me over for the day-to-day — a local file, no subscription, no cloud. But a .buckets file is really just a SQLite database in a trench coat, and a database with no questions asked of it is a waste of a database.

The one decision that mattered: read-only

So I built a dashboard that reads the Buckets file and never, ever writes to it.

That sounds like a small technical footnote. It's the whole design. The .buckets file is the single source of truth — Buckets owns it, I do my actual budgeting there, and the dashboard treats it as strictly read-only. Anything I want to layer on top — tidied-up payee names, a few classifications, notes — goes into a separate "sidecar" database alongside it. The original file is never touched. (I learned this the hard way once: edit the file underneath the app and you break the app's own sync. Once was enough.)

I'm fussy about this because I've watched home-grown tools rot, and they almost always rot the same way: the helpful little dashboard slowly becomes a second place where the truth lives, the two drift apart, and now you trust neither. A reporting layer should be downstream of your source of truth and powerless over it. If my dashboard caught fire tomorrow, my actual budget wouldn't notice.

What it gives me that YNAB never did

Net worth as a trend line, not just a number. A monthly narrative the dashboard writes for me in plain prose, so I actually read it. A money-flow diagram — income in on the left, out to each part of life on the right. A tracker for the UK £20k ISA allowance against the tax year, because that deadline has cost me before.

The one I didn't expect to lean on is the runway view. I've tagged every spending category as essential, important, or discretionary, so the dashboard can answer a question YNAB never could: if the money stopped coming in tomorrow, how long could we actually coast — and what would we have to give up, in what order, to stretch it? Seeing your spending sorted by how hard it would be to drop is a different and more honest picture than seeing it sorted by size.

None of it is rocket science. All of it is mine, answers the questions I care about, and costs me nothing a year.

The genuinely annoying bit

The hard part was never the charts. It was that "Tesco" is also TESCO STORES, TESCO PETROL, and three other spellings depending on the card terminal's mood. Real analysis dies on dirty data, and personal spending is filthy. So a good chunk of the work is a mapping in the sidecar — saying once that these six strings are all "Tesco" — plus a set of integrity checks that quietly flag the data when something doesn't reconcile. Unglamorous, and the difference between a chart and a chart you'd actually trust.

Three years late

In the 2021 post I said the real value of YNAB was the lessons, not the software — that once you've learnt the fundamentals, you don't need to keep renting them. I still think that's right. The natural endpoint of that argument is owning the analysis layer outright, and now I do.

It took a weekend, not a subscription. Sorry it's late.