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.


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 provide 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.

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.


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

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.