Plain-Text Accounting (Beancount, Ledger, hledger)
Beancount + Fava, Ledger, hledger — finances in plain text in git; the gold-standard PTA stack for engineers.
Plain-Text Accounting (PTA) — your finances live as plain-text double-entry ledgers in a git repo. The 2026 default stack is Beancount + Fava (Python + a beautiful web UI). Ledger is the original (John Wiegley, 2003); hledger is the Haskell rewrite known for performance + ergonomics. All free OSS. For envelope budgeting see Actual Budget; for desktop double-entry see GnuCash; for the web-app comprehensive option see Firefly III Deep; for portfolio see Ghostfolio; for the broader self-host index see Self-Hosted Personal Apps; for SMB-business accounting see Accounting & Bookkeeping; for tax software see Free Tax Software.
The headline tools
- ★ ★ Beancount + Fava — free OSS (GPLv2); the modern PTA gold standard. Beancount = strict typed double-entry text format, written in Python. Fava = the web UI (gorgeous; charts; budgets; income statements; balance sheets; net worth).
- ★ Ledger — free OSS (BSD); the original PTA tool by John Wiegley (2003); C++; CLI-first; mature; the canonical reference.
- ★ hledger — free OSS (GPLv3); Haskell rewrite of Ledger; faster, simpler syntax, built-in web UI (
hledger-web); great docs.
Why pick plain-text accounting
- ★ Forever-format — text files; readable in 30 years.
- ★ Git-versioned — every change is a commit; full history; diffs; branching.
- ★ Programmable — pipelines, scripts, custom reports; integrates with anything.
- ★ Auditable — your accountant can read the source.
- ★ No lock-in — switch tools, keep the data.
- ★ Privacy — text files; no cloud; you choose your sync.
Why not
- High learning curve.
- No mobile-first story.
- Manual category mapping until you build automation.
- Family-friendly UX is weak (Fava helps; still a power-user app).
Beancount syntax (a taste)
Strict typed format; Beancount validates balances and rejects malformed entries. The mental model: every transaction has at least two postings that balance to zero.
hledger / Ledger syntax
Looser typing; faster to write; same conceptual model.
Importers (★ critical for adoption)
- ★ bean-extract (Beancount built-in) — config-driven importers; per-bank Python class.
- ★ smart_importer — beancount + ML category prediction; great for the "I don't want to map every coffee shop" workflow.
- beancount-import — interactive importer with category-suggestion UI.
- plaid-importers for Beancount — community modules; or use SimpleFIN (Bank Import & SimpleFIN) → CSV → bean-extract.
- ledger-autosync — OFX → Ledger.
- hledger-flow — opinionated CSV pipeline for hledger.
- rules.py — most PTA practitioners write per-account rules; easy.
- ofxstatement — OFX file → CSV intermediate format.
Investment / commodities
- ★ Beancount has first-class commodity + lot tracking; cost basis, FIFO/LIFO, gains/losses, multi-currency conversions all native.
- Price feeds —
bean-price/pricehistplugins fetch from Yahoo / AlphaVantage / Coingecko etc. Cron daily. - ★ Fava charts — net worth, allocation, performance, income vs expense — comparable to a paid app.
- For deeper portfolio UI, pair Beancount with Ghostfolio (Ghostfolio).
Family / multi-user
- One git repo, multiple committers — branching for spouses; merge.
- Shared Fava behind Tailscale or Cloudflare Access.
- Encrypted git repo (git-crypt, age) — recommended for sensitive ledgers.
Community
- ★ ★ plaintextaccounting.org — the directory + getting-started hub.
- PTA mailing list + Reddit /r/plaintextaccounting + IRC/Matrix.
- Conferences — community gatherings around FOSDEM each year.
- Beancount mailing list — small, helpful.
Migration path from spreadsheets / GnuCash / Mint
- ★ Export GnuCash → CSV → bean-extract.
- ★ Mint export (while data still exists in old exports) → bean-extract.
- ★ Walk the past N years of transactions through importers — backfill is the one-time pain that pays off forever.
Backup + sync
- Git repo on a private remote (GitHub / Codeberg / self-host Forgejo) — see Self-Hosted Git Forges.
- Encrypted backup of the repo with restic / Borg — see Backup & Disaster Recovery.
License / pricing
- Beancount, Fava, Ledger, hledger, bean-extract, smart_importer, beancount-import, ledger-autosync, hledger-flow, ofxstatement: free OSS.
- plaintextaccounting.org: free.
Pick this if…
- Default 2026 PTA stack: Beancount + Fava.
- Performance / simpler syntax: hledger.
- Want the original: Ledger.
- Don't want to learn syntax / write code: Actual Budget or GnuCash instead.
- Already a software engineer: PTA is the right home for your finances.
- Multi-currency / lot-tracked investments: Beancount.
- Want a beautiful web UI on top of it: Fava.
- Comfortable shipping a small Python pipeline: SimpleFIN → bean-extract → git commit; once a week.