--- name: record-demo description: Record a demo video of a desktop app — launch it, play a scripted scenario with smooth synthetic mouse input, and capture the screen (cursor and click highlights included) straight to an X/Twitter-ready MP4 (H.264, yuv420p, no audio, no keyboard input) — on macOS locally or on a remote Windows host, where the MP4 is encoded on the host and copied back. Use this whenever the user wants a demo video, screen recording, or "something to post" showing a feature or an example app, or asks to re-record after a UI change. --- # record-demo A demo is a `gui-test` scenario played slowly and nicely, with a recorder running. Everything in `gui-test` (safety rules!) applies; this skill adds the recorders and the pacing. **It only records.** The output is the take as captured, encoded once to MP4 on the machine that recorded it, named `-.mp4`. No trimming, no re-encoding, no raw/cut pairs — if the user wants a cut, that is a separate request. | | macOS | Windows | Linux (GNOME/Wayland) | | --- | --- | --- | --- | | recorder | `scripts/macos/recorder.py` (`Recorder`) | `scripts/windows/recorder.ps1` (`Start-Recording` / `Stop-Recording`) | `scripts/linux/recorder.py` (`Recorder`, `grab`) | | capture | `screencapture -v -C -k` → `.mov` → ffmpeg → `.mp4` | GDI screen grabs → JPEG frames → ffmpeg **on the host** → `.mp4` | Mutter ScreenCast → PipeWire → `jpegenc` → JPEG frames → ffmpeg **on the Mac** → `.mp4` | | needs | ffmpeg (or `avconvert`), Screen Recording permission | ffmpeg on the Windows host (see below) | PyGObject and `gst-launch-1.0` with `pipewiresrc`/`jpegenc` on the host, ffmpeg on the Mac | | template | any `gui-test` script wrapped in `Recorder` | `templates/record_template.ps1` | any `gui-test` script wrapped in `Recorder` | | run | the scenario script itself | `scripts/record_remote.sh` from the Mac | `scripts/record_remote_linux.sh` from the Mac | The recorders know nothing about any particular app. **Scenarios are project code, not part of this skill** — in this workspace they live in `tools/gui/` (`*_demo.py`, `*_demo.ps1`); read those before writing a new one, and put new ones there. Videos go to one git-ignored directory (here `tools/gui/output/`); a new take overwrites the old one. ## macOS ```python from recorder import Recorder # sys.path: .agents/skills/record-demo/scripts/macos recorder = Recorder('output/