How to Install Actual Budget (Private Envelope Budgeting on Your Own Server)

Budgeting apps want a monthly fee and, worse, your bank login. Actual Budget is the open-source envelope-budgeting app (the YNAB method: give every pound a job) that runs on your server. Your laptop and phone work on a local copy and sync through the server, encrypted so the server never sees the figures. Import bank CSVs, set category budgets, see the month at a glance. One container, no accounts anywhere.
Quick reference
| Task | What |
|---|---|
| Folder | ~/docker/actual/compose.yaml |
| Web | http://server-ip:5006 |
| First visit | set the server password |
| Phone | the same web address — it's a full web app |
| Bank data | Import → CSV / OFX / QFX from your bank's export |
| Encrypt | Settings → Encryption — the server stores ciphertext |
1. The compose file
mkdir -p ~/docker/actual && cd ~/docker/actual
nano compose.yaml
services:
actual:
image: actualbudget/actual-server:latest
container_name: actual
ports:
- "5006:5006"
volumes:
- ./data:/data
restart: unless-stopped
docker compose up -d
sudo ufw allow from 192.168.1.0/24 to any port 5006
Open http://192.168.1.50:5006. It asks you to set a server password — this protects the server; the budget itself gets its own encryption key later.
2. Create a budget
Create new file. Add your accounts (current, savings, credit card) with their current balances. Then the budget screen: a row per category group (Bills, Everyday, Savings) with categories under each, and a column for this month. The money in your accounts sits in To Budget at the top; assign it to categories until it's zero. That's the whole method — spend from envelopes, not from the account balance.
3. Import transactions
Download a CSV (or OFX/QFX) from your bank's online banking, then in Actual: the account → Import. Map the columns once (date, payee, amount); Actual remembers. Categorise the transactions; it learns payee → category and does it for you after a few. Rules (Rules in the sidebar) handle the rest: payee contains "TESCO" → Groceries.
Repeat weekly. Five minutes.
4. Sync and encrypt
Open the same address on your phone (add it to the home screen) and log in with the server password; pick the budget file. Changes merge both ways. Then Settings → Encryption → Enable: choose a key password. From now on the server stores an encrypted blob; a new device needs that password to open the file. Write the key password down — losing it loses the budget.
5. Reports and useful bits
- Reports: net worth over time, cash flow, spending by category.
- Schedules: recurring bills appear in advance so you budget for them.
- Goals / templates: #template 50 in a category note auto-budgets £50 a month.
- Bank sync: optional GoCardless/SimpleFIN integration for direct UK/EU bank feeds, if you decide to trust it; CSV import is the private default.
6. Back it up
The budget is a SQLite file in ./data/user-files/ plus ./data/server-files/. Include ~/docker/actual in the nightly backup (tutorial 23). Also Settings → Export occasionally for a plain ZIP you can open anywhere.
Behind the proxy
budget.example.com → 127.0.0.1:5006 with HTTPS (tutorial 28). Keep it behind the VPN or Authelia (95) — even encrypted, it's your finances.
Troubleshooting
Phone and laptop show different numbers. One hasn't synced; the sync icon at the top. Both must use the same server address.
Forgot the server password. Stop the container, delete ./data/server-files/account.sqlite, start — it asks for a new one. Budget files are untouched.
Forgot the encryption password. Unrecoverable. Restore from an export made before encryption, or start again.
CSV import maps amounts wrongly. Some banks use separate debit/credit columns or a sign convention; the import dialog has a flip-amount toggle.
Wrapping up
One container, a server password, a budget file, a weekly CSV. The YNAB method with no subscription, no aggregator holding your bank login, and the numbers encrypted before they even reach the server. Back up the folder and write the key password down.
