Tourwright

io.github.CXmiloxxPublished by GitHub account CXmiloxxv2.6.1Updated Nov 7, 2026

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

Overview

AI-generated overview

Turns a YAML tour script into a narrated product-tour video: real Chromium walkthrough, captions, voice and MP4 output.

What you can do
  • Write, validate and check tour scripts, including a step-by-step guide with screenshots
  • Render narrated videos from a script, or film a single step, with captions, chapters and a thumbnail
  • List available text-to-speech voices
  • Submit render jobs to a Tourwright API and list or delete those jobs
  • Read a script file from disk when file access is explicitly enabled
When to use it
Useful when you want an assistant to produce or refresh demo, onboarding or how-to videos of a web app without manual screen recording, and to re-render them after UI changes.
Requirements
Runs locally as a Node.js 22+ process (npm package tourwright, started with the mcp argument) on Linux, macOS or Windows; a first-time install downloads ffmpeg, Chromium and voice engines into a local folder. Optionally set TOURWRIGHT_API_URL and TOURWRIGHT_API_TOKEN to send jobs to a remote Tourwright API instead of rendering locally.
Before you install
Rendering drives a real browser through the steps in the script, so it can sign up, pay or send messages unless safe mode is used; credentials used in tours are stored separately and should be handled carefully. TOURWRIGHT_API_TOKEN is a secret for the remote API. File reading is off unless explicitly enabled, and the README advises reading the security notes before exposing the API to untrusted clients.

Installation

In SourceWeft

  1. Open Tourwright in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

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.

Source: README.md at commit 28a37bc

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

5
  1. v2.6.1LatestNov 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

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts