screenwright
Enables users to create subtitled tutorial videos by scripting browser interactions with Playwright, outputting MP4 with burned-in captions and SRT file.
README
π¬ Screenwright
Subtitled tutorial videos, scripted. An MCP server that turns a list of steps into a narrated screen recording by driving a real browser with Playwright β captions burned into the video and exported as an
.srt.
The name is a play on Playwright (the engine under the hood) + screen.
steps[] βββΊ Playwright drives the browser βββΊ caption overlay synced per step
βββΊ video recorded βββΊ ffmpeg β .mp4 + .srt sidecar
β¨ Features
- Scripted walkthroughs β
goto,click,fill,type,press,hover,scroll,wait. - Synced subtitles β attach a
captionto any step; it's burned into the video and written to a timed.srt. - Self-contained output β bundled
ffmpeg(viaffmpeg-static) produces a clean H.264.mp4. - Robust β per-action timeouts; mark a step
optionalso a missing selector doesn't abort the take. - Use it from an AI (MCP tool) or straight from Node.
π¦ Requirements
- Node.js 18+
- A Chromium build for Playwright:
npx playwright install chromium(run automatically onnpm install).
π Install
# from GitHub
npm install -g github:0xjesus/screenwright
# or clone
git clone https://github.com/0xjesus/screenwright.git
cd screenwright && npm install
π Use as an MCP server
Add it to your MCP client. Claude Desktop / Claude Code (claude_desktop_config.json or .mcp.json):
{
"mcpServers": {
"screenwright": {
"command": "node",
"args": ["/absolute/path/to/screenwright/src/index.js"]
}
}
}
(If installed globally, you can use "command": "screenwright" with no args.)
Then just ask your assistant to record a tutorial β it calls the record_tutorial tool.
Tool: record_tutorial
| Field | Type | Notes |
|---|---|---|
output |
string | Path to the output .mp4. |
steps |
step[] | Ordered steps (below). |
baseUrl |
string? | So goto steps can use relative paths. |
viewport |
{width,height}? |
Default 1440Γ900. |
headless |
bool? | Default true. |
channel |
string? | e.g. "chrome" to use the system browser. |
burnIn |
bool? | Burn captions into the video. Default true. |
srt |
string? | Custom .srt path. Default <output>.captions.srt. |
captionStyle |
object? | { position, fontSize, bg, color, maxWidth }. |
Step = { caption?, action, url?, selector?, text?, key?, deltaY?, delayMs?, timeoutMs?, dwellMs?, optional? }.
selector is any Playwright selector β CSS, text=β¦, xpath=β¦, or :has-text(β¦).
π§ͺ Use from Node (no MCP)
node scripts/run-example.js # records examples/demo.json
node scripts/run-example.js examples/capleton.json
import { recordTutorial } from 'screenwright/recorder';
await recordTutorial({
output: 'out/tour.mp4',
baseUrl: 'https://playwright.dev',
steps: [
{ action: 'goto', url: '/', caption: 'Welcome to the tour π¬', dwellMs: 2600 },
{ action: 'scroll', deltaY: 600, caption: 'Each step can carry a synced subtitleβ¦', dwellMs: 2400 },
{ action: 'goto', url: '/docs/intro', caption: 'β¦burned into the video and exported as .srt', dwellMs: 3000 },
],
});
// β { mp4, srt, durationMs, steps, captions }
π‘ Tips
- Don't double your subtitles. The
.mp4already has burned-in captions. Players like VLC auto-load an.srtthat shares the video's name and draw it on top. Screenwright defaults the sidecar to*.captions.srt(a non-matching name) so that doesn't happen β keep it that way, or disable the subtitle track in your player. Want selectable-only subs? PassburnIn: falsefor a clean video + the.srt. - Black video in VLC on Linux? That's a GPU/output glitch, not the file. Launch with
vlc --avcodec-hw=none --vout=xcb_x11, or set those in VLC β Preferences. - Headless still records β no display needed.
π License
MIT Β© 0xjesus
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.