Skip to content

Live presenting

A standalone deck syncs across your own windows via BroadcastChannel. Run it through the live server and it becomes a shared session: every connected device follows along, and plugins come alive.

Terminal window
liebstoeckel live my-talk # a deck dir, or a built .html

This builds the deck (if needed), serves it on your LAN, and prints presenter + audience links:

▶ liebstoeckel live, session a1b2c3d4
on this machine presenter http://localhost:4321/?t=…
audience http://localhost:4321/?t=…
on the network presenter http://192.168.1.20:4321/?t=…
audience http://192.168.1.20:4321/?t=…
  1. Open the presenter link (or press p for the presenter window).
  2. The room opens the audience link: share it directly, or press q in the deck to show a scannable QR full-screen.
  3. Navigate: every viewer follows. Plugins (polls, Q&A, reactions) sync in real time.

State lives in a Yjs document (a CRDT) shared over WebSocket. A small relay (Hub) keeps one doc per session and broadcasts changes.

  • Presenter: drives the slide index; everyone follows. Can moderate plugins.
  • Viewer: follows the presenter’s index; can still interact with plugins (vote, ask, react).

Roles come from an unguessable token in the URL (?t=…), not a login. A viewer’s client is scoped to match: the presenter view (p / #presenter) and the overview grid (o) are presenter-only: they stay disabled and dimmed in the shortcut help (?) for viewers, so the speaker notes and plugin consoles aren’t reachable from a shared audience link.

  • A plugin’s client part does WS + shared-state only and runs in every browser.
  • A plugin’s optional server part runs once, on the machine that started liebstoeckel live, never in the audience’s browsers.

liebstoeckel live is LAN-first. To reach viewers over the public internet, point it at a relay:

Terminal window
liebstoeckel live my-talk --relay https://relay.example.com --relay-token <token>

Comments

liebstoeckel

Code-first presentations your agent can author. One file out, no server.

© 2026 Leon Kaucher