Use when you have a written implementation plan to execute in a separate session with review checkpoints
npx skills add tanchunsiong/agent-skills-lite --skill "zoom-ui-toolkit"
Install specific skill from multi-skill repository
# Description
|
# SKILL.md
name: zoom-ui-toolkit
description: |
Zoom Video SDK UI Toolkit - a vanilla JavaScript library that renders pre-built video UI
into DOM containers. NOT a React component library. Use for quick video app integration
with minimal code. Requires server-side JWT generation.
Zoom Video SDK UI Toolkit
Pre-built video UI powered by Zoom Video SDK. Renders into DOM containers via JavaScript API.
Overview
Zoom UI Toolkit provides:
- Ready-to-use video conferencing UI
- Consistent Zoom-like experience
- Vanilla JavaScript API (works with any framework)
- Built-in controls, chat, participants list
- Requires React 18 as peer dependency
Installation
npm install @zoom/videosdk-ui-toolkit jsrsasign
npm install -D @types/jsrsasign
Note: Requires React 18 specifically (not 17, not 19).
Quick Start
Basic Usage (Vanilla JS)
import uitoolkit from "@zoom/videosdk-ui-toolkit";
import "@zoom/videosdk-ui-toolkit/dist/videosdk-ui-toolkit.css";
const container = document.getElementById("sessionContainer");
const config = {
videoSDKJWT: "your_jwt_token",
sessionName: "my-session",
userName: "John Doe",
sessionPasscode: "",
features: ["video", "audio", "share", "chat", "users", "settings"],
};
uitoolkit.joinSession(container, config);
uitoolkit.onSessionJoined(() => {
console.log("Session joined");
});
uitoolkit.onSessionClosed(() => {
console.log("Session closed");
});
Next.js / React Integration
'use client';
import { useEffect, useRef } from 'react';
export default function VideoSession({ jwt, sessionName, userName }) {
const containerRef = useRef<HTMLDivElement>(null);
const uitoolkitRef = useRef<any>(null);
useEffect(() => {
let isMounted = true;
const init = async () => {
const uitoolkitModule = await import('@zoom/videosdk-ui-toolkit');
const uitoolkit = uitoolkitModule.default;
uitoolkitRef.current = uitoolkit;
// @ts-ignore
await import('@zoom/videosdk-ui-toolkit/dist/videosdk-ui-toolkit.css');
if (!isMounted || !containerRef.current) return;
const config: any = {
videoSDKJWT: jwt,
sessionName: sessionName,
userName: userName,
sessionPasscode: '',
features: ['video', 'audio', 'share', 'chat', 'users', 'settings'],
};
uitoolkit.joinSession(containerRef.current, config);
uitoolkit.onSessionJoined(() => console.log('Joined'));
uitoolkit.onSessionClosed(() => console.log('Closed'));
};
init();
return () => {
isMounted = false;
if (uitoolkitRef.current && containerRef.current) {
try {
uitoolkitRef.current.closeSession(containerRef.current);
} catch (e) {}
}
};
}, [jwt, sessionName, userName]);
return <div ref={containerRef} style={{ width: '100%', height: '100vh' }} />;
}
Available Features
| Feature | Description |
|---|---|
video |
Enable video layout and send/receive video |
audio |
Show audio button, send/receive audio |
share |
Screen sharing |
chat |
In-session messaging |
users |
Participant list |
settings |
Device selection, virtual background |
preview |
Pre-join camera/mic preview |
recording |
Cloud recording (paid plan) |
leave |
Leave/end session button |
JWT Token Generation (Server-Side)
Required: Generate JWT tokens on your server, never expose SDK secret client-side.
Node.js / Next.js API Route
import { NextRequest, NextResponse } from 'next/server';
import { KJUR } from 'jsrsasign';
const ZOOM_VIDEO_SDK_KEY = process.env.ZOOM_VIDEO_SDK_KEY;
const ZOOM_VIDEO_SDK_SECRET = process.env.ZOOM_VIDEO_SDK_SECRET;
export async function POST(request: NextRequest) {
const { sessionName, role, userName } = await request.json();
if (!sessionName || role === undefined) {
return NextResponse.json({ error: 'Missing params' }, { status: 400 });
}
const iat = Math.floor(Date.now() / 1000);
const exp = iat + 60 * 60 * 2; // 2 hours
const oHeader = { alg: 'HS256', typ: 'JWT' };
const oPayload = {
app_key: ZOOM_VIDEO_SDK_KEY,
role_type: role, // 0 = participant, 1 = host
tpc: sessionName,
version: 1,
iat,
exp,
user_identity: userName || 'User',
};
const signature = KJUR.jws.JWS.sign(
'HS256',
JSON.stringify(oHeader),
JSON.stringify(oPayload),
ZOOM_VIDEO_SDK_SECRET
);
return NextResponse.json({ signature });
}
JWT Payload Fields
| Field | Required | Description |
|---|---|---|
app_key |
Yes | Your Video SDK Key |
role_type |
Yes | 0 = participant, 1 = host |
tpc |
Yes | Session/topic name |
version |
Yes | Always 1 |
iat |
Yes | Issued at (Unix timestamp) |
exp |
Yes | Expiration (Unix timestamp) |
user_identity |
No | User identifier |
API Reference
Core Methods
uitoolkit.joinSession(container, config);
uitoolkit.closeSession(container);
Event Listeners
uitoolkit.onSessionJoined(callback);
uitoolkit.onSessionClosed(callback);
uitoolkit.offSessionJoined(callback);
uitoolkit.offSessionClosed(callback);
Component Methods
uitoolkit.showChatComponent(container);
uitoolkit.hideChatComponent(container);
uitoolkit.showUsersComponent(container);
uitoolkit.hideUsersComponent(container);
uitoolkit.showControlsComponent(container);
uitoolkit.hideControlsComponent(container);
uitoolkit.showSettingsComponent(container);
uitoolkit.hideSettingsComponent(container);
uitoolkit.hideAllComponents();
CDN Usage (No Build Step)
<link rel="stylesheet" href="https://source.zoom.us/uitoolkit/2.3.5/videosdk-ui-toolkit.css" />
<script src="https://source.zoom.us/uitoolkit/2.3.5/videosdk-ui-toolkit.min.umd.js"></script>
<div id="sessionContainer"></div>
<script>
const uitoolkit = window.UIToolkit;
uitoolkit.joinSession(document.getElementById('sessionContainer'), {
videoSDKJWT: 'your_jwt',
sessionName: 'my-session',
userName: 'User',
features: ['video', 'audio', 'chat']
});
</script>
Next.js with basePath
When deploying Next.js under a subpath:
// next.config.ts
const nextConfig = {
basePath: "/your-app-path",
assetPrefix: "/your-app-path",
};
Fetch API routes with full path:
fetch('/your-app-path/api/token', { ... })
Prerequisites
- Zoom Video SDK credentials from Zoom Marketplace
- React 18 as peer dependency
- Server-side JWT generation (never expose SDK secret)
- Modern browser with WebRTC support
Browser Support
| Browser | Version |
|---|---|
| Chrome | 78+ |
| Firefox | 76+ |
| Safari | 14.1+ |
| Edge | 79+ |
Common Issues
| Issue | Solution |
|---|---|
peer react@"^18.0.0" error |
Use React 18, not 17 or 19 |
| CSS import TypeScript error | Add // @ts-ignore before import |
| Config type error | Type config as any |
| API returns HTML not JSON | Check basePath in fetch URL |
Resources
- GitHub: https://github.com/zoom/videosdk-ui-toolkit-web
- UI Toolkit Docs: https://developers.zoom.us/docs/video-sdk/web/ui-toolkit/
- Auth Endpoint Sample: https://github.com/zoom/videosdk-auth-endpoint-sample
- Marketplace: https://marketplace.zoom.us/
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.