View as markdown

Embed

Embed elements drop external content directly into a slide. Three flavors, picked from the inspector.

Three kinds

  • iframe — any embeddable URL (YouTube, Vimeo, Calendly, Loom, Figma, your own custom widget). The most flexible.
  • code — render a syntax-highlighted code block at canvas position. Useful for technical demos.
  • form — link a form (defined elsewhere — e.g., Tally, Typeform, your own backend) so a Button with action.kind: submit_form can submit it.

Click Embed in the top toolbar; pick the kind in the inspector.

iframe

NameTypeDescription
embedKind*"iframe"Discriminator
iframeUrl*string (URL)Any URL the parent allows iframing. Must be HTTPS.
json
{
  "type": "embed",
  "embedKind": "iframe",
  "iframeUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ",
  "position": { "x": 80, "y": 200, "w": 1100, "h": 619 }
}

Common embeds:

WhatURL pattern
YouTubehttps://www.youtube.com/embed/<videoId>
Vimeohttps://player.vimeo.com/video/<videoId>
Loomhttps://www.loom.com/embed/<videoId>
Calendlyhttps://calendly.com/<user>?embed=true
Figmahttps://www.figma.com/embed?embed_host=share&url=...

Some sites block being iframed (X-Frame-Options / Content-Security-Policy). If your embed shows a blank box, check the source's docs for an embed-specific URL — it usually exists.

code

NameTypeDescription
embedKind*"code"Discriminator
code*{ language: string; source: string }Language and source. Highlighting is plain today (no syntax tokens) but the schema is ready for future support.
json
{
  "type": "embed",
  "embedKind": "code",
  "code": {
    "language": "tsx",
    "source": "<AvatarWidget agentId=\"agt_abc123\" />"
  }
}

The current renderer uses a monospace font on a dark surface. Syntax highlighting is on the roadmap — the schema's already ready for it.

form

NameTypeDescription
embedKind*"form"Discriminator
formId*stringID of an external form integration (Tally, Typeform, custom). Configure the integration in Settings → Integrations first.
json
{
  "type": "embed",
  "embedKind": "form",
  "formId": "tally_xyz123"
}

Pair with a Button that has action.kind: submit_form and formElementId pointing at this embed's element ID. Without the button, the form submits when the visitor presses Enter inside it.

Schema reference

Embed element:

NameTypeDescription
type*"embed"Discriminator
embedKind*"iframe" | "code" | "form"Which embed flavor
iframeUrlstringiframe only
code{ language: string; source: string }code only
formIdstringform only