Deploy Wealthfolio
Empower Alternative. Track investments, holdings and net worth
wealthfolio
Just deployed
/data
Deploy and Host Wealthfolio on Railway
Wealthfolio is an open-source portfolio and net-worth tracker for people who want to follow their investments without handing a bank login to a third party. It records brokerage accounts, holdings and every buy, sell, dividend and deposit, values the portfolio against live market data, and reports time-weighted returns and allocation — the self-hosted answer to Empower Personal Dashboard, Sharesight and the spreadsheet most investors outgrow.
Deploy Wealthfolio on Railway and you get the web edition: a single Rust service serving both the React frontend and its REST API on one origin, backed by embedded SQLite on a persistent volume. Self-host Wealthfolio here and there is nothing else to wire up — no external database, cache or object storage. The source repository builds on the official wealthfolio/wealthfolio image, adding a startup script that hashes your password, prepares the encryption key and takes ownership of the volume before dropping to the app's own unprivileged user.

Getting Started with Wealthfolio on Railway
Set WF_AUTH_PASSWORD when you deploy, or keep the random value the template generates — readable from the service variables at any time. Open the public URL and you meet a single password box: Wealthfolio is single-user, so there is no username, no registration and no second account to lock down. A short setup flow covers tracking modes and appearance.
Before entering transactions, go to Settings → General → Base Currency and press Save Currency, even if the dropdown already shows the currency you want. The setup flow does not write that value, and until it is saved every valuation fails and a "Portfolio Update Failed" message appears on each recalculation.
Next, add an account under Settings → Accounts with a name, currency and tracking mode — Transactions for full performance analytics, Holdings for a snapshot of positions. From Activities → Add Activities, record a deposit, then a buy: start typing a ticker and Wealthfolio searches live market data, so picking AAPL fills in Apple's price. Dashboard and Holdings then value your positions and update as prices move — the quickest way to confirm the deployment works. Larger histories come in via Import from CSV.



About Hosting Wealthfolio
Wealthfolio is local-first by design: your holdings, trades and balances live in one SQLite file you own, and the only data leaving the deployment is anonymous market-data lookups for the tickers you hold. Aggregators like Empower and Mint instead hold your brokerage credentials; the trade-off for inverting that is entering transactions yourself or importing broker CSVs.
Key features:
- Accounts in any currency, converted automatically into one base currency
- Full ledger — buys, sells, dividends, splits, deposits, withdrawals, fees, transfers
- Live and historical prices for stocks, ETFs and bonds across global exchanges
- Time- and money-weighted returns, allocation and contribution tracking
- Net worth and spending views, savings goals and contribution limits
- CSV import, addons and optional OpenID Connect SSO
One service runs the Rust binary, serving the frontend and the REST API under /api/v1 from one origin, so there is no cross-origin session problem. A single volume at /data holds the database, the encrypted secrets file and addons. Two background jobs run inside that process on timers, refreshing market data and syncing brokers — which is why it runs as one instance.
Why Deploy Wealthfolio on Railway
Railway removes operational work around a self-hosted tracker:
- One service and one volume — no database, cache or storage to provision
- HTTPS and a public domain issued automatically, used for the session cookie
- Persistent storage that survives redeploys and upgrades
- A health check that catches a bad release before it takes the site down
- Scaling and metrics without touching a server
Common Use Cases
- Consolidating scattered brokerage accounts into one net-worth figure across currencies
- Tracking real performance with returns that separate market movement from your own cashflows
- Replacing a portfolio spreadsheet with something that prices itself and keeps an audit trail
- Keeping financial data private on infrastructure you own
Dependencies for Wealthfolio
- Wealthfolio server — built from the source repository on
wealthfolio/wealthfolio:latest, the official multi-arch image. Serves frontend and API on port 8088, all state in SQLite. - Persistent volume at
/data— database, encrypted secrets file and addons. The only durable state; back it up before upgrades. - Public market-data providers — Yahoo Finance, OpenFIGI, Börse Frankfurt and a US Treasury calculator supply quotes and instrument metadata. No API key needed, and only tickers are sent, never portfolio data.
Environment Variables Reference
| Variable | Required | Purpose |
|---|---|---|
WF_AUTH_PASSWORD | Yes | Password you sign in with. Generated if left alone. |
WF_SECRET_KEY | Yes | Encrypts stored credentials, signs sessions. Keep it stable, or encrypted data becomes unreadable. |
PORT | No | HTTP port, 8088 by default. |
WF_CORS_ALLOW_ORIGINS | No | Defaults to the deployment's URL. Set for a custom domain. |
WF_AUTH_PASSWORD_HASH | No | Supply your own Argon2id hash instead. |
WF_COOKIE_SECURE | No | auto, true or false. Defaults to true. |
WF_OIDC_ISSUER_URL, WF_OIDC_CLIENT_ID | No | Enable single sign-on when both are set. |
Deployment Dependencies
- Source repository: https://github.com/gridalpha/wealthfolio-railway
- Upstream project: https://github.com/wealthfolio/wealthfolio (AGPL-3.0)
- Official image: https://hub.docker.com/r/wealthfolio/wealthfolio
- Self-hosting docs: https://wealthfolio.app/docs/guide/self-hosting
Hardware Requirements for Self-Hosting Wealthfolio
A compiled Rust binary with an embedded database, Wealthfolio is lighter than most self-hosted finance tools.
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 0.5 vCPU | 1 vCPU |
| RAM | 256 MB | 512 MB |
| Storage | 1 GB volume | 2 GB volume |
| Runtime | Linux container, x86-64 or ARM64 | — |
Memory stays flat with portfolio size; storage grows with transaction history and cached prices, and a few hundred positions fit in 1 GB.
Self-Hosting Wealthfolio
On Railway, deploying this template is the whole process. To run the same app locally with Docker, generate a key and an Argon2id password hash first — the following is a shell session:
export WF_SECRET_KEY=$(openssl rand -base64 32)
printf 'your-password' | argon2 "$(openssl rand -hex 8)" -id -t 3 -m 16 -p 1 -e
Pass the resulting hash as WF_AUTH_PASSWORD_HASH and run the official image with a named volume:
docker run -d --name wealthfolio -p 8088:8088 \
-v wealthfolio-data:/data \
-e WF_LISTEN_ADDR=0.0.0.0:8088 \
-e WF_DB_PATH=/data/wealthfolio.db \
-e WF_SECRET_KEY="$WF_SECRET_KEY" \
-e WF_AUTH_PASSWORD_HASH='$argon2id$v=19$...' \
-e WF_CORS_ALLOW_ORIGINS=http://localhost:8088 \
wealthfolio/wealthfolio:latest
The container runs as UID 1000, so a bind mount needs chown -R 1000:1000 first; a named volume gets this automatically.
Is Wealthfolio Free?
Wealthfolio is open source under AGPL-3.0 and free to self-host, with no feature gating or seat limits, and the desktop apps are free too. An optional subscription, Wealthfolio Connect, adds read-only syncing from 30+ brokerages; manual entry and CSV import stay free. On Railway you pay only for compute and storage used.
FAQ
What is Wealthfolio? An open-source, privacy-focused tracker for investments and net worth. It stores accounts, holdings and transactions in a database you control and values them with public market data — a self-hosted alternative to services like Empower that need your brokerage credentials.
What does this Railway template deploy?
A single Wealthfolio web service with a persistent volume at /data, serving both the interface and the API. The volume holds the database, encrypted secrets file and addons.
Why is there no separate database service? Wealthfolio uses embedded SQLite, so the database is a file on the volume. That keeps the deployment to one service and backups as simple as copying a file, at the cost of a single instance.
Why does my portfolio show "Portfolio Update Failed"? The base currency has not been saved. Open Settings → General, pick your currency and press Save Currency — the dropdown shows a currency before it is actually stored. Transactions already entered are safe, and the next recalculation values them correctly.
Can I use single sign-on with self-hosted Wealthfolio?
Yes. Set WF_OIDC_ISSUER_URL and WF_OIDC_CLIENT_ID for any OpenID Connect provider — Authentik, Keycloak, Pocket ID — with redirect URL https://your-domain/api/v1/auth/oidc/callback. Also set WF_OIDC_ALLOWED_EMAILS or WF_OIDC_ALLOWED_SUBS: without an allowlist the server refuses to start unless you opt into open access.
Template Content
wealthfolio
gridalpha/wealthfolio-railway