Trying Caelum in Your Browser

You do not have to install anything to use Caelum. The whole model checker is compiled to WebAssembly and runs inside this documentation. Every .lum example you see is a live editor, and the entire Tutorial: A Traffic-Light Controller can be completed without leaving your browser.

Every example is editable and runnable

Wherever these docs show a .lum specification, that grey block is a real code editor, not a static snippet. You can:

  • Edit it in place — change a value, break a rule, add a property.

  • Run it — press the Check ▶ button or Ctrl-Enter (Cmd-Enter on a Mac).

A block gets a Check ▶ button when it contains at least one property (or invalid) to verify. Smaller fragments that only show a type or a transition are still editable and syntax-highlighted, but there is nothing to check, so they have no button.

Try it now — press Check ▶:

let x  0..2

init { x = 0 }

transition step { x' = (x + 1) mod 3 }

property stays_small {  (x  2) }

Everything runs locally

The checker is caelum-kernel compiled to WebAssembly, using the pure-Rust varisat backend. Your specification is checked entirely in your browser — it never leaves the page, there is no server, and no account is required. Close the tab and it is gone.

Reading the results

When you run a spec, a results pane appears beneath the editor.

Passing. Each property is listed with a pass marker. A pass means Caelum explored every reachable state and found no way to violate the property.

Failing — the counterexample trace. When a property can be broken, Caelum shows a counterexample: a table with one row per state, the variable values in each, and the transition taken between rows. It is a concrete, replayable story of how the property fails. For a liveness ( ) property the trace ends in a loop, and a marker shows the state the loop returns to — the system cycles there forever without the good thing ever happening.

Try this one. The property claims x is never 2, but the counter reaches 2 on the third step, so it fails — press Check ▶ and read the trace:

let x  0..2

init { x = 0 }

transition step { x' = (x + 1) mod 3 }

property never_two {  (x  2) }

Errors — inline underlines. If a spec does not parse or has a type error, Caelum underlines the exact spot and explains the problem, the same way an editor flags a syntax error. Try deleting the closing brace } from the property above and running it again.

The invalid keyword

Sometimes you want to confirm that a property does not hold — for example, to show a bad state is unreachable. Marking a block invalid flips the reporting: Caelum reports a pass when the property fails as expected, and a fail if it unexpectedly holds.

let x  0..2

init { x = 0 }

transition step { x' = (x + 1) mod 3 }

invalid never_reaches_two {  (x  2) }

Here x does reach 2, so the property is genuinely false — which is exactly what invalid asserts, so this reports a pass.

Where to go next

  • The Tutorial: A Traffic-Light Controller builds a complete traffic-light controller step by step, right in these editors.

  • The Playground is a full-page blank editor for your own experiments, with the ability to load and share specifications by URL.