Accounts and the chart of accounts

ShippedWorks today.

An account is opened by name before anything can post to it, it lives in the ledger as a line of text you can read — and the currency you open it with is permanent.

The five roots

Every account name begins with one of five words, and the rest is yours:

Assets:Bank:Checking
Liabilities:CreditCard:Amex
Equity:Opening-Balances
Income:Consulting
Expenses:Software:Subscriptions

The colon is a hierarchy, not decoration — Expenses:Travel:Flights rolls up into Expenses:Travel, which rolls up into Expenses, in every report and every query, without you configuring anything.

Opening one

open_accounts takes ordinary Beancount text and commits it:

2026-01-01 open Assets:Bank:Checking USD
2026-01-01 open Expenses:Travel

list_accounts returns everything currently open. Opens, closes and commodity declarations are routed into accounts.beancount, transactions into transactions.beancount, prices into prices.beancount — so the diff on a change tells you what kind of change it was before you read a line of it.

An account must exist before anything posts to it. A transaction naming an account that was never opened is refused by bean-check, and the book is left unchanged.

Closing one

2026-06-30 close Liabilities:CreditCard:Amex

A closed account keeps its history — closing is a statement about the future, not an erasure. There is no delete.

The currency trap

This is the one that costs people an afternoon, so it is stated in full.

An account opened as open Expenses:Foo USD is pinned to USD. A later EUR posting to it fails bean-check with “Invalid currency”, and there is no tool to amend an existing open.

Open anything that might see more than one currency with no constraint at all:

2026-01-01 open Expenses:Travel:Berlin

An unconstrained account accepts every currency. A constrained one is a promise you are making to your future self about a bank account that really does only ever hold one currency — which is worth making for a chequing account and a mistake for an expense category.

What a book will not accept

A book takes ledger entries, not configuration. Only dated directives are accepted — open, close, commodity, balance, pad, note, document, price, event, and transactions. An option, plugin, include or custom line is refused by name, because those lines can change what validation even means, and the text arriving here was composed by a language model from someone’s prose.

What there is not

No rename, no merge, no amend. There is no tool that changes an existing open line — not its currency, not its name. A mis-named account is fixed by opening the right one, moving the balance with a transaction, and closing the wrong one. The wrong name stays in history, which is the trade plain text makes.

No account templates. There is no jurisdiction-specific chart you can pick off a list. The agent composes a starter chart from what you tell it, and you edit it by asking.

No sub-account limits and no numbering scheme. If your accountant wants 4000 style codes, they go in the account name or in metadata; nothing enforces or generates them.

Something here wrong or missing? Put it on the board — it is public, and the reply is in the thread.