A savings-circle register, running in this page

Everything below is written in Ring — a programming language that normally runs on a server or a desktop, executing here inside your browser tab. Not compiled to JavaScript: the actual Ring virtual machine, compiled to WebAssembly, holding the data in its own memory while you work with it.

The application is a tontine register — a savings circle, where members put money into numbered rounds and someone has to keep the books. It was chosen because it is ordinary: a table of records, a filter box, sortable columns, a form that validates as you type, a running total. Whatever you build, it probably does these same things.

What this page is for. It answers one question a programmer is right to ask before trusting a new runtime with real work: can a page written this way carry a normal amount of data and still feel responsive? So every interaction is timed and judged against how people actually perceive delay — under 16 ms is instant, under 100 ms still feels caused by your click, and past that the page is visibly thinking. The log at the bottom fills in as you go.

JavaScript is here too, but only as a referee: it recomputes every answer independently and marks it ✓ or ✗. It has no timing column, because the question being asked of it is whether Ring is right, not whether it is faster.

Try it: press Load the register below — 20,000 deposits is a realistic size — then type in the filter box, click a column heading to sort, page through the rows, add a deposit. Watch the log. Then set it to 50,000 and do it again; two of the interactions will cross the line, and the page says so rather than hiding it. The full write-up is here, and the Ring source is one readable file.

Loaded once, at startup — the only time JSON crosses the bridge.