Why self-host your budget instead of using YNAB
The envelope budgeting method is straightforward: allocate every incoming dollar to a named category (rent, food, savings, emergency fund) before spending it. When a category runs out, you either stop spending or consciously move money from another envelope. YNAB popularised this approach in a polished app — but it costs $99/year, stores your financial data on its servers, and can't be audited. Actual Budget replicates the method (including the coveted 'roll with the punches' flexibility) with full source code on GitHub under the MIT licence. Self-hosting it on a VPS means your transactions, balances and budget history never leave your infrastructure — and the annual cost is whatever a small VPS costs.
Deploy Actual Budget with Docker in two minutes
Actual ships as a single Docker image — no database server, no message broker, no configuration files. One container, one volume, one port. On your Ubuntu 22.04 VPS, run: docker run -d --restart=always -p 5006:5006 -v actual-budget:/data --name actual-budget actualbudget/actual-server. The server is ready in under two seconds on port 5006. Open http://<your-vps-ip>:5006 in a browser, click 'Create new budget', and you are budgeting. The entire SQLite database is stored in the actual-budget Docker volume — back it up with a single docker run --rm -v actual-budget:/data alpine tar -czf - /data.
What you get out of the box
- Zero-based envelope budgeting — assign every dollar to a category before spending; Actual flags overspending in real time.
- Multi-device sync — phone, tablet and desktop all share the same live budget via the encrypted server.
- End-to-end encryption — the server only stores ciphertext; your transactions are readable only on your devices.
- Bank sync via GoCardless (Europe) and SimpleFIN (North America), or import OFX/QFX/CSV files manually.
- Reporting: net-worth chart, cash-flow, spending by category, and fully custom reports.
- YNAB 4 and nYNAB import — migrate your full history in about five minutes.
Add HTTPS so you can sync from anywhere
To access your budget from outside the VPS — on mobile or from another country — you need HTTPS. The simplest path is Caddy. Install it on the same VPS and add a one-line Caddyfile: budget.yourdomain.com { reverse_proxy localhost:5006 }. Caddy handles the Let's Encrypt certificate automatically. Once the domain resolves, open https://budget.yourdomain.com on your phone, tap the browser's 'Add to Home Screen' button, and Actual becomes a full PWA icon on your home screen. All sync traffic between your devices and the server goes through this TLS channel.
Setup in six steps
Create a VPS (1 GB RAM, Ubuntu 22.04)
Actual idles under 80 MB RAM. Even the smallest VPS plan gives you plenty of headroom.
Deploy the container
docker run -d --restart=always -p 5006:5006 -v actual-budget:/data --name actual-budget actualbudget/actual-server
Create your budget
Open port 5006 in a browser, click 'Create new budget', add your bank accounts with opening balances.
Set up envelope categories
Create categories (Housing, Food, Transport, Savings…) and allocate your expected monthly income across them.
Secure with HTTPS
Install Caddy, add budget.yourdomain.com { reverse_proxy localhost:5006 } to your Caddyfile, and reload.
Install on mobile
Open the HTTPS URL on your phone and use 'Add to Home Screen' — Actual Budget becomes a PWA icon.
How to back up your budget
All data lives in the actual-budget Docker volume. A daily cron backup is one command: docker run --rm -v actual-budget:/data -v /backups:/out alpine tar czf /out/actual-budget-$(date +%Y%m%d).tar.gz /data. Restore by reversing the tar into a fresh volume before starting the container. Actual also has a built-in export: from the budget screen, go to Settings → Export → Download backup. This creates a portable ZIP of your entire budget that you can import on any other Actual instance.