Take Back Control of Your Money Without the Cloud
Actual Budget is an open-source personal finance application that runs entirely on your own hardware. Unlike subscription-based tools that store your transaction history on remote servers, Actual gives you a local database file that never leaves your machine unless you choose to sync it. The budgeting logic follows a zero-based approach – every dollar gets assigned a job before the month begins, which forces a level of intentionality that passive expense trackers simply don’t produce.
Self-hosting Actual through Docker makes the setup permanent and accessible from any browser on your network. You’re not locked into a desktop app on a single machine. Your budget loads on your laptop in the living room, your tablet in the kitchen, or any device you connect to your home server – all pointing to the same data, no account required.
This guide walks through the full setup: installing Actual Budget via Docker Compose, configuring persistent storage, accessing the web interface, and getting your first budget running.

What You Need Before Starting
The prerequisites are minimal. You need a machine running Linux, macOS, or Windows with Docker and Docker Compose installed. A Raspberry Pi 4 with at least 2GB of RAM handles this comfortably, as does any old desktop or a VPS. Actual Budget is a lightweight Node.js application – it does not require significant processing power or memory to run reliably. The database it creates is a plain SQLite file, which stays small even after years of transaction history.
Make sure Docker is installed and the Docker daemon is running before you begin. On Linux, you can verify this with sudo systemctl status docker. On macOS or Windows with Docker Desktop, the whale icon in your system tray indicates it’s active. You’ll also want a text editor available for writing the Compose file – nano, vim, or VS Code all work fine. No special networking knowledge is required for local access, though if you want to reach your budget from outside your home network, you’ll need a reverse proxy like Nginx Proxy Manager or Caddy, which is a separate configuration outside the scope of this guide.
Port 5006 is what Actual Budget uses by default. Check that nothing else on your machine is already bound to that port before proceeding. On Linux, sudo ss -tulnp | grep 5006 will show you if it’s occupied.
Installing Actual Budget with Docker Compose
Create a directory for the project. Naming it something like actual-budget keeps things organized if you’re running multiple self-hosted services on the same machine.
Inside that directory, create a file named docker-compose.yml and paste in the following configuration:
version: “3.8”
services:
actual-server:
image: actualbudget/actual-server:latest
container_name: actual_budget
ports:
– “5006:5006”
volumes:
– ./actual-data:/data
restart: unless-stopped
The volume mapping ./actual-data:/data is the critical line. It binds a local folder called actual-data inside your project directory to the container’s internal /data path, where Actual writes its database and all budget files. Without this binding, your data would live only inside the container and disappear the next time you pull a new image or restart with a fresh container. Docker will create the actual-data folder automatically on first run if it doesn’t already exist. Once the file is saved, run docker compose up -d from inside the project directory. The -d flag runs the container in detached mode, meaning it stays running in the background after the command returns. You can verify it started correctly with docker compose logs -f, which streams the container output live – look for a line confirming the server is listening on port 5006.

First Login and Budget Configuration
Open a browser and navigate to http://localhost:5006 – or replace localhost with your server’s local IP address if you’re accessing it from another device on the same network. The first time you load the interface, Actual will prompt you to create a server password. This password protects access to the web interface and encrypts the optional cloud sync feature if you enable it later. Pick something strong and store it in a password manager.
After logging in, you’ll land on the budget setup screen. You can start a fresh budget from scratch or import data from YNAB if you’re migrating from that tool. Actual’s import process handles YNAB4 and YNAB5 export files, which makes switching over substantially less painful than rebuilding transaction history by hand. For a fresh start, you’ll name your budget file, and Actual creates a new SQLite database in your actual-data directory. From there, the workflow is straightforward: add your accounts (checking, savings, credit cards), set opening balances, then build out your budget categories. Actual uses a month-by-month grid where you assign available funds to each category. Any money not yet assigned sits in a “To Budget” pool at the top – the goal is to get that number to zero, meaning every dollar has been directed somewhere intentional.
One feature worth configuring early is the bank sync integration. Actual supports SimpleFIN and GoCardless for automatic transaction import, depending on your country. SimpleFIN covers most US-based banks. GoCardless handles a broad range of European institutions. Both require a separate account with those respective services – they act as the bridge between your bank and your local Actual instance. If you’d rather not connect live bank data, manual CSV import works reliably for most banks, which export transaction history directly from their online portals. The import screen in Actual handles duplicate detection, so re-importing the same file twice won’t create double entries.
Keeping Your Data Safe
Because everything lives in a single SQLite file inside your actual-data directory, backing up your budget requires nothing more than copying that folder. A simple cron job that runs rsync or cp on a schedule – daily or weekly – is enough to protect months of work. If you’re already running a self-hosted file sync server like Seafile, pointing it at the actual-data directory gives you versioned, automatic backups without any extra configuration on the Actual side. Store backups somewhere physically separate from the machine running Actual – an external drive, a NAS on your network, or an encrypted off-site location. A budget that tracks every dollar you earn is not a file you want to lose to a failed drive with no recovery path.

Actual Budget does offer an optional end-to-end encrypted sync feature built into the interface, which lets you access the same budget across multiple devices without setting up a reverse proxy. It routes sync through Actual’s own hosted relay server, but because the data is encrypted client-side before it leaves your machine, the relay server never sees your financial information in readable form. You can also self-host the sync relay yourself if that architecture makes you more comfortable – the project’s documentation covers this setup. Either way, your database file remains the authoritative source of truth, always readable offline, always under your control. That’s the part no SaaS budget tool can match: when their servers go down, your access goes with them. When your server goes down, you still have the file.





