Wardian docs

Loan planner

Try it

The app runs here in your browser. Nothing you type leaves it; what it saves stays in this browser, and Claude is off here. Open it on its own.

Download loan-planner.wardian Import it in Wardian: Settings → Import.

A Wardian suite: six sealed apps that plan a loan together. WebAssembly does the amortization.

AppSlotJobContract
inputsasideAmount, rate, term, extra payment, start month, currency. Checks and remembers them.emits loan:changed (retained); storage
engine—Runs engine.wasm: the monthly payment and a row per month.provides schedule; asset
planner—Turns each change into one plan for every viewer, with and without the extra payment.listens loan:changed; needs engine.schedule; emits plan:ready (retained)
summarymainMonthly payment, total interest, total paid, payoff date, what the extra saves.listens plan:ready
chartmainBalance over time, with and without the extra payment. Hover or use the arrow keys.listens plan:ready
exportmainDownloads the schedule as CSV.listens plan:ready; claude:downloads

How a change flows: inputs emits loan:changed → planner calls engine.schedule twice (as asked, and without the extra payment) → planner emits plan:ready → summary, chart and export each draw their part. The engine runs once per change, not once per viewer.

shared/format.js (money, months, durations) is listed in suite.json "scripts", so every frame gets its own copy. Apps never share objects.

The engine's source is src/lib.rs: payment, schedule, alloc and dealloc. Rebuild engine.wasm with ./build.sh. Its buffers are 8-byte aligned so JavaScript can read them as a Float64Array.

The numbers use the standard formula with no rounding to cents each month, so the totals can differ from a lender's statement by a few cents.

This page is apps/loan-planner/README.md in the repository. Something wrong or missing? Change that file.