Tourwright

io.github.CXmiloxx由 GitHub 账号 CXmiloxx 发布v2.6.1更新于 Nov 7, 2026

Turn a script into a narrated product tour video: real browser, captions, voice, MP4.

概览

AI 生成的概览

把 YAML 导览脚本变成带旁白的产品演示视频:真实 Chromium 操作、字幕、配音与 MP4 输出。

可以做什么
  • 编写、校验并检查导览脚本,还可生成带截图的步骤指南
  • 按脚本渲染带旁白的视频,或只拍摄单个步骤,输出字幕、章节和缩略图
  • 列出可用的语音合成音色
  • 向 Tourwright API 提交渲染任务,并列出或删除这些任务
  • 在显式开启文件访问后读取磁盘上的脚本文件
适用场景
适合让助手为 Web 应用制作或更新演示、上手引导和操作教学视频,免去人工录屏,并在界面改动后重新渲染。
运行要求
以本地 Node.js 22+ 进程运行(npm 包 tourwright,以 mcp 参数启动),支持 Linux、macOS 和 Windows;首次安装会把 ffmpeg、Chromium 和语音引擎下载到本地目录。可选设置 TOURWRIGHT_API_URL 与 TOURWRIGHT_API_TOKEN,把任务发送到远程 Tourwright API 而非本机渲染。
安装前请注意
渲染会用真实浏览器执行脚本中的步骤,若未使用安全模式,可能真的注册、付款或发送消息;导览中使用的凭据单独保存,需谨慎处理。TOURWRIGHT_API_TOKEN 是远程 API 的密钥。文件读取默认关闭,需显式开启;README 建议在向不受信任的客户端开放 API 前先阅读安全说明。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Tourwright,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[Tourwright]

[npm] [CI] [License: MIT] [MCP]

Narrated product tours and how-to videos, without editing. Click through your app once, or ask your AI agent for the video: Tourwright writes the script, films a real browser in a studio frame, guides the eye to each element, speaks with a natural voice and delivers an .mp4 with captions, chapters and a thumbnail. When the UI changes, you render again. Built for people and AI agents, on any server, from a laptop to a cluster.

Leer en español

[A Tourwright video: a login with 2FA, a guided focus on each field, invented data instead of real customers, an upload and a live notice]
Made by Tourwright from examples/app.yaml, with nobody at the keyboard. ▶ Watch it with sound (77 s)

yaml
# tour.yamltitle: Your first invoicevoice: lessacbaseUrl: https://app.example.comsteps:  - goto: /invoices/new  - title: { text: Your first invoice, subtitle: Step by step }  - say: Pick the <b>customer</b> first.  - click: { role: combobox, name: Customer }  - say: Then save. That's it.  - click: { role: button, name: Save }
bash
tourwright render tour.yaml        # → videos/tour/tour.mp4 (+ captions.srt/.vtt, .jpg, .json)

Why Tourwright

Screen recorders (Loom) and click-through demo tools (Arcade, Supademo, Scribe) need a person to record, and every redesign means recording again. Tourwright videos are code:

Screen recorderDemo SaaSTourwright
Re-record after a UI changeby handby handtourwright render
Knows when a video went stalenonotourwright check in CI names the broken step and the fix
Narrationyour voice, retakesnone or extratext-to-speech in many voices, offline or online
Same tour for 50 customers or languages50 recordings50 demosone script with {{variables}}
Personal data on screenedit it outedit it outmask replaces it with invented data
Lives ina vendor's clouda vendor's cloudyour git repo, your servers; MIT
AI agents can make onenonoMCP server and a Claude Code plugin

What you get

  • Browser walkthroughs: real Chromium, a smooth animated cursor, click ripples, highlights, spotlights, callout bubbles, camera zoom, drag and drop, blurred personal data, title cards and captions in your colors and logo.
  • Guided focus: the tour an app shows the first time you open it. Everything dims but the element, a ring marks it, a bubble with a 2/4 badge explains it and the camera pushes in, right on the word the voice is saying.
  • Narrated slides: title cards, images (with slow pan/zoom), HTML, crossfades. No website needed.
  • Voices, your choice: Pocket TTS (offline, open, natural: tourwright install --pocket), Piper (offline, open source, light), Microsoft Edge neural voices, any OpenAI-compatible TTS server (OpenAI, Kokoro, LocalAI…), or your own command. Every sentence is cached: re-rendering never re-synthesizes.
  • A cast, and how each line is said: several voices per video, speed, pitch and volume per line on any engine, exact pauses ([[1s]]), a pronunciation dictionary, sound presets (warm, radio, podcast…), click, typing and other sound effects, music with fades.
  • Scripts that scale with you: variables ({{name}}, also from the CLI or the API), reusable blocks, repeats, conditions and steps that may fail. One script, many videos.
  • Plugins: new actions, TTS engines and voices as small modules (docs/PLUGINS.md).
  • Tight edits, automatically: page loads, slow waits and voice synthesis are cut out; narration never overlaps; background music ducks under the voice.
  • Deliverables: H.264/AAC .mp4 with chapters and the captions drawn on it, .srt, .vtt, thumbnail and a JSON manifest (duration, chapters, captions) for automation.
  • Four ways in: CLI, HTTP API with job queue and webhooks, MCP server for AI agents, Node library.
  • Scales out: stateless API replicas, any number of workers on any number of servers, Redis/BullMQ queue, S3-compatible storage. Or a single process with a folder, on a Raspberry Pi.

Install

Docker (recommended)

bash
docker run --rm -v "$PWD:/work" -w /work ghcr.io/cxmiloxx/tourwright render examples/slides.yaml --out videos/

A full service (API + 2 workers + Redis):

bash
cp .env.example .env    # set TOURWRIGHT_API_TOKENSdocker compose up -d --builddocker compose up -d --scale worker=6

From npm (quickest to try)

Node.js 22+, on Linux, macOS or Windows:

bash
npm install -g tourwrighttourwright install                    # ffmpeg, Piper + voices, edge-tts, Chromium (no root)tourwright install --plan             # only show what it would use from this PC and what it would downloadtourwright config set quality fullhd  # your own defaults: quality, voice, fps… (tourwright config lists them)tourwright record https://app.example.com --out tour.yaml   # do the tour by hand: you get the script and the videotourwright guide tour.yaml --open     # the same tour as a step-by-step guide with screenshots (HTML, PDF, Markdown)tourwright narrate tour.yaml --write  # your AI (Claude, OpenAI, Ollama) rewrites the narration from the screenstourwright translate tour.yaml --to en  # the same video in English (or pt, fr, de, it): tour.en.yamltourwright check videos/*.yaml        # which videos broke after a deploy, at which step, and the fixtourwright fix tour.yaml --write      # puts the new targets in the scripttourwright render tour.yaml --step 7  # film one step with its voice, without the whole videotourwright install --pocket           # + Pocket TTS: natural offline voices (about 1 GB)tourwright clean                      # what each part takes on disk; removes downloads and leftoverstourwright doctor                     # what works on this machine

Without installing anything globally: npx tourwright <command>. With pnpm: pnpm add -g tourwright (on 2.0.0, add --no-optional).

The Redis queue and Claude for narrate are optional: install bullmq ioredis or @anthropic-ai/sdk next to Tourwright when you use them (npm install -g bullmq ioredis). The Docker image already has them.

Without Docker (Linux, macOS, Windows)

Node.js 22+. tourwright install puts ffmpeg, Piper, voices, edge-tts and Chromium in TOURWRIGHT_HOME, with no root or admin rights; what the system already has is kept.

bash
git clone https://github.com/CXmiloxx/tourwright && cd tourwright./scripts/install.sh           # Linux / macOS (Windows: powershell -ExecutionPolicy Bypass -File scripts\install.ps1)node bin/tourwright.js doctor  # what works on this machinenpm link                       # optional: the `tourwright` command

Each piece is looked for on the PC first and only downloaded when it is missing:

Linux (x64, arm64)macOS (Intel, Apple Silicon)Windows 10/11 (x64, ARM)
ChromiumChrome, Edge or Chromium (apt, dnf, pacman, Raspberry Pi OS), else downloadedChrome, Edge or Chromium, else downloadedChrome or Edge, else downloaded
ffmpegPATH, Homebrew, Nix, else downloadedHomebrew, MacPorts, Nix, else brew install ffmpegPATH, winget, scoop, Chocolatey, C: fmpeg, else downloaded
Piper (offline voices)PATH, pip, pipx, conda, else downloadedPATH, pip, pipx, conda, else piper-ttsPATH, pip, pipx, conda, else downloaded
Piper voicesHugging Face cache, TOURWRIGHT_PIPER_VOICE_DIRS, else downloadedsamesame
edge-tts (Microsoft voices)PATH, pip, pipx, conda, else installedsamesame
Python (for edge-tts, Pocket, Whisper)the system's 3.10–3.13, else 3.12 is downloadedsamesame (not the Microsoft Store stub)
Capturescreen with Xvfb (sharpest), else screencastscreencastscreencast

Also reused: a Chromium left by another Playwright or Puppeteer version, and CHROME_PATH, CHROME_BIN or PUPPETEER_EXECUTABLE_PATH. Snap and Flatpak browsers are skipped (their sandbox blocks Playwright). TOURWRIGHT_SYSTEM_BROWSER=0 always uses Playwright's own Chromium. tourwright doctor shows what was found.

Nothing is installed on the system: what is downloaded lives in one folder (TOURWRIGHT_HOME), and the Python packages run in a virtual environment, so yours is never changed. To uninstall, delete that folder.

Xvfb (apt install xvfb, Linux only) gives the sharpest capture; without it Tourwright records headless (screencast), which works everywhere Chromium runs. Clients of the HTTP API or MCP can be on any system.

Use it

From a site to a video, without writing selectors by hand:

bash
tourwright explore https://app.example.com/login --draft app.yaml   # asks for the login, writes the scripttourwright render app.yaml --dry-run                               # checks every step in secondstourwright render app.yaml --open                                  # the video, in ./videos/app/

The draft goes through every section of the site with narration taken from its pages; edit it in your words. Credentials are asked for once, never shown and never written in the script (tourwright secret list; tourwright forget deletes them).

bash
tourwright init video.yaml                  # an example scripttourwright validate video.yamltourwright render video.yaml --dry-run      # runs every step fast: tests selectors, no voice/videotourwright render video.yaml --safe         # the same, pressing nothing: no real sign-up, payment or SMStourwright render video.yaml --keep         # keeps the recording: tourwright recompose videos/video remakes it without the browsertourwright render video.yaml --quality fullhd --voice salome --out out/tourwright voices                           # voices available heretourwright install-voice en_GB-alba-medium  # any voice from huggingface.co/rhasspy/piper-voicestourwright say "Hello there" --voice lessac --out hello.wav

The script format, every action and the voices: docs/SCRIPTS.md. JSON Schema for editors and agents: schema/script.schema.json.

HTTP API

bash
TOURWRIGHT_API_TOKENS=secret tourwright serve --worker --port 4700curl -X POST localhost:4700/v1/jobs -H 'authorization: Bearer secret' -H 'content-type: application/json' \  -d '{"script": {"type": "slides", "slides": [{"title": "Hello", "say": "Hello from the API."}]}}'curl localhost:4700/v1/jobs/<id> -H 'authorization: Bearer secret'   # → status, result, download links

Endpoints, assets, webhooks: docs/API.md.

AI agents (MCP)

Claude Code, as a plugin (the MCP server plus a skill that writes, checks and renders the script):

text
/plugin marketplace add CXmiloxx/tourwright/plugin install tourwright@tourwright

Any other MCP client (Claude Desktop, Cursor, VS Code…):

json
{ "mcpServers": { "tourwright": { "command": "tourwright", "args": ["mcp"] } } }

Tools: tourwright_guide, tourwright_voices, tourwright_validate, tourwright_check, tourwright_render, tourwright_job, tourwright_jobs, tourwright_delete_job (and tourwright_render_file with TOURWRIGHT_MCP_ALLOW_FILES=true). Point it at a remote API with TOURWRIGHT_API_URL and TOURWRIGHT_API_TOKEN. Details: docs/AGENTS.md.

GitHub Action

Re-render your tours on every release, or fail the build when a deploy broke one:

yaml
- uses: CXmiloxx/tourwright@v2  with:    scripts: videos/*.yaml    command: check            # or render: the videos become a workflow artifact  env:    TOURWRIGHT_SECRET_APP_PASSWORD: ${{ secrets.APP_PASSWORD }}

Inputs: scripts, command, out, voice, quality, voices, version, upload (action.yml).

Node library

js
import { loadFile, render } from 'tourwright'const result = await render(await loadFile('tour.yaml'), { out: 'videos/', quality: 'hd' })console.log(result.paths.video, result.duration, result.chapters)

Scaling

SizeSetup
One machinetourwright serve --worker — local folder queue, files on disk
One big machinedocker compose up --scale worker=N — Redis queue, shared volume
Many machinesAPI replicas behind a load balancer, workers anywhere, same Redis + S3 bucket
Kubernetesdeploy/kubernetes/tourwright.yaml, workers autoscaled

Each worker renders TOURWRIGHT_CONCURRENCY videos at a time (one Chromium + ffmpeg each: plan ~1–2 CPU and ~1 GB RAM per video at 720p). Workers run at low CPU and disk priority so a shared server stays responsive. More: docs/DEPLOYMENT.md · configuration: docs/CONFIGURATION.md.

Security

API jobs run in a sandbox: data-only scripts (no JavaScript), files limited to the job's assets, optional host allowlist and private-network blocking, secrets off by default, per-token job isolation, signed download links. Read SECURITY.md before exposing the API to untrusted clients.

License

MIT. Piper voices have their own licenses (see each voice's model card); Edge voices are a Microsoft online service, check its terms for your use.

来源:README.md,提交 28a37bc

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

5
  1. v2.6.1最新Nov 7, 2026
  2. v2.6.0Nov 6, 2026
  3. v2.5.0Nov 5, 2026
  4. v2.3.0Nov 4, 2026
  5. v2.2.0Nov 3, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分