← Files Demo VideosARCHIVED FILE

skills/create-demo-video/SKILL.md

6.4 KB · Oct 4, 2026 · 12:26 UTC

↓ Download file

---
name: create-demo-video
description: Create a demo from new or existing footage, with captions, zooms, privacy masks, and optional cursor animations or input badges.
---

# Create a demo video

Use Cirro to turn a recording into a product demo. Keep the original recording and write
generated files outside tracked repository paths.

When footage is needed, use [Capture Demo Video](../capture-demo-video/SKILL.md).

Follow [Set up Cirro](../setup/SKILL.md) to prepare its launcher before editing. The
examples use the macOS/Linux launcher; pass the same arguments on Windows.
If setup fails, report the blocker; do not substitute another editing pipeline.
Use Cirro to validate and render the final screenplay, fixing validation errors
before delivering the video.

## Inspect the recording

Cirro produces VP9/WebM video without audio and can also read supported MP4 recordings.

```sh
sh /absolute/path/to/setup/scripts/cirro.sh schema
sh /absolute/path/to/setup/scripts/cirro.sh inspect /absolute/path/recording.webm --json
```

Read the schema and [editing guide](references/screenplay-contract.md). Check the
recording's dimensions, duration, interface states, and frames around important
transitions. Before choosing the trim, identify the outcomes the user's request or
session summary says the demo should show, then locate their evidence in the footage.
Keep the setup and result for those outcomes. A short demo can compress pauses without
reducing a multi-step walkthrough to its last interaction. For a failure and retry,
let the viewer recognize the failure, retained work, and eventual result.

Show the starting state, interaction, response, and result. Use short captions to
explain what's happening.

For cursor animations and input badges, use actual event logs with coordinates in
recording pixels and timestamps in milliseconds from the first video frame. Keep drag
endpoints and button metadata; map tool names only when their meaning is known.

Omit `recording.events` when logs are unavailable. The renderer then keeps any cursor in
the recording and adds no cursor animation or input badges. If the recording already has
a cursor, omit pointer events to avoid drawing a second one; reliable keyboard events
can still produce input badges. Use cursor-free footage when supplying pointer events.
Never invent events from screenshots.

Summarize ordinary typing by count. Protected typing must contain neither its value nor
its length. Review the visible interactions as well as the finished file.

## Edit the video

Keep one continuous section of the recording. Trim the beginning or end and speed up
idle time instead of adding gaps, repeats, freezes, or invented actions. Keep enough of
the opening to establish where the viewer is and what will change. Keep important
actions and their visible results, including the final success or failure, readable.
Compress idle waits aggressively, but preserve time to recognize each new state.
The renderer shows a double-chevron icon during
fast-forward and adds elapsed source time after ten seconds.

Start at full-frame zoom 1. Use a zoom only when it reveals a detail the viewer would
otherwise miss. Use a short, deliberate transition, then hold the same framing through
the action and result. Avoid a slow zoom throughout a scene or an immediate zoom-out
that competes with the action. Keep the cursor, target, and relevant result inside the
frame; show enough context to follow scrolling and movement between controls.

Highlight visible results sparingly. Inspect the target's bounds in the actual frame;
use balanced padding that separates the annotation from the UI without covering nearby
controls. Start the highlight after its target appears and end it before the target
moves or disappears. Map source times through speed changes before timing overlays.

Use ASD-STE100-inspired language for captions: short sentences, active voice, familiar
words, and one idea per caption. Explain the action or result and give each caption
enough reading time. Keep captions and input badges from overlapping each other or the important UI;
omit redundant annotations. If annotations obscure the evidence, simplify or remove
them before adding camera motion to make room. A clear, complete static edit is a
better starting point than a decorated edit that needs repeated repairs.
Recorded click events animate the cursor. Use
`edit.style.reduced_motion` when requested.

Set `edit.style.accent` to `#4a8fff` for an ordinary demonstration, `#ef6b73`
for a bug reproduction, or `#58c98a` for a verified fix. Use the video's actual
outcome to choose the color; an unresolved bug is not a verified fix.

Use `edit.cover.at_ms` to choose a frame that shows what the viewer should notice. The
cover is the first video frame; the complete story follows. Overlay and camera times
refer to the story, so do not offset them for the cover. Derive duration from clip
ranges and speeds; validate to get the exact mapped event times.

Cover private information with opaque masks in every affected frame, including the cover
and zooms. If masks would hide the behavior being demonstrated, request a clean
recording instead of sharing it.

## Validate and render

```sh
sh /absolute/path/to/setup/scripts/cirro.sh validate /absolute/path/screenplay.json --json
sh /absolute/path/to/setup/scripts/cirro.sh render /absolute/path/screenplay.json -o /absolute/path/demo.webm --json
sh /absolute/path/to/setup/scripts/cirro.sh frame /absolute/path/screenplay.json --at-ms 2000 -o /absolute/path/review.png
```

Start with 60 fps and a width near 1440 pixels, adjusted for the source dimensions and
aspect ratio. Upscaling does not add source detail. Wait for encoding to finish.

## Verify and deliver

Watch the finished video. Check that the actions and results are easy to follow. Check
frames around clicks, zooms, speed changes, masks, and the final result. Watch the opening
and ending without relying on the prompt: the viewer should understand the setup and
see the outcome, not just the last click. Make sure the cover and captions match what happened and private content stays covered. The renderer
decodes the output to check VP9/yuv420p WebM, dimensions, frame count, and timing. That
does not establish that the demo shows the task or is easy to follow.

When the user is working on a pull request, include the video in that PR using
[Share Demo Video](../share-demo-video/SKILL.md). Otherwise, show the final video using
its absolute file path. Mention any limitations in the footage.

SHA-256: d9fa11579f406d9b3eeb4eb795939bf8e950be2d87a3b0da455dead66a820cc1