Skip to main content
Three self-contained pages, each driving an invisible widget with completely custom UI. Replace YOUR_WIDGET_ID and your-domain.com with the values from your campaign’s Web Widget tab → Embed Code panel, serve over https:// (or http://localhost), and they run as-is.
These pages use no framework - plain HTML, CSS, and JavaScript - so the patterns translate directly to React, Vue, Svelte, or Webflow custom code.

Voice call

A single toggle button with full state cycling (Loading → Talk → Connecting → End), call duration from durationMs, mic-denied and error banners, and a consent listener.
voice-call.html

Chat

A complete custom chat panel: bubbles rendered from the single chat.message stream, balanced typing dots, an online/offline chip, an End-chat button, and human-readable handling of all four session-ended reasons.
chat.html

Voice + chat together

One invisible widget powering both surfaces side by side. widget.readye.detail.modes gates each surface, and a single consent modal serves both flows.
voice-and-chat.html