2026 · Solo · Open source
Clipwright
Turns a scripted browser session into a short-form how-to video, with captions that match the voice character for character.
Architecture
Mission
Vertex Reader needed recap videos every week and I was not going to record them by hand. Clipwright records a Playwright flow, trims dead time, synthesises the voiceover, lays captions that match the audio character for character, adds a branded outro, and renders vertical, 16:9, and 1:1 MP4s.
For whom: anyone who ships a product and owes it a demo. Constraints: fully scriptable so an agent can drive it, pluggable TTS because voices change, and deterministic output because a video that renders differently twice is a bug.
Manifest
| Layer | Choice | Version | Why |
|---|---|---|---|
| app | Typer CLI | — | Scriptable first; every Studio action is a CLI command underneath. |
| app | Tauri 2 + React (Studio) | 2 | A desktop timeline that pairs each segment with an agent, without an Electron footprint. |
| agents | Claude Code skill | — | An agent can produce a whole video from a script and a URL. |
| agents | Kokoro / Piper / ElevenLabs | — | Pluggable TTS behind one character-level alignment format. |
| services | Playwright | — | Records the scripted browser session frame-accurately. |
| services | ffmpeg + Remotion | — | Compositing and two render backends; PIL overlays for captions. |
Decisions
Three surfaces from one repo. A Typer CLI, a Claude Code skill so an agent can run the pipeline end to end, and Clipwright Studio (Tauri 2 + React) that pairs each timeline segment with an agent.
One alignment format for every voice. Kokoro, Piper, and ElevenLabs all emit the same character-level timing, so captions never depend on which engine spoke.
Versioned JSON manifests with atomic writes. The timeline on disk is the source of truth; the app reloads from it.
Two render backends. Remotion when I want React composition, ffmpeg when I want speed.
Extracted, not invented. Every feature came out of the real Vertex Reader recap pipeline first.
Impact
- Surfaces
- 3
- TTS engines
- 3
- Output formats
- 3
- Commits
- 74
Every Vertex Reader recap since April has come out of this pipeline, and it is now an MIT project with 71 commits that other people can point at their own products.
What broke
Captions. The first version burned subtitles with libass through ffmpeg, and the character-accurate highlighting I wanted was fighting the renderer: kerning drifted from the alignment data, emoji and mixed scripts fell back to the wrong fonts, and every style tweak meant re-encoding to see it.
I replaced libass with PIL-rendered PNG overlays: each caption frame is drawn in Python with exact glyph positions from the alignment, then composited by ffmpeg. Slower per frame, deterministic, and the captions finally match the voice.
Ship log
- First commit, extracted from the Vertex Reader recap pipeline
- Clipwright Studio (Tauri) added
- Studio-first: the v1 pipeline deleted, Studio at the repo root with the Remotion skill set
- Persona library with memory and per-persona voices; OpenAI TTS with voice previews
- Now: MIT, three surfaces, 74 commits