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...
- 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).
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.
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)
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.
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)
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.
https://beancount.github.io/fava/
I really like its big picture view of the accounts, the search / query interface, and live editing of transactions.
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.
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.
Had it been 5m a week, maybe I could’ve done it. But it was 3h/wk - finding transactions, transcoding them with scripts I was maintaining, and breaking down the costs with my wife to understand if Costco purchases were “groceries” or “home”.
I nailed the micro and failed the macro. With two kids, and no desire to invest 150h a year into this, there’s no way I can get this to work.
I imagine AI would be great at:
1. Maintaining scripts to extract and normalize various financial artifacts (PDFs, CSVs, XLSXs) into text files
2. Helping draw insights
But manual effort of:
1. Collecting from various banks, paystubs and investment accounts
2. Ensuring flows net to zero and make sense
Is Too Much Work.
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.
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.
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'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 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.
A ton of software out there was too US-centric, sometimes not even supporting multi-currency, or the UI being terrible to a newcomer. I've recently tried Beancount, but it still didn't convince me to switch over, because:
1) Double-entry bookkeeping is about what happened, and I want the software to tell me what's coming up. I can still handle that in Beancount, but it's unaware of $CURRENT_DATE, making it labour intensive: if you post an expense for the next week, it will already deduct it from your balance, you'd have to post the item as a liability, and then later move the liability to an expense once it actually hit the bank account (and you have to do that manually);
2) I matured my personal finances by following the YNAB method, and I'm not sure how to apply that to DEBK;
3) I think most people use a Personal Finances software differently than me. I see discussions about importing transactions and monthly reconciling. I open it nearly daily to check what is coming up, and I post transactions as soon as they happen. I want to know how much clothing/groceries/restaurant budget I have left before I leave home;
Any tips on how to handle those things on Beancount/DEBK, or that's just not for me?
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?
I just spent a few hours using LLMs (aider, specifically) to reconcile my books for the past year. Worked great, but was slightly fiddly.
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.
What is the value in detailed tracking of personal finance? We audit ~every credit card bill when it comes in for oddities, but don't really pay attention where everything goes as long as more comes in than goes out.
I stumbled upon Maybe (https://github.com/maybe-finance/maybe) and the community fork (https://github.com/we-promise/sure) a couple days ago and almost invested too much time to migrate to it. That project still doesn't have split transactions. A fresh intuitive UI is great but Beancount's format is so simple it's hard to beat.
https://github.com/beancount/beancount/blob/master/README.rs...
If the program fails to interpret a transaction, it fails totally and says why. Then I fix the code until another transaction breaks. I keep doing this until it works - that's the regular process.
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 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?
I feel the strong urge to let people know that excel files are just a zip file containing XML. Sure it's not quite as simple as CSV, but not far off.
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 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 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.
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.
$ 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?
Is there a way to get bank data feeds through an API? I’m not wanting to download monthly CSV or PDF files for that matter.
Any ideas?
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"?
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.
Intuit sucks as a company, but I can hack my way around their requirements for upgrades
To me, the choice is very easy.
That's 6–9 hours every year!
5 years: 30–45 hours
10 years: 60–90 hours
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.
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.
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.
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...).