The landscape

Plain text and local-first

Beancount

A double-entry bookkeeping language for text files, with a strict Python core, a SQL-like query language and a separate importer framework.

beancount.github.io · founded 2008 (Martin Blais dates his own start to around 2007) · No headquarters; a volunteer open-source project written and led by Martin Blais · researched 2026-10-10

Scope
Beancount parses a plain-text journal, checks it strictly (transactions must balance, lots are matched, balance assertions are dated) and produces reports and a Python data structure. Fava gives it a web interface; beangulp handles importing bank files; beanquery runs BQL queries. It does not fetch from banks or accounting systems, does not run a server of its own, and does not keep versions: history lives in whatever version control you use.
Backing
No funding or company. Donations go to the author through Wise or PayPal (README, checked 2026-10-10). A separate commercial service, beancount.io, sells a hosted ledger and MCP endpoint; its page does not say it is affiliated with the project.
Serves
consumer, freelancer, developers, smb
Covers
ledger, personal, documents, reporting, crypto
To ownpurse
Kin. The closest relative in spirit: an owner-held, local, exact record checked by strict rules. It differs from ownpurse in keeping one normalized journal you edit, rather than an append-only log of what each source reported.

What it is

Beancount is a double-entry bookkeeping language: you write transactions in a text file, Beancount reads them into memory, checks them and produces reports. Martin Blais began it in 2008 after learning double entry and finding the tools of the time fragile; John Wiegley’s Ledger was the inspiration, as the history doc says. It is free software under GPL-2.0-only, and Blais has written nearly all of the code himself.

It does not fetch data, host anything or keep versions. It is a strict reader of a file you own.

How it works

The journal holds dated directives: open and close accounts, transactions, prices, balance assertions, documents, notes. Blais’s comparison with Ledger and hledger states the stance plainly: “Beancount is highly pessimistic. It assumes the user is unreliable.” Every transaction must balance, there are no virtual postings, lots held at cost must match a lot that was added earlier, and balance assertions apply by date, not by file position. Python plugins run inside the load pipeline and can transform or check the directive stream.

Version 3, stable since June 2024, is trimmed down: importing moved to beangulp and querying to beanquery, and the web interface, Fava, is its own project (1.30.16, 2026-08-18).

Beangulp’s Importer class is small and worth reading. identify(filepath) says whether this importer handles a file. account, date and filename decide where the original is archived. extract(filepath, existing) returns new entries and may consult the existing ledger. deduplicate(entries, existing) marks, rather than drops, entries that look like ones already in the books, by setting __duplicate__ metadata; the code compares against existing entries within two days either side (its docstring says five). The import guide recommends a Git repository with a documents/ tree mirroring the chart of accounts, so every download is filed next to the account it fed.

Data and access

You hold everything. The journal is the data and is readable without Beancount. The Python API (beancount.loader.load_file) returns the parsed entries, errors and options; BQL answers SQL-like questions; Fava exports query results. There are no rate limits, keys or fees. History is not Beancount’s job: if you edit an entry, the old one exists only if Git kept it.

Agents

The core has no AI features and no MCP server. The ecosystem does. StdioA/beancount-mcp runs BQL and submits transactions to a local ledger (0.1.1 on PyPI, 2025-03-29). beanquery-mcp is an experimental read-focused server. plaintextaccounting.org lists Countbean (a Claude Code plugin and MCP server), Beanhand (receipts to entries) and Finzytrack. A commercial host, beancount.io, offers an OAuth-scoped MCP endpoint whose write tools commit to Git with an optional dry_run diff; it says the server itself shows no human approval dialog.

The strictness matters more than any of these. An agent that writes a wrong entry usually fails bean-check instead of quietly skewing a balance, which is the kind of check an agent can run on its own before a person looks.

Customers

Technical individuals, households and some sole traders and small firms; the README says it has been useful to “many users, companies, and foundations”. beancount has 6,065 GitHub stars and Fava 2,583 (GitHub API, 2026-10-10); plaintextaccounting.org counts about 103 committers and a mailing list of about 880. There are no review-site profiles. People who pick it praise the strict checks, the Python plugins, BQL and Fava; the costs are the learning curve and writing your own importers.

History

Version 1 (to 2013) was partly Ledger-compatible; version 2 was a complete rewrite with a new grammar, in maintenance from 2020; version 3 became stable in June 2024 and split the tools out. The latest release is 3.2.3 (2026-05-05).

For ownpurse

Beancount is kin: a local, exact, owner-held record that refuses what does not balance. Two things are worth taking. First, beangulp’s importer shape, identify, extract, archive the original and mark likely duplicates, maps directly onto an ownpurse connector writing to the drawer. Second, the pessimism: a record that will not load when it is wrong is the right base for agents.

The difference is where truth sits. Beancount’s truth is the normalized journal you edit; what the bank actually said survives only as a filed document. ownpurse keeps what each source reported as facts and derives the ledger, so a correction is a new fact and an as-of question has an answer. A Beancount export, and a Beancount importer that reads the ownpurse record, would serve the same people well.

Data and access

Public API
Yes. Python library (beancount.loader, beancount.core), BQL via beanquery, plugin hooks; no network API in the core
Auth
None; local files
Limits
None; bounded only by your machine
What access costs
Free
Export
Everything: the journal is the data. BQL and Fava export query results to CSV and other formats.
Notes
Beancount 3 (stable since June 2024) moved importing and querying into separate packages: beangulp 0.2.0 (2025-01-20) and beanquery 0.2.0 (2025-03-24). The latest beancount release on PyPI is 3.2.3 (2026-05-05).

Price

Model
Free open-source software
Entry
Free
Top
Free
Notes
Donations are optional. beancount.io, an unrelated-by-statement commercial host, requires a paid plan for personal API keys; its prices were not checked.

Agents

MCP
community
AI features
None in the core. The ecosystem has StdioA/beancount-mcp (query and submit transactions to a local ledger), vanto/beanquery-mcp (experimental, BQL), Countbean (a Claude Code plugin and MCP server), Beanhand (receipt photos to entries) and Finzytrack, all third party.
Agent writes
An agent can append text to the journal or call a community MCP tool that writes transactions; the core itself has no write API. beancount.io's hosted MCP has appendLedgerText and editLedgerFiles tools that commit to Git.
Approval
No built-in approval gate. The strict checker (bean-check) catches unbalanced or inconsistent entries after the fact; beancount.io offers a dry_run diff but says its server shows no human approval dialog and leaves confirmation to the client.
Notes
The strictness is what makes Beancount a good target for agents: an agent's mistake usually fails bean-check rather than silently skewing a balance.

Integration and customers

Connects to
Inputs through beangulp importers (CSV, OFX and PDF importers are written per bank, many shared by the community); outputs through BQL, Fava and the Python API. Fava 1.30.16 (2026-08-18) also offers an import screen over beangulp.
Notes
No bank feeds or accounting-system connectors ship with it. The importer interface is small: identify, account, date, filename, extract, deduplicate and sort.
Scale
6,065 GitHub stars for beancount and 2,583 for Fava (GitHub API, 2026-10-10). plaintextaccounting.org (2026) lists about 103 committers and a mailing list of about 880. No user counts are published.
Ratings
No G2, Capterra or Trustpilot profiles were found for the open-source project.
What customers say
Its author's comparison calls it 'highly pessimistic', and users who choose it tend to value that strictness, the Python plugin system, BQL and Fava. The usual costs are the learning curve, writing your own importers, and the v2 to v3 split that moved tools into separate packages.

Timeline

  1. 2008

    Beancount begun by Martin Blais, inspired by Ledger (project history doc).

  2. 2013

    Development on version 1, partly Ledger-compatible, halted; version 2 is a full rewrite with a new grammar.

  3. 2016-02-15

    First PyPI upload (2.0b5).

  4. 2020

    Version 2 enters maintenance mode.

  5. 2024-05-29

    beangulp 0.1.0 published, the successor to beancount.ingest.

  6. 2024-06

    Beancount 3 becomes the stable version, trimmed down with tools moved to their own projects.

  7. 2025-01-20

    beangulp 0.2.0 released.

  8. 2025-03-29

    Community beancount-mcp 0.1.1 published on PyPI.

  9. 2026-05-05

    beancount 3.2.3 released.

Borrow and avoid

Borrow
beangulp's importer shape: identify the file, extract entries, archive the original under a dated, account-named path, and mark (not drop) likely duplicates within a date window. Also bean-check's pessimism: refuse a record that does not balance.
Avoid
Making the edited journal the only record: once an entry is changed in place, what the source said is gone unless Git or the documents archive happen to hold it. Avoid deduplication by fuzzy date window as the identity rule; keep it as a review hint.

Sources

  1. beancount on GitHub (README, versions, donations)
  2. Beancount documentation index
  3. Beancount history and credits
  4. A comparison of Beancount and Ledger/hledger
  5. Importing external data in Beancount
  6. beangulp on GitHub
  7. beangulp Importer class source
  8. beancount on PyPI
  9. Fava
  10. StdioA/beancount-mcp listing
  11. vanto/beanquery-mcp
  12. beancount.io MCP announcement
  13. plaintextaccounting.org

Not confirmed against a primary source

  • Whether beancount.io is run by anyone connected to the Beancount project; its page does not say.
  • beancount.io plan prices.
  • Exact release date of Beancount 3.0.0 beyond 'June 2024' from the README.
  • Customer sentiment is drawn from the author's docs and the project's own positioning; Reddit could not be fetched and no G2, Capterra or Trustpilot profiles were found.
  • Activity and maintenance state of the community MCP servers beyond their last PyPI or GitHub dates (beancount-mcp last pushed 2025-05-08).

ownpurse is not affiliated with Beancount 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.