---
title: "Deploy Wealthfolio"
description: "Empower Alternative. Track investments, holdings and net worth"
category: "Other"
url: https://railway.com/deploy/wealthfolio-tracker
---

# Deploy Wealthfolio

Empower Alternative. Track investments, holdings and net worth

**[Deploy Wealthfolio on Railway](https://railway.com/template/wealthfolio-tracker)**

- **Creator:** A3A
- **Category:** Other
- **Total deploys:** 1

## Template content

### wealthfolio https://raw.githubusercontent.com/wealthfolio/wealthfolio/main/assets/brand/icon.png

- **Source:** https://github.com/gridalpha/wealthfolio-railway
- **Public domain:** Yes

## Documentation

![Wealthfolio logo](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRQXWMLpaJUaAeCXInqxj7f5uPZk5hyiulITaEHo6pPkstmG2ZAJhg78paf&s=10)

# 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.

![Wealthfolio Railway architecture](https://res.cloudinary.com/rroe4rtk/image/upload/v1787076959/152f864c-2173-4ea0-ba0e-e12b787cb1e5.png)

## 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**.

![Wealthfolio dashboard showing portfolio value and two holdings](https://res.cloudinary.com/rroe4rtk/image/upload/v1787068174/wealthfolio-portfolio-dashboard.png)

![Wealthfolio holdings table with live prices and total returns](https://res.cloudinary.com/rroe4rtk/image/upload/v1787068193/wealthfolio-holdings-positions.png)

![Wealthfolio activity ledger listing buy and deposit transactions](https://res.cloudinary.com/rroe4rtk/image/upload/v1787068221/wealthfolio-activity-ledger.png)

## 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.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/wealthfolio-tracker
