The landscape

Plain text and local-first

Ledger

The original plain-text double-entry accounting tool: a C++ command-line reporter over a journal you write by hand.

ledger-cli.org · founded August 2003 · No headquarters; an open-source project begun by John Wiegley, maintained by volunteers · researched 2026-10-10

Scope
Ledger reads a text journal and reports balances, registers, budgets, forecasts and commodity values from the command line, with a value-expression language and automated transactions. It converts bank CSV to journal entries with its convert command. Its manual says it 'will never alter your input file': it only reads, so it has no write path, no bank connections and no versioning.
Backing
No company, investors or sponsorship programme found; volunteer-maintained under the ledger GitHub organization.
Serves
consumer, freelancer, developers
Covers
ledger, personal, reporting, crypto
To ownpurse
Kin. The origin of the idea ownpurse shares: your books as a file you own, read by a tool that never edits them. It keeps a hand-written journal, discards the raw source by default, and leaves history to you.

What it is

Ledger is “a powerful, double-entry accounting system” run from the command line over a plain-text journal. John Wiegley began it in August 2003; it is BSD-licensed C++ and the tool that hledger, Beancount and the other plain-text accounting projects descend from or react to. Its manual is clear about scope: “Ledger will never alter your input file” and “Ledger is only for analyzing the data, not for altering it.” It “provides no bells or whistles” and suggests GnuCash to anyone who wants an entry interface.

How it works

You write transactions in a journal with any editor. Ledger parses it and answers questions: balances, registers, budgets, forecasts, values at market prices, with a value-expression language and automated transactions for anything else. It is optimistic where Beancount is strict: virtual postings are allowed, lots are not matched against earlier additions, and balance assertions follow file order, as Beancount’s author notes.

For bank data, ledger convert turns a CSV file into entries. With --rich-data, each entry carries the original CSV line, the import date and a UUID that is “a checksum of original csv line”; if an entry with that UUID is already in the journal, it is not printed again. That is content-based identity on the raw line, done right. Without the flag, the raw line is not kept.

Version 3.4.0 (2025-10-22, per the NEWS) added --hashes: a SHA-512 chain over transactions, built from each posting’s account, amount and other details plus the previous transaction’s hash, so that “the single hash value of the final transaction is sufficient to guarantee the shape of the entire history leading up to it”. You record Hash metadata on some transactions and Ledger reports a mismatch.

Data and access

The journal is yours and Ledger never writes to it. Reports come out as text, CSV, XML or Lisp, with custom --format strings; there is no JSON output and no network API. Python bindings expose the core, though Beancount’s author found them hard to build, and the unreleased 3.5.0 notes list many fixes for crashes in them.

Agents

Ledger has no AI features and no official MCP server; none from the community was verified for this dossier. plaintextaccounting.org lists ledger-guesser, a neural network that proposes entries resembling past ones. An agent can use Ledger as a capable read-only query engine and write by appending text, with no gate except the person and, now, a hash chain that shows if history was changed afterwards.

Customers

Technical individuals. The repository has 6,053 GitHub stars (2026-10-10); plaintextaccounting.org (2026) counts about 245 committers and a mailing list of about 900, the largest of the three. There are no review-site profiles. Releases slowed: 3.3.2 in March 2023, then 3.4.0 and 3.4.1 in October 2025, with a large 3.5.0 (more than 575 merged pull requests, C++17) in progress.

History

Ledger 2.x added XML output that Ledger could also read back. 3.0 changed defaults; 3.1 came 2014-10-05; 3.2.0 on 2020-05-01; 3.3 on 2023-02-08. hledger (2007) began as a Haskell take on it and Beancount (2008) as a stricter one.

For ownpurse

Ledger is kin and the original statement of the idea: your books are a file you own and the tool only reads it. Three of its choices line up with ownpurse: never write the owner’s data, identify an import by a checksum of the raw line rather than by date, and chain hashes so the last one vouches for the whole history.

Where it stops is where ownpurse starts. The raw record is discarded unless you ask; the chain is opt-in metadata on a file you can still edit; and every source must first be flattened into one journal by hand or by script. ownpurse keeps what each source reported as facts in an append-only, chained log by default and derives the journal, which a Ledger user could still export and read with Ledger.

Data and access

Public API
Yes. CLI reports with custom --format strings; csv, xml, lisp/emacs output; Python bindings to the C++ core
Auth
None; local files
Limits
None; local
What access costs
Free
Export
Everything: the journal is the data; reports as text, CSV, XML or Lisp.
Notes
Latest release 3.4.1 (2025-10-26) after 3.4.0 (2025-10-22). The development NEWS lists an unreleased 3.5.0 with more than 575 merged pull requests, a C++17 migration and many Python-binding crash fixes.

Price

Model
Free open-source software
Entry
Free
Top
Free
Notes
No paid tier or hosted service.

Agents

MCP
none
AI features
None. plaintextaccounting.org lists ledger-guesser, a neural network that suggests entries resembling past ones, used with ledger-autosync.
Agent writes
Ledger has no write path; an agent writes by appending text to the journal, often from convert's output.
Approval
None built in. Because Ledger only reads, any gate is whatever the person or their editor imposes; --hashes can detect that history was changed afterwards.
Notes
An agent can drive Ledger well as a read-only query engine over the journal: the CLI and value expressions are expressive, but outputs are text, CSV or XML rather than JSON.

Integration and customers

Connects to
Inputs: the Ledger journal and CSV via convert (with --auto-match, --invert, --account, --rich-data). Outputs: text reports, CSV, XML, Lisp, pricedb. Emacs ledger-mode is a separate project.
Notes
With --rich-data, convert stores the original CSV line, the import date and a UUID that is a checksum of that line; an entry whose UUID is already in the journal is not printed again. Without it, the raw line is not kept.
Scale
6,053 GitHub stars and 548 forks (GitHub API and page, 2026-10-10); plaintextaccounting.org (2026) lists about 245 committers, a mailing list of about 900 and about 70 on IRC. No user counts are published.
Ratings
No G2, Capterra or Trustpilot profiles were found.
What customers say
Respected as the origin of plain-text accounting and for its flexible value expressions and speed; its manual itself says it 'provides no bells or whistles' and points people who want an entry interface to GnuCash. Releases were sparse between 2023 and 2025.

Timeline

  1. 2003-08

    John Wiegley begins Ledger.

  2. 2011

    Featured on FLOSS Weekly 150.

  3. 2014-10-05

    Ledger 3.1 (3.0 preceded it); payee uuid directive added.

  4. 2020-05-01

    Ledger 3.2.0.

  5. 2023-02-08

    Ledger 3.3, adding a debit column to convert.

  6. 2025-10-22

    Ledger 3.4.0: hash chaining with --hashes, commodity swaps, C++17 and Boost 1.86.

  7. 2025-10-26

    Ledger 3.4.1.

  8. 2026-09-22

    Latest push to the repository; 3.5.0 notes in progress on master.

Borrow and avoid

Borrow
Read-only by design ('Ledger will never alter your input file'); a content checksum of the raw line as import identity (--rich-data UUID); a chained hash over transactions so the last hash vouches for the whole history (--hashes).
Avoid
Discarding the raw record by default: without --rich-data, nothing of what the bank said survives conversion. Also avoid an integrity check that is opt-in and per-transaction metadata rather than built into the record.

Sources

  1. Ledger home page
  2. Ledger 3 manual (convert, --rich-data, --hashes)
  3. Ledger NEWS
  4. Ledger releases on GitHub
  5. Ledger on GitHub
  6. A comparison of Beancount and Ledger/hledger
  7. plaintextaccounting.org

Not confirmed against a primary source

  • Whether any community MCP server for Ledger exists; web search was unavailable and none was found in the sources read.
  • The release date of Ledger 3.0 (NEWS gives none).
  • Who currently leads maintenance of Ledger; no maintainer statement was read.
  • Sentiment comes from the manual, Beancount's comparison and project activity; Reddit could not be fetched and no review-site profiles were found.

ownpurse is not affiliated with Ledger or any company named here. Names are their owners' trademarks. Figures come from the company's own pages and the press, as linked, as of 2026-10-10; scores are our reading of them against the definitions in the landscape. This is not legal or financial advice.