Skip to content

Install

One container. Your hardware.

Budvo runs anywhere Docker does: a NAS, a Mac mini, a home server or a Raspberry Pi. Start it, open the dashboard and you're a few minutes from your first plan.

Latest server: 0.5.0· Statements, more paychecks and loans paid every 2 weeks

Recommended

Docker Compose

Save this as docker-compose.yml in a new folder, set TZ to your time zone, then start it.
  1. 1

    Start the container

    docker compose up -d
  2. 2

    Find your setup code

    It's printed in the logs: docker logs budvo
  3. 3

    Open the dashboard

    Go to http://<your-server>:8484, enter the code, choose a database password and save your recovery kit.
Full install guide
docker-compose.yml
services:  budvo:    image: git.ronniie.com/nulldaily/budvo:latest    container_name: budvo    restart: unless-stopped    ports:      - "8484:8484"    volumes:      - ./data:/data               # encrypted data and backups    environment:      TZ: America/New_York         # your time zone      BUDVO_TRUST_PROXY: "false"    # "true" behind a tunnel or proxy
terminal
docker compose up -ddocker logs budvo    # prints the one-time setup code

Or

A single docker run

The same thing in one command. Run it from the folder where the data directory should live.
terminal
docker run -d --name budvo --restart unless-stopped \  -p 8484:8484 \  -v "$(pwd)/data:/data" \  -e TZ=America/New_York \  -e BUDVO_TRUST_PROXY=false \  git.ronniie.com/nulldaily/budvo:latest

Optional

One-click updates

Add a small Watchtower sidecar and update from the dashboard with Update now. It only acts when Budvo asks, with a secret token, and only on the Budvo container. Budvo backs up the database before every update.
Updates, backups and rollback
terminal
echo "WATCHTOWER_HTTP_API_TOKEN=$(openssl rand -hex 32)" >> .envdocker compose up -d
docker-compose.yml
services:  budvo:    image: git.ronniie.com/nulldaily/budvo:latest    container_name: budvo    restart: unless-stopped    ports:      - "8484:8484"    volumes:      - ./data:/data    environment:      TZ: America/New_York      BUDVO_TRUST_PROXY: "false"      # One-click updates: Budvo asks the watchtower service below.      BUDVO_UPDATER_URL: http://watchtower:8080      BUDVO_UPDATER_TOKEN: ${WATCHTOWER_HTTP_API_TOKEN}    labels:      com.centurylinklabs.watchtower.enable: "true"  # Applies an update only when Budvo asks for one. It never polls on its  # own, and label-enable limits it to the budvo container.  watchtower:    image: nickfedor/watchtower:1.22.3@sha256:2f8f2a9bd21a195b3b650409532a20f6aada8ef5834f00d0d7a999dee0779a81    restart: unless-stopped    volumes:      - /var/run/docker.sock:/var/run/docker.sock    environment:      WATCHTOWER_HTTP_API_ENDPOINTS: update,health      WATCHTOWER_HTTP_API_TOKEN: ${WATCHTOWER_HTTP_API_TOKEN:?set it in .env}      WATCHTOWER_LABEL_ENABLE: "true"      WATCHTOWER_CLEANUP: "true"      TZ: America/New_York    labels:      com.centurylinklabs.watchtower.enable: "false"

After it's running

The iPhone app is on its way

A native app for iOS 26 that pairs with your server by scanning a code in the dashboard. Safe to spend at a glance, widgets, bills in your calendar and encrypted reminders. Your data still lives only on your server.

Coming soon foriPhone, iOS 26

The dashboard does everything today.