App contract

app/main

render is always required; handle is required when events can arrive; resolve is required when non-timer capability requests can complete.

The entry module returns one instance from App.compose. Initial render describes the screen without side effects; later handle or resolve calls update module state, then Luastra renders again.

Implement handle before declaring controls, timers, lifecycle behavior, history, or media-state events. Implement resolve before starting Host, Server, or Media requests. Timer acknowledgements do not enter resolve; timer expiry enters handle.

Keep app.render deterministic: describe UI from current state, and start timers, storage, media, or server work from initialization or event logic—not as a render side effect.

Detail pages

app.renderapp.handleapp.resolve