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.
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
- CSV import for bulk transaction history
- Auto-categorisation rules that learn from corrections
- Account management across multiple sources
- Bulk categorisation flows for cleaning up backlog
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.