Skip to main content
skill CX Codex

customware-support-widget — Claude Code skill

Wires the Customware support chat into a client-only React Router SPA: script in root.tsx, <customware-chat> in the route or layout that needs it.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add customware-ai/skills --skill customware-support-widget -a claude-code
Open on GitHub

What customware-support-widget does

The skill walks an agent through embedding a third-party browser custom element, <customware-chat>, in the Customware React Router client-only template. The script at https://app.customware.ai/support-widget/customware-chat.js is loaded once from root.tsx or the equivalent root document file, and the element itself is rendered only where support belongs — a floating launcher or an embedded panel.

Two modes are covered: chat-bubble for a floating launcher and dialog, full for a rail, drawer or split pane. Both need org-id and project-id. When either id is missing, the task is supposed to fail with a clear reason; the skill forbids placeholder values and follow-up questions. Visitor identity goes through meta only, limited to email and name. Sizing belongs to the wrapper, styleOptions or style-options — the native DOM style property is not widget configuration.

The widget owns its Shadow DOM, chat runtime, service calls, tool badges and page operation: filling fields, picking options, clicking buttons, replacing values. Adding your own click or fill handlers around it is pointless, and so is restyling its internals in React or reaching into the Shadow DOM. In full mode the wrapper needs a concrete height and the widget keeps its own scrolling. In chat-bubble mode make sure the container does not clip the element and carries a suitable z-index.

What it helps with

  • add a support chat to a client-only React Router SPA
  • place a floating support launcher in the app shell
  • embed chat as a panel inside a layout region
  • let the support agent fill a form for the user
  • fix the placement or styling of an existing widget

Example prompts for the agent

  • Add the Customware support widget to root.tsx and render it in the app layout
  • Render <customware-chat> in chat-bubble mode with org-id and project-id
  • Switch the widget to full mode in a right-hand panel and give the wrapper a height

How to install customware-support-widget

1Skills CLI (Vercel)

npx skills add customware-ai/skills --skill customware-support-widget -a claude-code

2Manually: put the files in place

~/.claude/skills/customware-support-widget/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/customware-support-widget/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about customware-support-widget

How do I install customware-support-widget in Claude Code?

Run npx skills add customware-ai/skills --skill customware-support-widget -a claude-code. The skill file then sits at ~/.claude/skills/customware-support-widget/SKILL.md.

What does customware-support-widget do?

It guides an agent through adding the Customware support chat to a React Router template: loading the script, typing the JSX element, rendering it in the right route, choosing between chat-bubble and full, and setting optional meta and styleOptions.

What does the skill need to work?

An orgId and a projectId. Without them the task ends with a missing-id reason instead of placeholders. If the ids arrive asynchronously, gate the component behind orgId && projectId.

Source text

SKILL.md · MIT
---
name: customware-support-widget
description: Use this skill when adding, placing, configuring, or fixing the Customware support chat widget in the Customware React Router client-only SPA template. It covers root.tsx/root document script loading, route/layout placement, required org/project ids, bubble versus full mode, optional metadata and style options, page-operation support, and constraints for MITB-style code generation.
---

# Customware Support Widget

Use this skill when the Customware React Router client-only SPA template needs a Customware support chat entry point.

The widget is a third-party browser custom element. In this template, load the widget script in `root.tsx` or the equivalent React Router root file/component where the HTML document structure is defined, and render `<customware-chat>` only in the route or layout where support should appear. The widget owns its Shadow DOM UI, chat runtime, service calls, tool badges, speech input, and page-operation behavior.

For all React code examples, script loading patterns, JSX typing, bubble/full mode examples, metadata, and style options, read [references/component-usage.md](references/component-usage.md).

## What It Offers

- A support chat UI as `<customware-chat>`.
- `chat-bubble` mode for a floating launcher/dialog.
- `full` mode for a sidebar, rail, drawer, or split-pane chat region.
- Optional visitor metadata through the `meta` DOM property.
- Optional sizing/customization through `styleOptions` or `style-options`.
- Tool-backed support behavior: read domain/context, list tasks, create tasks, and operate the visible page.
- Page operation for user requests like filling forms, selecting options, clicking buttons, replacing values, or submitting visible UI.

## When To Use

- Add support chat to the Customware React Router client-only SPA template.
- Place a floating support launcher in an app shell.
- Place support chat as a full embedded panel in a layout region.
- Allow the support agent to help with visible app UI, such as filling a form on behalf of the user.
- Update an existing support widget placement or styling.

For the exact React implementation patterns, use [references/component-usage.md](references/component-usage.md).

## When Not To Use

- Do not use this skill for server-side rendering work. The target template is client-only React Router SPA mode.
- Do not use this skill to build a custom chat UI.
- Do not use this skill to iframe the widget.
- Do not use this skill to call support chat endpoints directly.
- Do not use this skill for non-template React apps or non-React apps unless explicitly asked.
- Do not use this skill if `orgId` or `projectId` cannot be determined. Fail the task with a clear reason that the required Customware org/project id is missing.

## Non-Negotiables

- Always render the real custom element: `<customware-chat>`.
- Always pass both `org-id` and `project-id`.
- If either id is unavailable, fail the task with a clear missing-id reason instead of rendering placeholders or asking follow-up questions.
- Load `https://app.customware.ai/support-widget/customware-chat.js` once from `root.tsx` or the template's equivalent React Router root document shell unless an existing app-level loader already does this.
- Do not pass task ids, domain ids, user ids, API tokens, session tokens, auth cookies, or secrets into the component.
- Use `meta` only for optional visitor identity: `email` and/or `name`.
- Use wrapper CSS, `styleOptions`, or `style-options` for sizing. Do not use the native DOM `style` property as widget configuration.
- Tool calls are compact status badges, not buttons.
- Page operation is handled inside the widget. Do not add custom click/fill/page-control handlers around it.
- Do not hardcode page-operation prompts or values into the host app. The user must type the request into the widget.

## Implementation Workflow

1. Read [references/component-usage.md](references/component-usage.md).
2. Confirm the React app has `orgId` and `projectId`.
3. Choose the mode:
   - `chat-bubble` for a floating support launcher/dialog.
   - `full` for an embedded rail, drawer, split pane, or fixed chat region.
4. Add the script tag in `root.tsx` or the React Router root file/component that defines the HTML document `<head>`, unless it already exists.
5. Add JSX custom element typings in a `.d.ts` file when the template does not already know `<customware-chat>`.
6. Render `<customware-chat>` with `org-id` and `project-id` in the specific route or layout that needs support.
7. Set optional `meta` and `styleOptions` through a typed React ref when needed.
8. For full mode, ensure the wrapper/component has a concrete height and internal scrolling belongs to the widget.
9. For bubble mode, ensure the wrapper is not clipped and has an appropriate `z-index`.
10. Validate the resulting React code syntactically and with `npm run check` when available.

Use [references/component-usage.md](references/component-usage.md) for complete code examples for each mode.

## MITB Agent Constraints

- Do not assume access to Playwright, screenshots, browser DevTools, or visual testing.
- Do not claim that the widget was visually tested.
- Do not write user-facing status reports inside the generated app.
- Validate by code inspection, TypeScript/compile checks, and ensuring the generated React Router/Vite code follows the examples in [references/component-usage.md](references/component-usage.md).
- If runtime ids are unavailable during generation, fail the task with a clear missing-id reason. If ids are expected to load asynchronously at runtime, gate the component behind `orgId && projectId` so it never renders with placeholders.

## Do Not Do

- Do not create an iframe integration.
- Do not rebuild or restyle the widget internals in React.
- Do not reach into Shadow DOM or depend on internal class names.
- Do not expose tool calls as clickable UI controls.
- Do not call the support chat API or page-operation API directly from the host app.
- Do not add fallback embed modes.
- Do not store secrets, access tokens, private payloads, or auth/session data in widget attributes.
- Do not pass arbitrary user/profile objects into `meta`; pass only optional `email` and `name`.
- Do not set a fixed height only on an imagined internal message list. Size the whole full-mode host region.
- Do not place bubble mode inside clipped or transformed containers unless that behavior is intentional.

© customware-ai · MIT · customware-ai/skills

Similar skills

Everything for Frontend and UI →

From the same set7

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor