A robust command-line interface and Python library for programmatically managing Beancount ledgers. Designed for AI agents and automation workflows.
- Validation: Wrap
bean-checkto validate ledgers programmatically. - Visualization: View the file inclusion tree (
treecommand). - Transactions:
- List transactions with regex filtering (account, payee, tags).
- Add transactions via CLI arguments or JSON (stdin supported).
- Draft mode support (flag
!).
- Entities:
- Manage Accounts (list, create).
- Manage Commodities (create).
- Manage Prices (fetch, update).
- Formatting:
- Auto-format ledgers (
bean-formatwrapper). - Global output formatting:
--formatsupport (table,json,csv) for all data commands.
- Auto-format ledgers (
- Reporting: Generate balance, holding, and audit reports with multi-currency conversion.
- Composability: Built for Unix piping (
json|csv) and batch processing via STDIN. - Configuration: Custom Beancount directives for routing new entries to specific files.
- Tab Completion: We provide tab completions for bash and zsh.
Install using uv or pip:
uv pip install beancount-cli
# or
pip install beancount-cliFor development:
uv syncFor setting up tab completion for your shell, see Tab Completion under Configuration.
All data-retrieval and reporting commands support the --format flag.
# Default human-readable table
bean report bs
# Machine-readable CSV (highly token-efficient for AI agents)
bean --format csv transaction list
# Structural JSON (perfect for piping into jq or other scripts)
bean --format json account listValidate your ledger file:
bean check main.beancountFormat your ledger file in-place (uses bean-format):
bean format main.beancountVisualize the tree of included files:
bean tree main.beancountGenerate specialized accounting reports with multi-currency support:
# Balance Sheet (Assets, Liabilities, Equity)
bean report balance-sheet main.beancount
# Trial Balance (All accounts including Income/Expenses)
bean report trial-balance main.beancount
# Holdings (Net worth per Asset account)
bean report holdings main.beancount
# Audit a specific currency (Source of Exposure)
bean report audit USD main.beancountTip
Convenience aliases are supported: bs (balance-sheet) and trial (trial-balance).
Use the --convert and --valuation flags for a consolidated view:
# View Trial Balance in USD using historical cost
bean report trial main.beancount --convert USD --valuation cost
# View Balance Sheet in EUR using current market prices
bean report bs main.beancount --convert EUR --valuation market| Valuation | Description | Use Case |
|---|---|---|
market (default) |
Uses latest prices from the ledger. | Current Net Worth tracking. |
cost |
Uses historical price basis ({}). |
Accounting Verification (proving balance). |
List Transactions:
bean transaction list main.beancount --account "Assets:US:.*" --payee "Amazon"Add Transaction:
# JSON via argument
bean transaction add main.beancount --json '{"date": "2023-10-27", ...}'
# JSON via stdin (Recommended for complex data)
cat tx.json | bean transaction add main.beancount --json -
# Create as Draft (!)
bean transaction add main.beancount --json ... --draftAll creation commands (transaction add, account create, commodity create) support batch processing via JSON arrays on STDIN.
# Batch add transactions from a file
cat txs.json | bean transaction add --json -
# Pipe accounts from one ledger to another
bean --format json account list --file old.beancount | bean account create --json -Standard CLI usage:
# List Accounts
bean account list
# Create Account
bean account create --name "Assets:NewBank" --currency "USD"
# Create Commodity
bean commodity create "BTC" --name "Bitcoin"
# Fetch and Update Prices
bean price --updatebeancount-cli is specifically optimized for AI agents, providing both operational guidance and machine-readable interfaces.
We provide specialized documentation for different types of AI interactions:
- AGENTS.md: Guide for AI End Agents operating the CLI (prompting strategies, token optimization, batch workflows).
- CODING_AGENTS.md: Mandatory rules for AI Coding Agents modifying the source code (Value Objects, Fail-Fast rules, type safety).
Agents can dynamically retrieve the JSON schema for transactions to ensure valid data generation:
bean transaction schemaAgents should aim to generate JSON in this format for a standard purchase with multiple postings:
{
"date": "2023-10-27",
"payee": "Amazon",
"narration": "Office supplies",
"postings": [
{
"account": "Expenses:Office:Supplies",
"units": { "number": 45.99, "currency": "USD" }
},
{
"account": "Liabilities:US:Chase:Slate",
"units": { "number": -45.99, "currency": "USD" }
}
]
}For reliable cross-platform execution in agent workflows:
uv run bean transaction add --json - < tx.jsonbean uses a 4-tier discovery logic to find your ledger file automatically:
- Explicit Argument: Passing the filename directly (e.g.
bean check my.beancount). BEANCOUNT_FILE: Direct path to a ledger file.BEANCOUNT_PATH: Looks formain.beancountinside this directory.- Local Directory: Fallback to
./main.beancount.
You can configure where new entries are written using custom directives in your Beancount file.
Note: custom directives require a date (e.g. 2023-01-01).
2023-01-01 custom "cli-config" "new_transaction_file" "inbox.beancount"
2023-01-01 custom "cli-config" "new_account_file" "accounts.beancount"
2023-01-01 custom "cli-config" "new_commodity_file" "commodities.beancount"
Context-Aware Insertion: You can use placeholders to route transactions to dynamic paths:
2023-01-01 custom "cli-config" "new_transaction_file" "{year}/{month}/txs.beancount"
Supported placeholders: {year}, {month}, {day}, {payee}, {slug}.
Directory Mode (One file per transaction):
If new_transaction_file points to a directory, bean will create a new file for each transaction inside that directory, named with an ISO timestamp.
2023-01-01 custom "cli-config" "new_transaction_file" "inbox/"
bean supports shell tab completion through argcomplete.
For the current Bash session:
eval "$(register-python-argcomplete bean)"For the current Zsh session:
autoload -U +X bashcompinit && bashcompinit
eval "$(register-python-argcomplete bean)"To enable globally for future sessions:
activate-global-python-argcomplete --userIf completion does not work, confirm your shell has loaded the generated completion
script and that register-python-argcomplete is available in your environment.
Run tests:
uv run pytest