Article
MCP server
Serve a project to Claude, Codex, Cursor and other agents over the Model Context Protocol.
wabcut-cli mcp serves one project to external AI agents (Claude Desktop, Claude Code, Codex, Cursor, and others) over the Model Context Protocol. The tools are the typed edit commands of docs/commands.md: every edit is validated, previewable with dryRun, and one undo step. The server is local only: stdio, no network, no files besides the project.
Protocol#
- Implemented revision: MCP 2026-07-28 (stateless: every request carries
_metaio.modelcontextprotocol/protocolVersionandclientCapabilities;server/discover; results carryresultType). Checked against https://modelcontextprotocol.io/specification/2026-07-28 on 2026-10-11. - Clients that open with
initializeget the handshake-based revisions 2025-11-25 and 2025-06-18 (the spec's dual-era server, "Versioning: Backward Compatibility"). The server answers with the requested revision when it serves it, otherwise with the newest one it serves; the client then decides whether to continue. - Transport: stdio, one JSON-RPC 2.0 message per line, UTF-8. stdout carries only protocol messages; diagnostics go to stderr. JSON-RPC batches are not supported (removed from MCP in 2025-06-18).
| Method | Notes |
|---|---|
server/discover | Supported versions, capabilities (tools, resources), server info, instructions. |
initialize, notifications/initialized | Legacy handshake (see above). |
ping | Always answered. |
tools/list, tools/call | The tools below; results carry structuredContent (matching each tool's outputSchema) and the same JSON as text. |
resources/list, resources/templates/list, resources/read | wabcut://project/summary and wabcut://sequence/{id}. |
notifications/cancelled | Stops the running call at its next checkpoint (nothing is committed) or skips a queued request; no response is sent for it. |
notifications/progress | Sent for calls with _meta.progressToken: once per batch step, per range of timeline_removeSilences and before a commit. progress counts up; there is no total. |
Errors. Protocol problems are JSON-RPC errors:
| Code | When |
|---|---|
| -32700 | The line is not JSON. |
| -32600 | Not a JSON-RPC 2.0 request (bad jsonrpc, id or method), a batch array, a message over 4 MiB or nested deeper than 64. |
| -32601 | Unknown method. |
| -32602 | Bad params: missing _meta fields (2026-07-28) without a prior initialize, unknown tool, arguments not an object, unknown resource. |
| -32022 | _meta names a protocol version the server does not serve; data.supported lists the one it does. |
| -32603 | Internal error. |
Problems with a tool call itself (bad parameters, a stale revision, an edit the model refuses, a read-only server) come back as a normal result with isError: true. The text explains the problem, and structuredContent.error has code, message and details, so the model can correct itself.
Setup#
Run the server with wabcut-cli mcp --project <file.wabcut>:
| Flag | Effect |
|---|---|
--project <file> | The project to serve (required). |
--allow-edit | Enables the edit tools (EditSequence, EditProject), undo/redo and project_save. Without it the server is read-only. |
--allow-analysis | Also serves the analysis commands (MediaAnalysis: transcript.transcribe with local transcription and the analysis cache, audio.loudness). They decode media and can run long: raise --timeout-ms. Network commands are never served. |
--allow-files | Also serves the commands that read or write files (review packages, CDL and LUT files, project.merge, lottie.import, ...), confined to the project's folder: every path they are given must lie inside it once symlinks and junctions are resolved. Without it they are not listed and refused by name. plugins.scan (native code) is never served. |
--files-folder <dir> | One more folder those commands may use (repeatable; implies --allow-files). |
--save-on-exit | Saves the project when the client disconnects, if anything changed (needs --allow-edit). |
--autosave | Saves after every change (needs --allow-edit). |
--timeout-ms <n> | Longest a tool call may run (default 30000). |
Without a save flag, changes stay in memory until the agent calls project_save. Every save is atomic and keeps rotated .bak copies.
Claude Desktop#
Add to claude_desktop_config.json (Windows: %APPDATA%\Claude\, macOS: ~/Library/Application Support/Claude/), then restart Claude Desktop:
{
"mcpServers": {
"wabcut": {
"command": "C:\\Program Files\\Wabcut\\wabcut-cli.exe",
"args": ["mcp", "--project", "C:\\Users\\me\\Videos\\Rough cut.wabcut", "--allow-edit", "--save-on-exit"]
}
}
}
Leave out --allow-edit (and the save flag) for a read-only connection.
Claude Code#
claude mcp add wabcut -- wabcut-cli mcp --project ./rough-cut.wabcut --allow-edit
or check a project-scoped .mcp.json into the repository:
{
"mcpServers": {
"wabcut": {
"command": "wabcut-cli",
"args": ["mcp", "--project", "rough-cut.wabcut", "--allow-edit"]
}
}
}
Codex#
codex mcp add wabcut -- wabcut-cli mcp --project /home/me/rough-cut.wabcut --allow-edit
or in ~/.codex/config.toml:
[mcp_servers.wabcut]
command = "wabcut-cli"
args = ["mcp", "--project", "/home/me/rough-cut.wabcut", "--allow-edit"]
Cursor and other clients use the same mcpServers JSON as Claude Desktop.
Safety model#
- Read-only by default. The client gets the
Readcapability.--allow-editaddsEditSequenceandEditProject,--allow-analysisaddsMediaAnalysis;Networkcommands are never served. Edit tools are not even listed on a read-only server; calling one anyway returns anisErrorresult (PermissionDenied) that tells the user to restart with--allow-edit. - AI models. Read tools that run a local model (
search.footage,shorts.find,takes.find) are served read-only: they read the project and its media and never change them. The analysis commands that run models need--allow-analysis; edit tools that run one (reframe, shorts, dub, ...) need--allow-edit, and the paid ones only estimate here. - Validated, previewable, undoable. Edits go through the command engine: params are checked against the schema, references resolve, and results pass the model invariants and the locked-track guard.
dryRun: truepreviews without committing. Every commit (and everyedit_batch) is one undo step, andedit_undo/edit_redowork like the menu items. - Revisions. Every result reports the session
revision. A commit with a staleexpectedRevisionfails withStaleRevisioninstead of editing. Without one, the commit is based on the current revision and the result saysassumedRevision: true.idempotencyKeymakes retries safe. - Bounded input. Messages are limited to 4 MiB and 64 levels of nesting,
edit_batchto 1000 commands, and every argument is checked against its schema. - Call timeout. It is checked at the engine's checkpoints (between batch steps, inside long commands, before a commit). A call that runs past it stops with
TimedOutand commits nothing. Work between two checkpoints (one model edit) always finishes. - Files. An MCP client is a model steered by what it reads (project content included), so it never picks files: the commands that read or write the files their parameters name are not listed and are refused by name (
PermissionDenied,details.touchesFiles). With--allow-filesthey are served, but every path must be absolute and lie inside the project's folder or a--files-folderonce symlinks and junctions are resolved (details.confinedwhen it does not).plugins.scanis never served. The project file itself:project_savewrites it, or a copy next to it (copyNameis a plain file name ending in.wabcut: no folders, no.., no device names). There is no shell or network access. - Annotations are hints. Read tools are
readOnlyHint: true; edit tools aredestructiveHint: true(they change the project, although undo restores it);openWorldHintis always false.
Edit results#
Edit tools return {ok, revision, basedOnRevision, dryRun, committed, changes, layout, ...}:
changes: per sequence, the touched tracks ("V1") with[start, end)timecode ranges, plus the added, removed and modified clip ids and what changed on them (roles).layout: the resulting clips of those tracks in the compactsequence.summaryformat (clipFieldsplus arrays). For a dry run this is the preview, so an agent can check the result before committing.createdIds,warnings,steps(edit_batch),undone/redone,canUndo/canRedo,saved(autosave),replayed(idempotency) when they apply.
Resources#
| URI | Content |
|---|---|
wabcut://project/summary | The project.summary JSON plus revision. |
wabcut://sequence/{id} | The sequence.summary JSON of that sequence plus revision (listed per sequence; also a resource template). |
Tools#
Tool names use _ for the command's . (timeline_rippleDelete is timeline.rippleDelete). Parameters are documented in docs/commands.md; edit tools also take dryRun, expectedRevision and idempotencyKey.
| Tool | Title | Access | Description |
|---|---|---|---|
adjustment_add | New Adjustment Layer | edit (--allow-edit) | Adds an adjustment layer clip (File > New > Adjustment Layer, dropped on the timeline): its effects (colour grade, blur, masks, keyframes) apply to the composite of every video track below it for its duration; its Opacity and blend mode mix the adjusted picture over the unadjusted one. Inside a nested sequence it adjusts that sequence's lower tracks only. "media" reuses an existing adjustment layer item; without it a new one is made for the sequence. Add effects with clip.addEffect. createdIds: the clip (and the new item). |
analysis_detectBeats | Detect Beats | edit (--allow-edit) | Finds the tempo and beats of a clip's music: beat markers labelled 1-2-3-4 (downbeats red) and the sequence's beat grid (snapping, edit.snapToBeats and edit.cutToBeats use it). For a media item the beats are listed in media time. Results are cached per source file. |
analysis_detectShots | Detect Shots | edit (--allow-edit) | Finds the cuts (hard cuts, fades through black, dissolves; flashes are not cuts) in a clip's video and, for a clip, marks them with sequence markers ("markers": false to only list them). For a media item the cuts are listed in media time. Results are cached per source file. |
analysis_speakers | Who Speaks When | analysis (--allow-analysis) | Active-speaker detection for a multicam source, on this computer: who speaks when (with crosstalk, silence and laughter) and which angle shows whom (close-up or wide), from the transcripts with their speakers, each angle's microphone level and each camera's faces and lip motion. Nothing changes. "angles" sets angles yourself; they win over the guesses. |
analysis_subjects | Find Subjects | analysis (--allow-analysis) | Finds the faces, people and salient regions of a media item over time, shot by shot (5-10 samples a second, denser while the picture moves; faces and people tracked within each shot). Reframing uses it; the result is cached per file, so running it again is cheap. Runs locally: nothing leaves the computer. |
audio_addEffect | Add Track or Master Effect | edit (--allow-edit) | Adds an audio effect to an audio track's stack (applied to the track's mix, before its fader) or to the master bus (applied to the sequence's mix, before the master fader). Parameters not given take their defaults. An audio plugin ("plugin": its effect id from plugins.list) goes in the same way; its parameters are "p |
audio_addKeyframe | Add Track or Master Keyframe | edit (--allow-edit) | Adds a keyframe to a parameter of a track or master effect, or (no "effect") to the fader: "volume" or "pan" - at a timeline time (track and master curves run in timeline time). A constant parameter becomes a curve. |
audio_autoDuck | Auto-Duck Music | edit (--allow-edit) | Lowers music under speech: finds speech on the dialogue tracks (transcript words, or the audio level where there is no transcript) and writes volume keyframes on the music tracks' clips - down by "amount" over "attack" before each phrase, back up over "release" after "hold", bridging short pauses. Replaces the music clips' volume keyframes in the range (like Premiere's Auto Ducking); the keys stay editable. "preset": "gameUnderVoice" ducks a gaming recording's game audio and music under the streamer's mic: the tracks named Mic (else the dialogue-role ones) are the speech, the tracks named Game or Desktop Audio (else the effects-role ones) and the music tracks duck, -10 dB with a 0.12 s attack, 0.35 s hold and 0.8 s release; given parameters still win. The report names the tracks used. One undo step; dryRun previews it. |
audio_channelLevels | Measure Channel Levels | analysis (--allow-analysis) | Peak and RMS of each source channel of audio clips (the clip's source range, at most 120 s), and the channels 30 dB or more under the loudest ("silentChannels"): which microphone is on which channel, and whether a recording has sound on one side only. Decodes media; changes nothing. |
audio_channels | Audio Channels | read | What each audio clip plays (its source channel count and channel map: the clip's, its media item's or none), each audio track's channel format and 5.1 panner, and the master's format. A read: it changes nothing. |
audio_effects | Audio Effect Stack | read | The effect stack of an audio track or of the master audio bus: instance ids, effect ids, enabled, parameter values (constants or keyframes in timeline ticks), and the fader after it: "volume" (dB) and, for tracks, "pan". |
audio_enhanceSpeech | Enhance Speech | edit (--allow-edit) | Studio-quality dialogue (Premiere's Enhance Speech, Resolve's Voice Isolation): renders each clip's media with DeepFilterNet3 on this computer (no audio leaves it; the model downloads on first use), records the enhanced take on the media item and puts the Enhance Speech effect first in each clip's stack: the clip plays the take blended with the original by "strength" (toggle the effect to compare), before its level and redactions. A take already rendered for the same file and model is reused. Video clips stand for their linked audio. With "render": false only the effect is applied (it plays the original until the take is rendered). Records the take on the media item, so it is a project edit. One undo step. |
audio_essentialSound | Essential Sound | edit (--allow-edit) | Premiere's Essential Sound panel: tags clips as dialogue, music, sfx or ambience and applies a preset of that type as ordinary, editable effects at the top of each clip's stack (an Essential Sound record with the type and options, then one marked effect per setting: Gain for loudness; Dialogue Repair: Reduce Rumble (high-pass), DeHum, Reduce Noise or Enhance Speech, Noise Gate, Reduce Reverb (expander), DeEss; Clarity: EQ preset (podcastVoice, phone, radio, streamerVoice), Dynamics (compressor) and a true-peak limiter last; Creative: reverb (smallRoom, largeRoom, hall, plate, outside); Stereo Width), then matches each clip's loudness to the type's target. Music and ambience can duck under the dialogue (volume keyframes) and music can be remixed to a duration ("duration"); sound effects take a position ("pan"). Applying again replaces what Essential Sound put there; "type": "none" removes it. Presets - dialogue: default, streamerVoice (a gaming mic at -16 LUFS: rumble cut, Reduce Noise, gate, de-esser, EQ, compressor with makeup, limiter at -1 dBTP), cleanUpNoisy, podcastVoice, phone, radio, reduceRoomEcho, removeHum, smallRoom, largeRoom, outside; music: default, background (ducked), wide; sfx: default, background; ambience: default, underDialogue (ducked), wide. "options" change a preset's settings. "tracks" applies it to every clip of those tracks (the mic track of a recording in one request). Without "type" a clip keeps its recorded type, else its track's role. One undo step; dryRun previews it. |
audio_fillChannel | Fill Channel | edit (--allow-edit) | Premiere's Fill Left with Right and Fill Right with Left: both sides of the clips play one channel - for audio heard on one side only ("fix the left-only audio": from left). "from" is the side that has the sound. One undo step. |
audio_loudness | Measure Loudness | analysis (--allow-analysis) | EBU R128 / ITU-R BS.1770 loudness as it renders: integrated LUFS, loudness range (LU), true peak (dBTP), sample peak, loudest momentary and short-term LUFS. Targets: the mix (with mute/solo and the master effects: what export writes), a track (its clips and track effects) or a clip on its own. |
audio_masterLimiter | Master True-Peak Limiter | edit (--allow-edit) | Puts a true-peak brick-wall limiter at the end of the master audio bus (or updates the one there): no true peak of the mix goes above the ceiling (default -1 dBTP, the streaming and EBU R128 maximum). |
audio_moveEffect | Reorder Track or Master Effect | edit (--allow-edit) | Moves an effect to another position in a track or master stack. |
audio_moveKeyframe | Move Track or Master Keyframe | edit (--allow-edit) | Moves keyframe index of a track or master effect parameter or of the fader ("volume" / "pan", no "effect") to another timeline time; fails if another key is there. |
audio_normalize | Normalize Loudness | edit (--allow-edit) | Sets a gain so the loudness hits a delivery target: YouTube / Spotify -14 LUFS, podcasts and Apple Podcasts -16, broadcast EBU R128 -23, ATSC -24, or a custom "lufs". The gain is the first effect of each clip's, the track's or the master's stack (adjusted when it is already there), measured again and refined until within tolerance, so compressors and limiters after it are accounted for. With "limit" the master gets the true-peak limiter at the preset's ceiling first. One undo step. |
audio_remix | Remix Music | edit (--allow-edit) | Premiere's Remix: retimes a music clip to a target length by rearranging its own bars - repeating or skipping sections where the music around the jump sounds alike (beats and bars, then chroma and MFCC self-similarity) - never by stretching it. The intro and the outro are kept. The clip becomes its pieces on its track (the first keeps its id; they share its level and effects) with a short constant-gain crossfade on each join just before a beat; audio.remixRender makes one rendered take instead. The report lists every join with its confidence (0..1). Target: "duration" (seconds), "end" (a timeline time) or "fit": "video" (the end of the last video clip). One undo step; dryRun previews it. |
audio_remixRender | Render Music Remix | edit (--allow-edit) | audio.remix rendered into one file: the remix of the music clip (the same plan: its own bars rearranged, intro and outro kept, crossfaded joins) becomes a new media item derived from the song (a float WAV in the user's cache), and the clip plays it from its start. The report lists the joins like audio.remix's. Adds media, so it is a project edit. One undo step; dryRun previews it. |
audio_removeEffect | Remove Track or Master Effect | edit (--allow-edit) | Removes an effect from a track or master stack. |
audio_removeKeyframe | Remove Track or Master Keyframe | edit (--allow-edit) | Removes keyframe index of a track or master effect parameter or of the fader ("volume" / "pan", no "effect"); the last one leaves a constant. |
audio_separateStems | Separate Stems | edit (--allow-edit) | Splits a music or mixed clip's audio into vocals, drums, bass and other with HTDemucs on this computer (no audio leaves it; the model downloads on first use, and the job refuses on a computer with too little free memory). Each stem becomes a new media item, linked to the source by its provenance ("separated from X with htdemucs"), in a bin named after the source. One undo step. |
audio_setChannelVolume | Set Channel Volume | edit (--allow-edit) | Premiere's Channel Volume: the volume of one channel of audio clips (1-based clip channel), dB, a constant, or with "time" a keyframe there (the channel's volume becomes animated). One undo step. |
audio_setChannels | Modify Audio Channels | edit (--allow-edit) | Premiere's Modify > Audio Channels on clips: which source channels feed each of the clip's channels, in a clip format (mono, stereo, 5.1, adaptive), with mutes and per-channel volume. A "preset" (fillLeft, fillRight, swap, sumToMono, mono with "channel", stereo, identity, default) or a "map". Use it when the two microphones of an interview are on the left and right channels of one file, or a recording has sound on one side only. One undo step. |
audio_setEffect | Set Track or Master Effect | edit (--allow-edit) | Enables or disables an effect of a track or master stack, or sets constant parameters. |
audio_setMediaChannels | Modify Media Audio Channels | edit (--allow-edit) | Modify > Audio Channels on media items: the channel map every audio clip of the item plays unless it has its own (audio.setChannels). The same presets and maps. It changes media items, so it is a project edit. One undo step. |
audio_splitToMono | Split to Mono | edit (--allow-edit) | Splits a clip's channels into linked mono clips, one per source channel, on separate audio tracks (the clip keeps channel 1; the others go on the free audio tracks below it, new ones when needed, or on "tracks"): "split the two mics into separate tracks". Each keeps the clip's level and effects. One undo step. |
audio_syncClips | Synchronize by Audio | edit (--allow-edit) | Lines recordings of one event up by their audio: a camera's scratch audio and a separate recorder (dual-system sound), or several cameras. Returns each recording's offset to the reference (the one named, else the first clip with a picture), its confidence, the overlap and the clock drift between the devices (ppm, with the speed that would cancel it). "media" entries may be arrays: a camera's recording split into several files, played back to back in the order they were recorded. With clips and "apply" (Premiere's Synchronize), the other clips move to where they line up with the reference, and the external audio (clips without a picture) links to it; one undo step, dryRun previews it. |
autozoom_apply | Auto Zoom | edit (--allow-edit) | Zooms a screen recording in where things happen (clicks, typing, where the cursor rests) and back out when nothing does, like Screen Studio: smooth, editable Position and Scale keyframes on the clip (the AI-9 camera optimiser), never showing outside the frame. Activity comes from a cursor sidecar when there is one, else from the frames. Running it again replaces its keys. One undo step; dryRun with "preview" returns the zoom path. |
bin_create | New Bin | edit (--allow-edit) | Adds a bin (in "parent", default the project's root). Returns its id. |
bin_move | Move to Bin | edit (--allow-edit) | Moves bins, media items and sequences into "target" (absent: the project's root). A bin cannot go into itself or one of its sub-bins. |
bin_remove | Delete Bin | edit (--allow-edit) | Deletes bins with everything in them (sub-bins, media items, sequences). Refused while media inside is used by a sequence that is not deleted with it. |
bin_rename | Rename Bin | edit (--allow-edit) | Renames a bin (the name may not be empty). |
brand_get | Brand Kit | read | The project's brand kit (null when it has none). |
brand_set | Set Brand Kit | edit (--allow-edit) | Sets the project's brand kit - named colours, font roles and logos (media of the project) that graphics, templates and caption styles refer to by name - or removes it (null). Everything that refers to it re-themes. |
captions_addCue | Add Caption | edit (--allow-edit) | Adds a cue from "start" to "end" (or for "duration"). Refused where it would overlap another cue (unless the track's style allows overlaps). Returns its index. |
captions_addTrack | New Caption Track | edit (--allow-edit) | Adds an empty caption track, styled by a preset (built in: Clean, Bold Box, Podcast, Shorts, Thai-friendly; or one of the project's) and/or style fields. The default look is white text in a dark box at the bottom. |
captions_applyPreset | Apply Caption Preset | edit (--allow-edit) | Gives a caption track the style of a preset: built in (Clean, Bold Box, Podcast, Shorts, Thai-friendly) or one of the project's. |
captions_generate | Generate Captions | edit (--allow-edit) | Makes a caption track from the transcript: cues of at most maxLines lines of maxCharsPerLine characters and maxDuration seconds, broken at pauses, speaker changes and sentence ends; Thai lines break between words, never at spaces that are not there. Replaces a caption track when "replace" names one. |
captions_generateFromTranscript | Captions from Transcript | edit (--allow-edit) | Makes a caption track from the sequence's transcript (with the project's corrections and speakers): cues of at most maxLines lines of maxCharsPerLine characters and maxDuration, broken at pauses, speaker changes and (optionally) sentence ends, at least "gap" apart. Thai and other unspaced scripts break between words, and where the host provides line-break rules also inside them. Each cue gets the speaker of most of its words (diarization labels without a speaker get one). "replace" regenerates a caption track and keeps its style. |
captions_get | Caption Cues | read | The cues of a caption track (default: the sequence's first) as arrays in cueFields order: start, end, text (its lines joined by newlines). A cue over redacted speech (a bleep or mute) reads "[bleep]" as a whole; redactedCues lists their indices. sequence.summary lists the caption tracks. |
captions_mergeCues | Merge Captions | edit (--allow-edit) | Joins "count" consecutive cues (default 2) into one, its text re-wrapped to maxLines lines of maxCharsPerLine characters. |
captions_presets | Caption Presets | read | The caption presets: built in, then the project's, each with its style. |
captions_remove | Delete Caption Track | edit (--allow-edit) | Deletes a caption track of the sequence. |
captions_removeCue | Delete Caption | edit (--allow-edit) | Deletes a cue of a caption track. |
captions_removePreset | Delete Caption Preset | edit (--allow-edit) | Deletes one of the project's caption presets. |
captions_savePreset | Save Caption Preset | edit (--allow-edit) | Saves a named caption style in the project: a caption track's style, with "style" fields applied on top (or the default look). Replaces the project preset of that name; built-in names are refused. |
captions_setStyle | Caption Style | edit (--allow-edit) | Changes how a caption track looks: font, size (fraction of the frame height), fill, outline, shadow, background box, placement (bottom, top or a custom position), alignment, width, karaoke highlight, speaker names. Fields not given keep their values. Preview and burn-in export both use it. |
captions_setTrack | Caption Track Settings | edit (--allow-edit) | Renames a caption track, sets its language or shows/hides it. |
captions_shiftCues | Shift Captions | edit (--allow-edit) | Moves the cues that start in [from, to) (default: all of them) by a signed delta, e.g. to resync captions. Refused when a cue would start before 0 or overlap a cue that stays. |
captions_splitCue | Split Caption | edit (--allow-edit) | Cuts a cue in two at a time inside it. The text splits at "textOffset" (a byte offset) or else at the line-break opportunity nearest the same share of the text (Thai and other unspaced scripts break between words where the host provides line-break rules). |
captions_translate | Translate Captions | edit (--allow-edit) | Translates a caption track into new caption tracks, one per language, keeping the cue timing: cues that would read too fast in the target language borrow time from the gaps, merge with a neighbour or move words across, and text that does not fit two lines is split into more cues (Thai broken between words). The corrections layer applies first, and bleeped words stay "[bleep]" (never sent as content). A local model (OPUS-MT, on this computer) or the user's cloud model (consent and spend cap; caption text only) with a glossary and a tone. One undo step; "estimate" prices a cloud run first. |
captions_updateCue | Edit Caption | edit (--allow-edit) | Changes a cue's text, start, end or speaker (null clears the speaker). |
captions_updateFromTranscript | Update Captions from Transcript | edit (--allow-edit) | Rewrites the text of a caption track's cues from the transcript words under them (after transcript corrections), keeping their timing and style; cues with no words under them stay as they are. |
cdl_export | Export CDL | edit, files (--allow-files, confined) | Writes clips' colour wheels as an ASC CDL: slope = gain - lift, offset = lift + offset, power = gamma, saturation. .cc holds one clip; .ccc and .cdl several (ids are the clip names). Refuses to replace a file unless "overwrite". |
cdl_import | Import CDL | edit, files (--allow-files, confined) | Sets clips' colour wheels from an ASC CDL file (.cc, .ccc, .cdl): the correction whose id is the clip's name, else the one at the clip's position, or "index". Values beyond the wheels' ranges are clamped (with a warning). |
clip_addEffect | Apply Effect | edit (--allow-edit) | Adds an effect to the stack of each clip (video effects on video clips, audio effects on audio clips). Parameters not given take their defaults. An audio plugin ("plugin": its effect id from plugins.list) goes on audio clips the same way. The new instance ids are returned in createdIds. |
clip_addKeyframe | Add Keyframe | edit (--allow-edit) | Adds a keyframe at a timeline time inside the clip (or replaces the one there). A parameter that was constant becomes animated with just this key. Keyframes stick to the media: slipping the clip moves them with the picture, trims hide but keep them. |
clip_details | Clip Details | read | Everything about one clip: track, timeline and source range (ticks and timecode), media, stream, speed, enabled, label colour, linked clips and all parameter values. |
clip_enable | Enable | edit (--allow-edit) | Enables or disables clips (Premiere Shift+E). Disabled clips stay in place but are not shown or heard. |
clip_fade | Fade | edit (--allow-edit) | Fades clips in and/or out with keyframes: opacity on video clips (to 0), level on audio clips (to -144 dB). The fade ends (or starts) at the value the parameter has there. |
clip_find | Find Clips | read | Finds clips by name (case-insensitive substring), by a time they cover, by track and by media. Returns arrays in clipFields order. |
clip_frameHold | Frame Hold | edit (--allow-edit) | Holds the frame at a time. Without duration (Add Frame Hold) the clip is cut there and the rest shows that frame; with a duration (Insert Frame Hold Segment) a still of that length is inserted, rippling the track and sync-locked tracks. Effects keep animating through the hold. |
clip_insert | Insert | edit (--allow-edit) | Insert edit (Premiere ','): puts a media source range onto the patched tracks at a time and pushes later material on those tracks and every sync-locked track later, cutting through clips there. Video and audio clips are linked. |
clip_instantReplay | Instant Replay | edit (--allow-edit) | Replays a moment right after itself in slow motion, Premiere-style instant replay in one step: the moment's clips are copied and inserted right after it (everything later moves, sync-locked tracks stay in sync) with a speed ramp (100 % easing into "speed" and back), the REPLAY stinger template over the replay and a white flash at each cut. The moment is a video clip ("clip": its span, and its linked clips), or a range ("in"/"out", default the sequence In/Out marks: every clip of media overlapping it). Graphics and titles are not replayed. The replay is silent unless "includeAudio" (slowed, the pitch drops). One undo step. |
clip_link | Link | edit (--allow-edit) | Links clips so they select and edit together. |
clip_move | Move | edit (--allow-edit) | Moves clips in time and across tracks. "overwrite" (plain drag) replaces what is at the destination; "insert" (Ctrl-drag) makes room there. Clips cannot start before 0. |
clip_moveEffect | Reorder Effect | edit (--allow-edit) | Moves an effect to another position in the clip's stack. |
clip_moveKeyframe | Move Keyframe | edit (--allow-edit) | Moves a keyframe to another timeline time inside the clip. |
clip_openNested | Open Nested Sequence | read | The sequence a nested or multicam clip plays (open it to edit inside), the range of it the clip shows and, for a multicam clip, its active angles. |
clip_overwrite | Overwrite | edit (--allow-edit) | Overwrite edit (Premiere '.'): puts a media source range onto the patched tracks at a time, replacing whatever is there. Nothing moves. |
clip_pasteAttributes | Paste Attributes | edit (--allow-edit) | Premiere's Paste Attributes (Ctrl+Alt+V): the chosen attributes of the clipboard's clip (the first one of each target's kind: video attributes from the copied video clip, audio ones from the audio clip) or of "source" onto "clips". Parameter values and keyframes replace the target's; effects are added after its own; time remapping replaces its speed. Keyframes keep their time from the clip's start, or stretch to the target's length with "scaleTimes". One undo step; "changes" lists what each clip took and skipped (dryRun previews). |
clip_removeAttributes | Remove Attributes | edit (--allow-edit) | Premiere's Remove Attributes: the chosen parameters go back to their defaults (keyframes too), time remapping is turned off (the clip plays at 100 % from the frame it started on), effects are removed by id (or all). One undo step; "changes" lists what each clip lost. |
clip_removeEffect | Remove Effect | edit (--allow-edit) | Removes an effect instance from a clip's stack. |
clip_removeKeyframe | Remove Keyframe | edit (--allow-edit) | Removes a keyframe; removing the last one leaves the parameter constant at its value. |
clip_rename | Rename Clip | edit (--allow-edit) | Renames clips (the name shown on the timeline; the media keeps its name). |
clip_rippleTrim | Ripple Edit | edit (--allow-edit) | Ripple edit (B): moves a clip's In or Out point and ripples later material (sync-locked tracks too). |
clip_roll | Rolling Edit | edit (--allow-edit) | Rolling edit (N): moves the edit point at a clip's edge, trimming the neighbour the other way. |
clip_setAnimated | Toggle Animation | edit (--allow-edit) | Premiere's stopwatch. On: the constant value becomes one keyframe at "time" (default: the clip's start). Off: all keyframes are deleted and the parameter keeps the value it has at "time". |
clip_setBlendMode | Set Blend Mode | edit (--allow-edit) | Sets the blend mode of video clips (the Opacity section's Blend Mode, Premiere's list): how each clip combines with what is below it. "normal" puts it over; the darken, lighten, contrast, inversion and component groups follow Premiere's menu. Opacity (keyframable) still applies on top. Audio clips are refused. |
clip_setColor | Set Label Color | edit (--allow-edit) | Sets the label colour of clips (0-15). |
clip_setEffect | Set Effect | edit (--allow-edit) | Turns an effect on or off or sets its parameters (constants; animate them with clip.addKeyframe and "effect"). |
clip_setKeyframe | Set Keyframe | edit (--allow-edit) | Changes a keyframe's value, interpolation (hold, linear, bezier, easeIn, easeOut, easeInOut) or Bezier handles (slope in units per second, influence 0..1 of the segment). |
clip_setParam | Set Clip Parameter | edit (--allow-edit) | Sets one effect parameter (motion, opacity, volume, pan) on clips. |
clip_shake | Camera Shake | edit (--allow-edit) | A camera shake on a video clip from "at": Motion Position (and Rotation) keys of a seeded random pattern that decays over "seconds", plus a slight zoom so the clip's edges do not show ("cover"). The same request makes the same shake ("seed" picks another). Keys already inside the shake are replaced. One undo step. |
clip_slide | Slide | edit (--allow-edit) | Slide (U): moves a clip between its neighbours, trimming them to compensate. |
clip_slip | Slip | edit (--allow-edit) | Slip (Y): shifts which source frames clips show, keeping their place and length. |
clip_speedDuration | Speed/Duration | edit (--allow-edit) | Ctrl+R: plays each clip's material at a new speed (percent; 200 = twice as fast) or fits it into a new duration; can reverse it and keep audio pitch. With ripple, later material on the track and sync-locked tracks moves; without, the clip only grows into the gap after it. |
clip_splitAtShots | Split at Shots | edit (--allow-edit) | Razors each clip at the cuts in its video (scene-edit detection), with its linked partners. One undo step; dryRun previews the split. |
clip_trim | Trim | edit (--allow-edit) | Trim an edge (selection tool): moves a clip's In or Out point without moving anything else. Clamped to neighbours, source media and one frame; the delta actually applied is returned. |
clip_unlink | Unlink | edit (--allow-edit) | Takes clips out of their link groups. |
clip_zoomPunch | Zoom Punch | edit (--allow-edit) | A punch-in zoom on a moment of a video clip: Motion Scale keys ease in to "scale" times the clip's scale, hitting at "at", hold, and ease back out ("attack" and "release" are shares of "seconds"). With "focus" the zoom closes in on that point of the frame (Position keys too). Keys already inside the punch are replaced. One undo step; the keys stay editable. |
clipboard_copy | Copy | read | Copies clips (with their link partners unless "linked": false) to the clipboard exactly: speed, reverse, freeze frames, time remapping, effects and keyframes, names, labels, links, the transitions between them and the markers over them (captions on request). The project does not change. |
clipboard_cut | Cut | edit (--allow-edit) | Copies clips to the clipboard (like clipboard.copy) and deletes them, leaving gaps (Premiere's Cut). One undo step. |
clipboard_get | Clipboard | read | What the clipboard holds: clips, length, tracks, markers, captions, media; with "export" also the clipboard as JSON text. |
clipboard_paste | Paste | edit (--allow-edit) | Pastes the clipboard (or a "document" from clipboard.copy's export) at "at": overwrite (Ctrl+V) replaces what lies under the pasted clips, insert (Ctrl+Shift+V) first opens the clipboard's length on the destination and sync-locked tracks. Clips go to the lowest targeted track of their kind (or "videoTrack" / "audioTrack") plus their copied offsets; missing tracks are added. Media is the project's own when it has the file (by id, fingerprint or path), else it is added; "notes" say which. One undo step. |
color_auto | Auto Color | edit (--allow-edit) | Auto colour: looks at the clip (at "time", default its middle) without its grade and sets the grade's white balance (temperature, tint) and levels (exposure, whites, blacks) as ordinary, editable Basic parameters. One undo step. |
color_grade_get | Get Color Grade | read | A clip's grade at a time (default: its middle): parameters (only those changed unless "all"), animated ones, curves, LUTs, missing LUTs and whether it does anything. "grade": null when the clip has none. |
color_grade_set | Set Color Grade | edit (--allow-edit) | Sets a clip's colour grade (wabcut.color.grade; added at the end of the stack when the clip has none): "params" by registry key (only those given change; effect.list lists them with ranges), "stages" on or off (basic, creative, curves, wheels, hsl, vignette), "curves" as [x, y] points (master/red/green/blue x and y in 0..1; hueSat/hueHue/hueLuma x = hue in turns and lumaSat/satSat y with 0.5 = no change; [] resets), and the "inputLut" / "look" ("builtin: |
color_match | Color Match | edit (--allow-edit) | Makes clips look like a reference frame: "reference" is {"clip", "time"} (that clip as it looks, alone) or a sequence time (the whole picture). Fits the grade's exposure, contrast, temperature, tint and saturation so the clip's colour statistics (Oklab mean and spread) move to the reference's, by "strength"; "skinPriority" weighs skin tones more. Editable parameters, one undo step. |
color_matchScene | Match Scene | edit (--allow-edit) | Shot-to-shot consistency: matches every clip of the reference clip's scene to it - "scene" (default) is the run of clips on its track cut from the same take without gaps (what clip.splitAtShots makes), "track" every clip on its track, "media" every clip of the same media item, or an explicit "clips" list. One undo step; dryRun previews it. |
dub_create | Dub | edit (--allow-edit) | AI voice-over in another language with the user's own voice provider (ElevenLabs, OpenAI or Gemini; BYOK): each caption cue is spoken and fitted to its slot (sped up at most 15 %, pitch kept; else moved and flagged), on a new "Dub" audio track with the Dialogue role, the original dialogue ducked under it, as one undo step. Bleeped words are never spoken. The audio is marked AI-generated. Paid: "estimate" prices it; a run needs "maxCost" and the app's approval (standalone CLI/MCP and the assistant only estimate or open the Dub dialog). |
edit_clear | Delete | edit (--allow-edit) | Delete (Premiere Delete key): removes clips and leaves gaps. |
edit_cutToBeats | Cut to Beats | edit (--allow-edit) | Music-video assembly: places the given clips' media (from each clip's source In) and media items (from their start) one after another, each lasting beatsPerCut beats of the beat grid, starting at the first beat at or after "at" (the playhead). Overwrites what is there; video goes to videoTrack, audio only when audioTrack is given (the music usually stays alone). |
edit_insertFromSource | Insert from Source | edit (--allow-edit) | Insert edit from the source (Premiere ','), with three-point editing: the source marks (stored on the media unless given), the sequence In/Out marks and the playhead decide where it goes and what it uses. Later material on the patched and sync-locked tracks moves later. A four-point edit whose ranges differ takes a "fit" choice (Premiere's Fit Clip dialog). |
edit_overwriteFromSource | Overwrite from Source | edit (--allow-edit) | Overwrite edit from the source (Premiere '.'), with three-point editing like edit.insertFromSource: replaces what is on the patched tracks; nothing moves. "fit": "speed" retimes the clip to fill the sequence In/Out exactly. |
edit_snapToBeats | Snap to Beats | edit (--allow-edit) | Trims each clip's head and/or tail to the nearest beat of the beat grid when it is within the tolerance (linked partners follow). Edges that cannot reach their beat (a neighbouring clip, too little media) are left and reported. |
effect_list | List Effects | read | The effects and transitions Wabcut knows: id, name, category, kind (video, audio, videoTransition, audioTransition) and parameters as arrays in paramFields order. builtIn effects are part of every clip (set their parameters with clip.setParam or keyframes); the others go into a clip's stack. |
gen_broll | Generate broll | edit (--allow-edit) | App: opens a human-reviewed Generate proposal with consent and cost preview; acceptance imports one staged edit. Standalone CLI/MCP refuses paid generation without an approval host. |
gen_extend | Generate extend | edit (--allow-edit) | App: opens a human-reviewed Generate proposal with consent and cost preview; acceptance imports one staged edit. Standalone CLI/MCP refuses paid generation without an approval host. |
gen_image | Generate image | edit (--allow-edit) | App: opens a human-reviewed Generate proposal with consent and cost preview; acceptance imports one staged edit. Standalone CLI/MCP refuses paid generation without an approval host. |
graphic_add | New Graphic | edit (--allow-edit) | Adds a motion graphic as a clip on a video track (overwriting what is there): "graphic" is the graphic's JSON (docs/graphics.md: name, width/height of its design canvas - default the sequence's frame - layers of text, shapes, images and groups, responsive time). Layer ids 0 get fresh ones. Add layers later with graphic.addLayer, animate them with graphic.applyPreset or keyframes in the layer JSON. createdIds: the clip, and the canvas media item when the project had none of this size. |
graphic_addLayer | Add Graphic Layer | edit (--allow-edit) | Adds a layer (JSON, docs/graphics.md) to a graphic clip: on top of "parent" (a group layer; default the top level), or at "index" (0 = bottom). An id of 0 or one in use gets a fresh one; returns it as "layer". |
graphic_applyPreset | Apply Animation Preset | edit (--allow-edit) | Animates a layer with editable keyframes: fade, slide, scalePop, bounce (the transform), typewriter and wordByWord (a text-range animator: characters or words appear in turn), wipe (a mask). "in" animates the graphic's start, "out" its end, "loop" repeats over the whole clip. Keys inside the preset's time replace the ones there; others stay. |
graphic_get | Graphic | read | A graphic clip's graphic as JSON (docs/graphics.md), with its layers listed flat (bottom to top, groups before their children) and, for a template instance, its template and field values. |
graphic_removeLayer | Delete Graphic Layer | edit (--allow-edit) | Removes a layer from a graphic clip (a group with its children); pins to it and template fields bound to it go too. |
graphic_resolve | Graphic Draw List | read | The draw list of a graphic clip at a timeline time (default its start): every visible layer bottom to top with its transform to canvas pixels [a, b, c, d, e, f], opacity, blend mode, shadow, masks, and its path and paints, text runs (and per-character animator values) or image - with the brand kit applied. What the renderer draws (docs/graphics.md). |
graphic_update | Edit Graphic | edit (--allow-edit) | Changes a graphic clip's graphic with a JSON merge patch (RFC 7386) over its JSON (graphic.get): objects merge, null resets a key to its default, arrays ("layers") are replaced whole. For one layer use graphic.updateLayer. |
graphic_updateLayer | Edit Graphic Layer | edit (--allow-edit) | Changes a layer of a graphic clip with a JSON merge patch (RFC 7386) over the layer's JSON: {"text": {"runs": [{"text": "New"}]}} replaces the runs, {"transform": {"x": 200}} moves it, a curve ({"keys": [{"t": ticks, "v": value}, ...]} or just the array of keys) animates it. Its id stays. |
highlights_find | Find Highlights | edit (--allow-edit) | Finds the best moments of a gaming recording on this computer: game-audio spikes, the player's voice (louder or higher than usual, shouting, laughter), the picture (fast action, flashes, bursts of picture changes), the recording's imported Twitch / YouTube chat log (busy chat, emotes; highlights.importChat) and OBS chapter markers or a marker file next to the recording. Each moment gets a score, a confidence and the reasons, and a marker ("Highlight 1: ..."; earlier highlight markers are replaced). For a media item the moments are in media time and become clip markers. Measurements are cached per source file. |
highlights_importChat | Import Chat Log | read, files (--allow-files, confined) | Reads a stream's chat log (TwitchDownloader JSON, yt-dlp live_chat.json or chat-downloader JSON) and keeps it with a recording's analyses, so highlights.find counts busy chat and emotes. Nothing is uploaded. |
highlights_toReel | Make Highlight Reel | edit (--allow-edit) | Makes a new sequence from highlight moments (the sequence's highlight markers, or "moments"): each moment with handles, best first up to "count" / "maxDuration", in time or score order, with transitions between them. With "music" the cuts land on its beats (every "beatsPerCut" beats) and the music plays under the reel; "slowMotion" slows the moment's peak. One undo step. |
highlights_toShort | Make Highlight Short | edit (--allow-edit) | Makes one highlight moment (a highlight marker by rank, or start/end) a vertical 1080x1920 Short: the moment cut out with every track, laid out with layout.apply ("verticalSplit" with the facecam under the gameplay when there is one: a facecam clip above the gameplay or "facecamRegion"; else "verticalBlurFill": the whole game view over a blurred copy), captioned, with the moment's title as the hook and loudness for Shorts. One undo step. |
history_checkpoint | Save Version | edit (--allow-edit) | Records the project as it is now in the version history (unchanged since the last version: nothing is added). Give "label" to name it ("Client cut v2"): named versions are never pruned. Hosts call it on save, every few minutes of editing and before an AI agent applies a plan (kind). |
history_diff | Compare Versions | read | What changed from one version to another ("current" is the project as it is): per sequence the clips added, removed, moved, trimmed or retimed, effects and keyframes changed, settings, tracks, markers and captions; media and review notes. "summary" says it in lines with timecodes. |
history_export | Save Version As | edit, files (--allow-files, confined) | Writes a saved version as a project file of its own ("restore as a new project"). Refuses to replace a file unless "overwrite". |
history_list | Version History | read | The project's saved versions, oldest first, as arrays: id, createdAt (UTC), kind (save, auto, agent, manual, restore), label (named versions are kept), sequences, clips, the bytes the version added. |
history_name | Name Version | edit (--allow-edit) | Names a saved version (an empty label unnames it). Named versions are kept when the history prunes. |
history_restore | Restore Version | edit (--allow-edit) | Goes back to a saved version: the whole project (one undo step; the project as it was is saved as a version first), or, with "sequence", that sequence of the version as a new sequence next to the current ones (the media it plays is the project's own where the project still has it). The no-cloud lock stays on. |
interchange_export | Export Timeline | read, files (--allow-files, confined) | Writes the sequence (with the sequences it nests and its multicam sources) as a timeline file other editors read, at "path": Final Cut Pro 7 XML ("fcp7-xml": Premiere Pro, DaVinci Resolve), FCPXML ("fcpxml": Final Cut Pro, Resolve; "fcpxmlVersion" 1.10 or 1.11), OpenTimelineIO ("otio") or a CMX3600 EDL ("edl"). Returns the export report: how many elements were carried exactly, and every one approximated (rounded to frames, a transition the format has no name for, ...) or dropped (graphics and effects the format cannot describe). The project does not change; a dry run writes nothing. |
keyframes_move | Move Keyframes | edit (--allow-edit) | Moves several keyframes of one parameter together by a timeline distance, keeping their spacing. The distance is clamped so the keys stay within the clip (keys already outside it do not move further out); a moved key landing on another key replaces it. Returns the moved keys' new indices. |
keyframes_setInterpolation | Set Keyframe Interpolation | edit (--allow-edit) | Sets the interpolation (hold, linear, bezier, easeIn, easeOut, easeInOut) of several keyframes of one parameter at once. |
layout_apply | Apply Layout | edit (--allow-edit) | Lays out a gameplay clip and a facecam in one step, with plain editable clip settings: "pip" (gameplay fills the frame, the facecam in a corner with rounded corners or a circle, a border and a drop shadow), "verticalSplit" (9:16: gameplay on top, facecam below, or the other way round) or "verticalBlurFill" (9:16: the gameplay fitted to the width over a blurred copy of itself filling the frame, an optional facecam on top). The facecam is a clip on a track above the gameplay's, or "facecamRegion": the part of the capture where the webcam already shows (a copy of the gameplay cropped to it). Copies of the gameplay go on free tracks above it (new tracks when none is free) and are linked with it. Applying again replaces the layout's own effects. One undo step. Make a Shorts sequence first with sequence.create preset "shorts". |
layout_list | List Layouts | read | The layout presets layout.apply takes and their options with defaults: facecam picture-in-picture and the vertical 9:16 shorts layouts. |
llm_local_models | Local assistant models | read | Inspect the managed local assistant and its installable models; never downloads implicitly. |
llm_local_start | Local assistant start | analysis (--allow-analysis) | Start or stop the managed local assistant (an installed, allow-listed model); never downloads implicitly. |
llm_local_status | Local assistant status | read | Inspect the managed local assistant and its installable models; never downloads implicitly. |
llm_local_stop | Local assistant stop | analysis (--allow-analysis) | Start or stop the managed local assistant (an installed, allow-listed model); never downloads implicitly. |
lottie_import | Import Lottie | edit, files (--allow-files, confined) | Imports a Lottie animation (Bodymovin JSON from After Effects, LottieFiles) as a motion graphic: from a file ("path") or the JSON itself ("data"). With "at" it becomes a clip there; with "saveAs" a template in the project's library (both are allowed). Shapes, fills, strokes, gradients, trims, transforms with their easing, text, masks and precomps come in; the report lists what was approximated or dropped (images, effects, mattes, expressions...). |
lut_import | Import LUT | edit, files (--allow-files, confined) | Adds a .cube LUT file (1D or 3D, up to 65 points per side) to the project as an asset: it relinks and is collected like media. Returns its reference for color.grade.set's inputLut / look. Importing the same file again returns the existing asset. |
lut_list | List LUTs | read | The built-in looks and camera input LUTs (with where their math comes from) and the project's LUT assets (path, offline, how many effects use each). |
marker_add | Add Marker | edit (--allow-edit) | Adds a sequence marker. Premiere's marker colours are 0-7: green, red, purple, orange, yellow, white, blue, cyan. |
marker_clearAll | Clear All Markers | edit (--allow-edit) | Removes every marker of the sequence (Premiere's Clear All Markers). |
marker_clearInAndOut | Clear In and Out | edit (--allow-edit) | Clears the sequence In and Out marks. |
marker_list | List Markers | read | The sequence's markers in time order with all their fields: index (what marker.update and marker.remove take), start, duration, name, comment, colour, type, web link, and the highlight a highlight finder wrote (score, confidence, reasons, peak, source; null when none). |
marker_markIn | Mark In | edit (--allow-edit) | Sets the sequence In mark at the start of the frame at a time. |
marker_markOut | Mark Out | edit (--allow-edit) | Sets the sequence Out mark at the end of the frame at a time (the frame is included). |
marker_remove | Remove Marker | edit (--allow-edit) | Removes the sequence marker at an index (as listed by sequence.summary). |
marker_update | Edit Marker | edit (--allow-edit) | Changes the sequence marker at an index (as listed by sequence.summary): any of its time, duration, name, comment, colour, type, URL and frame target. Keys left out keep their values; the markers stay sorted by start. |
mask_add | Add Mask | edit (--allow-edit) | Adds a mask to a clip: to an effect ("effect"; the effect then only changes the masked area - a local correction, including the colour grade) or, without "effect", to the clip's opacity mask (it cuts the clip out). Shapes: ellipse and rectangle (center, size, rotation, roundness) or a Bezier "path". Edge: feather and expansion; opacity; invert; add/subtract/intersect with the masks before it. Every parameter can be keyframed. Returns the mask's id. |
mask_list | List Masks | read | A clip's masks by effect, with their parameters (keys at media times) and paths. |
mask_objectSelect | Select Object | edit (--allow-edit) | AI Object Mask: segments the person or object you click on (positive and negative clicks), draw a box around, or name ("subject": a face, a person, a car...) on a frame of a clip with SAM 2.1 (local, on this computer), and tracks it through the shot. The result is a mask that follows it, on an effect of the clip ("blur the background behind the speaker": a Gaussian Blur with an inverted object mask; "brighten the red car": a grade limited to it) or on the clip's opacity (remove the background). Stops at shot cuts unless acrossShots. One undo step; dryRun previews it. |
mask_propagate | Track Object Mask | edit (--allow-edit) | Tracks an object mask's object through the clip (or In / Out) from its last clicked frame: after a selection made with "propagate": "none", or across a shot cut with acrossShots. A job with progress; one undo step. |
mask_refine | Refine Object Mask | edit (--allow-edit) | More clicks (positive: part of the object; negative: not) or a new box on a frame of an object mask: segments it again there and re-tracks from that frame. One undo step. |
mask_remove | Remove Mask | edit (--allow-edit) | Removes a mask from its effect. |
mask_update | Update Mask | edit (--allow-edit) | Changes a mask: only the fields given (name, shape, mode, inverted, enabled, params, path / pathKeys). A number replaces an animated parameter; {"keys": [...]} replaces its keys. |
media_list | List Media | read | Lists the project's media as arrays in mediaFields order: id, name, duration in ms, whether it has video, its number of audio streams, whether it is a still image and whether it is offline. |
media_makeSubclip | Make Subclip | edit (--allow-edit) | A new media item playing "in".."out" (exclusive) of a media item's file, named "name", in "bin" (default the root). Restricted (default) keeps trims inside that range. Returns its id. |
media_newSynthetic | New Synthetic Item | edit (--allow-edit) | Makes a synthetic project item (File > New): "colorMatte" (params color.r/g/b, 0..1: a background for text, a flash), "blackVideo" or "transparentVideo" (a layer of its own for effects that draw). It is made for the sequence's frame size and rate, needs no file and can be any length. Put it on the timeline with clip.overwrite or clip.insert. createdIds: the item. |
media_setAttributes | Media Attributes | edit (--allow-edit) | Library metadata of media items: name (new clips take it; existing clips keep theirs), label colour, comment, description and poster frame (a source time, or null to clear it). Fields not given stay. One undo step for any number of items. |
media_setSubclip | Edit Subclip | edit (--allow-edit) | Changes a subclip's range and restriction (Premiere's Edit Subclip). Restricting is refused while a clip of it uses media outside the new range. |
multicam_angles | Multicam Angles | read | A multicam source's angles: their names, tracks and sync offsets, and how they were synced. |
multicam_autoSwitch | Auto Switch Multicam | edit (--allow-edit) | Cuts a multicam clip to whoever is speaking, on this computer: the active speaker's close-up after a minimum hold, cut a little before they start, the wide shot for crosstalk, laughter, long pauses and for variety on long monologues, optional reaction shots, never in the middle of a word. Presets: calm (podcast), interview, energetic; every rule tunable. The result is ordinary angle cuts (editable afterwards), one undo step, each with its reason ("Cut to Cam B: Speaker 2 starts talking"); dryRun previews them. |
multicam_create | Create Multi-Camera Source Sequence | edit (--allow-edit) | Premiere's Create Multi-Camera Source Sequence: a new sequence with one angle per media item (its video on a video track, each audio stream on an audio track) synced by "sync": their start timecodes, Source Monitor In or Out marks, first clip markers, audio waveforms (needs the host's audio analysis) or "offsets" given by hand. Cut it into a sequence with sequence.insert / overwrite "sourceSequence". |
multicam_flatten | Flatten | edit (--allow-edit) | Premiere's Flatten: a multicam clip (with its linked multicam partners) is replaced by the clips of the angles it plays, trimmed to what it shows (audio angles' tracks on its audio track and the ones below). Refused when that would not look and sound the same (effects on it, retimed, a clip in the way). |
multicam_setSync | Set Angle Sync | edit (--allow-edit) | Moves one angle of a multicam source in time (its sync offset: where its material starts); every multicam clip then shows that angle shifted. The source's sync method becomes manual. |
multicam_switchAngle | Switch Multicam Angle | edit (--allow-edit) | Premiere's angle switch (the 1-9 keys while playing): the multicam clip is cut at "at" and plays "angle" from there to its next cut; without "at" the whole clip switches. "switches" records a list of [time, angle] switches (a live multicam edit) as one undo step. "target": the picture, the sound or both (default). |
narration_create | Narration | edit (--allow-edit) | Narration from a script with the user's own voice provider (BYOK): each line spoken, over its rough-cut beat when the sequence is a rough cut (AI-11) or one after another, on a new "Narration" audio track with the Dialogue role and the other audio ducked under it, as one undo step. The audio is marked AI-generated. Paid: "estimate" prices it; a run needs "maxCost" and the app's approval. |
plugins_list | List Audio Plugins | read | The audio plugins (CLAP, VST3) this computer has, by effect id ("plugin.vst3. |
project_merge | Merge Projects | edit, files (--allow-files, confined) | Three-way merge of another copy of this project ("theirs", a project file) into this one, both edited from "base" (the file they started from): edits of different sequences, tracks or clips merge; the same thing changed differently on both sides is a conflict with a stable id. With unresolved conflicts the result is only staged (the project does not change; the conflicts and what would change are returned) unless "apply"; "choices" resolves them ([{conflict: id, take: "mine" | "theirs"}]; unresolved ones keep mine). A merge that cannot give a valid project with those choices is staged too, with "invalid" saying why. One undo step. |
project_summary | Project Summary | read | Lists the project's sequences (id, rate, length, track and clip counts) and media counts. Start here. |
provenance_report | Generated media provenance | read | Unsigned report of generated segments; no prompts or credentials. |
record_takes | Voice-over Takes | read | The takes of a recorded voice-over slot (Premiere's repeated voice-over passes over one range): each pass over the same track and range made a media item in the Voice-over bin, and the clip plays the newest unless record.useTake chose another. Lists them newest first with their number, media, start, length, input device, time and which one the clip plays. |
record_useTake | Use Voice-over Take | edit (--allow-edit) | Plays another take of a recorded voice-over slot (record.takes): that take's media goes over its recorded range on the clip's track as an overwrite, with the clip's level, pan and effects. The takes stay in the Voice-over bin. One undo step; dryRun previews it. |
redaction_add | Add Redaction | edit (--allow-edit) | Marks a region of a media item in SOURCE time for privacy: every use of that range in every sequence (trimmed, sped up, reversed, reused) is blurred, pixelated or covered in preview, export and burn-in, before the clip's own effects; "audio" mutes or bleeps it (only "words" when given). Mark by "media" + "source", or through a "clip" between "in" and "out". The region can be keyframed or tracked (track.mask on a clip's mask, then copied) - its key times are media times. Returns the redaction's id. |
redaction_list | List Redactions | read | The project's redactions (of one media item with "media"). |
redaction_override | Redaction Override | edit (--allow-edit) | "Don't redact here": the redaction skips this clip (and, with "linked", its linked partners), or applies again with "redact": true. A clip later cut from an excepted one is redacted again until excepted too. |
redaction_remove | Remove Redaction | edit (--allow-edit) | Removes a redaction everywhere. |
redaction_update | Update Redaction | edit (--allow-edit) | Changes a redaction: only the fields given. |
reframe_createSequence | Auto Reframe | edit (--allow-edit) | Makes a copy of a sequence at another aspect ("9:16" for vertical shorts, "1:1", "4:5", "16:9") whose video clips keep their subjects in frame: per shot, a smooth virtual camera (still, then steady pans) follows the main subject, all faces, the speaker or an anchor. The result is ordinary, editable Position/Scale keyframes on each clip (nothing is rendered); the source sequence is not changed. Run analysis.subjects first for long media (otherwise this runs it). The new sequence remembers its source, so reframe.rerun can make it again. |
reframe_rerun | Reframe Again | edit (--allow-edit) | Makes a reframed sequence again from its source sequence (after the source was edited), with the parameters it was made with, or new ones given here. It replaces the reframed sequence's contents (its manual keyframe changes too); its id, name and bin stay. Fails when the source sequence was deleted. |
render_deletePreviewFiles | Delete Render Files | analysis (--allow-analysis) | Deletes preview files: of the sequence between "start" and "end" (In to Out with Sequence > Delete Render Files In to Out), of the whole sequence, or with "all" of every sequence in the project. The edit itself is not affected; the segments show red or yellow again. Needs a host with a preview cache; a dry run lists what would be deleted. |
render_previewInOut | Render In to Out | analysis (--allow-analysis) | Renders preview files for the red and yellow segments between In and Out (or "start" / "end"; else the whole sequence), so they play in real time; segments with a valid preview are skipped. The cache keys each file by the segment's content and drops it when an edit changes that content. Needs a host with a preview renderer (the app); a dry run lists the segments it would render. |
render_status | Render Bar | read | The render bar of a sequence (Premiere's red/yellow/green bar): segments between edit points, each "red" (must be rendered to play in real time: nested sequences, adjustment layers or effects heavier than real time), "yellow" (effects, transitions, blend modes or track mattes that may play in real time), "rendered" (a valid preview file exists) or "none" (plays as it is). Rendered segments show only in hosts with a preview cache. |
review_add | Add Review Note | edit (--allow-edit) | A frame-accurate comment on the sequence: at "time" (a frame) or from "start" to "end", optionally pointing at a spot or rectangle of the frame ("mark"), by "author". Returns its id. |
review_exportPackage | Export Review Package | edit, files (--allow-files, confined) | Writes a review package folder for a client or reviewer: notes.json (the notes with timecodes) and index.html (one self-contained page with a thumbnail per note, its mark drawn on it), plus the thumbnails in frames/. Notes: the sequence's ("sequence"; all the project's without it), or "status" only. Thumbnails come from the host's renderer, else placeholder cards. |
review_importPackage | Import Review Package | edit, files (--allow-files, confined) | Reads a review package's notes back (one undo step): replies and status update the matching notes (by id, else by sequence, time and text), new notes are added at their timecodes, and notes that cannot be placed or that changed on both sides are listed as conflicts and left out. |
review_list | Review Notes | read | The review notes of the sequence ("sequence"; all the project's without it), in time order, with their timecodes, mark, author, status and replies ([author, text, createdAt]). |
review_remove | Delete Review Note | edit (--allow-edit) | Deletes a note and its replies. |
review_reply | Reply to Review Note | edit (--allow-edit) | Adds a reply to a note's thread. |
review_resolve | Resolve Review Note | edit (--allow-edit) | Marks a note resolved (or open again with "resolved": false). |
review_toMarkers | Review Notes to Markers | edit (--allow-edit) | Turns the sequence's review notes ("notes", or all of them) into sequence markers: named after the note's first line, the comment holding the text, author and replies, red while open, green once resolved. With "remove" the notes go. |
roughcut_fromScript | Rough Cut from Script | edit (--allow-edit) | Makes a first cut from a script, an outline or bullet points: each line is found in the transcripts of the recordings (fuzzy, Thai too), the best take of it chosen (fewest fillers and false starts, complete sentence, clean audio; alternates kept), and the takes assembled in script order as a new sequence with linked video and audio trimmed to the words with small handles. Optional: clean-up of fillers and pauses, B-roll suggestions on their own track. Returns the alignment report (per line: the chosen take, its confidence, the alternates). Needs transcripts. One undo step; dryRun previews it. |
roughcut_swapTake | Swap Take | edit (--allow-edit) | In a rough cut made by roughcut.fromScript, plays another recorded take of one line in place of the current one; what follows moves to fit (a ripple). The report of roughcut.fromScript numbers the lines and their takes. |
scopes_read | Read Scopes | read | Scope statistics of the picture at a time (or of one clip alone): luma percentiles in IRE, clipped highlights and crushed blacks, mean colour, saturation and colour cast, with a verdict ("underexposed", "overexposed", "low contrast", "clipped highlights", "crushed blacks" or "ok"). Read only. |
search_footage | Search Footage | read | Smart search: finds the moments of the project's media that show or say what the query describes ("a dog on the beach", "the part where she mentions the budget", Thai too), by what the frames show (an image-text model) and what is said (the transcripts). Returns hits best first: the media, its source range (sourceIn / sourceOut in ticks, start / end in seconds) ready for clip.insert, the matched transcript words and a score. Media must be indexed first (search.indexMedia); a read, it changes nothing. |
search_indexMedia | Index Media for Search | analysis (--allow-analysis) | Brings the smart-search index up to date for some or all media: keyframes of every shot (one per shot, more in long shots) through the image-text model, and the transcript's phrases. Unchanged files are skipped, so running it again is cheap. Runs locally; nothing leaves the computer. |
sequence_addEdit | Add Edit | edit (--allow-edit) | Add edit / razor (Premiere Ctrl+K): cuts the clips under a time on the given tracks (default: the targeted tracks). |
sequence_addEditToAllTracks | Add Edit to All Tracks | edit (--allow-edit) | Add edit to all tracks (Premiere Ctrl+Shift+K): cuts every unlocked track at a time. |
sequence_addTrack | Add Track | edit (--allow-edit) | Adds a video track above the top video track or an audio track below the last audio track. |
sequence_applyAudioTransition | Apply Audio Transition | edit (--allow-edit) | Ctrl+Shift+D: a constant-power crossfade on the edit point nearest the playhead on each targeted audio track. |
sequence_applyDefaultTransitions | Apply Default Transitions to Selection | edit (--allow-edit) | Shift+D: default transitions on both ends of each clip (cross dissolve on video, constant power on audio), on the cut where a neighbour meets the clip, otherwise a fade inside it. |
sequence_applyVideoTransition | Apply Video Transition | edit (--allow-edit) | Ctrl+D: a cross dissolve on the edit point nearest the playhead on each targeted video track, shortened to the media there is. |
sequence_beats | List Beats | read | The beats of the sequence's beat grid as arrays in beatFields order: time, place in the bar (1 = downbeat) and index from the grid's downbeat. |
sequence_create | New Sequence | edit (--allow-edit) | Makes a new, empty sequence (3 video and 3 audio tracks, 48 kHz) from a preset (sequence.presets: "1080p60", "1440p144", "2160p60", "shorts" for 1080x1920 60 fps, ...). createdIds: the sequence. |
sequence_exportMarkers | Export Markers | read | Returns the sequence's markers as text: "csv" (Premiere's columns: Marker Name, Description, In, Out, Duration, Marker Type, plus Color) or "youtube" (chapter lines for a video description, from the chapter markers, or every marker when there are none). YouTube's rules (the first chapter at 0:00, at least 3 chapters, each at least 10 s) are reported as warnings, never fixed silently. Nothing is written to disk. |
sequence_extract | Extract | edit (--allow-edit) | Extract (Premiere "'"): removes a time range from the targeted tracks and closes the gap; sync-locked tracks lose the same range so they stay in sync. |
sequence_lift | Lift | edit (--allow-edit) | Lift (Premiere ';'): removes a time range from the targeted tracks and leaves a gap. |
sequence_makeVersion | Make Vertical or Square Version | edit (--allow-edit) | Makes a 9:16 Shorts (1080x1920) or 1:1 square (1080x1080) version of a 16:9 gaming edit as a new sequence: with a facecam (a track named like a webcam - facecam, webcam, cam, camera -, a picture-in-picture made with layout.apply, "facecamTrack" or "facecamRegion") Shorts get the vertical split (gameplay on top, facecam below) and square versions the gameplay over a blurred fill with the facecam in a corner; without one, Auto Reframe when the host has it, else the gameplay fitted to the width over a blurred copy of itself. Captions move into the version's safe area. The 16:9 sequence is not changed. One undo step. |
sequence_matchFrame | Match Frame | edit (--allow-edit) | Match Frame (Premiere F): the clip under a time on the targeted tracks (the topmost; every track when none is targeted there), its media and the source frame shown. Like Premiere, the media's source marks become the clip's used range (setMarks false leaves them). |
sequence_nest | Nest | edit (--allow-edit) | Premiere's Nest: the clips (and, with "linked", their partners) move into a new sequence in the same bin, keeping their tracks, effects, links and the transitions between them, and one nested clip per kind (picture on the lowest selected video track, the mix on the lowest audio track, linked) takes their place. Returns the new sequence's id and the nested clips. |
sequence_presets | Sequence Presets | read | The sequence presets sequence.create takes: landscape 1080p, 1440p and 4K at 30, 60, 120, 144 and 240 fps (and 59.94), and vertical 1080x1920 for Shorts, TikTok and Reels at 60 ("shorts") and 30 fps. Every rate is exact in ticks. |
sequence_removeDeadTime | Remove Dead Time | edit (--allow-edit) | Finds low-activity stretches of gameplay - game audio and picture motion both low (loading screens, walking, waiting) for at least "minSeconds" - and removes them with handles kept, like a silence cleanup. Without "apply" it only lists the ranges (the preview: nothing changes); review them, then call again with "apply": true (the same detection) or with the "ranges" to remove. Removing ripple-deletes on every unlocked track and the captions in one undo step; markers move with the material. Listens to the gameplay track (the lowest video track with media) and the unmuted audio tracks unless "tracks" says otherwise. Media the host cannot measure is never cut. |
sequence_removeTrack | Delete Track | edit (--allow-edit) | Deletes a track and its clips (their linked partners on other tracks stay, unlinked). The track must be unlocked. |
sequence_reverseMatchFrame | Reverse Match Frame | read | Reverse Match Frame (Premiere Shift+R): where a source frame is used in the sequence: the first use at or after "from", else the first one. |
sequence_rippleTrimNextToPlayhead | Ripple Trim Next Edit to Playhead | edit (--allow-edit) | W: removes the time from the playhead to the next edit point on the targeted tracks and closes it. |
sequence_rippleTrimPreviousToPlayhead | Ripple Trim Previous Edit to Playhead | edit (--allow-edit) | Q: removes the time from the previous edit point to the playhead on the targeted tracks and closes it. |
sequence_setBeatGrid | Set Beat Grid | edit (--allow-edit) | Sets the sequence's beat grid, which timeline snapping, edit.snapToBeats and edit.cutToBeats use: a tempo and the time of a downbeat, a tempo from tapped beats (at least two times), or detected beats; "clear" removes it. analysis.detectBeats sets it from the music. |
sequence_setMasterFormat | Set Master Channel Format | edit (--allow-edit) | The sequence's master: stereo, or 5.1 (mono and stereo tracks through their 5.1 panners; previewed on a stereo device and exported to stereo through an ITU-R BS.775 downmix; exports with 0 channels follow it). One undo step. |
sequence_setMasterGain | Set Master Gain | edit (--allow-edit) | Sets the master fader: dB, 0 = unity, applied to the sequence's mix after the master effects and before the meters (what export renders). With "time" it sets a keyframe there. One undo step. |
sequence_setPatches | Set Source Patching | read | Checks a source patching (Premiere's source track indicators: which source track goes to which sequence track, and which are switched off) and returns it in order. Patching is view state of the app's Source Monitor, which keeps it; elsewhere nothing is stored: pass "patches" to the source edits. |
sequence_setTargets | Set Track Targets | edit (--allow-edit) | Targets exactly the given tracks (Premiere's track targeting: Lift, Extract, paste, Up/Down navigation and Match Frame use them). |
sequence_summary | Sequence Summary | read | Compact view of a sequence: settings, In/Out marks, every track (label, id, flags) with its clips as arrays in clipFields order (times are timecodes; link = link group, clips with the same value are linked), and markers. Use from/to to look at part of a long sequence. |
sequence_unnest | Unnest | edit (--allow-edit) | Resolve's Decompose: a nested clip (with its linked nested partners) is replaced by copies of the clips it shows - trimmed to what it shows, on its track and the ones above (audio: below), with their effects, links and transitions. Only when that looks and sounds exactly the same; otherwise it is refused with the reason (retimed, effects on the nested clip, track effects, a missing track, a clip in the way, ...). |
shorts_create | Create Shorts | edit (--allow-edit) | Makes one new sequence per short (from shorts.find): the range cut out of the source sequence, reframed to 9:16 (or "aspect") with editable keyframes following the speaker, captioned, with the title as a hook for its first seconds; optionally cleaned of fillers and silences and normalised to -14 LUFS. The source is not changed; all the shorts of one call are one undo step. Export them afterwards (vertical 1080x1920). |
shorts_find | Find Shorts | read | Finds the best moments of a long sequence for vertical shorts (20-90 s each): whole sentences, a hook in the first seconds, one topic, lively delivery, faces, few fillers; optionally about a topic ("query"). Returns them best first with a score breakdown, reasons, a suggested title, the words and a start/end (seconds; ticks too) snapped to sentences and cuts, ready for shorts.create. Needs the media's transcripts. A read: it changes nothing. |
source_addMarker | Add Clip Marker | edit (--allow-edit) | Adds a clip marker to a media item, in media time. Every clip of the media shows it where it uses that part of the source (Premiere's master clip markers). |
source_clearMarks | Clear Source Marks | edit (--allow-edit) | Clears a media item's source In and/or Out mark (Premiere's Source Monitor Clear In / Clear Out / Clear In and Out). |
source_load | Load Source | read | Opens a media item as the source (Premiere's Source Monitor): its kind, duration, frame rate, stored In/Out marks and the source patching a source edit would use. The app also shows it in its Source Monitor. |
source_removeMarker | Remove Clip Marker | edit (--allow-edit) | Removes a media item's clip marker at an index. |
source_setMarks | Set Source Marks | edit (--allow-edit) | Sets a media item's source In/Out marks (Premiere's Source Monitor I and O). They are saved with the project and used by edit.insertFromSource / overwriteFromSource. A key left out keeps its mark; null clears it; an In at or after the Out (or an Out at or before the In) clears the other mark. |
source_updateMarker | Edit Clip Marker | edit (--allow-edit) | Changes a media item's clip marker at an index (keys left out keep their values). |
takes_find | Find Takes | read | Finds repeated attempts of the same line (retakes and false starts) in a sequence and the recordings it uses: groups of takes, best first, each with its words, a word-by-word difference from the best one, and quality (fillers, false starts, pauses, complete sentence, level, clipping, noise floor, pace). "improvable" groups would change with takes.use best. Needs transcripts. A read: it changes nothing. |
takes_use | Use Take | edit (--allow-edit) | Makes the sequence say a line once, with the chosen take: other takes of it on the timeline are removed with their pause, and a take that is not on the timeline replaces the first one there (linked video and audio, with small handles; what follows moves to fit). "best": true does this for every group whose best take is not already the one heard. Pass the same options as takes.find (and its expectedRevision). One undo step; returns the review list. |
template_instantiate | Add Template | edit (--allow-edit) | Adds a graphic made from a template (template.list) as a clip, with field values (by field id: text a string, colour "#RRGGBB" or [r, g, b, a] 0..1 or {"brand": name}, font a family or {"family", "style", "weight"}, image a media id or name, duration a time, checkbox true/false). Its length: a "clip" duration field, else "duration", else the template's. The project's library is searched first, then the user's, then the built-ins (template.list). |
template_list | Templates | read | The graphic templates of the project's library, the user's and the built-in ones that ship with Wabcut (C.16: gaming lower thirds, banners, callouts, stingers, end cards...): id, name, version, default length, canvas, and the fields (id, label, kind, default value) template.instantiate and template.setField take. Built-ins also give their category and "posterTime" (the design time a thumbnail shows: template.resolve draws it). With "id", that template only, with its graphic. |
template_resolve | Template Draw List | read | The draw list of a template at a design time, without adding it to a timeline: what template browsers draw for thumbnails and hover previews (C.16). Default time: the template's poster time (everything has animated in). "values" previews field values. Same items as graphic.resolve. |
template_save | Save as Template | edit (--allow-edit) | Saves a graphic clip's graphic as a template with editable fields (Premiere's Motion Graphics Templates): into the project's library (default), or the user's template library folder ("library": "user"; the host's, not a path). Saving under an id in use replaces that template and raises its version. |
template_setField | Edit Template Fields | edit (--allow-edit) | Sets field values of a template instance clip (template.list shows the fields): "field" and "value", or several at once in "values" - one undo step. A "clip" duration field trims the clip's end. |
timeRemap_addHold | Add Hold Segment | edit (--allow-edit) | Holds the frame shown at a timeline time for a duration inside a remapped clip; the rest of its remap plays later. |
timeRemap_addKey | Add Time Remap Key | edit (--allow-edit) | Adds a remap key at the sampled source position of a timeline time inside a remapped clip. Holds stay holds; the new key is otherwise linear and can reshape a smooth ramp. Returns its index. |
timeRemap_addReverse | Add Reverse Segment | edit (--allow-edit) | From a timeline time inside a remapped clip, plays the media backwards at 100 % for a duration, then forwards again over the same frames (a boomerang); the rest of the remap plays later by twice the duration. Needs that much media before the point. |
timeRemap_enable | Time Remapping | edit (--allow-edit) | Turns time remapping on (speed ramps, holds and reverse inside one clip; the clip shows the same frames, also beyond its ends for transitions and trims; keyframes of a clip that was not at 100 % then animate at timeline rate) or off (back to a constant speed: the one it shows if a single straight segment covers it, else 100 % from its first frame). Audio follows the remap (A.10): pitch kept (Maintain Audio Pitch, on by default when remapping starts) or varispeed; holds are silent. |
timeRemap_moveKey | Move Time Remap Key | edit (--allow-edit) | Moves a remap key to another timeline time. Without "ripple" it stays between its neighbours and both segments around it change speed; with "ripple" the later keys move too, so only the segment before it changes speed (Premiere's speed keyframe drag). |
timeRemap_removeKey | Remove Time Remap Key | edit (--allow-edit) | Removes a remap key (not the only one). |
timeRemap_setInterpolation | Set Time Remap Interpolation | edit (--allow-edit) | Shapes the remap around keys: linear (constant speed between keys), hold (the frame holds until the next key, then jumps), or easeIn / easeOut / easeInOut / bezier for a smooth speed ramp. |
timeRemap_setKey | Set Time Remap Key | edit (--allow-edit) | Changes a remap key's source position, interpolation and Bezier handles together. Omitted fields keep their values. Slopes are source ticks per second of curve time (254016000000 = 100% forwards); influence is a fraction of the adjacent segment. Source bounds and monotonic segments are validated. |
timeRemap_setSpeed | Set Segment Speed | edit (--allow-edit) | Sets the speed of one segment of a remapped clip (between two keys; the one playing at "time", or "segment" by index): its end key and the keys after it move, so later material plays earlier or later. |
timeline_removeSilences | Remove Silences | edit (--allow-edit) | Ripple-deletes a list of time ranges (e.g. silences found in a transcript) in one step. Only whole frames inside each range are removed. By default every track loses the same time so everything stays in sync; In/Out marks and track targeting are left as they were. |
timeline_rippleDelete | Ripple Delete | edit (--allow-edit) | Ripple delete: removes clips and closes the time they used, or closes a gap. Sync-locked tracks lose the same time. A gap only closes when no sync-locked track has material in it. |
title_add | New Title | edit (--allow-edit) | Adds a text title as a clip on a video track: a title media item holding the text and font, and the clip's "wabcut.title.style" effect holding size, fill and stroke colours, stroke width, shadow, alignment, line spacing and tracking. Place, scale and rotate it with the clip's Transform (clip.setParam motion.*). "placement" chooses the track: the named one (overwriting; the default when "track" is given), the first free one at or above the named or targeted one (the default without "track": nothing under the title is overwritten), or a new track on top. createdIds: the clip, the style effect, the title media. |
title_setFont | Set Title Font | edit (--allow-edit) | Changes a title's font family and/or style. |
title_setText | Edit Title Text | edit (--allow-edit) | Replaces a title's text. Every clip of the title shows the new text. |
track_mask | Track Mask | edit (--allow-edit) | Tracks a mask through the clip's media, frame by frame from "time" (forward or backward, to the clip's end or "frames" frames), with pyramidal Lucas-Kanade on features inside the mask and a robust fit of its motion ("model"). Its transform.* parameters get ordinary keyframes (one undo step). Stops where the picture is lost (confidence below "minConfidence"); data lists each frame's confidence. A job: it reports progress and can be cancelled. |
track_setFormat | Set Track Channel Format | edit (--allow-edit) | An audio track's channel format (Premiere's mono, stereo, 5.1 and adaptive tracks): clips are mixed to it (mono averages, 5.1 to stereo is ITU-R BS.775), and it to the master's format; adaptive passes channels through one to one. One undo step. |
track_setPan | Set Track Pan | edit (--allow-edit) | Sets an audio track's panner: -1 = left .. 0 = centre .. +1 = right, a balance on the track's stereo mix (centre leaves it unchanged; towards a side the other side follows the -3 dB constant-power curve down to silence). With "time" it sets a keyframe there. One undo step. |
track_setRecordArm | Set Track Record Arm | edit (--allow-edit) | Arms an audio track for voice-over recording or disarms it (the R button of Premiere's track headers and Audio Track Mixer). The app's Record (record.start) records the microphone onto the armed track (else the targeted one) at the playhead or between the sequence In and Out; recording is the user's action in the app, never a command. Allowed on locked tracks; video tracks are refused. One undo step. |
track_setRole | Set Track Role | edit (--allow-edit) | What an audio track carries: dialogue, music or effects (Premiere's Essential Sound types), or none. audio.autoDuck lowers music-role tracks under dialogue-role tracks. |
track_setState | Set Track State | edit (--allow-edit) | Changes track header toggles: lock, target, sync lock, mute, solo, output, name. Unlocking is how a locked track becomes editable again. |
track_setSurroundPan | Set Track 5.1 Panner | edit (--allow-edit) | The 5.1 panner of a mono or stereo track on a 5.1 master (Premiere's track 5.1 panner): the puck x (-1 left .. +1 right) and y (-1 back .. +1 front; front centre plays stereo on L/R and mono on C) and the LFE send in dB (-144 = off). One undo step. |
track_setVolume | Set Track Volume | edit (--allow-edit) | Sets an audio track's fader (Premiere's track Volume): dB, 0 = unity, applied to the track's mix after its effects. With "time" it sets a keyframe there (track automation, in timeline time) instead of a constant; a constant replaces the track's volume keyframes. One undo step. |
track_transform | Track Motion | edit (--allow-edit) | Tracks a region of a clip ("region": {x, y, width, height} 0..1 of the frame, {"mask": id}, or {"detect": "face"} once a detector is installed) and keys a clip's Motion with it (one undo step): "follow" moves "target" with the region (position; with the similarity model also scale and rotation), "stabilize" keys the tracked clip so the region stays still. A job: it reports progress and can be cancelled. |
transcript_addSpeaker | New Speaker | edit (--allow-edit) | Adds a speaker to the project. Returns its id. |
transcript_assignSpeaker | Assign Speaker | edit (--allow-edit) | Says who speaks over a timeline range: the words the audio clips there play (on "track" only when given) belong to "speaker", or to a new speaker called "name". It wins over diarization and stays with the media when the clips are edited. |
transcript_cleanup | Remove Fillers and Silences | edit (--allow-edit) | Removes every filler word and pause the review finds with at least minConfidence, in one undo step. |
transcript_correctRange | Correct Words | edit (--allow-edit) | Fixes several consecutive words at once (they read "text", split over them by spaces). Like transcript.correctWord; the words must come from one media item. |
transcript_correctWord | Correct Word | edit (--allow-edit) | Fixes a transcription mistake: the word reads "text" from now on, in the transcript the project sees and in captions generated or updated afterwards. The correction is saved with the project on top of the cached transcript, so transcribing again keeps it. |
transcript_corrections | Transcript Corrections | read | The project's transcript corrections and how they apply to the current transcripts: applied, conflict (the words changed since, e.g. after re-transcription; the correction still wins), restored (no words there any more; the correction brings them back) or noTranscript. |
transcript_deleteRanges | Delete Words | edit (--allow-edit) | Deletes words (and pauses) like deleting text: ripple deletes on the tracks the words are heard on and their linked partners, cut on frame boundaries just outside the words, neighbouring deletions merged, sync-locked tracks following, locked tracks untouched. One undo step. |
transcript_keepRanges | Keep Only Words | edit (--allow-edit) | Rough cut: keeps the given word ranges and ripple-deletes everything else on the transcript's tracks, from the first to the last clip that has words. One undo step. |
transcript_mergeSpeakers | Merge Speakers | edit (--allow-edit) | Makes speakers one: every word, assignment and caption of "from" (one id or several) becomes "into", and the merged speakers go. |
transcript_moveRange | Move Words | edit (--allow-edit) | Moves words (a sentence, a paragraph) to the word boundary before another word: cut out with a ripple and inserted there, with their linked video. One undo step. |
transcript_renameSpeaker | Rename Speaker | edit (--allow-edit) | Renames a speaker and/or changes its colour. Name it by "speaker" id, or by the diarization "label" of a media item's transcript (transcript.speakers lists both); a label without a speaker gets one. |
transcript_review | Review Fillers and Silences | read | Filler words (language-aware: um, uh, like in disfluent context; Thai อืม, เอ่อ, แบบว่า ...) and pauses longer than a threshold, as a review list: kind, word indices, time range, confidence, label and context. Remove chosen items with transcript.deleteRanges (fillers as words, silences as gaps) or all with transcript.cleanup. |
transcript_speakers | Speakers | read | The project's speakers (id, name, colour, words in this sequence) and the diarization labels of the sequence's transcripts with the speaker each one is (null: none yet; transcript.renameSpeaker by media and label names one). |
transcript_text | Transcript Text | read | What the sequence says, in timeline order, as paragraphs (split at speaker changes and pauses) with the word indices the other transcript commands take. Words inside an audio redaction read "[bleep]". Start here. |
transcript_transcribe | Transcribe Media | analysis (--allow-analysis) | Transcribes the audio of media items or clips (default: every audio clip of the sequence) so the other transcript commands have words. provider: "auto" (on this computer when the local engine is built, else the user's cloud transcription model), "local", or "cloud: |
transcript_words | Transcript Words | read | The sequence's words in timeline order as arrays in wordFields order: index, text, timeline start and end, the audio clip and track it is heard on, speaker and recognition confidence. |
transition_add | Add Transition | edit (--allow-edit) | Adds a transition at a clip's head or tail: on the cut when the neighbouring clip meets that edge, otherwise inside the clip (a fade from/to black). The media must have frames beyond the cut; by default the transition is shortened to what there is. Default effect: crossDissolve on video, constantPower on audio. |
transition_remove | Remove Transition | edit (--allow-edit) | Deletes a transition; the edit point becomes a cut. |
transition_set | Set Transition | edit (--allow-edit) | Changes a transition: its effect, parameters, its length on either side of the cut ("before", "after"), a new total "duration" placed by its alignment, or the alignment itself (which re-splits it; "custom" with "offset" puts the cut that far in). |
workflow_podcast | Podcast Workflow | edit (--allow-edit) | The one-click podcast / interview edit, on this computer (local, free): sync the cameras and microphones (multicam by audio), lay out the episode (the multicam picture, each microphone on its own dialogue track), transcribe, Enhance Speech, loudness to -16 LUFS, remove fillers and long pauses, switch cameras to whoever speaks, captions, chapters from the topics (and YouTube chapters), optionally shorts. Without "run" it returns the plan (every step, on or off and why); with "run" it runs the enabled steps (or "steps"), as one undo step; "context" continues an earlier run. |
edit_batch | Batch | edit (--allow-edit) | Applies several commands in order as ONE undo step: all of them or none. Later commands see the earlier ones' result. Read commands report in steps. |
edit_undo | Undo | edit (--allow-edit) | Undoes the last change of this session (one edit or batch). |
edit_redo | Redo | edit (--allow-edit) | Redoes the last undone change. |
project_save | Save Project | edit (--allow-edit) | Writes the project file (atomically, keeping rotated .bak copies). With copyName, writes a copy next to it instead, e.g. "Rough cut v2.wabcut". |
See also
Automation
- Edit commands
The typed command protocol that agents, the CLI, scripts and MCP clients use to edit a project.
- Extensions
Add commands to Wabcut in JavaScript, in a sandboxed process with the capabilities the user grants.