Budget Board
★ 897A self-hosted alternative to Mint, Ynab
About
Community Ratings
No ratings yetNew this week
Read recap →Features
- Accounts & assets management
- Transaction recording and categorization
- Monthly budgeting
- CSV transaction import
- Financial institution sync via providers
- Auto-categorization
- Automatic transaction rules
- Financial goals tracking
- Spending trends charts
- Local authentication with 2FA and OIDC login
Details
- Last Updated
- Nov 11, 2026
- Created
- Jun 16, 2020
- Install Methods
- source
- Default Port
- 6253From the project's Compose file
- Authentication
- localoidc-sso2fa
- Runtime / Stack
- Docker
- Privacy & Independence
- Cloud: Optional
- Deployment
Deployment: Docker Compose ✓3 Containers — light hosting footprintRuns as 3 containers
Run Budget Board yourself
Pick how much you want to manage.
netcupBest match
Full control
A small server, then Docker Compose.
About 20 minutes with Docker
Hetzner
Full control
A small server, then Docker Compose.
About 20 minutes with Docker
DigitalOcean
Full control
A small server, then Docker Compose.
About 20 minutes with Docker
1 more way to host
Some links earn us a commission. netcup pays us one and is our preferred VPS host.
Is this your project? Sponsor a listing
Run Budget Board with Docker Compose
Compose file from the Budget Board project repository.
3 services · database: postgres · infra: postgres
no resource limits declared
needs persistent storage (1 volume)
compose.yml · @ a3ec333 · scanned Nov 3, 2026
services:
budget-board-server:
container_name: budget-board-server
restart: unless-stopped
image: ghcr.io/teelur/budget-board/server:v3
build: ./server
environment:
Logging__LogLevel__Default: ${LOG_LEVEL:-Information}
CLIENT_ADDRESS: budget-board-client
ASPNETCORE_HTTP_PORTS: 8080
POSTGRES_HOST: ${POSTGRES_HOST:-budget-board-db}
POSTGRES_PORT: ${POSTGRES_PORT:-5432}
POSTGRES_DATABASE: ${POSTGRES_DATABASE:?POSTGRES_DATABASE must be set; use --env-file compose.env}
POSTGRES_USER: ${POSTGRES_USER:?POSTGRES_USER must be set; use --env-file compose.env}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set; use --env-file compose.env}
OIDC_ENABLED: ${OIDC_ENABLED:-false}
OIDC_ISSUER: ${OIDC_ISSUER:-}
OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:-}
OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET:-}
EMAIL_SENDER: ${EMAIL_SENDER:-}
EMAIL_SENDER_USERNAME: ${EMAIL_SENDER_USERNAME:-}
EMAIL_SENDER_PASSWORD: ${EMAIL_SENDER_PASSWORD:-}
EMAIL_SMTP_HOST: ${EMAIL_SMTP_HOST:-}
EMAIL_SMTP_PORT: ${EMAIL_SMTP_PORT:-587}
DISABLE_NEW_USERS: ${DISABLE_NEW_USERS:-false}
DISABLE_LOCAL_AUTH: ${DISABLE_LOCAL_AUTH:-false}
AUTO_UPDATE_DB: ${AUTO_UPDATE_DB:-true}
DISABLE_UPDATE_CHECK: ${DISABLE_UPDATE_CHECK:-false}
DISABLE_AUTO_SYNC: ${DISABLE_AUTO_SYNC:-false}
SYNC_INTERVAL_HOURS: ${SYNC_INTERVAL_HOURS:-8}
TZ: ${TZ:-UTC}
networks:
- budget-board-network
depends_on:
budget-board-db:
condition: service_healthy
healthcheck:
test:
[
"CMD",
"curl",
"--fail",
"--silent",
"--show-error",
"http://localhost:8080/health",
]
interval: 5s
timeout: 5s
retries: 10
start_period: 10s
budget-board-client:
container_name: budget-board-client
restart: unless-stopped
image: ghcr.io/teelur/budget-board/client:v3
build: ./client
environment:
PORT: 6253
VITE_SERVER_ADDRESS: budget-board-server
VITE_OIDC_ENABLED: ${OIDC_ENABLED:-false}
VITE_OIDC_PROVIDER: ${OIDC_ISSUER:-}
VITE_OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:-}
VITE_DISABLE_NEW_USERS: ${DISABLE_NEW_USERS:-false}
VITE_DISABLE_LOCAL_AUTH: ${DISABLE_LOCAL_AUTH:-false}
ports:
- ${CUSTOM_PORT:-6253}:6253
networks:
- budget-board-network
depends_on:
budget-board-server:
condition: service_healthy
budget-board-db:
container_name: postgres-db
image: postgres:16
restart: unless-stopped
command: ["-c", "timezone=${TZ:-UTC}"]
environment:
POSTGRES_USER: ${POSTGRES_USER:?POSTGRES_USER must be set; use --env-file compose.env}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set; use --env-file compose.env}
POSTGRES_DB: ${POSTGRES_DATABASE:?POSTGRES_DATABASE must be set; use --env-file compose.env}
ports:
- "6252:5432"
volumes:
- db-data:/var/lib/postgresql/data
networks:
- budget-board-network
healthcheck:
test:
[
"CMD-SHELL",
"pg_isready -U ${POSTGRES_USER:?POSTGRES_USER must be set; use --env-file compose.env} -d ${POSTGRES_DATABASE:?POSTGRES_DATABASE must be set; use --env-file compose.env}",
]
interval: 5s
timeout: 5s
retries: 5
volumes:
db-data:
networks:
budget-board-network:
name: budget-board-network
driver: bridge
This file may be out of date. Check the Budget Board documentation for current setup steps.
Track your self-hosted stack
Bookmark software to try, rate tools you've used, and keep your collection in one place.