This quickstart shows the streams modality end to end. The control plane creates a live input and mints a signed playback URL. The data plane opens a browser viewer that yields CMAF chunks. You can replace streams with any other modality (voice, robotics, games, data). All modalities follow the same shape.

1. Install

2. Server-side: create a live input

3. Browser-side: open a viewer

4. Push a broadcast (if you’re publishing too)

What just happened

  1. The control-plane API (tRPC) procedure created the live input and returned the cleartext stream key once. The control-plane API only keeps a hash.
  2. signedPlaybackUrl minted a relay token scoped to playback/<input_id> for an hour.
  3. BroadcastViewer.open connected MoQT over WebTransport on relay.clutchcall.dev:443 and presented the token. It then received the CMAF init and media segments live.
  4. BroadcastPublisher.open opened a publish track on publish/<input_id>. The relay fanned out the track to your viewer.

Other modalities

The other four modalities follow the same shape: construct → control-plane call → data-plane publish/subscribe.

Voice

Voice.calls.originate + Voice.audioBridge.attach

Robotics

Robotics.publishTelemetry + subscribeCommand

Games

Games.publishState + subscribeInputs

Data

Data.publish + subscribe with MQTT-style filters