The renewal email from YNAB arrived in November wanting a hundred and nine dollars for the year, and I sat with it for a while because the method genuinely changed how I handle money and I did not want to leave, but the more I thought about what I was paying for, the stranger the deal looked. Envelope budgeting is an idea, give every rupee a job before it spends itself, and the idea costs nothing, while the app holding the idea had my complete financial life on their servers, every transaction and balance and note about the dentist, priced at more per year than the disk my entire homelab runs on.
Actual Budget is the open-source version of the same method, twenty-eight thousand stars on GitHub, free with no feature gates, and the architecture is the part that sold me, because it is local-first in the literal sense. The budget is a file, the app runs in your browser against that file, and a small sync server keeps every device caught up, so the server holds your data and the app works even when the connection does not, and if the project vanished tomorrow the file on your disk opens in the desktop app forever.
The method transfers completely if you know YNAB, envelopes that roll over, targets that fill up month by month, credit handled as debt against a category, and the reports answer the only questions that matter, what did I spend and on what and is it trending worse. Categories behave the way the method intends, money moves between them with two clicks when reality disagrees with the plan, and the reconciliation loop against imported statements takes minutes, which is the whole habit that makes any budget survive past February.
The compose file is the smallest of anything in my stack, one service, no database container, no sidecar.
services:
actual:
image: actualbudget/actual-server:latest
restart: unless-stopped
ports:
- "5006:5006"
volumes:
- ./actual-data:/data
Everything lives inside that one data folder, the budget files and the sync state, so backing it up is a single rsync line into the same Restic job as everything else, and moving servers is copying a directory. On first load you set a password for your budget file, the browser remembers it, and the phone gets the same interface through the browser with the layout adapted for a small screen, which covers the mobile use case where a budget actually gets used, standing in a shop wondering if the envelope allows this.
The honest tradeoff is bank syncing, because YNAB’s price partly buys automatic feeds through their aggregation partners, while Actual’s self-hosted sync needs GoCardless or SimpleFIN, services that either do not cover Indian banks or want their own fees, so my workflow imports a CSV from each bank once a week, which takes about four minutes and has quietly taught me more about my spending than the automatic feed ever did, since the money passes through my hands on its way into the ledger. There is optional end-to-end encryption for the synced files if you want the server to hold ciphertext instead of plaintext, and import handles OFX and QIF and CSV with a rules engine that remembers how to categorize the recurring things.
A year in, the ledger holds every transaction across three accounts, the envelopes have absorbed every surprise from car service to festival gifts without a credit card swipe, and the hundred and nine dollars stayed mine. The method was always free, it turns out, the subscription was just the box it shipped in.
If your money math deserves a server of its own, subscribe to the newsletter.