Eva Feature Screenshot
vvedantb/eva
Grab a single clean HD screenshot of a new eva feature from the real running app (Playwright at deviceScaleFactor 2, 1280 layout captured crisp at 2560×1440, dev overlays hidden) and write a tweet…
Agent skill
Records browser interactions as video with Playwright, covering viewport sizing, cursor highlighting, and converting output for Remotion.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit playwright-recording --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/playwright-recording .claude/skills/playwright-recording && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "playwright-recording" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/playwright-recording into .claude/skills/playwright-recording/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-recording", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/playwright-recordingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit playwright-recording --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/playwright-recording .agents/skills/playwright-recording && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "playwright-recording" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/playwright-recording into .agents/skills/playwright-recording/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-recording", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit playwright-recording --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/playwright-recording .cursor/skills/playwright-recording && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "playwright-recording" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/playwright-recording into .cursor/skills/playwright-recording/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-recording", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/digitalsamba/claude-code-video-toolkit.git --path .claude/skills/playwright-recording--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit playwright-recording --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/playwright-recording .gemini/skills/playwright-recording && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "playwright-recording" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/playwright-recording into .gemini/skills/playwright-recording/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-recording", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install digitalsamba/claude-code-video-toolkit playwright-recordingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/playwright-recording .github/skills/playwright-recording && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "playwright-recording" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/playwright-recording into .github/skills/playwright-recording/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-recording", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit playwright-recording --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/playwright-recording .opencode/skills/playwright-recording && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "playwright-recording" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/playwright-recording into .opencode/skills/playwright-recording/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-recording", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
playwright-recordingRecords browser interactions as video with Playwright, covering viewport sizing, cursor highlighting, and converting output for Remotion.
This skill scripts Playwright to capture demo footage for Remotion video compositions, covering form submissions, multi-page navigation, scrolling, and login flows as example recording patterns, plus recommended viewport sizes and context-level video quality settings.
Since Playwright shows no visible cursor by default, it adds a CSS-based highlight and a click-ripple effect so a recorded demo reads clearly to a viewer. Output comes out as WebM, which it converts with ffmpeg for broader compatibility, and finished recordings move into a project's demo folder for use in a composition.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 2c99460. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxnpmffmpegFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Playwright Browser Demo Recording loads about 3.2k tokens when it runs. Until then it costs about 70 tokens; SKILL.md has 295 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from digitalsamba/claude-code-video-toolkit at commit 2c99460, republished under its MIT licence (© digitalsamba). 295 words, ~3,164 tokens.
.claude/skills/playwright-recording/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Playwright can record browser interactions as video - perfect for demo footage in Remotion compositions.
# In your video project
npm init -y
npm install -D playwright @playwright/test
npx playwright install chromium// scripts/record-demo.ts
import { chromium } from 'playwright';
async function recordDemo() {
const browser = await chromium.launch();
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
recordVideo: {
dir: './recordings',
size: { width: 1920, height: 1080 }
}
});
const page = await context.newPage();
// Your recording actions
await page.goto('https://example.com');
await page.waitForTimeout(2000);
await page.click('button.demo');
await page.waitForTimeout(3000);
// Close to save video
await context.close();
await browser.close();
console.log('Recording saved to ./recordings/');
}
recordDemo();Run with:
npx ts-node scripts/record-demo.ts
# or
npx tsx scripts/record-demo.ts// Standard 1080p (recommended for Remotion)
viewport: { width: 1920, height: 1080 }
// 720p (smaller files)
viewport: { width: 1280, height: 720 }
// Square (social media)
viewport: { width: 1080, height: 1080 }
// Mobile
viewport: { width: 390, height: 844 } // iPhone 14const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
recordVideo: {
dir: './recordings',
size: { width: 1920, height: 1080 } // Match viewport for crisp output
},
// Slow down for visibility
// Note: slowMo is on browser launch, not context
});
// For slow motion, launch browser with slowMo
const browser = await chromium.launch({
slowMo: 100 // 100ms delay between actions
});import { chromium } from 'playwright';
async function recordFormDemo() {
const browser = await chromium.launch({ slowMo: 50 });
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
recordVideo: { dir: './recordings', size: { width: 1920, height: 1080 } }
});
const page = await context.newPage();
await page.goto('https://myapp.com/form');
await page.waitForTimeout(1000);
// Type with realistic speed
await page.fill('#name', 'John Smith', { timeout: 5000 });
await page.waitForTimeout(500);
await page.fill('#email', 'john@example.com');
await page.waitForTimeout(500);
// Click submit
await page.click('button[type="submit"]');
// Wait for result
await page.waitForSelector('.success-message');
await page.waitForTimeout(2000);
await context.close();
await browser.close();
}async function recordNavDemo() {
const browser = await chromium.launch({ slowMo: 100 });
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
recordVideo: { dir: './recordings', size: { width: 1920, height: 1080 } }
});
const page = await context.newPage();
// Page 1
await page.goto('https://myapp.com');
await page.waitForTimeout(2000);
// Navigate to page 2
await page.click('nav a[href="/features"]');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(2000);
// Navigate to page 3
await page.click('nav a[href="/pricing"]');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(2000);
await context.close();
await browser.close();
}async function recordScrollDemo() {
const browser = await chromium.launch();
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
recordVideo: { dir: './recordings', size: { width: 1920, height: 1080 } }
});
const page = await context.newPage();
await page.goto('https://myapp.com/long-page');
await page.waitForTimeout(1000);
// Smooth scroll
await page.evaluate(async () => {
const delay = (ms: number) => new Promise(r => setTimeout(r, ms));
for (let i = 0; i < 10; i++) {
window.scrollBy({ top: 200, behavior: 'smooth' });
await delay(300);
}
});
await page.waitForTimeout(1000);
await context.close();
await browser.close();
}async function recordLoginDemo() {
const browser = await chromium.launch({ slowMo: 75 });
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
recordVideo: { dir: './recordings', size: { width: 1920, height: 1080 } }
});
const page = await context.newPage();
await page.goto('https://myapp.com/login');
await page.waitForTimeout(1000);
await page.fill('#email', 'demo@example.com');
await page.waitForTimeout(300);
await page.fill('#password', '••••••••');
await page.waitForTimeout(500);
await page.click('button[type="submit"]');
// Wait for dashboard
await page.waitForURL('**/dashboard');
await page.waitForTimeout(3000);
await context.close();
await browser.close();
}Playwright doesn't show cursor by default. Add visual indicators:
// Inject cursor visualization
await page.addStyleTag({
content: `
* { cursor: none !important; }
.playwright-cursor {
position: fixed;
width: 24px;
height: 24px;
background: rgba(255, 100, 100, 0.5);
border: 2px solid rgba(255, 50, 50, 0.8);
border-radius: 50%;
pointer-events: none;
z-index: 999999;
transform: translate(-50%, -50%);
transition: transform 0.1s ease;
}
.playwright-cursor.clicking {
transform: translate(-50%, -50%) scale(0.8);
background: rgba(255, 50, 50, 0.8);
}
`
});
// Add cursor element
await page.evaluate(() => {
const cursor = document.createElement('div');
cursor.className = 'playwright-cursor';
document.body.appendChild(cursor);
document.addEventListener('mousemove', (e) => {
cursor.style.left = e.clientX + 'px';
cursor.style.top = e.clientY + 'px';
});
document.addEventListener('mousedown', () => cursor.classList.add('clicking'));
document.addEventListener('mouseup', () => cursor.classList.remove('clicking'));
});// Add click ripple visualization
await page.addStyleTag({
content: `
.click-ripple {
position: fixed;
width: 40px;
height: 40px;
border-radius: 50%;
background: rgba(234, 88, 12, 0.4);
pointer-events: none;
z-index: 999998;
transform: translate(-50%, -50%) scale(0);
animation: ripple 0.4s ease-out forwards;
}
@keyframes ripple {
to {
transform: translate(-50%, -50%) scale(2);
opacity: 0;
}
}
`
});
// Custom click function with ripple
async function clickWithRipple(page, selector) {
const element = await page.locator(selector);
const box = await element.boundingBox();
await page.evaluate(({ x, y }) => {
const ripple = document.createElement('div');
ripple.className = 'click-ripple';
ripple.style.left = x + 'px';
ripple.style.top = y + 'px';
document.body.appendChild(ripple);
setTimeout(() => ripple.remove(), 400);
}, { x: box.x + box.width / 2, y: box.y + box.height / 2 });
await element.click();
}import { chromium } from 'playwright';
import * as fs from 'fs';
import * as path from 'path';
async function recordForRemotion(outputName: string) {
const browser = await chromium.launch({ slowMo: 50 });
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
recordVideo: { dir: './temp-recordings', size: { width: 1920, height: 1080 } }
});
const page = await context.newPage();
// ... recording actions ...
await context.close();
// Get the video path
const video = page.video();
const videoPath = await video?.path();
if (videoPath) {
const destPath = `./public/demos/${outputName}.webm`;
fs.mkdirSync(path.dirname(destPath), { recursive: true });
fs.renameSync(videoPath, destPath);
console.log(`Recording saved to: ${destPath}`);
// Get duration for config
// Use ffprobe: ffprobe -v error -show_entries format=duration -of csv=p=0 file.webm
}
await browser.close();
}Playwright outputs WebM. Convert for better Remotion compatibility:
ffmpeg -i recording.webm -c:v libx264 -crf 20 -preset medium -movflags faststart public/demos/demo.mp4For user-driven recordings where you manually perform actions:
// Inject ESC key listener to stop recording
async function injectStopListener(page: Page): Promise<void> {
await page.evaluate(() => {
if ((window as any).__escListenerAdded) return;
(window as any).__escListenerAdded = true;
(window as any).__stopRecording = false;
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
e.preventDefault();
(window as any).__stopRecording = true;
}
});
});
}
// Poll for stop signal - handle navigation errors gracefully
while (!stopped) {
try {
const shouldStop = await page.evaluate(() => (window as any).__stopRecording === true);
if (shouldStop) break;
} catch {
// Page navigating - continue recording
}
await new Promise(r => setTimeout(r, 200));
}Key insight: page.evaluate() throws during navigation. Use try/catch and continue - don't treat errors as stop signals.
Record at full 1080p while showing a smaller window:
const scale = 0.75; // 75% window size
const context = await browser.newContext({
viewport: { width: 1920 * scale, height: 1080 * scale },
deviceScaleFactor: 1 / scale,
recordVideo: { dir: './recordings', size: { width: 1920, height: 1080 } },
});Comprehensive selector list for common consent platforms:
const COOKIE_SELECTORS = [
'#onetrust-accept-btn-handler', // OneTrust
'#CybotCookiebotDialogBodyButtonAccept', // Cookiebot
'.cc-btn.cc-dismiss', // Cookie Consent by Insites
'[class*="cookie"] button[class*="accept"]',
'[class*="consent"] button[class*="accept"]',
'button:has-text("Accept all")',
'button:has-text("Accept cookies")',
'button:has-text("Got it")',
];
async function dismissCookieBanners(page: Page): Promise<void> {
await page.waitForTimeout(500);
for (const selector of COOKIE_SELECTORS) {
try {
const btn = page.locator(selector).first();
if (await btn.isVisible({ timeout: 100 })) {
await btn.click({ timeout: 500 });
return;
}
} catch { /* try next */ }
}
}Call after page.goto() and on page.on('load') for navigation.
Warning: Any DOM elements you inject (cursors, control panels, overlays) will be recorded. For UI-free recordings, use terminal-based controls only (Ctrl+C, max duration timer).
waitForLoadState('networkidle')If this skill is missing information or could be improved:
Just say "improve this skill" and I'll guide you through updating .claude/skills/playwright-recording/SKILL.md.
© digitalsamba, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .claude/skills/playwright-recording of digitalsamba/claude-code-video-toolkit.
Open the folder on GitHubat commit 2c99460
We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in digitalsamba/claude-code-video-toolkit, which our catalogue first saw on October 7, 2026.
Playwright Browser Demo Recording next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Playwright Browser Demo Recording this skilldigitalsamba/claude-code-video-toolkit | 2.2k | 1 repos | ~3.2k | Automated safety check: Pass | MIT | |
| Eva Feature Screenshotvvedantb/eva | 101 | — | ~3.2k | Automated safety check: Notes | MIT | |
| Cs Web Promo FilmChenShuo2004/cs-skills | 193 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Whiteboard Videotrustfuture/simon-skills | 353 | — | ~1.8k | Automated safety check: Notes | MIT | |
| Immersive Short Videoxrkseek/XRK-AGT | 140 | — | ~1k | Automated safety check: Pass | MIT | |
| Michel UI Demo RecorderPackmindHub/packmind | 317 | — | ~6.4k | Automated safety check: Pass | Apache-2.0 |
vvedantb/eva
Grab a single clean HD screenshot of a new eva feature from the real running app (Playwright at deviceScaleFactor 2, 1280 layout captured crisp at 2560×1440, dev overlays hidden) and write a tweet…
ChenShuo2004/cs-skills
把真实网页做成 30–60 秒产品演示宣传片:Playwright 采集页面长截图,Remotion 用虚拟浏览器窗口做推进、平移、滚动和点击,渲染可交付 mp4,并可附口播稿。触发词包括 $cs-web-promo-film、网页宣传片、产品演示片、把这个网页做成视频、产品功能演示。不用于网页幻灯片、静态海报、真人出镜、电商对标复刻(改用 $cs-auto-videl)、ChatCut…
trustfuture/simon-skills
手绘白板风"边画边讲"讲解视频出片 skill(Excalidraw 风格逐笔动画 + 火山引擎配音 + 烧录字幕 + 品牌水印与片尾卡 + 横竖两张封面 + 各平台发布文案)。当用户说"做一期白板视频 / 边画边讲 / 手绘讲解视频 / 用 excalidraw 做视频 / whiteboard video",或要在本仓库里新建一期、改场景、换贴纸或真实…
xrkseek/XRK-AGT
Produce immersive vertical short videos (口播/科普/产品讲解) without AI-slop aesthetics.
PackmindHub/packmind
Record polished UI demo videos and screenshots of a running web app using Playwright MCP — for client deliverables, release notes, feature walkthroughs, or bug repros.
ChenShuo2004/cs-skills
用代码做动画视频:页面暴露 render(t),Playwright 逐帧截图 + FFmpeg 合成 mp4,可接合成配乐、出图和配音。通用模式先明确主题、规格、风格和声音,出风格卡、分镜与关键帧后逐镜制作;Vibe知识大赏模式额外查证来源、记录真实素材许可、先渲 10 秒样片。触发词包括…
digitalsamba/claude-code-video-toolkit
Command recipes for converting, resizing, compressing, trimming and extracting audio from video with FFmpeg, including settings for Remotion projects.
digitalsamba/claude-code-video-toolkit
Generates roughly five-second video clips from a text prompt or a still image with the LTX-2.3 22B model, run through a Modal endpoint by `tools/ltx2.py`.
digitalsamba/claude-code-video-toolkit
Generates narration, sound effects and cloned voices through the ElevenLabs API, with model and setting choices tuned to the content's style.
digitalsamba/claude-code-video-toolkit
Turns a casual image request into the structured JSON caption Ideogram 4 needs for legible on-image text, exact brand colors and controlled layout.
digitalsamba/claude-code-video-toolkit
AI image editing prompting patterns for Qwen-Image-Edit. An agent skill from digitalsamba/claude-code-video-toolkit.
digitalsamba/claude-code-video-toolkit
Generates background music, vocal tracks, covers and stems with ACE-Step 1.5 through a bundled music_gen.py tool, using cloud or self-hosted providers.
Works with
Categories
Records browser interactions as video with Playwright, covering viewport sizing, cursor highlighting, and converting output for Remotion. This skill scripts Playwright to capture demo footage for Remotion video compositions, covering form submissions, multi-page navigation, scrolling, and login flows as example recording patterns, plus recommended viewport sizes and context-level video quality settings.
Playwright Browser Demo Recording fits situations like: recording a demo video of a web app flow for a video composition; capturing a login or form-submission walkthrough as footage; adding visible cursor movement to a screen-recorded browser demo.
Run `npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a claude-code`. Or copy the skill folder (.claude/skills/playwright-recording in digitalsamba/claude-code-video-toolkit) into .claude/skills/playwright-recording in your project. Claude Code loads it when a task matches its description.
Run `npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a codex`. Or copy the skill folder (.claude/skills/playwright-recording in digitalsamba/claude-code-video-toolkit) into .agents/skills/playwright-recording in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add digitalsamba/claude-code-video-toolkit --skill playwright-recording -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/playwright-recording, .gemini/skills/playwright-recording, .github/skills/playwright-recording and .opencode/skills/playwright-recording in your project.
Going by SKILL.md and its folder, Playwright Browser Demo Recording needs the command-line tools its instructions call (npx, npm and ffmpeg). Our summary lists: Node.js with playwright and @playwright/test installed; ffmpeg for converting WebM output to MP4.
SKILL.md contains no URLs. Its commands use npx and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Playwright Browser Demo Recording is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Playwright Browser Demo Recording: Eva Feature Screenshot (vvedantb/eva, 101 stars), Cs Web Promo Film (ChenShuo2004/cs-skills, 193 stars), Whiteboard Video (trustfuture/simon-skills, 353 stars) and Immersive Short Video (xrkseek/XRK-AGT, 140 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
digitalsamba (a GitHub organization) maintains it in digitalsamba/claude-code-video-toolkit, which has 2,174 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 5, 2026.
Source: digitalsamba/claude-code-video-toolkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.