zBudget is our open source personal finance application. It runs entirely on hardware you control: no cloud account, no subscription, no third party holding a read-only token against your checking account.

This post covers what it does, how it differs from the two obvious alternatives, and — because this matters more than a feature list — when you should use one of those instead.

Why self-hosted finance

Most budgeting apps ask you to link your bank through an aggregator. Your transaction history flows through their infrastructure, lands in their database, and is governed by a privacy policy that can be revised with an email. The aggregator layer is also the part that breaks: connections silently expire, a bank changes its login flow, and your budget quietly stops updating until you notice a month later.

zBudget takes the other trade. There is no aggregator, which means no silent breakage and no third party — but it also means you import statements yourself. That is a real cost, and it is the main reason to choose something else, which we will get to.

What you get

  • Dashboard — Monthly net balance, spending charts, budget health indicators, and upcoming recurring transactions in one view
  • Transactions — Manual entry plus bulk import from OFX and CSV with automatic deduplication, and inline category and account editing
  • Auto-categorize rules — Match on payee name patterns so imported transactions land in the right category without a second pass
  • Budgets — Per-category spending limits with progress bars that shift from green to red as you approach them
  • Accounts — Checking, savings, credit cards, and investment accounts, color-coded and reorderable
  • Reports — Income versus expenses by month, spending breakdowns, top payees, and PDF export
  • Backup and restore — The whole database as a single JSON file, restorable anywhere

How it compares

Actual Budget and Firefly III are both good, both mature, and both solve a different problem than zBudget does. The honest summary:

zBudget Actual Budget Firefly III
Model Category budgets Envelope / zero-based Double-entry accounting
Stack React + FastAPI + PostgreSQL JS, local-first with sync server PHP/Laravel + MySQL or PostgreSQL
Bank sync None — OFX/CSV import SimpleFIN and GoCardless Separate importer app
Offline use Web app against your server Local-first; works offline Server required
Mobile Responsive web Responsive web plus community apps Responsive web plus community apps
Learning curve Low Low Steep
Project age New Years, large community Years, large community

Choose Actual Budget if you want strict envelope budgeting where every dollar is assigned a job, or if local-first offline editing matters to you. Its sync model — a local copy that syncs through a small self-hosted server — is genuinely better than a plain client-server app if you move between machines and want the UI to stay instant.

Choose Firefly III if you think in double-entry terms, run multiple currencies, or want a rules engine and reporting depth that took years to accumulate. It is the most complete of the three by a wide margin. The cost is a learning curve: you will spend a weekend understanding its model of accounts and transfers before it feels natural.

Choose zBudget if you want a plain category-budget app on a stack you can read, deployed with one docker compose up, with your data in a PostgreSQL database you already know how to back up. It is deliberately smaller than the other two. If the feature table above shows something missing that you need, take that seriously — it is missing.

The honest weaknesses: no bank synchronization, no native mobile app, no multi-currency support, and a young enough project that you should keep those JSON backups.

Tech stack

React 19 and TypeScript on the frontend with Tailwind CSS v4, Zustand for state, and Recharts for the visualizations. FastAPI and PostgreSQL on the backend. Everything is orchestrated with Docker Compose, and the whole thing is small enough to read in an afternoon — which is the point. Self-hosting software you cannot audit is just someone else's cloud with extra steps.

Getting started

Clone the repository, copy .env.example to .env and set your database password, then:

docker compose up -d
                

The app comes up on localhost:3000. Seed the default categories with one click, import a statement, and you have a month of history in a few minutes. If you want to put it behind a reverse proxy on your own domain, the Docker Compose builder will help you assemble the service definition, and the OpenSSL command generator will produce the database password and session secret.

zBudget is MIT licensed. The source is on CodeVault, and it runs on the same self-hosted stack described in why we build in the open.