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
Start the container
docker compose up -d - 2
Find your setup code
It's printed in the logs:docker logs budvo - 3
Open the dashboard
Go tohttp://<your-server>:8484, enter the code, choose a database password and save your recovery kit.
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 proxyterminal
docker compose up -ddocker logs budvo # prints the one-time setup codeOr
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:latestOptional
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.
terminal
echo "WATCHTOWER_HTTP_API_TOKEN=$(openssl rand -hex 32)" >> .envdocker compose up -ddocker-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.