A view model holds four income streams (label, amount, kind) and five spending categories (label, amount, colour). Formula converters with bound tokens do the app's own maths inside the file: ribbon width from the square root of the amount, where each line lands so the stack in the lake never crosses, the lake's height, the month total, the end-of-month balance and a safe total weighted by each stream's kind. The web page only writes numbers and an enum; nothing is drawn in JavaScript.