With alternatives available like Ledger and hledger, this page explains why I wrote Penny rather than continue using one of these excellent programs.
I first tracked my expenditures on computer using Microsoft Money under Windows. This created some problems when I switched to Linux. For awhile I dual booted just to run Money. I tried Wine but it was finicky. For a little while I switched to GnuCash but found it wanting.
For several years I then used Ledger. At first Ledger seemed like a cockamamie idea but I became quite accustomed to it and even liked it. As I used Ledger I started writing my own scripts to help me with my workflow. For example, I found entering bank transactions to be quite tedious, so I wrote little scripts with zsh, awk, and the like in order to parse CSV files downloaded from my banks. I wrote several automated checks of my data to ensure, for instance, that I didn't use any accounts I didn't intend for (this was before Ledger 3.0, which had a feature to help with this sort of thing.) I also made sure certain periodic transactions were present so that I could use the output from Ledger to do some short-term forecasts.
Eventually I figured it would have been nice to manipulate this data in a structured way, rather than doing it all through text processing facilities. My scripts had a lot of nasty hacks that are necessary when you are processing plain text rather than working with data structures generated by a real parser. Ledger did have some sort of Python facility, but because Python does practically no static type checking, I find that writing Python offers few practical benefits over writing an awk or shell script. So I hobbled along with my scripts.
Then I learned of Haskell, a cutting-edge functional programming language. I realized that Haskell could help me write my scripts to manage my money: it has a robust static typechecker, so using it would actually afford advantages over the shell or awk (to me, dynamically typed languages do not offer enough advantages over the shell or awk to justify using them for tasks such as this.) Over a few years I learned enough Haskell to be dangerous in it, which isn't saying much--I am still a Haskell beginner.
So I looked at hledger, which was promising because it could parse my ledger files as they were. I did however have various concerns about hledger which caused me to limit my use of it. hledger is however great at many things, so please continue to use it if it works for you.
So I figured I could write my own program which would meet my needs perfectly. So here we are.
My first objective when writing Penny was to build the principles of double-entry accounting into the Penny library in a type-safe way. This catches most errors at compile time. I also wanted to build a library I can use to build custom checks of my data. You probably will not notice these objectives if you only use Penny from the command line though.
As an end user, Penny brings you a few things that Ledger and hledger don't have:
Penny also suffers from many disadvantages: