Produce a polished launch or walkthrough video for a product, feature, or page and publish it end-to-end: real product screenshots, a Remotion motion video, an emotive AI voice-over, a YouTube upload, a click-to-play embed on the page, and a team announcement. Use this whenever the user wants a launch video, feature video, demo video, walkthrough, product video, screen-recording, or "make a video" for a page/tool/feature — and whenever they want to publish/ship/upload a video to YouTube or ad...
Installs into .claude/skills of the current project.
Are you the author of Launch Video?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/vood-launch-video)
---
name: launch-video
description: >-
Produce a polished launch or walkthrough video for a product, feature, or page and publish it
end-to-end: real product screenshots, a Remotion motion video, an emotive AI voice-over, a YouTube
upload, a click-to-play embed on the page, and a team announcement. Use this whenever the user wants
a launch video, feature video, demo video, walkthrough, product video, screen-recording, or "make a
video" for a page/tool/feature — and whenever they want to publish/ship/upload a video to YouTube or
add narration/voice-over to one. Also use it to add videos to top-traffic pages (from analytics) at
scale. Covers the whole pipeline, not just editing.
---
# Launch / Walkthrough Video
A repeatable pipeline for turning a product, feature, or page into a short motion video with
narration, then publishing it to YouTube, embedding it on the page, and announcing it. It exists
because doing this by hand means rediscovering a dozen non-obvious details every time (OAuth quirks,
voice-over sync math, the click-to-play embed, loudness targets).
Default output: a **1080p / 30fps** video, ~45–60s, with an emotive voice-over, uploaded **unlisted
first for the user to approve**, then flipped public. Never publish a video publicly without the
user hearing/seeing it — voices and pacing are subjective.
## Configure this for your project
Before first use, fill in `config.md` (a few IDs and paths). The skill reads those instead of
hardcoded values, so it works for any product. The values you need:
- Your YouTube **channel** (the OAuth account must have it selected)
- Your OAuth **client secret** path and **GCP project number** (YouTube Data API v3 enabled)
- Where finished-video announcements go (Slack channel, Discord, etc.)
- Your brand colors and the product URL pattern
## When to use it
Building any video for a page/feature/tool, adding a voice-over, or shipping a video to YouTube.
For a broad "add videos to our best pages" request, pull the top pages first (from your analytics),
then run this pipeline once per page — **pilot one, get approval on the format, then batch** the rest.
## The pipeline (7 steps)
Work top to bottom. Each step has detail in the referenced file or script.
1. **Understand the subject.** Read the implementation / docs so the steps shown match real behavior.
For a tool walkthrough, drive the live tool (Playwright) to see the actual input→output flow —
that IS the walkthrough.
2. **Capture real screenshots.** Playwright against production, 1920×1080. Hide any promo banners /
cookie bars first. See `references/video-production.md` → "Capturing screenshots".
3. **Build the Remotion video.** Copy the `remotion-scaffold/` structure. Scenes are frame-counted at
30fps in `src/theme.ts`. Size each scene to its narration length (step 4). Full scene/animation
patterns in `references/video-production.md`.
4. **Generate the voice-over.** `scripts/tts_voiceover.py` — OpenAI `gpt-4o-mini-tts`, voice `ash`,
with an **`instructions` prompt for emotion** (without it the read is flat and robotic — this is
the single most important VO detail). It generates per-scene clips, syncs them to each scene's
start frame, and loudness-normalizes the mixed track. Re-time scenes in `theme.ts` if a clip
overflows its scene, then re-render.
5. **Render + mux + encode.** `npx remotion render`, mux the VO track on with ffmpeg (`-c:v copy`),
then encode a `< 10 MB` upload cut (`libx264 -crf 25 -movflags +faststart`). Commands in
`references/video-production.md` → "Render, mux, encode".
6. **Publish to YouTube.** `scripts/youtube.py` (wraps `youtubeuploader` for the upload, uses the
Data API for everything else). Upload **unlisted**, get the user's OK, then set **public**. Read
`references/youtube-publishing.md` first — it has the auth setup, the OAuth redirect gotcha, the
API-not-enabled failure, quota limits, and the metadata template.
7. **Embed + announce.** Add a click-to-play facade section to the page (poster + play button; the
YouTube iframe only mounts on click — keeps it off initial load). Then post the link to your team
channel. Both patterns in `references/embed-and-announce.md`.
## Guardrails
- **Unlisted → approve → public**, every time. Uploading to the user's own channel needs their sign-off.
- The Google **OAuth consent is the user's to give** — you cannot click "Allow" for them. If auth
isn't set up, walk them through it (see `references/youtube-publishing.md`), don't try to bypass it.
- Keep the master render; only the upload cut is size-constrained.
- YouTube API quota ≈ **6 uploads / 24h**. A batch bigger than that must be spread across days —
say so instead of silently failing partway.
- CLI can't set a **thumbnail** — flag that the user should add one in Studio (or set via API separately).