Taking Control of Your Money Without Handing It to a Cloud Service
Actual Budget is an open-source, privacy-first personal finance app that runs entirely on your own hardware. Unlike subscription-based tools that sync your bank data to remote servers, Actual gives you a local-first experience where every transaction and budget entry lives under your control. Setting it up takes about 20 minutes, and what you get in return is a full-featured envelope budgeting system with no monthly fees and no third-party data exposure.

What You Need Before You Start
Actual Budget runs as a Node.js server, so your hosting environment needs to support it. A Raspberry Pi, an old laptop running Ubuntu, a VPS, or any machine with Docker installed will work. Docker is the fastest path to a working instance, and the project maintains an official image that handles all the dependency management for you. If you are already running a self-hosted stack – perhaps Nextcloud as a Google Drive alternative or similar services – Actual fits into that environment without much friction.
You will need Docker and Docker Compose installed on your host machine. On Ubuntu or Debian, run sudo apt update && sudo apt install docker.io docker-compose -y and confirm both are available with docker –version and docker-compose –version. On a Raspberry Pi, the same commands apply, though you should verify you are running a 64-bit OS image for compatibility with the official Actual container.
Open a port for Actual on your firewall. By default, the server uses port 5006. If you are using UFW, run sudo ufw allow 5006. If you plan to access Actual only from your local network, you can skip public-facing firewall rules entirely and rely on your router’s NAT to keep things private. That is, honestly, the smarter setup for a personal finance tool – there is no good reason to expose your budget data to the open internet.
Create a dedicated directory for your Actual data. Something like mkdir -p ~/actual/data works fine. This is where the SQLite database and any uploaded files will live. Keep this directory backed up – losing it means losing your entire budget history, and Actual does not have a cloud recovery option by design.

Installing and Configuring Actual Budget
Create a docker-compose.yml file inside your ~/actual directory. The configuration is minimal. Set the image to actualbudget/actual-server:latest, map port 5006:5006 on the host, and mount your data directory as a volume pointing to /data inside the container. The full block looks like this:
version: ‘3’
services:
actual:
image: actualbudget/actual-server:latest
ports:
– “5006:5006”
volumes:
– ./data:/data
restart: unless-stopped
Once the file is saved, run docker-compose up -d from the same directory. Docker will pull the Actual server image and start the container in the background. The first pull usually takes a minute or two depending on your connection. After that, the server starts almost instantly. Run docker-compose logs -f to watch the output and confirm it shows something like Listening on port 5006 before you proceed.
Open a browser and navigate to http://[your-server-IP]:5006. On first load, Actual will ask you to create a password. This password protects your budget files and is stored locally – there is no account creation, no email verification, and no company receiving your credentials. Choose something strong and store it in a password manager. After setting it, you land on the main interface where you can either start a new budget from scratch or import an existing one from YNAB 4 or the nYNAB format.
To start fresh, click Create new file and name your budget. Actual uses an envelope budgeting method, meaning you assign every dollar a specific category before you spend it. The left sidebar lists your budget months, and the main panel shows your category groups, their assigned amounts, and your running balances. Add categories that match your actual spending life – rent, groceries, utilities, subscriptions, dining, car maintenance, whatever applies. The goal is to have a category for every dollar that comes in.
Connecting bank accounts requires manual entry by default, which is intentional. Actual does not pull live transaction data from financial institutions unless you set up a third-party integration like GoCardless or SimpleFIN, both of which require separate configuration. For most people starting out, manual entry is fine – it forces you to review every transaction, which is where the budgeting discipline actually develops. You can import OFX or QFX files exported from your bank to speed up transaction entry if manual logging feels too slow.
Making the Setup Work Long-Term
The most common reason self-hosted finance tools get abandoned is not technical difficulty – it is friction in the daily workflow. Actual has a progressive web app mode, which means you can install it to your phone’s home screen by visiting the server URL in a mobile browser and using the browser’s “Add to Home Screen” option. That single step removes most of the friction. When adding a transaction takes three taps instead of opening a laptop, you actually do it.

Set up an automated backup of your ~/actual/data directory. A simple cron job that copies the folder to an external drive or a local NAS once a day is enough. The SQLite database Actual uses is a single file, so the backup is fast and the restore process, if you ever need it, is just a file copy back into place. No budget history survives a hardware failure without this step – and that is the kind of data loss that is genuinely difficult to reconstruct after the fact.





