HO

Hospitable Ledger

Plain-text accounting toolkit and CLI

Budgeting & Finance ★ 6k stars Hard setup BSD-3-Clause

Ledger is the original command-line, double-entry plain-text accounting tool. It reads human-readable journal files and generates balance sheets, registers, and reports with powerful query options.

Key features

  • Command-line accounting
  • Plain-text journal files
  • Powerful reporting queries
  • No database required

Pros & cons

Strengths

  • Extremely portable data
  • Scriptable and version-controllable

Trade-offs

  • CLI only
  • Steep learning curve

Hospitable Ledger replaces

Last reviewed Sep 13, 2026 · 760 words

2026/09/01 * Electricity - September
    Expenses:Home:Utilities        84.20 EUR
    Assets:Bank:Checking

That is a complete, balanced transaction in Ledger, and the whole accounting system is a file of entries like it. Ledger is the original plain-text, double-entry accounting tool: a C++ command-line program first released in 2003, BSD-licensed, and still the reference that Beancount and hledger measure themselves against. It runs in 64 MB, needs no database, and the data is a file you can grep, diff, and commit to git. The Hard difficulty rating is fair, but the tool is not what is hard. Double-entry bookkeeping is hard, and Ledger refuses to hide it from you.

The journal file is the entire database

Every account is a colon-separated path (Assets:Bank:Checking, Expenses:Food:Groceries) that exists the moment you first use it. Every transaction lists postings that must sum to zero; leave one amount blank and Ledger fills it in. Commodities are arbitrary strings, so EUR, USD, BTC, and VTI shares live in the same file with P price directives for valuation. There is no schema to migrate, no export step, and no vendor. A 10-year personal journal is a few megabytes of text, and ledger -f journal.dat bal reads it in well under a second.

Every report is one command

ledger -f journal.dat balance Assets Liabilities
ledger -f journal.dat register Expenses:Food --monthly
ledger -f journal.dat bal Expenses -p "this year" --depth 2
ledger -f journal.dat bal ^Assets -X EUR -V

The query language filters by account regex, period, payee, tag, or amount expression; --monthly, --depth, -X (convert to a commodity), and -V (market value) cover most of what a budgeting app's dashboard shows. Budgets are ~ Monthly periodic transactions and --budget reports actual against plan. Automated transactions (= /Groceries/) can split a posting into shared and personal portions on every match. None of this has a GUI, and that is the point: the output goes to a terminal or a script, and the script goes wherever you want.

Getting bank data in is the actual work

Ledger has no bank sync and never will. The workflow that survives contact with real life is: download CSV from the bank monthly, run ledger convert or a short script that maps rows to postings from a rules file, review the result, append. Reviewing is where the time goes, because a text-file accounting system only works if every posting lands in the right account. Budget about an hour a month once your rules cover the recurring payees. People who skip this step end up with a beautiful journal that stops in March.

Beancount is where a newcomer should start

Ledger is the ancestor, but for someone starting today I point to Beancount with Fava as the web front end. Beancount is stricter (accounts must be opened with a directive, which catches typos Ledger silently accepts), its Python ecosystem of importers is larger, and Fava gives you an income statement, balance sheet, and charts in a browser on the same self-hosted box. Ledger wins if you want the fastest CLI, the most flexible query expressions, or you already have a journal in its syntax. hledger, a Haskell reimplementation, sits between the two and reads Ledger files with minor edits. All three share the same idea; moving between them is a format conversion, not a migration.

If you want an app, this is the wrong aisle

The finance category has proper web apps. Firefly III gives you a multi-user web UI, budgets, rules, and bank import through its data importer. Actual Budget is envelope budgeting with a polished client and local-first sync. Both are easier by a wide margin and both keep your data in a database you can export. Choose plain text only if you actively want to edit the source of truth in a text editor and script the reporting. That is a real preference, and a minority one.

What I'd do

New to double-entry: Beancount and Fava, with a monthly CSV import ritual on the calendar. Already fluent and allergic to web UIs: Ledger, the journal in a private git repo, a Makefile with the four reports above, and a cron job that emails the monthly balance. Either way the format is the durable part, and it is why I still have readable accounts from over a decade ago while every budgeting app from that era is gone.

Compare Hospitable Ledger

12 head-to-head comparisons.

Similar budgeting & finance apps