# Ledger CLI

Plain-text double-entry accounting from the command line; the CLI is the whole interface.

Ledger reads a text journal of transactions and produces balance, register, budget and forecast reports with no database. It has been the reference plain-text accounting tool since 2003 and is scriptable by construction: an agent appends to the journal and runs reports. BSD-3-Clause, actively maintained.

Alternative to: Quicken

- Capabilities: operable
- Vertical: invoicing-finance
- Shape: product
- Form factor: cli
- Execution model: deterministic
- Provenance: human-written (recorded, never ranked)
- Repo: https://github.com/ledger/ledger (BSD-3-Clause), 6026 stars, last commit 2026-08-28
- Last activity: 2026-08-28
- Page: apps/ledger--ledger.html
- JSON: apps/ledger--ledger.json

## Use it when

- I keep my books in a text file in git and want reports without a GUI
- I want my agent to append transactions and run balance checks in a script

## Gotchas

- No invoicing, no bank sync; you supply the journal
- Python features (--import) need a Python-enabled build, which is off by default
- Community Windows support is weaker than macOS and Linux

## Editions

- Free: Free, open source
  - source: https://github.com/ledger/ledger
  - installable: brew install ledger
  - container: https://hub.docker.com/r/dcycle/ledger/

## Operable: what an agent can drive

Operability: official. Interface: cli at https://www.ledger-cli.org/docs.html (published by the builder, local).

### Reach (partial coverage)

- Balance reports by account: reachable. ledger balance (manual ch. 'Reports')
- Register of transactions with filters: reachable. ledger register with account, payee and date expressions
- Budgeting against periodic transactions: reachable. --budget and --unbudgeted flags
- Forecasting: reachable. --forecast option with periodic entries
- Multi-commodity and price valuation: reachable. price database, --market and --exchange
- Periodic and custom-formatted reports: reachable. --period, --format, csv and xml commands
- Enter new transactions: reachable. ledger xact drafts a transaction from a payee; or append to the journal file
- Import bank data: undetermined. convert command exists; --import needs a Python-enabled build
- Close books and equity: reachable. equity command for opening balances

## Code stack

- Languages: C++, Python
- Frameworks: Boost
- Package manager: cmake
- Database: none
- Hosting target: local machine, Docker

## Evidence and confidence

- formFactor: UNIX command-line tool (README) (confidence 0.95)
- executionModel: no model at runtime (confidence 0.95)
- operability: the CLI is the product; docs at ledger-cli.org by the Builder (confidence 0.95)
- effort: no Customization surface beyond the journal and ~/.ledgerrc defaults; adapting means C++ fork (confidence 0.7)
- editions: BSD-3-Clause per LICENSE.md; free (confidence 0.95)
- active: GitHub pushedAt 2026-08-28; CLAUDE.md in repo
- reach:  (confidence 0.85)

## Open questions

- Whether ~/.ledgerrc should count as a config file that makes this Adaptable at config-only; this analysis kept it Operable only

## Sources

- https://github.com/ledger/ledger (sourcing:invoicing-finance:community)
- https://www.ledger-cli.org/docs.html (sourcing:invoicing-finance:community)
