Beancount vs Ledger
Beancount and Ledger are both plain-text double-entry accounting tools, but they make different design trade-offs. This page outlines the differences that matter when choosing between them.
Strictness vs. flexibility: This is the fundamental divide. Ledger is permissive — accounts don’t need to be declared, most directives are optional, and the parser accepts a wide range of input formats. Beancount is strict — accounts must be opened before use, every transaction must balance exactly, and the parser rejects anything it doesn’t understand. Ledger’s approach is faster to start with. Beancount’s approach catches more errors.
Balance assertions: Beancount treats balance assertions as a core feature and the primary error-detection mechanism. Ledger supports them but doesn’t emphasize them. In practice, Beancount users write assertions frequently; Ledger users may not use them at all.
Virtual postings: Ledger supports virtual postings (postings that don’t need to balance) for budgeting and tracking. Beancount doesn’t — every posting must balance. Beancount’s position is that virtual postings violate double-entry principles and introduce opportunities for hidden errors.
Web interface: Beancount has Fava, a polished web UI with charts, filtering, and interactive reports. Ledger has hledger-web (from the related hledger project) but no native web interface.
Language and extensibility: Beancount is written in Python, making plugins and importers easy to write for Python users. Ledger is written in C++, which makes it faster but harder to extend. Ledger compensates with powerful command-line reporting and Unix-style composability.
Commodity and lot tracking: Both handle multiple commodities, but the syntax differs. Ledger uses @ for price and {...} for lot cost. Beancount uses similar syntax but with stricter rules around cost basis tracking and lot matching.
Which to choose: Pick Ledger if you want maximum flexibility, are comfortable with the command line, and prefer to define your own conventions. Pick Beancount if you want the software to enforce correctness, plan to use the Python ecosystem for importers, or want a web interface through Fava. Both are solid choices — the plain-text data format means switching later isn’t catastrophic.