Plain Text Accounting


accounting is tracking the flow of valuable commodities, such as money or time. It clarifies activity, priorities, obligations, opportunities. It can reduce stress and even be enjoyable.

double-entry bookkeeping is a process for doing this reliably. For every movement of value (a transaction), both the source and destination are recorded. Simple arithmetic invariants help prevent errors.

In traditional double-entry bookkeeping, value at any point in time is tracked in various accounts, classified as asset (owned), liability (owed) or equity (invested). Two more classifications track changes during some period: revenues (inflows) and expenses (outflows).

Transactions consist of debits (increases to asset or expense accounts, or decreases to liability or equity accounts) or credits (decreases to asset or expense accounts, or increases to liability or equity accounts).

… with text

In 2003, John Wiegley invented Ledger: a plain text data format and command-line reporting tool for efficient double-entry-style accounting. This idea went viral among software developers and technical folk, and we now have 5+ actively-developed Ledger-likes such as hledger and Beancount, with 40+ add-on tools and an active community. This site was created in 2016 to introduce our tools, documentation, and practices.

Accounting data is valuable; we want to know that it will be accessible for ever - even without software. We want to know when it changes, and revision-control it. We want to search and manipulate it efficiently. So, we store it as human-readable plain text.

We simplify debits and credits by using signed numbers instead - positive for inflows to an account, negative for outflows from an account.

We define arbitrary account hierarchy to suit our needs. This scales smoothly from simple to complex scenarios, and from high-level overview to fine detail.

Ledger-likes are, at least in part, command-line tools. This makes them efficient to use and very scriptable and flexible.

Ledger-likes also, at their core, tend towards functional operation: they read the input data without changing it, and output a report. This simple model makes them easy to understand and rely on.

questions ?

who is this for ?
Techies, power users, and do-it-yourself-ers, for now. If you need a complete GUI providing lots of guidance, you may prefer to use something else.

must I edit text and type cryptic commands ?
Not entirely! "Plain Text Accounting" is a broad description, referring mainly to the data format. We don't object to additional GUIs, and they are coming.

who is using it, and how ?
See Who's using Ledger? for some stories.

what are the alternatives ?
FOSS tools like GNUCash, Grisbi, KMyMoney. Proprietary tools like Quicken/Quickbooks, You Need A Budget. Online tools like Xero, FreeAgent. (There are many). Spreadsheets. Paper accounting. A bookkeeper.

why is this better than QuickBooks ?
Your data remains accessible. No yearly fees. Free software you can fix and port. Cross platform. Scriptable. Efficient.

how do I communicate with my accountant ?
Clean up text reports by hand, print them as PDF, export CSV reports to a spreadsheet..

what if my accountant only uses QuickBooks ?
You'll need a new accountant, or a duplicate set of books in QuickBooks, or to pioneer *ledger -> QuickBooks exporting.

can I use this to do my taxes ?
You can use this to track and report the data needed for tax reporting. Fill out and submit tax forms with another tool, or by hand.


Project, start date Last release Code, committers Mail list, size IRC, size
Ledger, 2003 2016/01 C++ 101 ledger-cli 650 #ledger 75
hledger, 2007 2015/10 Haskell 30 hledger 75 #hledger 30
Beancount, 2008 Python 8 beancount 70 #beancount 5
Abandon, 2013 2015/11 Scala 5
Ledger in Go, 2013 Go 2


Project, start date Last release Code
uledger, 2015 Python
pacioli, 2013 Python, 2013 Perl
Penny, 2012 2014 Haskell
UMM, 2009 2010 Haskell
cl-ledger, 2007 Common Lisp
sm-Ledger, 2007 Squeak Smalltalk

data import/conversion

  • banks2ledger - CSV to *ledger converter
  • bean-identify, bean-extract, bean-file - Beancount built-in tools
  • beancount-import CSV to beancount converter (curses)
  • GNUCash to *ledger conversion
  • icsvledger CSV to *ledger converter
  • ledger-autosync OFX download, OFX to *ledger conversion, deduplication
  • *ledger to beancount converter
  • ledgerhub fetch prices, extract entries, convert various formats to beancount (? deprecated)
  • plaid2text Plaid API to *ledger/beancount download/conversion
  • qb2ledger QuickBooks General Journal CSV to *ledger converter
  • QIFtoLedger (Bank of America's) QIF to *ledger converter
  • reckon smart interactive/non-interactive CSV to *ledger converter
  • total_recall CSV to *ledger converter

editor support

time logging

UI, console

  • bean-add interactive transaction entry
  • hledger add interactive transaction entry (built-in command)
  • ledger-add interactive transaction entry
  • ledger-plot interactive helper for making charts with GNUplot
  • ledger xact history-aware transaction generator (built-in command)

UI, curses


UI, web



mail lists/IRC

see above

stack exchange

ledger, hledger

hacker news

2009, 2013, 2014, 2014, 2015, 2016, 2016




@LedgerTips, #plaintextaccounting, #ledgercli, #hledger, #beancount




online books




blog posts


common tasks

choosing accounts

entering data



  • ledger-mode: C-c C-r





multiple currencies

shared expenses


time tracking

inventory tracking

non-profit accounting


API access

Send updates via the github repo (changes)