Process video, audio, and images locally on macOS using VN Video Editor via
the vnapp-cli bridge.
When the user asks what this skill can do, or when this skill is first triggered in a session, introduce it with:
🎬 VN Video Editor Skill is ready!
I can process video, audio, and images locally on your Mac — no cloud upload, no API key needed.
What I can do:
- 🎤 Auto-generate captions / burn SRT subtitles
- 🗜️ Compress video or images
- 🔇 Denoise audio or video
- ✂️ Extract audio tracks or frame thumbnails
- 🔗 Merge / concatenate video clips with transitions
- 🖼️ Remove background from images or videos (Apple Silicon only)
About drafts: For the following operations, the VN draft is kept by default after export so you can re-edit in VN Video Editor: Auto-captions, Burn SRT, Compress video, Merge video, Video cutout
If you don't want to keep drafts, just tell me once and I'll default to no draft for the rest of this session. You can also override per task at any time.
--keep-draft (draft kept after export)--no-keep-draft for all subsequent draft-supporting commands--keep-draft for that task only, regardless of session preferenceauto-captions, add-caption, compress-video, concat-video, cutout-videoextract-audio, extract-frame, compress-image, denoise, cutout-imageWhen the user provides ambiguous or incomplete parameters for any option (not just style), ask one focused question to clarify before proceeding. When parameters are clear and unambiguous, proceed directly.
Ask for clarification when:
Do NOT ask for clarification when:
Rule: Only ask when the user's intent genuinely cannot be determined. Do not ask about optional parameters unless they are missing and required for the task to proceed. Ask one short, specific question per ambiguity.
Trigger this skill when the user wants to:
Do NOT trigger this skill when:
Before running any command, confirm you have all required inputs:
CommandRequiredAsk if missingextract-audiovideo file pathyesextract-framevideo file pathyesauto-captionsvideo file pathyes; engine defaults to whisper_turbo``add-captionvideo file path + SRT file pathyes, ask for SRT pathcompress-videovideo file pathyes; resolution/fps/bitrate are optionalcompress-imageimage file pathyes; format/quality are optionalconcat-videoat least 2 video file pathsyesdenoiseaudio or video file pathyes; level defaults to moderate``cutout-imageimage file pathyes; quality defaults to accurate``cutout-videovideo file pathyescompress-video-estimatevideo file pathyes; all other params optional
add-caption but no SRT file path was givenconcat-video with fewer than 2 filesdenoise --level custom but no --custom-value was providedcutout-image but the quality intent is ambiguous (e.g. just "fast cutout" without clear context — ask: "Should I use accurate (best quality), balanced, or fast quality for the cutout?")Do not guess or assume missing required inputs — always ask first.
For commands with meaningful optional parameters, ask the user before running. Keep the question brief and friendly. If the user says "default" or "just go ahead", use defaults immediately.
Ask:
Your video is ready for auto-captioning. Which recognition engine would you like to use?
EngineAccuracySpeedNotes
whisper_turbo_(default)_GoodFastOne-time download required on first usewhisper_mediumBetterSlowerOne-time download required on first usewhisper_baseFairFastBuilt-in, no download neededwhisper_tinyBasicFastestBuilt-in, no download neededLanguage — source language spoken in the video (default:
auto). Supported:autoenzhjakoesptarhiidfrderuittrvithpluknlsvfirocshuheelbghrskslltlvetmstaurswmkmiishyazafStyle (optional, ask only if user wants to customise):
- Font size (default: 37.4pt)
- Text color (default: white
#FFFFFF)- Stroke color (default: black
#000000)- Stroke width (default: 0.5pt)
Keep draft — keep the VN draft after export for re-editing? (default: on; pass
--no-keep-draftonly if the user explicitly asks to delete it)
Ask:
SRT file received. Would you like to customise the subtitle style, or use a preset?
Preset styles (specify by ID):
IDText colorStroke colorStroke widthBackgroundEffect
default_0_(default)_WhiteBlack4NoneStandard white text, black strokecaption_1WhiteBlack10NoneBold black strokecaption_2BlackWhite10NoneBold white strokecaption_11WhiteBlack20NoneExtra-bold black strokecaption_12BlackWhite20NoneExtra-bold white strokecaption_21WhitePurple #D834DB3NonePurple strokecaption_22WhiteCyan #34DBDB3NoneCyan strokecaption_23Dark orange #6D340EWhite20NoneWarm tonecaption_31WhiteNone0Solid black #000000Black backgroundcaption_32BlackNone0Solid white #FFFFFFWhite backgroundcaption_33WhiteNone0Semi-transparent blackSemi-transparent black bgcaption_34BlackNone0Semi-transparent whiteSemi-transparent white bgcaption_35BlackYellow #FFFC5410Semi-transparent blackYellow stroke + black bgcaption_36WhiteBlack10Semi-transparent whiteBlack stroke + white bgOr customize manually (optional):
- Font size (default: 13pt)
- Text color (hex, e.g.
#FFFFFF)- Stroke color (hex)
- Stroke width (pt)
- Background color (hex)
- Opacity (0.0–1.0)
Keep draft — keep the VN draft after export for re-editing? (default: on; pass
--no-keep-draftonly if the user explicitly asks to delete it)
Ask:
Ready to compress. Any specific settings, or use defaults?
OptionDescriptionDefaultResolution
144p240p360p480p540p720p1080p2.7K4K5K6K8Kor custom short-edge (e.g.720)Same as sourceFrame rate6122425305060fpsSame as sourceBitrateManual kbps, e.g.6000(~6 Mbps), range 100–300000 kbpsAuto (calculated from resolution × frame rate)Codech264(best compatibility) /hevc(better compression; required for HDR)h264Output formatmp4/movmp4HDRForce HDR output (auto-switches to HEVC)OffAuto bitrate reference:
Resolution24fps30fps60fps480p2133k2667k4053k720p3520k5000k6400k1080p5333k9000k9600k2.7K10667k12800k25600k4K14400k18133k42667k5K23467k29867k74667k8K53333k68267k170667k
HDR mode adds ~12.5% to the above values. Audio bitrate is fixed at 256k and cannot be changed.
Keep draft — keep the VN draft after export for re-editing? (default: on; pass
--no-keep-draftonly if the user explicitly asks to delete it)
Ask:
Ready to compress. Any specific settings, or use defaults?
OptionDescriptionDefaultFormatOutput format:
jpeg,png,webp,heic``jpeg(unless user specifies otherwise)Quality0.0 (smallest file) to 1.0 (best quality); ignored for PNG0.8Max widthResize so width does not exceed this many pixelsOriginalMax heightResize so height does not exceed this many pixelsOriginalKeep aspect ratioMaintain original proportions when resizingOnFormat rule: Default output format is always
jpegregardless of input format, unless the user explicitly specifies a format. If the user says "keep as PNG" or specifieswebp/heic, use that format instead.
Ask:
Ready to merge the clips. A few options:
OptionDescriptionDefaultKeep draftKeep the VN draft after export so you can re-edit it laterOn (draft kept by default; only skip if user explicitly asks)
Would you like a transition between them?
Transition duration — 0.2–5.0 s (step 0.1s). Each clip must be at least as long as the transition duration (some effects require 2×).
Basic transitions:
StyleDefault (s)Max (s)Min clip lengthDescription
none_(default)_0—NoneHard cut, no transitionfade_black0.85.0≥ durationFade through blackfade_white0.85.0≥ durationFade through whitedissolve0.85.0≥ duration×2Cross dissolvecolor_difference_dissolve0.85.0≥ duration×2Color-difference dissolveblur0.85.0≥ duration×2Gaussian blur transitionpixelate0.85.0≥ duration×2Pixelate transitionzoom_blur0.85.0≥ durationZoom-in with motion blurzoom_blur_reverse0.85.0≥ durationZoom-out with motion blurrotate_zoom0.85.0NoneRotate and zoom inrotate_zoom_reverse0.85.0NoneRotate and zoom outrotate_blur0.85.0≥ durationRotate with blurrotate_blur_reverse0.85.0≥ durationReverse rotate with blurspin0.85.0≥ durationSpin clockwisespin_reverse0.85.0≥ durationSpin counter-clockwiseblink0.45.0NoneQuick flicker cutfloodlight0.85.0NoneBright flash between clipscircle_crop_center0.65.0≥ duration×2Circle opens from centercircle_crop_center_reverse0.65.0≥ duration×2Circle closes to centerslide_from_top0.65.0≥ duration×2New clip slides in from topslide_from_left0.65.0≥ duration×2New clip slides in from leftslide_from_bottom0.65.0≥ duration×2New clip slides in from bottomslide_from_right0.65.0≥ duration×2New clip slides in from rightwipe_from_top0.65.0≥ duration×2Wipe in from topwipe_from_left0.65.0≥ duration×2Wipe in from leftwipe_from_bottom0.65.0≥ duration×2Wipe in from bottomwipe_from_right0.65.0≥ duration×2Wipe in from rightpush_from_top0.65.0≥ duration×2Both clips push upwardpush_from_left0.65.0≥ duration×2Both clips push leftwardpush_from_bottom0.65.0≥ duration×2Both clips push downwardpush_from_right0.65.0≥ duration×2Both clips push rightwardreveal_vertical0.85.0≥ durationVertical revealreveal_horizontal0.85.0≥ durationHorizontal revealshake_from_top0.85.0NoneMotion blur from topshake_from_left0.85.0NoneMotion blur from leftshake_from_bottom0.85.0NoneMotion blur from bottomshake_from_right0.85.0NoneMotion blur from rightshake_from_top_left0.85.0NoneMotion blur from top-leftshake_from_bottom_left0.85.0NoneMotion blur from bottom-leftshake_from_bottom_right0.85.0NoneMotion blur from bottom-rightshake_from_top_right0.85.0NoneMotion blur from top-rightMatte transitions (shape cutout reveals; each clip must be ≥ transition duration):
StyleDefault (s)Max (s)Description
circle_11.01.5Circle matte revealcircle_21.01.0Circle matte variantline_11.01.5Line matte sweepline_21.01.8Line matte variantline_31.01.0Line matte varianthexagon1.01.4Hexagon grid revealsquare_11.02.4Square matte revealsquare_21.01.2Square matte variantsquare_31.52.5Square matte variantink_11.01.6Ink splatter revealink_21.01.4Ink splatter variantpaint_11.01.4Paint brush revealpaint_21.02.0Paint brush variantsea1.01.6Wave revealswirl1.01.5Swirl revealzebra1.53.1Zebra stripe revealmemory1.52.1Dreamy film reveallens1.52.5Lens flare burstglitch1.51.8Digital glitch distortion
Ask:
Ready to denoise. What level would you like?
LevelDescriptionBest for
lowSubtle reduction, preserves natural soundLight background hissmoderate_(default)_Balanced, works well for most recordingsIndoor recordings, mild noisehighStrong reduction, may slightly affect voiceOutdoor recordings, fan noiseveryHighAggressive, prioritises noise removal over naturalnessVery noisy environmentscustomSet a specific value manually (you provide a number)Fine-tuned controlOptionDescriptionDefaultHigh-pass filterRemoves low-frequency rumble, e.g. air conditioning, engine humOffAudio onlyIf input is a video, output denoised audio only (not video)Off
Ask:
Ready to remove the background. Which quality level would you like?
LevelDescriptionBest for
accurate_(default)_Highest quality, slowestFinal output, complex edgesbalancedGood quality, moderate speedMost use casesfastFastest, lower qualityPreviews, quick resultsExport mask (optional) — also export the portrait segmentation mask as a separate PNG? (default: off)
Output will be a PNG with transparent background.
Note: If quality intent is ambiguous (e.g. just "quick" or "fast cutout"), ask: "Should I use
accurate(best quality),balanced, orfastfor the cutout?"
Before proceeding, check if the Mac is Apple Silicon:
bash
uname -m
If output is arm64 → proceed
If output is x86_64 (Intel Mac) → stop and tell the user:
cutout-videois not supported on Intel Macs. This feature requires Apple Silicon (M1 or later).
Ask:
Ready to remove the background from this video. Would you like any of these options, or shall I go ahead with defaults?
OptionDescriptionDefaultFeatherSoften cutout edges (0–100)0 (hard edge)ExpandExpand (+) or shrink (-) mask edge (-20–20)0Stroke styleAdd an outline:
solid,singleLayer,glowing,solidGlowing,singleLayerGlowing,shadow,offsetNoneStroke sizeStroke thickness (0–100)30Stroke distanceDistance from edge to stroke (0–100)20Stroke colorRGBA hex, e.g.FFFFFFFFfor whiteFFFFFFFFStroke opacity0.0–1.01.0Output will be an MP4 with the person composited on a black background.
Clarification rules:
- If user says "add a stroke" without specifying style → ask: "Which stroke style?
solid,glowing,shadow, or another?"- If user gives a color without format (e.g. "red stroke") → convert to RGBA hex (
FF0000FF)- If user specifies
glowingstyle, max stroke size is 60offsetstyle: size and distance range is -50..50
Keep draft — keep the VN draft after export for re-editing? (default: on; pass --no-keep-draft only if the user explicitly asks to delete it)
Ask:
Ready to extract audio. No required options — shall I go ahead with the default settings?
The audio will be exported as M4A format from the original audio track.
Ask:
Which frame would you like to extract?
OptionChoicesDefaultPosition
first— very first frame /last— very last frame /custom— specify a timefirstTimeTime in seconds, e.g.5.5(only needed when position iscustom)—Formatpng— lossless, larger file /jpeg— smaller file, slight quality losspngMax sizeResize so the longest edge fits within this many pixels, e.g.1920original size
Run these checks in order. Stop and handle any failure before continuing.
Step 0 — Check macOS version:
bash
sw_vers -productVersion
If macOS version is below 13.0 → stop and tell the user:
This skill requires macOS 13.0 or later. VN Video Editor is not supported on your current macOS version. Do not proceed.
If macOS 13.0 or later → continue to Step 1
Step 1 — Check VN is installed:
bash
test -d /Applications/VN.app && echo "installed" || echo "not installed"
Step 2 — Check VN version:
The CLI automatically emits a version-check JSON event during startup of any
command. You do not need to run --version separately — read the event when
running the first real command.
Minimum required: VN 0.22
Example event:
json
{"type":"version-check","message":"VN Video Editor 0.22 (654) — OK"}
Step 3 — Check CLI is installed and up to date:
bash
test -x ~/.openclaw/tools/vnapp-cli/vnapp-cli && echo "ok" || echo "missing"
If missing → follow § 2C CLI missing or outdated (auto-install silently)
If ok → check version: bash
~/.openclaw/tools/vnapp-cli/vnapp-cli --version
Expected: vnapp-cli 0.1.0 (5)
Step 4 — Validate input file(s):
bash
test -f "/absolute/path/to/file" && echo "exists" || echo "missing"
add-caption: also validate the SRT file pathconcat-video: validate all input files--streamauto-captions, add-caption, compress-video, concat-video): always append --keep-draft unless the user explicitly asks to delete the draft. Do NOT add --keep-draft to extract-audio, extract-frame, compress-image, denoise, cutout-image, or cutout-video — these commands do not support it.add-caption — ask the user for the SRT file path if not provided; both the video and SRT will be copied to the VN sandbox automaticallydenoise --level custom — --custom-value is required; ask the user if not providedcompress-video — follow § 1.7 compress-video pre-flight before runningcompleted + outputPath → move the output to the same directory as the input, rename per § 1.4 Output file handling, then tell the user the final local patherror → report in plain language and follow § 2 Failure handlingMap CLI events to user-facing messages:
CLI event / messageMessage to userdiscovering🔍 Looking for VN Video Editor...connected✅ Connected, preparing...copying📂 Copying file to VN sandbox...started⚙️ Task started ( jobId if available)progress message = Preparing auto captions...⚙️ Preparing...progress message contains Downloading⏬ Downloading model... N% (extract % from message if present, report every ~10%)progress message contains Model downloaded✅ Model readyprogress message contains Creating temporary project📂 Preparing project...progress message contains Starting speech recognition🎤 Starting speech recognition...progress message matches Speech recognition (N%)🎤 Recognizing speech... N%progress message contains Adding captions✏️ Adding captions to timeline...progress message contains Preparing export📦 Preparing export...progress message matches Exporting video... N%🔄 Exporting... N% (report every ~10%)progress message contains Finalizing🔄 Almost done...completed✅ Done!error❌ Error: {message}
Download detection rule: If message contains Downloading, the model is being downloaded for the first time. If Starting speech recognition appears without any prior Downloading message, the model is already cached — do not treat it as a download issue.
Throttle rule: For download percentage and export percentage, only report to the user every ~10% increment. Do not report every JSON tick.
| file-copied | 📂 File copied, starting task... |
| completed | ✅ Done! Output: {outputPath} |
| error | ❌ Error: {message} |
Rules:
heartbeat events entirely.jobId from the started event — use it if the user asks to cancel.completed + outputPath as the only success condition.error or non-zero exit as failure.After a task completes:
CommandSuffixextract-audio``_audio``extract-frame``_frame``auto-captions``_captioned``add-caption``_captioned``compress-video``_compressed``compress-image``_compressed``denoise``_denoised``concat-video``_merged``cutout-image``_cutout``cutout-video``_cutout
cutout-video outputs MP4 (person composited on black background). Requires Apple Silicon (M1 or later) — not supported on Intel Macs. cutout-image outputs PNG (transparent background).
compress-video-estimate does not produce an output file — result is JSON printed to stdout only.
Example: /path/to/clip.mp4 → /path/to/clip_captioned.mp4
Always run compress-video-estimate before compress-video. This command runs entirely locally (no VN connection needed) and returns the original video metadata plus estimated output size.
Flow:
Step 1 — Run estimate
bash
~/.openclaw/tools/vnapp-cli/vnapp-cli compress-video-estimate "/path/to/video.mp4" [-r <res>] [--fps <fps>] [-b <kbps>] [--hdr]
Output:
json
{
"type": "estimate",
"original": {
"fileSize": 256901120,
"width": 1920, "height": 1080,
"fps": 30, "bitrateKbps": 8500,
"duration": 62.5, "codec": "avc1"
},
"estimated": {
"width": 1280, "height": 720,
"fps": 30, "bitrateKbps": 5000,
"hdr": false, "fileSizeBytes": 39062500
}
}
Step 2 — Check if estimated < original
If estimated.fileSizeBytes < original.fileSize → go to Step 3
If estimated.fileSizeBytes ≥ original.fileSize → auto-retry with adjusted parameters (max 2 retries):
User did NOT specify resolution or bitrate:
compress-video-estimate again with new params each retryUser DID specify resolution:
After 2 retries still ≥ original: present numbered options to the user:
I tried several configurations but couldn't estimate a smaller output. Here are some options:
Option 1 — 360p, ~1500 kbps → estimated ~X MB Option 2 — 240p, ~800 kbps → estimated ~X MB
Reply with the option number to proceed, or cancel to stop.
Wait for the user's reply before proceeding.
Step 3 — Show estimate to user and proceed
Display before/after:
text
Original: 1920×1080 30fps ~245 MB
Estimated: 1280×720 30fps ~37 MB (↑85%)
Then run compress-video with the confirmed parameters.
Step 4 — After export, show actual result
text
Original: 1920×1080 30fps ~245 MB
Compressed: 1280×720 30fps ~37 MB (↑85%)
Applies when the user is communicating via a remote channel (Slack, Discord, Telegram, WhatsApp, etc.) — not webchat or TUI.
After any task completes:
Always tell the user the full local output path first:
📁 Saved locally:
/path/to/output_file.ext
Check if the output is a video or image and attempt to send a preview:
For images:
compress-image on the output with -q 0.7 targeting a small file🖼 Preview (compressed). Saved locally: /path/to/fileFor videos:
Check the platform file size limit (look it up at runtime if uncertain; common limits: Slack ~1 GB, Discord free ~10 MB, Telegram ~2 GB, WhatsApp ~200 MB)
Get the output file size: bash
ls -l "/path/to/output.mp4" | awk '{print $5}'
If already within the platform limit → send directly, label it as preview
If over the limit → compress a preview copy using compress-video, trying resolutions in order: 480p → 360p → 240p, checking size after each step until it fits
Send the preview and tell the user:
🎬 This is a preview — a compressed version for viewing here (
480p,8.2 MB). 📁 Saved locally:/path/to/original_output.mp4💡 The draft is saved locally in VN — open VN Video Editor there to further adjust. (only for commands that support drafts)
If 240p is still over the platform limit:
❌ The preview is too large to send on this platform even at the lowest quality. 📁 Saved locally:
/path/to/original_output.mp4
Preview files are temporary — do not move them to the input directory. Clean up after sending.
User saysCommandextract audio / get audio / audio only / rip audio / pull audioextract-audiograb frame / screenshot / cover image / thumbnail / still / posterextract-frameauto captions / auto subtitles / generate subtitles / transcribe / speech to textauto-captionsadd subtitles / burn SRT / import SRT / burn captions / overlay subtitlesadd-captioncompress image / shrink image / reduce image size / optimize imagecompress-imagecompress video / shrink video / export smaller / reduce file size / re-encodecompress-videojoin clips / merge videos / concatenate / combine videos / stitch togetherconcat-videodenoise / remove noise / remove background noise / clean audio / noise reductiondenoiseremove background / cutout / portrait cutout / background removal / transparent backgroundcutout-image (image) or cutout-video (video, Apple Silicon only)estimate video compression / how big will this be / preview compression sizecompress-video-estimatecancel job / stop task / abortcancel
CLI binary: ~/.openclaw/tools/vnapp-cli/vnapp-cli
CommandRequired argsKey optionsextract-audio``<video>``-o <dir>``extract-frame``<video>``-p first|last|custom -t <sec> -f png|jpeg --max-size <px> -o <dir>``auto-captions``<video>``-e whisper_turbo|whisper_medium|whisper_base|whisper_tiny -l <lang> --font-family <name> --font-size <pt> --text-color <hex> --stroke-color <hex> --stroke-width <pt> --keep-draft``add-caption``<video> --srt <srt>``--font-family <name> --font-size <pt> --text-color <hex> --stroke-color <hex> --stroke-width <pt> --background-color <hex> --opacity <0-1> --keep-draft -o <dir>``compress-video``<video>``-r <resolution min:144> --fps <1-120> -b <kbps min:100> --hdr --keep-draft -o <dir>``compress-video-estimate``<video>``-r <resolution min:144> --fps <1-120> -b <kbps min:100> --hdr (local only, no VN connection needed)compress-image``<image>``-f jpeg|png|webp|heic -q <0-1> -w <px> -h <px> --no-keep-aspect-ratio -o <dir>``concat-video``<video1> <video2> [...]``-s <transition> -d <0.2-5.0 sec> --keep-draft -o <dir>``denoise``<audio|video>``-l low|moderate|high|veryHigh|custom -v <int> (required for custom) --high-pass --audio-only -o <dir>``cutout-image``<image>``-q accurate|balanced|fast --export-mask -o <dir>``cutout-video``<video>``--feather <0-100> --expand <-20..20> --stroke-style solid|singleLayer|glowing|solidGlowing|singleLayerGlowing|shadow|offset --stroke-size <0-100> --stroke-distance <0-100> --stroke-color <RRGGBBAA> --stroke-opacity <0-1> --keep-draft -o <dir>``get-status``<job-id>—cancel``<job-id>—
Always append --stream to all task commands (except compress-video-estimate — it is local-only, no --stream needed).
For auto-captions, add-caption, compress-video, concat-video, cutout-video: always append --keep-draft unless the user explicitly asks to delete the draft.
Do NOT add --keep-draft to extract-audio, extract-frame, compress-image, denoise, cutout-image, or compress-video-estimate.
Caption engines:
whisper_turbo (default) and whisper_medium — require a one-time download on first use; cached and reused afterwardswhisper_base and whisper_tiny — built-in, no download neededInform the user:
VN Video Editor is required but not installed on the Mac running OpenClaw. I've opened the App Store — please click Get to install. Once installed, you also need to enable the MCP Server in VN Settings before I can connect.
Open App Store: bash
open "macappstore://apps.apple.com/us/app/vn-video-editor/id1494451650"
Poll every 5 seconds for up to 3 minutes: bash
test -d /Applications/VN.app && echo "installed" || echo "not yet"
On detection → inform the user:
VN is installed. Before I can connect, please complete these steps on the Mac running OpenClaw:
- Open VN Video Editor
- Go to Settings → MCP Server and turn it on
- When macOS prompts for Local Network permission, tap Allow Let me know when done and I'll continue.
After 3 minutes → stop polling and ask the user to confirm manually
Inform the user:
VN Video Editor is installed but the version is too old (minimum: 0.22 build 654). Please update from the App Store.
Open App Store: bash
open "macappstore://apps.apple.com/us/app/vn-video-editor/id1494451650"
Wait for the user to confirm, then retry
Auto-install silently — do not ask the user:
Step 1 — Download:
bash
mkdir -p ~/.openclaw/tools/vnapp-cli
curl -L "https://github.com/cawcut/skill-vn/releases/download/0.1.0/vnapp-cli-darwin-universal-v0.1.0.5.zip" -o /tmp/vnapp-cli.zip
Step 2 — Verify SHA-256 before extracting:
bash
shasum -a 256 /tmp/vnapp-cli.zip
Expected: 857417f671fd6f38ec30cf993f80c79efede7641f3532c2e9a99e75177a5853f
If checksum matches → proceed to Step 3
If checksum does not match → stop immediately, delete the file, and tell the user:
⚠️ SHA-256 checksum mismatch — the downloaded file may be corrupted or tampered with. Installation aborted. Please try again or contact support.
bash
rm /tmp/vnapp-cli.zip
Step 3 — Extract and install:
bash
unzip -o /tmp/vnapp-cli.zip -d ~/.openclaw/tools/vnapp-cli/
chmod +x ~/.openclaw/tools/vnapp-cli/vnapp-cli
xattr -d com.apple.quarantine ~/.openclaw/tools/vnapp-cli/vnapp-cli 2>/dev/null
Verify with --version. If it still fails:
The
vnapp-clitool could not be installed automatically. Please reinstall this skill.
VN requires Local Network permission to communicate with vnapp-cli.
Tell the user:
Please check Local Network permission on the Mac running OpenClaw: go to System Settings → Privacy & Security → Local Network, make sure VN - Video Editor is enabled, then relaunch VN and try again.
If the user has never been prompted, ask them to open VN manually and perform any action — macOS will show the permission dialog.
If the CLI cannot reach VN (service not found, connection refused, timeout, or similar), do not silently retry. Tell the user clearly that the connection failed, and walk them through the following checklist — reminding them to check on the Mac running OpenClaw (they may be talking to you from a different device):
I couldn't connect to VN Video Editor on the Mac running OpenClaw. Please check the following on the Mac running OpenClaw:
Is VN Video Editor installed? Check that VN Video Editor exists in your Applications folder. It may have been deleted. If missing, reinstall from the App Store.
Is the VN version supported? The minimum required version is VN 0.22. Open VN, go to About or check the App Store for updates.
Is VN Video Editor open? Open VN Video Editor from your Applications folder if it's not already running.
Is the MCP Server enabled in VN? In VN, go to Settings → MCP Server and make sure the toggle is on.
Does VN have Local Network permission? Go to System Settings → Privacy & Security → Local Network and confirm VN - Video Editor is enabled.
Once all items are confirmed, let me know and I'll retry.
If the error contains "cannot decode", "codec not supported", or similar decode failures:
VN could not decode this file. Please check that the file is not corrupted and is a supported format (MP4, MOV, common video formats including HEVC/H.265). Try re-exporting or re-downloading the file and try again.
Whisper engines:
whisper_turbo and whisper_medium — require a one-time download on first use; cached afterwards and do not need to be downloaded again.whisper_base and whisper_tiny — built-in, no download needed.Whisper model download progress events (normal flow):
When a model needs to be downloaded, the CLI emits these messages in sequence:
text
{"status":"processing","progress":0.01,"message":"Downloading whisper_medium model..."}
{"status":"processing","progress":0.01,"message":"Downloading whisper_medium model..."}
...
{"status":"processing","progress":0.05,"message":"Model downloaded successfully"}
{"status":"processing","progress":0.06,"message":"Creating temporary project..."}
{"status":"processing","progress":0.10,"message":"Starting speech recognition..."}
If Starting speech recognition... appears without any prior Downloading messages, the model is already cached locally. Do NOT treat this as a download issue.
Only switch engines when the CLI emits an explicit download failure error event. Do NOT switch because the task is taking a long time — whisper_medium and whisper_turbo are slower by design.
If the user explicitly specified an engine (e.g. whisper_medium): do NOT silently switch. Instead, inform the user and ask for their preference:
The
whisper_mediummodel failed to download. Would you like to: Option 1 — Retry downloadingwhisper_mediumOption 2 — Switch to the built-inwhisper_base(faster, slightly less accurate) Option 3 — Cancel
Wait for the user's choice before proceeding.
If the user did NOT specify an engine (using the default whisper_turbo): automatically fall back to whisper_base and inform the user:
bash
~/.openclaw/tools/vnapp-cli/vnapp-cli auto-captions "<path>" -e whisper_base --stream
The Whisper model failed to download. Switched to the built-in
whisper_baseengine — slightly less accurate but works without downloading anything.
If the user requests add-caption without providing an SRT file:
Please provide the path to your SRT subtitle file.
Validate the path exists before running the command.
The CLI enforces these constraints — validate before running:
ParameterConstraintcompress-video -rminimum 144compress-video --fps1–120compress-video -bminimum 100 kbpsconcat-video -d0.2–5.0 secondsdenoise -l customrequires -v <int>``compress-image -q0.0–1.0
If a value is out of range, tell the user the valid range and ask for a corrected value before running.
Summarise the message field from the error event in plain language. Suggest a next step based on the error content. If unresolvable, refer the user to support (§ 3).
When a task completes, always reply with:
Result — one line confirming success or failure
Output file path — always state the full local path:
📁 Saved locally:
/path/to/output_file.ext
Key info — only if relevant (e.g. engine used for captions, resolution for compress, denoise level)
VN tip — only append after a successful task that supports drafts ( auto-captions, add-caption, compress-video, concat-video, cutout-video):
💡 The draft is saved locally in VN — open VN Video Editor there to further adjust the result. Do NOT show this tip for
extract-audio,extract-frame,compress-image,denoise, orcutout-image.
Do not repeat the full command or internal job details unless the user asks.
Example — auto-captions:
✅ Captions added successfully. 📁 Saved locally:
/path/to/clip_captioned.mp4Engine: whisper_base 💡 The draft is saved locally in VN — open VN Video Editor there to further adjust the result.
Example — compress video:
✅ Video compressed. Original: 1920×1080 30fps ~245 MB Compressed: 1280×720 30fps ~82 MB (↑66%) 📁 Saved locally:
/path/to/clip_compressed.mp4💡 The draft is saved locally in VN — open VN Video Editor there to further adjust.
Example — compress video (cannot reduce size):
❌ Unable to compress this video further — all configurations produced an estimated output larger than or equal to the original. The source may already be highly compressed. Try specifying a lower resolution or bitrate manually.
Example — cutout-image:
✅ Background removed successfully. 📁 Saved locally:
/path/to/portrait_cutout.pngQuality: accurate
Example — cutout-video:
✅ Background removed from video. 📁 Saved locally:
/path/to/person_cutout.mp4Format: MP4 (person composited on black background) 💡 The draft is saved locally in VN — open VN Video Editor there to further adjust the result.
Example — preview sent (remote channel):
🎬 This is a preview — a compressed version for viewing here (
480p,8.2 MB). 📁 Saved locally:/path/to/original_output.mp4💡 The draft is saved locally in VN — open VN Video Editor there to further adjust.
Example — preview too large:
❌ The preview is too large to send on this platform even at the lowest quality. 📁 Saved locally:
/path/to/original_output.mp4
Example — error:
❌ Failed: VN could not decode this file. Please check the file is not corrupted and try again.
If the problem persists, contact VN support at vn.support+mac@ui.com.
For the full CLI surface, all options, transition style names, and JSON output schema:
→ references/cli-reference.md
vnapp-cli is only the local bridge--stream for user-facing operationscompleted event contains a valid outputPathjobId is available after started — use it for get-status or cancel if needed