The build
When several people put money into one pot, you need to track who owns what share as money goes in and out at different times. The standard answer is unitization: the fund's value is divided into units, like shares in a fund. Put money in and you are issued units at today's price; take money out and units are redeemed at today's price. Everything else exists to keep that arithmetic exactly right.
Two decisions do most of the work. Money is never stored as an ordinary decimal number, because those cannot represent amounts like 0.10 exactly and the error compounds silently over thousands of operations; it is stored in a form that is exact and written to disk as text so nothing is lost in translation. And the older command-line tool and the newer web interface read and write the same files, so the two can never disagree about what the ledger says.
No figures from the fund appear anywhere on this site — no value, no returns, no members, no positions — and the repository is not linked.
The technical version
A NAV-based accounting system with per-member units, ownership, return and full transaction history across five screens. Four generations of command-line tool preceded the web application.
Correctness is the story
Money is handled as Decimal end to end and serialised to JSON as
strings, so no float drift can enter the ledger. The core invariant, that fund
value equals cash plus the market value of positions, is enforced rather than assumed.
Deposits and withdrawals issue or redeem units at the current NAV. The web terminal and
the command-line tool read and write the same state files, so the ledger cannot fork
between them.
Flask, pandas and yfinance on the backend; React, Vite and Recharts on the front end.