Back to Ledger


I
find book-keeping a pain. I’ve never been a numbers person and find personal finance boring and draining. Part of it seems to be a visualisation problem - I struggle to see the big picture. Ledger has solved this a little, at least in areas related to the management of financial data. It has provided me with the kind of perspective shift that needs to be illustrated with a story, and it goes like this.One day, the anthropologist Turnbull decided to take Kenge (a tribesman of the Mbuti people from the Congo region of Africa) on a road trip. The Mbuti lived in a tropical rainforest, and Kenge was about to see an open plain for the first time in his life.
As they drove out of the Jungle and onto the plains, Kenge noticed a distant herd of…something. They were small, and moving around, so he thought they may be insects. When he asked Turnbull what type of insects they were, Turnbull told him those were actually buffalo!
Kenge thought it was a joke. As they drove closer, the buffalo grew in size and Kenge became terrified. He could not understand how the animals were expanding in size. The Mbuti, you see, live in such a dense rain forest, their vision is rarely required to focus on anything beyond a few yards away. A vast plain was incomprehensible to Kenge.
That is the kind of shift I felt when I moved from GUI driven book-keeping programs to a plain-text system like Ledger. Accounting is a complex enough subject that each stage of the workflow requires many checks and measures. As a result the interface for such programs can be quite intense. The GUI felt like a jungle to me. Visually dense. Colourful and pretty, sure, but also very in-my-eyeballs. I could very easily keep clicking through windows and forget what I was doing in the first place. This fragmented, hyper-local view of my data made it hard for me to see the big picture. I was missing the forest for the trees.

Ledger feels different. Ledger is a command-line accounting application that creates reports from plain text files of financial data created and maintained by the user.
A single Ledger file could contain any number of transactions. Some people maintains years of data in a single file. This makes it easy to add, edit, or view transactions in a single place. No more windows, panes or dialog boxes. I can see all my transactions in a single view and since it is a simple text file, it is easy to search, view on any device, backup, version control, or use for RAG when working with LLMs. Very flexible.
Ledger uses the Double entry system of accounting. The idea is that the value of any single transaction has to balance itself, because money always comes from somewhere and goes somewhere else. This makes every entry clear and obvious. Here for example, is a typical transaction in Ledger.

2026/02/08 * Venniers Chocolatiers
; This is a memo about the chocolate cake I bought.
Assets:Cash ₹-100.00
Expenses:Food ₹100.00

This transaction says that I spent ₹100 on chocolate cake and that I paid in cash. The two lines show that ₹100 is withdrawn from my cash ‘account’ and that ₹100 worth of chocolate cake is deposited into my belly.

I used Ledger for a little while a few years ago, but It didn’t last because I need to share data on our household finances with my wife and Ledger wasn’t practical for this. So we used Homebank for a few years. Homebank is pretty awesome but the monthly ordeal of downloading bank statement CSVs and converting them into Homebank format CSVs for import became too much and we eventually went back to the stone age: Google Sheets.
This has been bothering me lately. Then I remembered Ledger was already on my system, so I imported a few months of data on a whim, and I can’t tell you what a pleasure it is to work with an open, plain text format again.
As a bonus, I no longer needs to manually enter each transaction. Now that we have A.I. I’ve used Google’s Gemini to generate helpers to automate some things.
- Parsers for bank statements and a CSV Importer that converts the CSV files to ledger transactions.
- The importer is smart enough to recognise payees and expense types using a rules file.
- Functions for inserting balance assertions, closing balances and for dealing with unbalanced accounts by inserting temporary balancing amounts.
- Visual reports that embed ledger shell commands in org-mode src blocks, which I can evaluate and then export as HTML with some CSS to make pretty headlines and tables.
- Even a nice one page html dashboard with graphs of important views using chartjs.
I also love how perfectly personal finance and book-keeping fits into my workflow in Emacs. I can interlink transactions with bills, and tasks, and the calendar and important news from RSS feeds on personal finance and then email my wife our financial reports and our list of personal finance todos - all in one place.
