Embedding the Widget
The Yedric widget is a web component, <yedric-widget>, that renders a chat panel in Shadow DOM on any page. You add a single script tag for widget.js, which registers the custom element and exposes window.Yedric.
Before you start
You need two values from the Yedric dashboard:
An agent ID: create an agent at Agents β All agents β New agent (or use an existing one). The ID is in the URL when you're on the agent's page.
A public widget API key: open your agent and go to Widget β Install. The key starts with
yk_β¦. Copy it.
That's enough for a working embed with API-key auth. For per-user chat history, see Secure Mode. It also uses the key's secret (yks_β¦), which you sign with server-side and never ship to the browser.
Quick start
The easiest way to generate your embed code is from the Widget page in the dashboard. The Install tab will generate embed code similar to this:
<script src="https://cdn.yedric.ai/widget.js?agent=your_agent_id"></script>
<yedric-widget
key="yk_your_public_key_here"
agent="your_agent_id"
></yedric-widget>Pasting this before </body> is enough to see the launcher and use the chat. We suggest enabling Secure Mode by using your secret key to generate a signature attribute.
Design and layout are configured in the dashboard
All design, layout, and behavior settings live in the dashboard under Widget β Configure, not on the <yedric-widget> element. That includes the theme, colors, fonts, icons, mascot videos, panel width and placement, greeting text, and feature toggles.
Settings you save there are stored with the agent and delivered to the widget automatically along with widget.js. You do not add appearance attributes to the embed code, and you do not redeploy your site to restyle the widget: every page picks up your saved configuration the next time it loads.
The element itself only needs a small set of attributes for identity, authentication, and embed-specific plumbing that cannot live in the dashboard. Those are listed below.
Attribute reference
key
Yes
Public widget API key (yk_β¦). Sent as X-Yedric-Key.
agent
Yes
Agent ID to use for chat and secure-mode history.
signature
No
HMAC-SHA256(secret, username) using the agent key's secret (yks_β¦). Sent as X-Yedric-Signature. See Secure Mode.
name
No
User's display name for personalization (sent as session context).
debug
No
Boolean-like. When truthy, widget console.log diagnostics run. Can also be enabled for all embeds in Widget β Configure β Advanced.
Situational attributes
Only needed for specific hosting setups:
auth-token
Static bearer JWT that is passed to Actions (Authorization: Bearer β¦). For embedded Shopify apps prefer App Bridge, and set it up on the custom tool server so the widget uses App Bridge idToken().
shop
Myshopify hostname (e.g. example-store.myshopify.com) appended as ?shop= on API requests for Shopify App Bridge auth. Falls back to the shop URL query param or window.shopify.config.shop.
backend-url
Explicit API base URL (http/https). Only needed when widget.js is on a different host than the API.
session-id-prefix
widget (default) or preview. Keeps preview traffic separate from production.
resume-session-id
Secure mode only. Resume a specific conversation thread by id on load instead of the user's default thread. See Secure Mode β Carrying a conversation across widget instances.
preview-page-url
Override window.location for page prompt matchUrl/ignoreUrl, suggestion {URL} / {{var}}, and chat API siteUrl.
parent-origin
Target origin for the postMessage bridge when the widget is hosted inside an iframe. See Advanced Configuration.
prompt-suggestion
Page-specific text for the top bubble shown beside the closed beacon when Show Page prompts when beacon is closed is on. Overrides the Prompt suggestion configured in the dashboard for this embed only. It cannot turn the feature on by itself. See Advanced Configuration.
reopen-on-page-change
Boolean-like. Reopen the panel on the next page, with the same conversation, when the visitor follows a link with the chat open. Overrides the Re-open when page changes setting for this embed. See Advanced Configuration.
fab-draggable
Set to "false" to stop visitors dragging the beacon to another corner on this embed. Any other value, or omitting it, leaves dragging on. See Advanced Configuration.
navigate-allow
Extra origins the assistant's built-in navigate action may send the visitor to, separated by spaces or commas (https://docs.example.com https://help.example.com). The embedding page's own origin is always allowed; http/https only. See Advanced Configuration.
Boolean-like attributes (debug, reopen-on-page-change) accept "", "true", "1", or "yes" as truthy; "false", "0", "no" as falsy. Omitting the attribute is the same as false, except that omitting reopen-on-page-change defers to the dashboard setting. fab-draggable is the reverse: only "false" has an effect.
Additional customizations
Everything else is configured per agent in Widget β Configure and applies to every embed of that agent once you click Save. Settings are grouped into the following cards. Use the Preview tab to see changes live before publishing.
General
Theme
Yeti, Light, or Dark. Switching themes resets colors, icons, and mascot videos to the theme's defaults.
Title
Shown in the panel header and the default beacon tooltip.
Side (beacon & panel)
Left or Right. The open panel docks to the same edge as the beacon. Visitors can drag the beacon to another corner, remembered per agent in their browser; opt out with fab-draggable="false".
Default state
Open, or Closed (beacon only) until the user or code opens it. On viewports 640px and narrower an Open embed starts closed, since the panel would fill the screen. Exceptions: fab="false" embeds (no beacon to reopen with), resume-session-id handoffs, an interrupted live chat, and the dashboard preview.
Show Page prompts when beacon is closed
Shown when Default state is Closed. Shows the current page's Page prompts as clickable bubbles beside the closed beacon; clicking one opens the chat and sends the prompt. Dismissed bubbles return after an hour, and the beacon tooltip is suppressed while this is on.
Prompt suggestion
Shown when the box above is checked. Optional text for the top bubble, shown with the assistant's avatar; line breaks become separate lines. The cluster shows at most four bubbles in total. Override per page with prompt-suggestion.
Re-open when page changes
If a visitor follows a link with the chat open, it opens again on the next page with the same conversation. Off by default. Override per embed with reopen-on-page-change.
Hide beacon
When the panel is closed, no beacon button is shown. Open the widget with Yedric.open() or your own control.
Beacon position
Top, Middle, or Bottom of the viewport edge.
Features
File uploads
Show a paperclip button so users can attach files to their messages.
Microphone (speech-to-text)
Show a mic button so users can dictate messages.
Live chat
Show an escalation button so visitors can reach your team. With the Built-in provider it opens Yedric's own chat panel (live chat). With External it fires the human_support event so the host page can open your chat provider, a support form, or a call.
Response voting
Show up/down vote buttons on the latest response from the Assistant. Fires the response_vote event.
Show tool activity
Show the step-by-step "I'm runningβ¦" tool status lines as the assistant works. Steps render in the reply at the point where they ran, so the step currently running sits below the text written so far. Turn off to hide all tool activity from visitors; typing dots show while a hidden tool runs. On by default.
Mascot
Beacon icon
Image used as the beacon button icon, plus an optional hover variant.
Agent chat icon
Assistant avatar shown on each chat message. Defaults to the beacon icon.
User Chat icon
Avatar beside the user's messages: initials from their name or email, or their Gravatar with a fallback style.
Beacon tooltip
Hover text on the beacon. Supports context variables. Hidden while Show Page prompts when beacon is closed is on, since the bubbles take its place.
Videos
Optional mascot video clips: Waving (welcome), Thinking (loading), Thumbs up, and Presenting (after reply), plus an optional placeholder image shown when no clip is playing. Each field has an Upload button (MP4 or WebM, up to 10 MB; PNG, JPEG, GIF, WebP, or AVIF for the placeholder) or takes a URL to a file you host. A configured Waving clip plays on open by itself; nothing shows if no clip is set.
Display
Panel width (open)
Any CSS length. On viewports 640px and narrower the panel takes the full width regardless.
Border style
Line, Shadow, or Rounded.
Suggestion style
Layout for starter suggestions: Stacked, Centered, List rows, Chips, Icon cards, Minimal links, or Suggested panel.
Prompt placeholder text
Placeholder shown in the message input.
Prompt textbox border radius
Corner radius of the message input.
Button border radius
Corner radius of buttons.
Font family / Base font size
Typography for the panel.
Greeting
Optional headline above the starter suggestions when the chat is empty. Supports context variables like the user's name.
Greeting description
Optional secondary line below the greeting.
The Display card also contains the full color palette, grouped as:
Base theme: Primary / accent, Panel background, Body text, Panel border
Title bar (header): Header height, Title bar background, Title bar border, Title bar text, Title bar icons
Buttons: Submit (send) button background and icon, Icon color, Icon button background and hover
Prompt input: Input background, Prompt textbox border, Prompt area background and border
Suggestions: Suggestion button background, Suggestion button background (hover), Suggestion border, Suggestion text
Avatar & message bubble: User avatar background, Assistant avatar & beacon background (also paints the tile behind the beacon icon, so the launcher and the chat avatar match), User text background, Assistant text background, User message text, Assistant message text
Greeting: Greeting text color, Greeting description text color
Advanced
Features (comma-separated)
Feature flags for the embed. Defaults to chat,mcp.
Add margin to host body when sidebar is open
Shifts the host page content instead of overlaying it with a backdrop.
Debug mode (in console log messages)
Enables widget console diagnostics on every embed.
Embed snippets
Basic
Open from your own UI
Turn on Hide beacon and set Default state to Closed in Widget β Configure β General, then open the panel programmatically:
Secure mode (server-rendered)
See Secure Mode for server-side signing examples in Node, PHP, and SubtleCrypto.
Follow the visitor between pages, with a page-specific prompt
Reopen the chat on the next page and replace the dashboard's Prompt suggestion with one written for this page:
Let the assistant navigate to your docs site
The assistant can only send visitors to pages on the embedding site unless you list other origins:
Shopify admin (embedded app)
The auth token for Shopify App Bridge is loaded from the custom tool server when App Bridge auth is enabled there, so you do not need to set auth-token manually. Theme, colors, greeting, and mascot videos come from Widget β Configure.
Common embedding mistakes
Pulled from production integrations that came in with subtle breakage.
Duplicate attributes. The browser keeps the last value of a repeated attribute, so dropping a hardcoded
key="yk_β¦"next to a server-rendered one silently wins, wrong key. Write each attribute exactly once.Stray quotes. A typo like
signature="β¦""has a trailing", which swallows every attribute after it on the same line until the next>. Scan your rendered HTML, not just the template.Styling with attributes. Appearance attributes on the element are not the supported way to style the widget. Configure design and layout in Widget β Configure so every page stays in sync with your saved settings.
Secrets in HTML. Never render the
yks_β¦secret in markup or JavaScript. Only rendersignature(the HMAC output). See Secure Mode.Wrong
widget.jsorigin. If your API is athttps://api.example.com/yedric, either servewidget.jsfromhttps://api.example.com/yedric/widget.js(auto-inferred) or addbackend-url="https://api.example.com/yedric"to the element when you must serve from a CDN.Using
keyfrom React JSX.keyis reserved in React. Use a ref andsetAttribute('key', β¦), or pass it viasetConfig({ yedricKey }).
Troubleshooting
If you see nothing on the page, open the browser console and check for these:
GET /widget.js returns 404
Wrong script URL or widget bundle not deployed alongside the API
Serve widget.js from the same origin+path as your API.
[Yedric] No <yedric-widget> found in the document.
You called window.Yedric.open() before the element was added, or the element isn't on the page
Add the <yedric-widget> element before calling any Yedric.* method.
401 Invalid Yedric Key or domain not allowed
Wrong key; origin not in the key's allowedDomains; or the request carried no Origin/Referer header at all
Check the key value matches the dashboard; add your origin to allowedDomains (or clear the list). A domain-restricted key now fails closed when there is no origin header, so non-browser callers need a key with no domain restriction.
401 Invalid signature
signature doesn't match HMAC-SHA256(secret, username)
Ensure the username you sign matches the username attribute byte-for-byte. See Secure Mode.
400 agentId required
The agent attribute wasn't set
Add agent="your-agent-id" to the element.
Widget loads but chat returns nothing
Assistant has no model, API keys are missing from Settings
In the dashboard β Settings, set at least one provider key (Google/OpenAI/Anthropic).
React: key attribute seems to be ignored
React treats key as a reserved prop and strips it from the DOM
Use a ref and el.setAttribute('key', value), or pass it via el.setConfig({ yedricKey }).
Yedric.open() doesn't fire a message
Default state set to Closed combined with passing a prompt works fine, but calling from SPA before widget mount fails silently
Guard with typeof window.Yedric !== 'undefined'. See Advanced Configuration.
Widget looks unstyled or ignores your changes
Configure changes were made but not published
Click Save in Widget β Configure; the widget picks up the saved settings on the next page load.
Enable debug="true" to get verbose logs in the console: route changes, matched site settings, client-tool delegation, and secure-mode state.
What's next
Secure Mode: per-user sessions with HMAC verification
Advanced Configuration: iframe embedding, client-side custom HTTP tools, programmatic open, closed-beacon prompt suggestions, cross-page reopen, navigation origins
JavaScript API:
window.Yedric.open(), events
Last updated