Lumencast
The missing standard for server-driven displays.
Reactive scenes. Live state. Leaf-grain updates over a tiny
LSDP WebSocket protocol.
Drop a mount() on any browser, OBS browser source, CEF wrapper, or embedded
frame, and your display becomes a thin reactive client of your backend.
Install
pnpm add @lumencast/runtime @lumencast/protocol
Or load directly in a browser via the npm CDN :
<script type="module">
import { mount } from "https://cdn.lumencast.dev/@lumencast/runtime@0.1.0/dist/lumencast.js";
mount({
target: document.getElementById("stage"),
serverUrl: "wss://example.com/lsdp/v1",
token: "<jwt>",
mode: "broadcast",
});
</script>
The surface
One protocol (LSDP/1), one declarative scene format (LSML 1.1), a runtime that mounts in three lines.
-
Leaf-grain reactivity. The server pushes a single
{ path, value }patch ; only the bound primitive re-renders. No virtual DOM diffing the world. -
Snapshot + delta resume. Reconnect with
since_sequenceand the server replays missed deltas. No re-fetching the world to recover from a flaky link. -
Animations declared, not coded. Per-leaf transition directives, keyframe
sequences, and
repeat.stagger_msare first-class in the protocol — not bolted on per-runtime. - Multi-language SDKs. TypeScript (this repo), Go, Rust, and Python share a single conformance suite — 33 scenarios that every implementation must pass.
Packages
| Package | What it does |
|---|---|
@lumencast/runtime
|
Browser runtime — mount(), transport, store, primitives. |
@lumencast/server
|
Node server kit — HTTP+WS, scene composition, leaf store, adapters. |
@lumencast/protocol
|
Pure protocol code — codec, sequence, types. No IO. |
@lumencast/dev-server
|
Mock server for tests — WS + HTTP + /__mock/* control plane. |
@lumencast/runtime-svelte
|
Headless Svelte adapter — leaf state as Svelte stores. |
@lumencast/runtime-vue
|
Headless Vue 3 adapter — leaf state as Vue refs. |
@lumencast/compiler
|
LSML 1.1 → flat RenderBundle compiler. |