Actual Budget is a fast, open-source, local-first budgeting app built on envelope budgeting (zero-based): every unit of income gets assigned to a category, and you spend from those envelopes. The app runs in your browser or as a desktop app, with all data stored locally. The small Actual server syncs budgets between your devices and serves the web app. It’s lightweight enough for the smallest VPS.
More accounting-style alternative: Firefly III.
How it works
- Your budget lives in a local database in each browser or device. The UI is instant and works offline.
- The server stores a sync copy, and exchanges changes between devices (CRDT-based, so edits merge cleanly).
- Optional end-to-end encryption: the server only sees encrypted data.
Requirements
- Any small VPS: about 100–200 MB RAM.
- HTTPS is required for the web app: browsers only allow the features Actual relies on (SharedArrayBuffer, service workers) in a secure context.
Install with Docker
# /opt/actual/compose.yaml
services:
actual:
image: actualbudget/actual-server:latest
restart: unless-stopped
ports:
- "127.0.0.1:5006:5006"
volumes:
- ./data:/data
cd /opt/actual && docker compose up -d
There’s also an npm package (@actual-app/sync-server) if you prefer running it under Node directly with systemd.
Nginx with HTTPS
server {
server_name budget.example.com;
client_max_body_size 50M; # large budget files and imports
location / {
proxy_pass http://127.0.0.1:5006;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# listen 443 ssl; certbot --nginx -d budget.example.com
}
See Let’s Encrypt.
First run
- Open
https://budget.example.com, and set the server password right away. Whoever sets it first controls the server. - Create a new budget, or import from YNAB4, nYNAB (YNAB export), or another Actual file.
- In Settings, enable end-to-end encryption with a separate encryption password. If you lose it, the server copy can’t be decrypted (local copies on your devices still work).
Recent versions also support OpenID Connect login and multiple users. See the docs if you want SSO.
Budgeting basics in Actual
- To budget: income arrives, and you assign all of it to categories until “To Budget” is zero.
- Overspending in a category rolls over as negative (or is covered from other categories).
- Rules auto-categorise imported transactions by payee or description.
- Schedules handle recurring bills.
- Reports: spending by category, net worth, cash flow, and custom reports.
Importing transactions
- File import: OFX, QFX, QIF, CAMT.053 and CSV exports from your bank. Map CSV columns once.
- Bank sync: Actual supports some bank-sync providers (for example GoCardless Bank Account Data in Europe, SimpleFIN in the US). These need your own credentials with those providers, and availability depends on your country and bank.
Access and security
- Keep the server password strong. Add a VPN or IP allowlist for extra protection if you only use it from known places. See Tailscale.
- Enable end-to-end encryption, so even a compromised server doesn’t expose your budget.
- Keep the container updated. See updating self-hosted apps.
Backups
- Server side: back up
./data(sync files and the server database). See backup strategy. - App side: Settings → Export data gives a zip of the budget. Keep periodic exports as well, especially before upgrades.
Updates
docker compose pull && docker compose up -d. The server and web app version together, so the browser picks up the new version on reload.
Quick reference
| Item | Value |
|---|---|
| Port | 5006 |
| Data | /data |
| HTTPS | required (secure context) |
| Encryption | Settings → End-to-end encryption |
| Imports | OFX/QFX/QIF/CAMT/CSV; some bank sync providers |
Related: Firefly III and Vaultwarden.