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 提交算繪工作,並列出或刪除這些工作
  • 在明確開啟檔案存取後讀取磁碟上的腳本檔案
適用情境
適合讓助理為網頁應用程式製作或更新示範、上手引導與操作教學影片,省去人工錄影,並在介面改版後重新算繪。
執行需求
以本機 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 分