Building Ledgerly: why I self-host my own finance tracker

Every mainstream budgeting app asks for the same thing: bank credentials, transaction history, and trust that a third party will handle both responsibly forever. I didn't want to make that trade. So I built Ledgerly — a personal finance tracker that runs entirely on hardware I own.

It's not a startup. It's a Docker Compose stack on my Proxmox homelab: self-hosted Supabase for auth and storage, Next.js for the app itself, and a Tesseract + Ollama OCR pipeline for reading receipts.

Advertisement
[ AdSense unit renders here once approved ]

The part that actually took the longest

Not the OCR. Not the UI. Authentication and deployment. Getting a self-hosted Supabase instance to behave the same way hosted Supabase does — correct RLS policies, working auth flows, a deploy pipeline that didn't need babysitting — took far longer than building the features on top of it.

That's the tax you pay for self-hosting: the boring infrastructure work has to be done by you, because there's no managed layer smoothing it over. Once it was solid, though, everything after it moved fast.

What's working now

Advertisement
[ AdSense unit renders here once approved ]

Why bother, when the free apps exist

Because the actual cost of a free finance app isn't zero — it's your transaction history sitting on someone else's servers, subject to their retention policy, their outages, their eventual pivot to a paid tier. Self-hosting means the trade-off is visible and mine to make, instead of buried in a terms-of-service update.

It also means I get to shape the tool around how I actually think about money, instead of how a product team decided most users think about money. That's the real payoff — not privacy as an abstraction, but software that fits.