Creative & Design🌐universal
@argo-video/cli
Turn Playwright scripts into polished product demo videos with AI voiceover
Quick Start
Install this Skill
npx skills add shreyaskarnik/argo```
___
_____ / /
/ _ | _ __ __ _ ___ / /
/ /_| | | '__|/ _` |/ _ \ / /
/ ___ | | | | (_| | (_) |/ /
/__/ |_| |_| \__, |\___//__/
__/ |
|___/
```
# @argo-video/cli
[](https://www.npmjs.com/package/@argo-video/cli)
**Turn Playwright demo scripts into polished product demo videos with AI voiceover.**
Write a demo script with Playwright. Add a scenes manifest. Run one command. Get an MP4 with overlays and narration.
## Showcase
[Watch the demo video](https://github.com/user-attachments/assets/2c0d25a2-3210-42fd-b511-dce2ec633712)
> *This demo was recorded by Argo, using Argo. Yes, really.*
## How it works
```bash
TTS Record Align Export
─── ────── ───── ──────
Kokoro Playwright Place clips ffmpeg
generates captures at scene merges
voice browser + timestamps video +
clips scene marks audio
│ │
▼ ▼
.scenes.json → narration-aligned.wav → final.mp4
```
## Quick start
```bash
# Install
npm i -D @argo-video/cli
# Initialize project
npx argo init
# Edit your demo script (or convert an existing Playwright test)
vim demos/example.demo.ts
npx argo init --from tests/checkout.spec.ts # auto-convert
# Run the full pipeline
npx argo pipeline example
# Or run steps individually
npx argo record example
npx argo tts generate demos/example.scenes.json
npx argo export example
```
## Writing a demo
A demo is two files: a **script** and a **scenes manifest**.
### Demo script (`demos/my-feature.demo.ts`)
```ts
import { test } from '@argo-video/cli';
import { showOverlay, withOverlay } from '@argo-video/cli';
test('my-feature', async ({ page, narration }) => {
await page.goto('/');
narration.mark('intro');
await showOverlay(page, 'intro', narration.durationFor('intro'));
narration.mark('action');
await withOverlay(page, 'action', async () => {
await page.click('#get-started');
await page.waitForTimeout(narration.durationFor('action'));
});
narration.mark('done');
await showOverlay(page, 'done', narration.durationFor('done'));
});
```
### Scenes manifest (`demos/my-feature.scenes.json`)
```json
[
{
"scene": "intro",
"text": "Welcome to our product — let me show you around.",
"overlay": { "type": "lower-third", "text": "Welcome to our product", "placement": "bottom-center", "motion": "fade-in", "autoBackground": true }
},
{
"scene": "action",
"text": "Just click get started and you're off.",
"overlay": { "type": "headline-card", "title": "Watch this", "placement": "top-right", "motion": "slide-in" }
},
{
"scene": "done",
"text": "And that's all there is to it.",
"voice": "af_heart",
"overlay": { "type": "callout", "text": "That's it!", "placement": "top-left", "motion": "fade-in" }
}
]
```
Each `scene` in the manifest maps to a `narration.mark()` call in the script. The `text` field is spoken narration; the optional `overlay` sub-object defines what appears on screen. Argo records the timestamp of each mark, generates TTS clips, and aligns them to produce the final narrated video.
## Configuration
### `argo.config.mjs`
```js
import { defineConfig } from '@argo-video/cli';
export default defineConfig({
baseURL: 'http://localhost:3000',
demosDir: 'demos',
outputDir: 'videos',
tts: { defaultVoice: 'af_heart', defaultSpeed: 1.0 },
video: {
width: 1920, height: 1080, fps: 30,
browser: 'webkit', // webkit > firefox > chromium on macOS
// deviceScaleFactor: 2, // enable after webkit 2x fix
},
export: {
preset: 'slow', crf: 16,
transition: { type: 'fade-through-black', durationMs: 2000 }, // scene transitions (2s+ recommended)
speedRamp: { gapSpeed: 2.0 }, // speed up gaps between scenes
formats: ['gif', '9:16'], // additional export formats
},
overlays: {
autoBackground: true,
// defaultPlacement: 'top-right',
},
});
```
> **Tip:** Use `browser: 'webkit'` for sharper video on macOS. Chromium has a [known video capture quality issue](https://github.com/microsoft/playwright/issues/31424). Set `deviceScaleFactor: 2` for retina-quality recordings (captured at 2x, downscaled with lanczos in export).
### Mobile Demos
Record mobile-viewport demos with touch support:
```ts
// In your demo script
test.use({
viewport: { width: 390, height: 664 },
isMobile: true,
hasTouch: true,
video: { mode: 'on' as const, size: { width: 390, height: 664 } },
});
```
Or set mobile options globally in config:
```js
video: {
width: 390,
height: 664,
browser: 'webkit',
isMobile: true,
hasTouch: true,
},
```
... (truncated)Repository
5stars
0forks
Details
Related Skills
More creative & design skills you might like
expo-router
Creative & DesignNavigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.
🌐universal
2.8k
178
View
expo-native-ui
Creative & DesignBuild beautiful, native-feeling Expo screens. Covers Apple HIG styling, semantic colors, native controls, SF Symbols, media, visual effects, gradients, storage, and responsive layout. For routing and navigation, use the expo-router skill; for motion and animation, use the expo-animation skill.
🌐universal
2.8k
178
View
frontend-slides
Creative & DesignCreate stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
🤖claude🌐universal
30.6k
2.4k
View
frontend-slides
Creative & DesignCreate stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
🤖claude🌐universal
30.6k
2.4k
View