Deploy Actual Budget — Self-Hosted YNAB Alternative
Self-host Actual — private budgeting with bank sync & encryption
Just deployed
/data
Deploy and Host Actual Budget on Railway
Actual Budget is a fast, private, open-source personal finance app — a self-hosted alternative to YNAB with zero-based envelope budgeting, multi-device sync, bank import, and optional end-to-end encryption. It's local-first, so the app is quick and works offline, while your own server keeps every device in sync — with no subscription and your financial data entirely under your control. This template deploys the official Actual server with a persistent volume and automatic HTTPS, so your private budgeting server is live across all your devices in minutes.
What This Template Deploys
| Service | Purpose |
|---|---|
| Actual Server | The budget sync server and web app (Node.js + embedded SQLite) on port 5006 |
A single lightweight service — no external database or cache. A persistent volume at /data holds everything: the server's account database and all your budget files. Railway provides automatic HTTPS, which Actual requires for encryption and sync to work.
About Hosting
Actual is exceptionally light, and two specifics are essential to get right — this template handles both.
HTTPS is mandatory — and Railway provides it automatically. Actual uses the browser's Web Cryptography API for its end-to-end encryption and client sync, and browsers only expose that API over a secure connection. Without HTTPS, encryption and multi-device sync simply fail — a common self-hosting frustration on setups that skip TLS. Railway serves your instance over automatic HTTPS out of the box, so encryption and sync work immediately with nothing to configure.
The /data volume holds your entire budget — persist it. Actual writes everything under /data: server-files/ contains the account database (account.sqlite) with your login and session data, and user-files/ holds your actual budget files. Both must live on the mounted volume — miss it, and the next image update throws your budget away. This template mounts the volume at /data, so your login and budgets survive every redeploy and update.
Set your server password on first visit. After deploy, open your Railway URL and you're prompted to create a server password that protects your budget from unauthorized access. Then click "Start fresh" for a new budget, or import an existing one from YNAB4, nYNAB, or QIF/OFX/QFX/CSV files.
Bank sync brings transactions in automatically. Connect your accounts through GoCardless (Europe/UK) or SimpleFIN (North America) to import and reconcile transactions automatically against your budget, instead of uploading CSVs by hand — the "bank sync" that makes a self-hosted budget genuinely low-effort to maintain.
Local-first means your budget survives anything. The budget itself lives in each client (browser and mobile app); the server is a sync endpoint holding the master copy and change log. So the app keeps working if the server is briefly down, and as long as one client has a copy, your data is safe. ACTUAL_TRUSTED_PROXIES is set so Actual correctly interprets forwarded headers behind Railway's proxy, and ACTUAL_PORT is 5006.
Typical cost: ~$5/month on Railway — Actual is remarkably light, running comfortably on the smallest plan with SQLite and no separate database. It's MIT-licensed and free, versus YNAB's annual subscription.
How It Compares
| Actual (self-hosted) | YNAB | Mint (discontinued) | Spreadsheet | |
|---|---|---|---|---|
| Cost | Flat infra (~$5/mo) | ~$109/year | N/A | Free |
| Budgeting method | Zero-based envelopes | Zero-based | Tracking | Manual |
| Bank sync | GoCardless / SimpleFIN | Built-in | Was built-in | No |
| Encryption | Optional E2E | Vendor | Vendor | None |
| Data ownership | Full — your infra | Vendor | Vendor | Yours |
| Self-hostable | Yes | No | No | N/A |
YNAB is polished but a paid subscription that holds your financial data. Mint was free but discontinued, and kept your data too. A spreadsheet is private but has no sync, bank import, or real budgeting workflow. Actual's edge is a genuinely fast, full envelope-budgeting app — with bank sync and optional end-to-end encryption — self-hosted at flat cost, with your most sensitive data on infrastructure you own.
Deploy in Under 5 Minutes
- Click Deploy on Railway — the Actual server builds with a persistent volume (~2 minutes)
- Confirm the volume is mounted at
/data - Open your Railway URL (served over automatic HTTPS) and create your server password
- Click "Start fresh" for a new budget, or import from YNAB or a file
- Optionally connect GoCardless or SimpleFIN for automatic bank sync
Your budget syncs across every browser and the mobile apps, pointed at your Railway URL.
Common Use Cases
- Private YNAB alternative — zero-based envelope budgeting without a subscription or data sharing
- Multi-device budgeting — keep laptop, tablet, and phone in sync from your own server
- Encrypted personal finance — optional end-to-end encryption on your most sensitive data
- Escape a discontinued app — a durable, self-owned home for budgeting after Mint-style shutdowns
Configuration
| Variable | Required | Description |
|---|---|---|
| Server password | On first visit | Set in the web UI to protect your budget |
ACTUAL_PORT | Pre-set | 5006 — the web app and sync API |
ACTUAL_TRUSTED_PROXIES | Pre-set | Correct client handling behind Railway's proxy |
| Storage volume | Pre-set | Persistent volume at /data — holds all budget and account files |
ACTUAL_UPLOAD_...FILE_SYNC_SIZE_LIMIT_MB | Optional | Raise for large budgets with many attachments |
Persist
/data— it's your whole budget. Bothserver-files/(login) anduser-files/(budgets) live under/data; without the volume, an update wipes them. This template mounts it, so everything survives redeploys.
HTTPS is required, and Railway provides it. Actual needs a secure connection for its Web Crypto encryption and sync — Railway's automatic HTTPS handles this, so encryption and multi-device sync work with no setup.
Dependencies for Actual Budget Hosting
- Railway account — ~$5/month for the lightweight service
- A persistent volume at
/datafor all budget and account files (included) - Nothing else — no external database or cache is required
- Optional: a GoCardless or SimpleFIN account for automatic bank sync
Deployment Dependencies
- Actual Budget GitHub Repository
- Actual Budget Documentation
- Actual Bank Sync Setup
- Railway Volumes Documentation
Implementation Details
The template runs the official actualbudget/actual-server image on port 5006 with a persistent volume mounted at /data, which holds both server-files/ (the account.sqlite account and session database) and user-files/ (the budget files) — the entire data set, with no external database or cache required since Actual uses embedded SQLite. Mounting this volume is essential: without it, an image update or redeploy discards the budget.
Actual relies on the browser's Web Cryptography API for end-to-end encryption and client synchronization, which browsers restrict to secure contexts, so HTTPS is mandatory; Railway's automatic HTTPS satisfies this so encryption and sync function without additional configuration. ACTUAL_TRUSTED_PROXIES is configured for correct forwarded-header handling behind Railway's edge proxy.
On first visit, the user sets a server password protecting the instance, then creates or imports a budget (from YNAB4, nYNAB, or QIF/OFX/QFX/CSV). Optional bank sync via GoCardless or SimpleFIN automates transaction import. The architecture is local-first — clients hold the budget and the server holds the synced master copy and change log — so the app is resilient to server downtime. The /data volume is the component to back up.
Frequently Asked Questions
Why do encryption and sync fail on some self-hosted setups? Because Actual needs HTTPS — its encryption and sync use the browser's Web Crypto API, which only works over a secure connection. Railway serves your instance over automatic HTTPS, so this works out of the box here.
Will I lose my budget on a redeploy? Not with this template — both your login data and budget files live under /data, which is mounted on a persistent volume. Without that mount, an update would wipe them, which is the main self-hosting pitfall this handles.
Can it sync transactions from my bank? Yes — connect GoCardless (Europe/UK) or SimpleFIN (North America) to automatically import and reconcile transactions against your budget, instead of importing CSVs manually.
Can I import from YNAB? Yes — Actual imports from YNAB4 and nYNAB, as well as QIF, OFX, QFX, and CSV files, so you can move your existing budget over.
Does it work on mobile? Yes — Actual has mobile apps and a responsive web UI; point them at your Railway URL and your budget syncs across every device from your own server.
Why Deploy Actual Budget on Railway?
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying Actual Budget on Railway you get a private budgeting server with the essentials handled — a persistent volume so your budget survives updates, automatic HTTPS so encryption and sync work, and the trusted-proxy setup done. Zero-based budgeting with bank sync across all your devices, self-hosted on infrastructure you own.
Template Content
