I wanted a monthly view of where my money was going. Every finance app that offers this wants bank credentials, a linked account, or an uploaded statement sitting on somebody else's server. For something as sensitive as a full transaction history, that trade felt backwards — so I wrote the smallest pipeline that could do the job locally instead.

The shape of it

The bank statement comes as a PDF. The pipeline is a short chain of steps:

Everything happens on my own machine. Nothing gets uploaded anywhere, which was the entire point of building it instead of using something off the shelf.

The categories that needed correcting

The first pass at categorization was too coarse. "Food" as a single bucket hid a distinction that actually mattered to me — restaurant spending and grocery spending have completely different levers to pull if I want to change either one. Splitting food into two named sub-categories made the monthly summary immediately more useful, instead of just producing a bigger number with less meaning behind it.

The other correction was a one-off: a large legal and notary transfer had landed in a generic "other" bucket and skewed an entire month's summary. Reclassifying it into its own category kept it from distorting the trend lines for everything else.

Why plain text

The output is deliberately plain-text and easy to skim on a phone — I wanted to be able to glance at a monthly summary the same way I'd read a message, not open a spreadsheet or a dashboard. A short summary with a few emoji as visual anchors for each category turned out to be more useful day to day than any chart would have been.

The best interface for a personal tool is the one you'll actually open every month.

It's not a product, and it was never meant to be — just a pipeline that answers one question honestly, without asking me to hand my transaction history to anyone else to do it.