How and why we built our expense tracker with CRDTs