I was also confused about double-entry accounting for most of my life until I read the article, "Accounting for Computer Scientists"[0] by Martin Kleppman (author of Designing Data-Intensive Applications). It explains double entry accounting in a surprisingly accessible way by putting it in terms of graph theory. I don't even like graph theory that much or consider myself competent in it, but Kleppman's explanation was extremely effective.
[0] https://martin.kleppmann.com/2011/03/07/accounting-for-compu...
https://beancount.github.io/fava/
I really like its big picture view of the accounts, the search / query interface, and live editing of transactions.
It's crazy to see just how much money I've paid Netflix since 2015 (and I'm a sub since 2011). Or Starbucks (which I rarely go to). But it's very powerful. One thing I've long wanted is better visualizations.
I started storing all my notes (500+ by today) in markdown files locally. It's easy to search and navigate with grep and ag/rg. It's easy to edit in Vim or your favorite editor. It's easy to append all sorts of informations. I add some flags and properties in metadata, like last_reviewed, some tags, etc.
The versioning and sync is solved by git + a private github repo.
I dump more raw data in every month, handle the 1-2 new edge cases in code, and voila: a complete, accurate, queryable, debuggable, visualizable, and fully reproducible history of my finances.
$ git log --oneline --reverse | head -n1
5f72575 Initial commit: January 2022
My importers take care of reconciling the common transactions, like train fares and groceries, which means my monthly session takes under an hour. The slow bits are exporting CSV statements from my banks, and reconciling transactions from amazon and the local pet supply store (is it useful in practice to track litter and treats separately? probably not).I'm also yet to migrate to beancount v3.
My bank has some very limited options to move specific amounts of money on a weekly schedule, but I'm looking for something more powerful then that.
Should I look at like ~Stripe~ Plaid or something? Or are there more pre built tools?
I am already used to logging everything manually, so importing isn't needed for me. Also I think having some 'manual labor' in this regard can help with becoming more 'in tune with your finances', to actually learn what is going on, instead of having an app that you check once a month.
I think I'll finally give PTA and beancount a go this year. I'm tired of changing and re-learning tools due to enshittifcation, so I heavily prefer those that use open formats / plaintext. I use Obsidian for my notes, specifically because it's just Markdown files. Since I realized that I don't even really use most of Obsidian's features, I might just switch to a regular editor + a markdown viewer.
Intuit sucks as a company, but I can hack my way around their requirements for upgrades
I made a tool that parses transactions (of my specific bank) into categories based on tx description and a GUI to analyze them in different time frames.
Highly recommend.
I think a nice thing about beancount is that given how simple it is you can almost even ignore whole parts of it. In my case I chose to write my own importing tooling essentially without learning at all about the built-in one: https://github.com/Julian/alubia. I had no intention to make that approachable for lots of users not named me (in fact none of my actual importers are present) but it's been very fun to watch my ledger get more and more accurate.
I'm now considering combining by finances with my partner. It would make a lot of things easier. We'd get paid into a joint account and then pay ourselves into individual "spending accounts" according to our budget. Anyone have any experience with this kind of thing?
All those require standard entries and processes, which I've yet to find, which means that now I need to become an accountant and write these standard tools.
None of which generates any income and only creates more work for myself.
I absolutely hate my current accounting software, but this is not (yet) a viable option as far as I can tell.
Happy to learn I'm wrong.
Finally I discovered PTA. I chose hledger (because of possible performance issues with beancount). I learned double-entry bookkeeping (it's pretty simple, honestly). I write Python scripts to import investment statements sent in PDF format (broker does not support transaction downloads) and pay stubs (payroll company does not do transaction downloads) and CSV imports for bank and credit card statements which lets me autocategorize most transactions. Turns out it's exactly what I wanted all this time I just didn't know it.
I spend about an hour each month updating accounts. I generate investment reports, budget reports, and tax summaries. It's all there, except tracking the ACB of my investments (which I probably could do except a simple spreadsheet is less effort). Everything I need for my coming retirement this year.
And because it's plain text I will never have to lose everything when data formats change due to new upstream releases. And because it's plain text I can use git to track changes and recover and do better off-site backups.
I guess the downside is it doesn't work on your phone and you have to know what you're doing. But if information like how much money you have and where you're spending it is actually important, it's the right tool for the job.
- Everything is managed by build system that is able to track dependencies
- Inputs from financial institutions are kept in the repo as is
- Those inputs are converted by your scripts to .csv files that are readable by PTA import engine
- There are rules files that describe how to convert .csv lines to PTA entries
- Generated files are included from per-year PTA journals (and you can put any manual transactions in here also)
The benefit is that you can change any part of this pipeline, and just re-generate the changed parts:
- improve the program that converts to .csv - raw data immediately gets better across the whole repo
- add/customize import rules - better classification is immediately applied to all of the past data
And with this approach you can start small (like, a single month of data from your primary bank), and refine the thing in steps, like adding more historical data or adding more data sources (examples being not only bank statements, but even things like itemized Amazon orders and Paypal slips).
As we've crossed into the new year I've switched to a similar directory setup as the OP with 1 file per year. Previously I just had one file that was from 2022 which ended up being like 2 million lines of text, which was starting to bog down the emacs plugin.
What I appreciate the most about this approach to personal finances is it just tracks everything. Investments, pensions, RSUs, bank accounts. You could even go as far as accounting for any resource that's modellable, e.g. energy usage in kwh vs. bills. I probably wouldn't go that far though :D
Also you can build a bunch of tooling around it too, with the advent of LLMs my toolset for beancount management has expanded quite significantly. Most recently I got claude to rewrite my transaction rules engine https://djharper.dev/post/2025/08/19/using-llms-to-turn-scri... into something nicer with a UI. This would have taken days to build in the before times, and I probably would not have bothered because it's overkill for 1 user (me)
Beancount is both, but you can do either one or the other or both. In particular, you DONT need to learn double entry to do plain text accounting. Of course, you SHOULD learn double entry accounting because it's a great tool for organizing knowledge.
Whether plain text is beneficial for accounting is less clear cut in my mind. I think plain text is backlash against the over-reliance on "services", "clouds", and "lock in", but I think it's misguided. If you're concerned with someone locking you in, it's perfectly concievable to do double entry accounting which lives only on your computer and manipulated with software that is under your control (read: free software).
So in summary, my opinon is:
- accounting: important
- double entry: important
- avoid clouds and ventor lock in: important
- avoid proprietary file formats: important
- plain text: unimportant
(I use GnuCash. It's not without its flaws, but it's great if you agree with the above views)
Two main goals: track how my expenses evolve over time, and stay on top of how much money I need to reserve for the coming year to pay those bills. Anything that's leftover is spending money. Which I dutifully spend.
Then, there's the import workflow: which "accounts" should you start with? How much history do you pull in? How do you set up an automatic importer? Hledger has a DSL. Beancount uses Python. Either way, an OP says, much of your time is spent manually editing text.
And finally, then what? Can I make a budget now? Will this thing do my taxes? Am I more financially responsible? How do I explain this to my spouse? My pension is kind of like a commodity, but I don't know what the unit price is, and I don't sell units, but what's a virtual PnL and what if I only have a quarterly PDF!?
It may sound like I'm ranting, but I have found that realizing I don't know the answers to these questions (or even that they exist) is the true benefit of PTA.
Every year, I'm asked if I want a different pension investment mix or if I want to change my car insurance. Or, I might wonder if I'm getting a good deal on my internet plan or if a new job offer's total comp is actually better. Am I "on track" for "retirement," how long until I have enough for a new roof, am I keeping up with inflation, did I spend too much on gifts this year?
There's immense privilege in not really needing to know the answers to these questions; getting them "wrong" won't really hurt you. But, being familiar with the routine minutiae of your economy by way of counting every cent, is rewarding, enlightening, and empowering—even if it's also finicky and brittle sometimes.
I may have to try beancount again. OP's importers look promisingly robust compared to my hledger scripts.
However, I just cannot bring myself to constantly pull the transactions down manually from multiple banks.
Many suggest automating. How is this working in practice? Are there providers like Plaid you can use? Build web scrapers? Build PDF statement parsers?
I ended up just paying YNAB the $130/year or whatever they’re at now. High wife approval factor and everything just connects. They also have an API. In theory I could just constantly backup YNAB with PTA by pulling down transactions from the API.
I ended up just logging my total holding of cash and stocks spread over my different bank accounts and my investment portfolio. Doing it every few months helped me make sure that my overall holdings went up. As long as I pay off my bills and then save enough to see my holdings rise I am happy. However I can see that having a more detailed overview over your spending might help you cut down even more.
I'm about to start out again and I chose not to track different categories individually, knowing that I can still add sub-accounts to distinguish between them later (even if I can´t recover the information for older transactions.)
Now I just need to investigate how to track gains/losses on the ETFs I own but that's common enough that there should be information out there on how to do it.
I just spent a few hours using LLMs (aider, specifically) to reconcile my books for the past year. Worked great, but was slightly fiddly.
It's cumbersome at times, and I do miss the (G)UI of entering transactions, but with (neo)vim I got used to it and I breeze trough my finances in 15-20 minutes once a week.
But what about basic Cost Of Goods Eaten?
I have fading thermal tapes in boxes with grocery store purchases. They get scanned once a year into large PDFs: grocery, home goods, repairs (large purchases are kept separately for easier finding).
I’m considering if a personal AI subscription to manage the data interrogation is worth the cost (not excited about the $20/mo cost. NPR should get the next $5 of my monthly).
Now here’s the funny part. The data sits in a box all year or in PDFs for years, and gets little attention. What janky home server AI could I spin up to perform as bad as me (but no worse)? Maybe move the data in those text files and PDFs into SQLite?
Why would you go that unintuitive route instead of simply having a category "Supermarket" (with your most common supermarkets autocategorized by name) and payee "Netflix"?
Anathema?
Yes, I know the data live in a data-center/cloud. But, don't the content of all those statements, payments and bills live there too. Yes, I know the service might go away tomorrow. But, couldn't one find the new-new service and import it all again from the banks, cc companies, utility companies etc.?
I like text accounting. It's useful. It has a niche. But, is this the best use of your time every month?
Tastes differ, but 30-45 minutes a month to hand-key data (or write the scripts that avoid that) isn't my taste.
That's 6–9 hours every year!
5 years: 30–45 hours
10 years: 60–90 hours
I would be okay with that as a monetization model, except that the book author despite being a self-described FOSS dev doesn't seem to have anything to do with the project (https://github.com/beancount/beancount/graphs/contributors).
Ah, not quite true. The author fixed a typo in a docstring once (https://github.com/beancount/beancount/commit/8584763b618f76...).
But I can't find an alternative that has cracked the killer feature: Syncing with each of my online accounts. I like to track every expense and every transfer down to the penny, and then update from the bank's online connection to confirm each of them. I do this daily so I can catch any fraud or mistakes. I have 27 accounts tracked, and I'm simply not going to log in to each of them using their janky web sites, download CSVs, and import them manually into personal finance software. It's just not going to happen. Quicken's support for this is far and away the best out there.
Doing this all in plaintext and copy/pasting from downloaded CSVs every day seems like an absolute nightmare.
Unfortunately, the trend seems to be banks turning down their public-facing OFX services, and instead moving to the model where Intuit is the middleman and you need to tether yourself to them, who in turn channel your requests to the banks. So it's been getting even more and more difficult to escape from Quicken.
We track way fewer categories than you do. But in addition, we also track larger expenses by amount. Right now everything over $100 gets an entry. That means a fancy $100+ dinner gets tracked but a normal $30 dinner doesn’t.
Some I wrote by hand using PyMuPDF, some I coerced Claude into writing (again using PyMuPDF) by uploading a sample bill (I'd never put my own data into an LLM but it's nice being able to find a sample bill, gets it close enough to correct that I can do the remaining bits if there are variations in bills over time).
Overall it's effort (and yes certainly a bunch effort for manually downloading transactions). The financial industry is very behind on this stuff clearly. I'm not sure in a few years whether I'll still think it's worth the effort I put in, which has gone down over the past few months as I automate things, but until it stops being fun I'll keep going.
Start easy and see what you want to get out of the data. If you can store the original source (e.g receipts) so that you can later go back and increase the granularity if you find yourself wanting it, that would be ideal.
I just put "Groceries" account based on the total that gets charged to my card. If there's a substantial item that doesn't fall into groceries then I can split that out on a case-by-case basis (e.g. I go to Costco and buy both a bunch of cereal and a dehumidifier).
I'm intrigued by this and now thinking I should start doing it. Just start with a clean slate for 2026 and see how I go.
But for the vast majority of people (even including devs), this will not be ideal at all and most people don't really care about it being in text files.
What I'm trying to say is that its designed for a very specific niche userbase and I doubt most people will have the same experience as you described after trying every single personal finance app to settle on this.
I'd wager it isn't most peoples' taste, which is why the off-the-shelf cloud-based options are as popular as they are. I see people in here doing things like writing PDF statement parsers and then dealing with the maintenance that this strategy entails whenever formatting changes and, well, I appreciate the people to whom this appeals, but I am not one of those people. :)
Can you point to some of your contributions to this project?
[0] https://github.com/siddhantgoel/awesome-beancount
[1] https://github.com/siddhantgoel/beancount-n26
[2] https://github.com/siddhantgoel/beancount-ing
I know money is the root of all evil and all that, but a total aversion to it isn't a very healthy way of interfacing with it at all.
I've been using it for years, and it helps a lot. I would pay good money for someone to improve the UI, maybe even separate the accounting engine into a library that could be used by different UIs.
I did that for myself and it took me at most three months of parttime working on it, resulting in a bespoke solution. No need to keep paying some SaaS or fiddling around in Excel. One still needs to learn the bookkeeping system though, but that's true for all options. A SaaS is not magically make that go away.
First, automation is a new orthogonal dimension. You can have automation with or without plain text.
Second, your emphasis on "automation" leads me to believe that perhaps you misunderstand what accounting is. Accounting is not just taking a list of transactions and recording them (database, file etc). That is called bookkeeping. Yes, accounting is also amenable to automation, but much less so than bookkeeping. Although, you could argue that when applied to the life of a normal individual, accounting and bookkeeping are almost indistinguishable. You have income, you have costs, and you have a mortgage - pretty straightforward. My point is in general you cannot entirely automate accounting. The reason for that is that accounting isn't just processing bytes, but instead requires the understanding of the underlying economics associated with the transactions. This understanding in turn isn't stored anywhere other than the accountant's mental model of the entity he's doing the accounting for.
EDIT: Just to be clear, I don't disagree with you that accounting could use more automation. Everything could use more automation. But for something it's more straightforward than others.
On the point of "library" - you know that "GnuCash the app" comes with its lib, and there's python wrappers? I've only ever used these to produce reports (read, reports different from the ones provided by the UI). However I believe it's also possible to do things like inserting transactions via these python wrappers.
Another example of something which is possible via the python wrappers is labels. GnuCash doesn't support labels, but it supports adding general text to each transaction and to each leg of each transaction. So you can e.g. use hashtags in the text, and then consume transactions into python and aggregate on these hashtags, making them effectively labels.
Re: learning curve, it's not that difficult. Shameless plug: I wrote a textbook (actually, a textbooklet, if that is a word;-)) about the basics of DEA, focused on personal finance and using ledger-cli: https://leanpub.com/personal-accounting-in-ledger/
Then Claude became a thing, and I thought what if I use Hledger and let Claude manage my books ? I was reluctant to migrate years of txns, so I started with an opening balance.
This has been the highest leverage usage of Claude for me. I drop everything: bank statements, invoices, etc and ask Claude to make entries. When it makes a mistake, I add a new rule for future. Privacy issues aside, I cannot go back to traditional tools.
I'm just, you know, pretty sensitive to HN submissions trying to sell me something.
If you have plenty of income, tracking grocery expenses might be a waste of time, like tracking how much air you breathe.
If your income is barely meeting your expenses (or worse), the grocery budget is one of the few places you can make meaningful decisions that will lower your costs.
And there's a tricky middle ground where it feels like you have enough income, but if you don't pay attention, you'll die by a thousand cuts to small expenses that feel insignificant by themselves.
I do everything with CSV exports of my bank accounts and credit cards. I drop the exports once a month into a directory and Python scripts (my newer versions of which are mostly written by LLMs) take all the analysis from there, breaking things down by category and by merchant (so that I can see if I'm unintentionally spending more on a particular merchant over time or if that merchant is charging more without notice).
I also have one credit card for strictly recurring expenses ONLY and never put non-recurring expenses on it. That way it's quite easy to see on that credit card bill what changed from month to month. If Comcrap tries to charge me $10 more one month they're going to be getting nasty messages from me pretty quickly.
Double entry book keeping isn't that difficult but that's easy to say once you've been doing it a while
I've been doing PTA since around 2018 and there's definitely lessons I've learned along the way along with plenty of mistakes.
I think the main benefit for me is just the system gives you a complete picture of your finances. The commercial services you can pay for just give you a view into a certain slice (e.g. open banking in UK/Europe to see your current account(s)) - I think mint.com did something similar in the US but it never came over here, I don't know if it still exists. Maybe that's enough for most people, but for me I want everything, investments, liabilities, assets etc. None of these commercial offerings have that because it's so complex and niche, e.g. your open banking provider won't tell you how your pension is doing.
It's also just nice to have the provenance of transactions, e.g. if you receive some shares from work, and you sell the shares and the money ends up in your bank account - the incoming transaction will just be the net proceeds but it won't tell you if you paid any tax prior to that - PTA gives you a more of a complete picture that tracks the whole chain of events that led up that transaction into your bank happening. Overkill for most people? Probably.
I can track money spent and earned down to the penny.
Takes less than 20 mins a month to update/manage it. I actually enjoy having sit-down time to "do finances". Keeps me leveled, and forces me to think about how much money I spent and the value I gained from the expenses.
Really awesome to have control finally. I am very interested in extending PTA to be more like blockchain ledgers, with signing for every transaction and decentralizing the ledger. still mulling through how this would work, but it would essentially be KERI based.
To me, the choice is very easy.
https://github.com/beancount/beancount/blob/master/README.rs...
I just have 1 text file with monthly data. Each month is on a separate line, with only 5 columns (expanded below).
1.date 2.saldo 3.savings 4.delta 5.special income / outcome (heading line)
1 31 january 2026
2 500
3 2500
4 -80
5 dinner -50, concert - 30, sales +80, trousers -80, etcetera
Where the date is the last day of the month that I need to make (the next day there is income, for me it's 19th, not 31th). Saldo is my bank account that day. Savings are, well, savings in a separate account. delta is the sum of special income and outcome. row 5 is all special income and expenses. Groceries are not listed, I need them every month anyway.But good to hear the positive story side for this.
And when it’s fragile even when working. The cost per unit changes with limited notice in various ways (line rate, unit cost, time period that various rates occur, the day, ‘free’ power bonuses etc).
I didn't track anything until about 5 years ago as my mental model was "track all purchases", and I wasn't willing to do that. Someone had to point out that higher level tracking can be quite useful too, and this is what I found to work well for me. That's why I bring this up in related topics: it's not an all-or-nothing choice.
I do the same. I have a bank account dedicated to all those recurring expenses I track. Every year I make a budget for those categories, work out the monthly average, and set up a transfer for that amount into that account. Some prices fluctuate quite a bit (like power) while my mortgage has a fixed rate, so I apply a healthy margin to make sure there are no nasty surprises.
And that's still ignoring that evangelism is also a valuable contribution.
Dec 20, 2025
January 2026 will mark 10 years since I started storing my personal finances in plain text files using Beancount. Since January 2016, I've taken out about 30-45 minutes every single month to download my monthly bank statements and import them into my Beancount ledger.
There's a lot to talk about here, but let's start with some fun numbers!
10 years of financial transactions is a lot of data! All in all, my ledger contains over 45,000 lines of Beancount entries spread across 16 plain text files. All of it is stored in a finances directory (version controlled) on my laptop. Here's a snapshot:
❯ find . -name "*.beancount" | xargs wc -l
4037 ./includes/2020.beancount
3887 ./includes/2018.beancount
27 ./includes/cash.beancount
4398 ./includes/2021.beancount
5531 ./includes/2019.beancount
5267 ./includes/2022.beancount
3287 ./includes/2017.beancount
5506 ./includes/2024.beancount
5606 ./includes/2023.beancount
1454 ./includes/2016.beancount
1089 ./includes/open/04-expenses.beancount
66 ./includes/open/03-income.beancount
11 ./includes/open/05-liabilities.beancount
37 ./includes/open/02-assets.beancount
1 ./includes/open/01-equity.beancount
4807 ./main.beancount
45011 total
Running bean-query on main.beancount tells me I have about 10,000 transactions in total, that in turn contain about 20,000 postings (in double-entry bookkeeping, one transaction may have multiple postings).
❯ uv run bean-query main.beancount
Input file: "Goel"
Ready with 12466 directives (19743 postings in 9895 transactions).
beanquery>
There are 1086 accounts in total.
beanquery> select count(*) from (select distinct(account));
coun
----
1086
... which does not mean that there are 1086 bank accounts. Accounts in Beancount are virtual, and you can create as many as you like. Imagine one account for categorizing supermarket spending, one for tracking your income, one for your Netflix subscription, and so on.
Next, there are about 500 documents in the repository.
❯ find documents/ -name "*.pdf" | wc -l
507
Beancount lets you attach documents (e.g. receipts or invoices) to transactions, that makes bookkeeping very efficient. I love the fact that whenever I need to do my tax returns, I can just take a look at my Beancount ledger and find all the invoices right there next to the relevant transaction.
Lastly, in terms of postings, I started out with 715 in the year 2016, and the year 2023 was the busiest so far in terms of just the total postings count.
beanquery> select year(date), count(*) where year(date) < 2025 group by year(date);
year coun
---- ----
2016 715
2017 1422
2018 1605
2019 2437
2020 1582
2021 2022
2022 2435
2023 2651
2024 2602
I wrote earlier that every month I take about 30-45 minutes to import my financial transactions into Beancount. What does that workflow look like? I wrote another, much more detailed blog post about it a few years ago, but here's a gist.
It starts with me logging in to my bank account(s) to download my monthly statement(s) in CSV (CSV because it's much more predictable to parse compared to PDF). I then run these CSV files through what's called an "importer", that converts this CSV data into data structures that Beancount understands. I then append all those extracted entries into my current .beancount file (which is the main file containing all my financial transactions in plain text). I then go through each entry one by one and make sure it's balanced (in double-entry bookkeeping, all the postings in a transaction must sum to zero, and not all postings/transactions that an importer outputs are balanced). Some of that balancing is manual and some of it is automated (e.g. the importer code can look at the transaction's description and decide which account it should go into, and balance automatically). This last part (balancing) is where most of those 30-45 minutes go.
Whenever a new year starts, I move all the transactions from the past year into a <year>.beancount file and add an include <year.beancount> in the active main.beancountfile, mostly to avoid the main file from becoming too long. Not that it would be an issue for Beancount, but just for the sake of readability.
With such a workflow, all my financial transactions from the beginning of time are contained in a few plain text files in one directory on my laptop.
Beancount only provides the foundations for working with money, but it has no knowledge of what your bank statements look like. This is where the concept of an importer comes in. An importer is a (Python) class that takes in a bank statement of sorts (e.g. a CSV export of your transactions) and converts them into something that Beancount can work with.
I live in Germany and my bank accounts are with German banks, so I had to write a few importers for a few different banks, specifically beancount-dkb, beancount-ing, beancount-n26, and beancount-commerzbank. I closed out my Commerzbank account a while ago, so I don't maintain that integration anymore, but the first three libraries are actively maintained (and used)!
My start with Beancount was a bit bumpy. The documentation is very comprehensive but as a newcomer, I found it tricky to get a grasp on the overall workflow. It took me some trial and error to figure things out and have that "aha" moment.
I figured that if I found it tricky, maybe it's tricky for others as well. So I wrote a short book to help newcomers get up and running with Beancount easily. If you're interested, here's a link: https://personalfinancespython.com.
The feedback on the book has been super positive. It got mentioned on Beancount's external contributions page, and the reader reviews have all been very encouraging!
Having all my finances in a bunch of plain text files tracked in a git repository feels invaluable to me. And hitting the 10 years mark on that almost feels like a milestone.
Perhaps the nicest bit about all this is that this data is sitting on my own machine, not in some data center somewhere else. All of it is in plain text files that I can open up in my editor, and analyze using the tools that the Beancount ecosystem gives me. All of it will outlive any app or service, and that, I feel, is why plaintext accounting is so powerful.
https://www.cnbc.com/2023/11/07/budgeting-app-mint-is-shutti...