Signals, effects & owners

Guide: Reactivity.

Signal(T)

MethodSignatureNotes
init(initial: T, allocator) Signal(T)usually via ctx.useSignal
get() Tread and subscribe current effect
peek() Tuntracked read
set(new: T) voidnotify subscribers; no-op when equal
increment/decrement() voidnumeric T only
on_set / on_set_ctxfieldspost-write hook (client DOM mirror)

Effect

ExportSignature
createEffect(owner: *Owner, ctx_ptr: anytype, comptime f: fn (@TypeOf(ctx_ptr)) void) !*Effect

Runs eagerly once collecting dependencies; re-runs on any dependency write. The ctx-pointer-plus-comptime-fn shape is the framework's allocation-free closure pattern.

Owner

Reactive scope. Owner.init(allocator) · createChild() !*Owner · allocator() · dispose() — disposing unsubscribes every owned effect from every signal it read. Server: one owner per request. Client: the runtime's root owner.

Escape hatches

ExportSignature
untrack(comptime R, ctx_ptr, comptime f: fn (...) R) R — read without subscribing
batch(ctx_ptr, comptime f: fn (...) void) void — coalesce writes, one flush
setReactivePendingAllocator(allocator) void — WASM runtime setup

Chunk-side named signals

Island chunks address signals registered in the main runtime's slot table by bind name:

registerI32/registerStr/registerF32(name, initial) · registerBool(name, class, initial) · signalSetI32/Str/Bool/F32(name, v) · signalGetI32/Bool/F32(name) · signalGetStr(name, buf) / signalGetStrLen(name).

Registration is idempotent — multiple islands registering the same name share one signal.