ZFinance

ZFinance is a web based, multi-user personal finance software system built for my family after I grew frustrated with limitations in off the shelf software. It combines the flexibility of a spreadsheet, the personal finance-specific automation and reporting power of dedicated desktop finance programs, and the convenience of an access-anywhere multi-user web application.

Origins

A screenshot of the zfinance filtering panel. The current focus is envelopes (19477 transactions). The current focus target is Groceries (1445 transactions) and the current filters have narrowed the list down to 10 transactions, of which 4 are manually selected by the user. Active filters are past transactions, tagged with groceries, whose name or memo contains the term 'produce' with a date range of +/- 180 days. A GUI is shown below with some controls for adding new filters for range, year, month, reconciled status, past/future, created today. Finally an arbitrary complex filter builder is present with checkboxes for the field to search, the operator to search using and the value to search for.

After evaluating many commercial options for tracking personal finances I determined that there was no one product that did what I wanted. I wanted the hackable flexibility of a spreadsheet but with some structure applied where it made sense. I wanted the security of owning my own data that a traditional desktop application provided but also the convenience of realtime multi-user, multi-machine, multi-platform web application. So I thought the famous last words.. how hard could it be?

Design Philosophy

Rather than starting from more traditional financial primitives (accounts) ZFinance uses a single flexible transaction ledger. From there you can filter to produce a working set of transactions to focus on. There are preset filters for common queries (show me all transactions in the cash account, show me all transactions in the last 15 days). Filters are composable to express complex questions by chaining: Give me transactions last year, in these two accounts, tagged as business expenses. Once a working set is established aggregate stats are produced in realtime: Sums, average, normalization to a particular asset. Aggregate results can be projected over time buckets: give me a chart of all transactions tagged groceries and household split into monthly buckets for the past five years.

A screenshot of ZFinance aggregate statistics. For the focused envelope (consisting of 115 transactions) it shows the balance today (¥5129) and the balance normalized to the primary currency ($46.67). Incoming and outgoing are zero and an end of month balance is listed that is the same as the normalized balance. The current filter set is the same as the focus set and has some additional stats, total sum, normalized sum, inflows, outflows, normalized average, number of months the transactions span, and the average net change per month. Finally, 5 items are selected and have their own sum, normalized sum, and normalized average.

Finely integrated with the transaction ledger & aggregation engine, as a first class citizen to accounts, is an envelope style budgeting system. This system allows keeping track of where money is allocated independently of the underlying financial institutions.

ZFinance is built to handle complex edge cases that other applications oversimplify. It understands multiple types of assets (multiple currencies, mutual fund shares, gift card balances) and their historic exchange rates. It can display the normalized balance of an account in a given currency based on exchange or market rates on a given date.

Technology

ZFinance is a self hosted web application built in 2008 as an experiment with single page application techniques. The front end application is raw Javascript without any front end frameworks (none really existed at the time). The poor experience of attempting to write a realtime multi-user client side web application between 2008 and 2010 led me to join the IETF effort to standardize at least one piece that I was missing, bidirectional sockets. WebSocket++ was a result of that effort.

I've written a number of backends over the years. The original (and mostly still used) is a simple PHP+MySQL REST API. I've also written experimental backends in C++ and Ruby on Rails to explore alternative strategies for storing, querying, and delivering transaction data.

Project Status

A screenshot of Zfinance showing the savings goals widget. It lists three envelopes with colored progress bars. Gazingus Pins with 5% progress, colored red. Financial Independence with 20% progress colored orange. Emergency with 100% progress colored green.

My family has used ZFinance as our exclusive financial organization system since 2008. I've done limited trials of the system with other users and gathered great feedback. Personal finance software is a difficult problem and one key result of my research is that software is a small part of success in this area. Making a non-trivial difference in a user's financial life requires them to change behavior in ways that software cannot compel them to do. Once sufficiently compelled, good software is merely an icing.

For those looking to improve the organization of their personal finances I recommend Vicki Robin's Your Money or Your Life and the software (and more critically, associated philosophy and coaching) from You Need a Budget. If you are at the point where you have everything more or less in order but it really bugs you that you can't put two different currencies in the same envelope, maybe drop me a line.