Fava

Web interface for Beancount plain-text accounting

Budgeting & Finance ★ 2.6k stars Medium setup MIT

Fava is a web interface for the Beancount plain-text, double-entry accounting system. It provides charts, balance sheets, income statements, and queries on top of plain-text ledger files.

Key features

  • Web UI for Beancount
  • Interactive charts and reports
  • Powerful query language
  • Plain-text ledger backend

Pros & cons

Strengths

  • Great for plain-text accounting fans
  • Version-controllable data

Trade-offs

  • Requires learning Beancount syntax
  • Not beginner-friendly

Fava replaces

Last reviewed Sep 13, 2026 · 949 words

Fava is not accounting software. It is a 2,575-star web viewer for Beancount, a plain-text double-entry ledger that you edit in a text editor and commit to git. If you have never heard of Beancount, that sentence is the whole decision: Fava is the best interface for a tool you first have to want. If you already keep a ledger in a text file, Fava is the reason to keep doing it, and it runs on 256 MB of RAM with no database at all.

The ledger is the product, Fava is the window

Every transaction in your books is a few lines of text, dated, with one posting per account, and Beancount refuses to load the file if the postings do not balance to zero. That strictness is the point. Fava reads the file, checks it with Beancount, and renders what an accountant would recognise: balance sheet, income statement, trial balance, a journal with filters, and a set of charts that treat every account as a time series. There is an editor tab, so you can fix an entry from the browser, but the file on disk stays the source of truth and git log stays the audit trail. That is what "version-controllable data" means in practice: a diff of last month's finances that you can read.

The cost is real. Beancount has syntax, account naming rules (five root accounts, Assets, Liabilities, Equity, Income, Expenses), and an import system that expects you to write small Python classes. Budget 1 evening to get a ledger loading and 2 to 3 weekends before entering data feels natural. People who want a friendlier route should look at Firefly III or Actual Budget, both of which have a bigger community and a form-based UI. Nothing in the finance category matches Fava for people who prefer text, and nothing in it is worse for people who do not.

Installation is one pip command, deployment is two decisions

Fava is a Python package. On any machine with Python 3:

pipx install fava
fava ~/finance/ledger.beancount

It listens on port 5000 by default and reloads automatically when the file changes. The two decisions come when you want it running permanently on a server.

First, authentication. Fava has none, and does not intend to add any. It shows every balance you own to whoever reaches the port, so it must sit behind something that asks for a password: a reverse proxy with basic auth, or better, a VPN so the port is never public. I run mine reachable only over Tailscale, which also removes the certificate question.

Second, where the ledger lives. Fava needs the file on local disk, and you want that file in git. The tidy pattern is a bare repository on a Gitea or Forgejo instance, a checkout on the Fava host, and a post-receive hook or a 5-minute cron git pull. Edits made in Fava's editor land in the working copy, so commit them from there, or treat the web editor as read-mostly and do real edits on your laptop.

Imports decide whether you keep using it

Nobody types 300 transactions a month by hand. Beancount's importer framework, and the companion beancount-import project, take CSV or OFX exports from your bank and turn them into ledger entries, with Fava's import page letting you review and accept each one. Writing the importer for a given bank is 30 to 80 lines of Python and is the single most common place people give up. Do it for your primary account first, live with manual entry for the rest, and add importers one at a time. Reconciliation is then a balance assertion per statement: one line stating what the bank says you have, which Beancount checks on every load.

The query console is the feature you did not know you needed

Fava exposes Beancount's query language, which looks like SQL over postings:

SELECT account, sum(position) WHERE account ~ "Expenses:Food" AND year = 2025 GROUP BY account

Anything you can phrase this way becomes a saved report, and the answer is exact to the cent because the underlying data is double-entry. This is the capability spreadsheet users lose and dedicated finance apps rarely match. It is also why Fava earns its place for multi-currency households, small companies filing their own accounts, and anyone tracking investments at cost basis: Beancount handles lots, prices and currency conversion natively, and Fava displays them without fuss.

What it will not do

There is no bank sync, no mobile app, no shared login for a partner, no invoicing, and no budgeting workflow beyond the plugin-driven budgets you write into the ledger. Multi-user means multiple people committing to one git repository. If any of those is a must, Fava is the wrong tool and Firefly III is the right one, with its bank-connector ecosystem and per-user accounts.

What I'd do

Start on a laptop, not a server. Install Fava with pipx, build a ledger for 1 account, write 1 importer, and run it for a month. If the text-based workflow clicks, move the ledger into a git repository and run Fava on a small VM behind Tailscale with no public port. If it does not click within that month, stop and set up Actual Budget instead; the sunk cost of learning Beancount is the trap here, not the software. For people who do stick with it, the payoff is a set of books you can grep, diff and query for the rest of your life.

Compare Fava

8 head-to-head comparisons.

Similar budgeting & finance apps