The problem
Small partnerships track money in a notebook until the first disagreement, at which point nobody can reconstruct what happened. This keeps a ledger that can be audited.
What I built
Entries are immutable. A mistake is corrected with a reversing entry, not an edit, which means the history stays true and the balance is always derivable from the record.
Each partner has a running balance computed from the ledger rather than stored, so a stored total can never drift out of agreement with the transactions behind it.
Architecture
Django and PostgreSQL. Balances are aggregates over the entry table, with a periodic reconciliation check that flags any discrepancy.
Problems worth writing down
Editable history
The first version allowed edits, and a corrected entry made an old report wrong. Reversing entries replaced editing entirely.
Rounding
Floating point cents did not add up across a year. Storing minor units as integers ended the problem.