---
title: "Deploy Budget Board"
description: "Self-hosted personal finance and budgeting with bank sync and PostgreSQL"
category: "Other"
url: https://railway.com/deploy/budget-board
---

# Deploy Budget Board

Self-hosted personal finance and budgeting with bank sync and PostgreSQL

**[Deploy Budget Board on Railway](https://railway.com/template/budget-board)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/budget-board/manifest.json

- **Creator:** Youssef Siam
- **Category:** Other

## Template content

### server

- **Image:** ghcr.io/youssefsiam38/budget-board-railway:1.0.0@sha256:357cc3d11f323cf1ae947515ec348a307786076f97c79e556f398425802464fb
- **Health check:** /health

### db

- **Image:** postgres:16.15@sha256:65b16a8b326e0cfbdf33fa7e783f2a0cb352a61448616ccccfd616ef42aa0f65

### client

- **Image:** ghcr.io/youssefsiam38/budget-board-railway-client:1.0.0@sha256:b0f93ec3a7fe1b08e56baeeb53ae2cb052f83e05b22d0d3a0c829e76a67694af
- **Health check:** /
- **Public domain:** Yes

## Documentation

# Deploy and Host Budget Board on Railway

Budget Board is an open-source, self-hosted personal finance app: track accounts, transactions and net worth, set
monthly budgets by category, plan goals, and pull in bank data automatically through SimpleFIN or LunchFlow. This
template deploys it ready for the internet: your owner account is created from the email you enter and a
generated password, and public sign-up is closed. It is a community-maintained template and is not affiliated with
the Budget Board project.

## About Hosting Budget Board

Budget Board is three pieces: an ASP.NET Core API server, a React web app served by nginx (which also proxies
`/api` to the server), and PostgreSQL. Only the web app gets a public domain; the API server and the database stay
on Railway's private network. All your financial data lives in PostgreSQL on a Railway volume.

A stock Budget Board on a public URL lets anyone who finds it create an account. Its only switch against that,
`DISABLE_NEW_USERS`, also blocks the very first account. This template solves both: on an empty database the server
first starts on loopback only, registers your owner account, then restarts with sign-up disabled, so registration
is never reachable from the network. The web app's nginx is also set to look up the API server at request time, so
it keeps working when the server is redeployed and its private address changes.

## Common Use Cases

- Replace a budgeting spreadsheet with monthly category budgets, rollovers and spending trends
- Track every bank, card, loan and investment account plus assets in one net-worth view
- Sync transactions automatically from your banks with a SimpleFIN Bridge or LunchFlow token
- Import CSV exports from your bank and auto-categorise them with rules

## Dependencies for Budget Board Hosting

- PostgreSQL 16: included, on Railway's private network, with its own volume
- Optional: a SimpleFIN Bridge or LunchFlow account for automatic bank sync (configured in the app)
- Optional: an SMTP account for e-mail (password resets) and an OIDC provider for single sign-on

### Deployment Dependencies

- Budget Board (AGPL-3.0): https://github.com/teelur/budget-board
- Template source, images and tests: https://github.com/youssefsiam38/budget-board-railway

### Implementation Details

**First sign-in:** enter your email as `OWNER_EMAIL` when deploying. After the deploy turns green, open the `server`
service's Variables, copy `OWNER_PASSWORD`, and sign in at the `client` service's domain. You can change the
password inside Budget Board; the variable is only used to create the account on an empty database.

**What's configured for you:** the official Budget Board server and client images pinned by digest and used
unmodified, plus a small start-up script on each; a generated PostgreSQL password; database migrations on every
start; sign-up closed on the server and hidden in the web app; the API server private on port 8080 (dual-stack, as
Railway's private network needs); a health check on the server's `/health` and the web app's `/`.

**Bank sync:** SimpleFIN and LunchFlow are set up per user inside Budget Board (Settings), and the server syncs
every 8 hours (`SYNC_INTERVAL_HOURS`). Nothing to configure at deploy time.

**Optional settings** on the `server` service: `EMAIL_SENDER`, `EMAIL_SENDER_USERNAME`, `EMAIL_SENDER_PASSWORD`,
`EMAIL_SMTP_HOST`, `EMAIL_SMTP_PORT` for e-mail; `OIDC_ENABLED`, `OIDC_ISSUER`, `OIDC_CLIENT_ID`,
`OIDC_CLIENT_SECRET` for single sign-on (also set `VITE_OIDC_ENABLED`, `VITE_OIDC_PROVIDER`, `VITE_OIDC_CLIENT_ID`
on `client`). Turning on e-mail makes Budget Board require confirmed addresses, so confirm the owner's email when
prompted.

Tested on a live deployment of this template over HTTPS: owner sign-in, refused sign-up and anonymous API access,
creating an institution, account, transaction and budget, and all of it surviving a redeploy.

## Why Deploy Budget Board 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 Budget Board on Railway, you are one step closer to supporting a complete full-stack application with
minimal burden. Host your servers, databases, AI agents, and more on Railway.


## 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/budget-board
