Agent skill

Record Demo

by libnativeapi in libnativeapi/nativeapi

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…

MITAuto-check passedMedia & Creative

Install Record Demo

skills CLI
$ npx skills add libnativeapi/nativeapi --skill record-demo -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install libnativeapi/nativeapi record-demo --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/libnativeapi/nativeapi.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/record-demo .claude/skills/record-demo && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
record-demo
GitHub stars
161
Token cost
~2.9k tokens
SKILL.md length
1,421 words
Files
7 (incl. scripts)
Skills in repo
5
Repo updated
First seen
Licence
MIT

At a glance

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…

  • Wants a demo video
  • SKILL.md covers macOS, Windows, Linux (GNOME/Wayland) and Writing a scenario, plus 1 more section
  • Runs Python, Shell and PowerShell scripts from its folder; calls ffmpeg, git and ffprobe
  • Screen recording

What it does

Record Demo is an agent skill from libnativeapi/nativeapi. 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.

Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including scripts (for example `scripts/linux/recorder.py`, `scripts/macos/recorder.py` and `scripts/record_remote.sh`).

It sits in Media & Creative, covering Video production. It works with macOS, X (Twitter), Linux and FFmpeg. The repository describes itself as: Unified access to native system APIs (windows, tray icons, menus, displays, dialogs, …) for Dart/Flutter, Rust, C, JS/TS and Python, built on one C++ core. The licence is MIT.

When your agent uses it

  • Wants a demo video
  • Screen recording
  • Something to post showing a feature
  • Asks to re-record after a UI change

Example prompts

  • “something to post”
  • “/record-demo”

Requirements

  • Python 3
  • A Bash shell
  • PowerShell

What it can do on your machine

Read from SKILL.md and the folder at commit ad9fbc4. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 5 files in scripts/ (Python, Shell and PowerShell), which the agent can run.

    Shell commands in SKILL.md call:

    • ffmpeg
    • git
    • ffprobe

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Record Demo loads about 2.9k tokens when it runs. Until then it costs about 133 tokens; SKILL.md has 1,421 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~133
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from libnativeapi/nativeapi at commit ad9fbc4, republished under its MIT licence (© libnativeapi). 1,421 words, ~2,880 tokens.

Download SKILL.mdSave it as .claude/skills/record-demo/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.
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 <scenario script name>-<os>.mp4. No trimming, no re-encoding, no raw/cut pairs — if the user wants a cut, that is a separate request.

macOSWindowsLinux (GNOME/Wayland)
recorderscripts/macos/recorder.py (Recorder)scripts/windows/recorder.ps1 (Start-Recording / Stop-Recording)scripts/linux/recorder.py (Recorder, grab)
capturescreencapture -v -C -k → .mov → ffmpeg → .mp4GDI screen grabs → JPEG frames → ffmpeg on the host → .mp4Mutter ScreenCast → PipeWire → jpegenc → JPEG frames → ffmpeg on the Mac → .mp4
needsffmpeg (or avconvert), Screen Recording permissionffmpeg on the Windows host (see below)PyGObject and gst-launch-1.0 with pipewiresrc/jpegenc on the host, ffmpeg on the Mac
templateany gui-test script wrapped in Recordertemplates/record_template.ps1any gui-test script wrapped in Recorder
runthe scenario script itselfscripts/record_remote.sh from the Macscripts/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/<script>-macos.mp4')
recorder.start()                       # SystemExit with a hint if permission is missing
try:
    play_scenarios()                   # gui-test harness calls
finally:
    recorder.stop()
recorder.convert()                     # → H.264, 60 fps, fits 1920×1200, no audio
  • A recording takes over the mouse for a minute or two, so the user runs it, or explicitly tells you to — they are usually sitting at this Mac. Give the script a countdown and an idle check before it starts.
  • The process that runs it needs Screen Recording (and Accessibility for the input) in System Settings › Privacy & Security. Without it screencapture exits at once and Recorder says so; screencapture -x /tmp/t.png is a quick check. Only the user can grant it, and the app has to be restarted afterwards.
  • The whole main display is in the picture — every window the user has open becomes the backdrop. Before recording, tell the user to hide what should not be seen; afterwards look at a few frames (ffmpeg -ss <t> -i x.mp4 -frames:v 1 f.jpg, then Read it) and warn them if private content (other projects, chats, paths) is visible.

Windows

powershell
# in the scenario (runs on the host's desktop session)
. "$PSScriptRoot\recorder.ps1"
$name = [IO.Path]::GetFileNameWithoutExtension($PSCommandPath)
Start-Recording "$RemoteScratch\$name-windows.mp4"
try { ...scenario... } finally { Say "saved $(Stop-Recording)" }
bash
# from the Mac: play, record and encode on the host, copy the MP4 into <output dir>
.agents/skills/record-demo/scripts/record_remote.sh <host> <scenario.ps1> <output dir>

It runs the remote-hosts steps (setup, desktop, pull, then removes the MP4 from the host), keeps the scenario log next to the video, and fails when the log shows no saved video or an ERROR.

  • Stop-Recording encodes with the frames' real timing (the grabber reaches ~21–25 fps on a 2560×1600 laptop; the MP4 is resampled to 30 fps), fits 1920×1200, then deletes the frames. Encoding ~2 minutes of frames takes about a minute; allow for it in the desktop timeout.
  • ffmpeg on the host. Get-Ffmpeg looks on PATH and in %LOCALAPPDATA%\Programs\ffmpeg\bin, scoop, winget and chocolatey locations. To install it on a host that has none: download the official Windows build (github.com/GyanD/codexffmpeg releases, ffmpeg-<ver>-essentials_build.zip) — on the Mac if the host cannot reach GitHub —, check its sha256 against the release's asset digest, remote.sh <host> push it, and extract it on the host to %LOCALAPPDATA%\Programs\ffmpeg (add bin to the user PATH). Package managers are optional: the test laptop's scoop was broken (self-update fails, the 7zip dependency would not install), and winget asks to accept agreements.
  • The apps must already be built there in debug (see remote-hosts), from the checkout you mean to show — check that the core submodule is actually checked out at the recorded commit (git submodule update), not just pointed at it.
  • The whole screen is in the picture. Before recording, look at the desktop (desktop_survey.ps1): another app's window — especially a maximized one — becomes the backdrop of the video and shows whatever the user had open, besides blocking clicks. Ask the user to clear it (do not close their apps yourself unless they ask).
  • Only one job at a time may use a host's desktop: the desktop verb shares one scheduled task and job.* files per host. When another session also drives the same machines, agree on turns first.
Show full SKILL.md (755 more words)Show less

Linux (GNOME/Wayland)

python
import sys; sys.path.insert(0, '.agents/skills/record-demo/scripts/linux')
from recorder import Recorder, grab

frame = grab('/tmp/look.png')     # one PNG of the monitor, for locating windows
rec = Recorder('$REMOTE_SCRATCH/<name>-linux.mp4')   # frames land in <output>.frames/
rec.start()                       # returns once the stream really is producing frames
try:
    ...                           # play the scenario
finally:
    rec.stop(); rec.report()      # prints RECORD_FRAMES <dir> — the wrapper reads that line
bash
# from the Mac: play on the host, pull the frames, encode here, copy the MP4 into <output dir>
.agents/skills/record-demo/scripts/record_remote_linux.sh <host> <scenario.py> <output dir>

There is no screen-capture shortcut on GNOME 46 to fall back on: gnome-screenshot is not installed, org.gnome.Shell.Screenshot answers AccessDenied, and XTEST/Xlib see no Wayland window. Capture goes through org.gnome.Mutter.ScreenCast → PipeWire, and the pointer is only in the picture if the stream is a real monitor recorded with cursor-mode: 1 (Mutter composites the cursor in; the frames have it — check one before publishing).

  • The host encodes nothing. A minimal Linux host has no ffmpeg and its GStreamer may have no H.264 encoder at all (x264enc, avenc_h264, openh264enc, vaapih264* were all missing on ours). So the recorder writes one JPEG per frame plus their real write times — the source is live, so the gaps between files are the gaps between frames — and the wrapper pulls the frames to the Mac and encodes them there (recorder.encode, a variable-framerate concat list, H.264 High, yuv420p, no audio, resampled to 30 fps, fitted to 1920×1200). Frames are scaled down to fit 1920×1200 at capture time: the stream is the whole monitor (2560×1440 here) and there is no point shipping pixels the MP4 will drop.
  • Throughput is what the host's CPU manages: ~21 fps for raw 1440p, ~28 fps when videoscale fits 1080p first, on a 2-core Celeron. Mutter produces frames on damage, so a still picture costs nothing and only motion costs frames — which is exactly where a demo needs them.
  • A host with no monitor attached cannot be recorded. If both outputs are disconnected (/sys/class/drm/*/status says disconnected), DisplayConfig reports no monitors at all: there is nothing to RecordMonitor, no wl_output for the app to place a window on, and ScreenCast.RecordVirtual is not a way out — a virtual monitor is not a wl_output (GDK logs gdk_monitor_get_scale_factor: assertion 'GDK_IS_MONITOR (monitor)' failed, the app's windows never appear on it) and Mutter paints no pointer into a virtual stream, in cursor-mode 0 or 1. Check /sys/class/drm/*/status and DisplayConfig before spending a take, and report the blocker instead of shipping a cursor-less video.
  • The scenario's safety rule is gui-test's, but there is no Xlib owner check to lean on for a Wayland client: refuse any press that the captured frame does not place inside the app's own located window, keep generous margins, and prefer driving the pointer only where a probe can prove the click arrived.

Writing a scenario

What makes a scenario watchable:

  • Tell one story per app: give the UI some visible state → show the feature → end on proof (the state survived, the window landed where it was dropped). 45–60 s per app.
  • Pace for a viewer, but brisk — the user found a relaxed pace (400–700 ms approaches, 350–1100 ms drag legs, 1.2–1.5 s rests) too slow. Aim for about half that: 200–350 ms approaches, drags in 2–3 legs of 150–550 ms with a short first leg, ~0.7 s after each drop (enough for new windows to appear before the next probe), 1.2 s hold on the final frame. Keep one speed factor in the scenario (--pace / $Pace) that scales every motion and pause, with floors for the pauses that wait for windows, so the tempo can be tuned in one place.
  • Keep dead time out at the source, since nothing is trimmed later: start the recorder right before the first app launches, and stop it right after the last one quits.
  • No keyboard input and no audio (user requirement; also the safest).
  • Re-probe after every gesture; views keep their identity, windows do not. Track "which window shows which view" by view name.
  • Dry-run the scenario as a plain gui-test (no recorder) before spending a take on it; give scripts a way to run a single scenario and to leave the app open.
  • Have the scenario log its proof (e.g. the state texts at the end) — the log is how you tell a good take from a bad one without watching it.
  • One app at a time: quit it before launching the next, with a ~1.5 s gap that becomes the transition.

Delivery

  • Check the file: ffprobe -v error -show_entries stream=codec_name,pix_fmt,width,height,r_frame_rate:format=duration x.mp4 → h264, yuv420p, ≤ 1920×1200, ≤ 60 fps, no audio stream (X also wants ≤ 140 s and ≤ 512 MB).
  • Look at a handful of frames spread over the take (Read the JPEGs): the apps are rendered, nothing private is in the background, the scenario did what the log says.
  • Send the file to the user, say where it is and how long it is, and report what the scenario log proved (state preserved, windows moved N times) — the video is also evidence that the feature works on that platform. Never commit videos.

© libnativeapi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files (scripts) in .agents/skills/record-demo of libnativeapi/nativeapi.

  • SKILL.md
  • scripts/linux/recorder.py
  • scripts/macos/recorder.py
  • scripts/record_remote.sh
  • scripts/record_remote_linux.sh
  • scripts/windows/recorder.ps1
  • templates/record_template.ps1

Open the folder on GitHubat commit ad9fbc4

Compare with similar skills

Record Demo next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Record Demo compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Record Demo this skilllibnativeapi/nativeapi161—~2.9kAutomated safety check: PassMIT
Video EditingLeoYeAI/openclaw-master-skills2.2k—~2.7kAutomated safety check: NotesMIT
Video Clipping ReferenceRightNow-AI/openfang18k—~4.1kAutomated safety check: WarnApache-2.0
Ppt CompressorLeoYeAI/openclaw-master-skills2.2k—~3.9kAutomated safety check: PassMIT
Vlog Auto Editznyupup/ai-video-editing-skill145—~6.8kAutomated safety check: PassMIT
Transcribebadlogic/pi-skills2.6k—~264Automated safety check: PassMIT

Similar skills

  • Video Editing

    LeoYeAI/openclaw-master-skills

    Automated video editing skill for talk/vlog/standup videos. An agent skill from LeoYeAI/openclaw-master-skills.

    2.2k GitHub stars~2.7k tokensUpdated 2 mo ago
    Media & CreativeAuto-check: notes
  • Video Clipping Reference

    RightNow-AI/openfang

    Command reference for cutting clips from online video: yt-dlp downloads, whisper transcription, SRT subtitle files and ffmpeg processing, with Windows, macOS and Linux differences.

    18k GitHub stars~4.1k tokensUpdated 3 mo ago
    Media & CreativeAuto-check: warnings
  • Ppt Compressor

    LeoYeAI/openclaw-master-skills

    This skill should be used when the user wants to compress a PowerPoint (.pptx) file by reducing the size of embedded videos and large images.

    2.2k GitHub stars~3.9k tokensUpdated 2 mo ago
    Documents & OfficeAuto-check passed
  • Vlog Auto Edit

    znyupup/ai-video-editing-skill

    AI Agent自动剪辑旅行Vlog的完整工作流。从原始素材到成品视频,系统级只需ffmpeg,其余在Python venv内完成。by nyx研究所 (GitHub @znyupup · B站/小红书 @nyx研究所)

    145 GitHub stars~6.8k tokensUpdated 5 mo ago
    Media & CreativeAuto-check passed
  • Transcribe

    badlogic/pi-skills

    Local speech-to-text transcription on Apple Silicon macOS. An agent skill from badlogic/pi-skills.

    2.6k GitHub stars~264 tokensUpdated 4 mo ago
    Media & CreativeAuto-check passed
  • Watch

    mathiaschu/watch

    Watch a video from YouTube, Instagram, X/Twitter, Vimeo, TikTok or any of ~1800 yt-dlp sites (or a local path).

    141 GitHub stars~4k tokensUpdated 4 mo ago
    Media & CreativeAuto-check: warnings

More from libnativeapi/nativeapi

  • Remote Hosts

    libnativeapi/nativeapi

    Build, run, and GUI-test on another machine over SSH — the user's Windows laptop today, Linux or other macOS machines tomorrow — with one symmetric CLI for every OS: push scripts, run them either in…

    161 GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • Flutter UI Probe

    libnativeapi/nativeapi

    Find where widgets are on screen in a running debug Flutter desktop app (macOS, Windows, Linux) by reading its render tree through the VM service — no hard-coded coordinates, no screenshots, works…

    161 GitHub stars~988 tokensUpdated today
    Auto-check passed
  • Gui Test

    libnativeapi/nativeapi

    End-to-end test a desktop app (Flutter desktop apps and plain native executables such as C++ examples) by launching the real app, driving it with guarded synthetic mouse input — eased moves, clicks…

    161 GitHub stars~3.5k tokensUpdated today
    Auto-check passed
  • Core API Change

    libnativeapi/nativeapi

    Carry a change to the C++ public API in core/ all the way downstream — design check, header edit, six platform implementations, C ABI + Rust/Dart/C/JS/Python regeneration, per-binding verification…

    161 GitHub stars~2.5k tokensUpdated today
    Auto-check passed

Questions about Record Demo

What does Record Demo do?

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…. Record Demo is an agent skill from libnativeapi/nativeapi.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.

When should I use Record Demo?

Record Demo fits situations like: wants a demo video; screen recording; something to post showing a feature; asks to re-record after a UI change.

How do I install Record Demo in Claude Code?

Run `npx skills add libnativeapi/nativeapi --skill record-demo -a claude-code`. Or copy the skill folder (.agents/skills/record-demo in libnativeapi/nativeapi) into .claude/skills/record-demo in your project. Claude Code loads it when a task matches its description.

How do I install Record Demo in Codex?

Run `npx skills add libnativeapi/nativeapi --skill record-demo -a codex`. Or copy the skill folder (.agents/skills/record-demo in libnativeapi/nativeapi) into .agents/skills/record-demo in your project. Codex loads it when a task matches its description.

Can I use Record Demo in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add libnativeapi/nativeapi --skill record-demo -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/record-demo, .gemini/skills/record-demo, .github/skills/record-demo and .opencode/skills/record-demo in your project.

What does Record Demo need to run?

Going by SKILL.md and its folder, Record Demo needs Python, a shell and PowerShell for the scripts in its folder and the command-line tools its instructions call (ffmpeg, git and ffprobe). Our summary lists: Python 3; A Bash shell; PowerShell.

Does Record Demo access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Record Demo safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Record Demo use?

Record Demo is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Record Demo use?

About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Record Demo?

Skills that share tags, products or a category with Record Demo: Video Editing (LeoYeAI/openclaw-master-skills, 2.2k stars), Video Clipping Reference (RightNow-AI/openfang, 18k stars), Ppt Compressor (LeoYeAI/openclaw-master-skills, 2.2k stars) and Vlog Auto Edit (znyupup/ai-video-editing-skill, 145 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Record Demo?

libnativeapi (a GitHub organization) maintains it in libnativeapi/nativeapi, which has 161 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 7, 2026.

Source: libnativeapi/nativeapi on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.