Edit a video
edit_footageCut a media library video down to transcript beats or second ranges, then render a new clip with captions, reframing, music, overlays, and branding.
Instructions
Cut a video in the media library (an upload, a generated or found clip, a render) down to the moments that matter and get a new media key: keep beats or quoted words from probe_media's transcript (keep_text), or seconds (keep_ranges, remove_ranges). The same call reframes to 9:16, tightens pauses, burns in captions, lays music and places overlays, a logo and a look. Run probe_media first; plan: true reads the paper edit back before rendering. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| fit | No | cover (default) crops to fill the new shape; contain letterboxes onto pad_color, which keeps a whole slide readable. Needs reframe. | |
| sfx | No | Sounds you place, one per line or semicolon: "<window> <sound> [gain dB]", e.g. "@"the result" ding; @"but then" record scratch -3; 12.4 riser". The sound lands as the window opens. Name it by id or by a few words ("vinyl scratch", "whoosh deep"), or media:<mediaKey> for a sound in the library. A placed sound replaces an automatic one within 0.3 s; the automatic pops and whooshes stay everywhere else. Default gain -6 dB. A few per short land; a hit on every sentence is noise. Library ids: air-horn, among-us-role-reveal, anime-wow, applause, apple-pay, bell-ding, boing, bone-crack, bruh, camera-shutter, cash-register, censor-beep, crowd-gasp, deadpan-bruh, ding, discord-notification, drama-boom, dramatic-boomer, dramatic-sting, emotional-damage, error-buzzer, fah, glitch, illuminati-confirmed, keyboard-typing, loading-lag, mac-quack, mario-jump, metal-gear-alert, minecraft-hurt, mouse-click, nelly-ahh, oh-my-god-vine, omg-hell-nah, page-turn, pop, price-is-right-fail, record-scratch, riser, rizz, romance-meme, run-vine, sad-meow, sad-trombone, sad-violin, sanctuary-guardian-what, shocked, shutter-modern, shutter-old, skedaddle, snapchat-notification, spongebob-fail, sub-drop, swoosh-transition, ta-da, triggered, ui-switch, vine-boom, vinyl-scratch, whip, whoosh, whoosh-deep, whoosh-short, wilhelm-scream, windows-xp-error, yippee. | |
| card | No | The hook card: "<4 to 8 words> <window>", e.g. "Get customers for your product 0-5" or "... @"That's exactly"+4". The pops' dark pill in the upper third, popping in, gone when the window closes. The reels pin one from the first half second, with an icon row above the words: add "| brand:meta + <logo mediaKey> = emoji:🚀" (the same whats as pops, a brand in its real colours, joined by + and =), or one mark alone, "| brand:meta", each on its tile, popping in one after the other. | |
| logo | No | The brand lockup small in a corner the whole cut: "<mediaKey> <window> [anchor] [width%] [| Brand Name]" ("0-45" or @"ShapelessAI"..end), top-right and 14% of the frame wide by default, a margin off the edge, the name beside the mark when given (always give it). It fades in and out and steps aside on its own while a full picture, the hook card or a pop on the same corner is on screen. Use the exact logo asset from the brand kit; beside the hook words it goes in the card's icon row. | |
| look | No | Grade the picture, a choice for flat footage or a brand, not a default: clean lifts contrast, colour and sharpness a touch; film is softer with a warm tint and grain; noir is high-contrast black and white; warm is saturated and sunny. Unset keeps the camera's colour, which is right for most phone footage. | |
| name | Yes | A 2-6 word filename for the cut, e.g. "demo hero moments". The user sees it in Assets. | |
| plan | No | Resolve the whole call and render nothing: the paper edit comes back, every beat of the take kept or dropped, where each plays on the cut and what sits on it, with what an editor would send back (a bare beat, a picture that leaves before the thought ends or runs into the next one, the same picture twice). Plan with it until it reads right, then repeat the call without plan to render once. | |
| pops | No | The small things the reels pop beside the speaker ON the word, one per line or semicolon: "<what> <window> [anchor] [size%]". what: brand:nvidia (a company or product's real mark, its own app tile - tiktok, instagram, youtube, linkedin, x, meta, openai, claude, claude-code, gemini, cursor, or any handle brand_mark returned; a domain like jev.ai reaches the long tail), wordmark:claude (the name written the brand's way, on white paper, wider - for a brand the viewer must read, not just recognise), icon:rocket (lucide, a white glyph on a tile in the caption accent), emoji:🔥 or emoji:fire (animated; any other emoji draws as a still), "13,255 visits" (a few words on a dark pill, the last word in the caption accent, quoted), or a media key (a screenshot or logo on a white card). Anchor top by default; in cutout mode the free band is above the speaker, so top, top-left, top-right. One pop per product noun, on the word: @"TikTok". A named platform gets its mark: "TikTok, Reels and Shorts" is three marks in a row (brand:tiktok @"TikTok"..@"Shorts" top-left; brand:instagram @"Reels"..@"Shorts" top; brand:youtube @"Shorts" top-right). The CTA beat shows where to go: the domain in a pill ("shapelessai.com" @"check it out"..end top). | |
| focus | No | "face" finds the person in every kept segment and frames on them, eyes on the upper third - what a talking head wants. Or where the subject is in the SOURCE frame, as "x,y" percentages: "30,50" keeps the left third of a screen recording in a 9:16 crop. Centre by default. Works with or without reframe. | |
| music | No | A bed under the take: "<mediaKey> [gain dB] [duck dB]", e.g. "music/lofi-bed.mp3 -18 12". The voice stays; the bed loops to the cut's length, sits at the gain (-18 by default, under a voice) and is pulled down by the duck amount while the person speaks, back up in the gaps. The key is plan_music's mediaKey or any audio in the library. Masters the cut's sound like normalize_audio. | |
| names | No | The brand, product and domain names, spelled the owner's way, comma-separated: "ShapelessAI, shapelessai.com". A recogniser hears "shapeless AI"; the captions must not misspell the customer. Always pass them when a take names the product. | |
| speed | No | Play the cut faster or slower - 1.5 tightens a demo, 0.5 holds a detail. Audio keeps its pitch. 1 (unchanged) by default. | |
| cutout | No | Cutout mode, the shape the best founder reels run in: the speaker is lifted off their background (a real matte, hair and all) and shrunk to a corner, so the product takes the frame while the take keeps playing. Beats, each "<window> anchor [height%]", one per semicolon: "@"paste the URL"..@"analyze" bottom-right; 12-38 bottom-center 45". Anchors: bottom-left, bottom-center, bottom-right, top-left, top-right, center; the height is a share of the frame, 50 by default. Outside the beats the take is full frame. Put an overlay layer in every beat - a screenshot, a card, the product - or the person is small in front of nothing. A whoosh lands where the mode changes when studio_sound or normalize_audio is on. The reels run three quarters of their length in it: hook and CTA full frame, the demo in cutout. | |
| effects | No | Effects pinned to the person, one per line or semicolon: "<window> <lightning|sparks|glow> from <left|right|any> hand [index|palm|fingertips] [colour]", "<window> <kind> from face" or "<window> <kind> at x,y". The hand is found in every frame and the effect follows it, lightning shooting the way the finger points: @"watch this"+2 lightning from right hand; 4-6 sparks from any hand palm gold. left and right are the person's own hands; any is the safe pick. Colour: a hex or blue, purple, red, gold, green, white. The window must be where the hand is actually in view (look at the filmstrip); the result says how many frames it was found in. A strike lands with a sound when studio_sound or normalize_audio is on. | |
| reframe | No | Re-crop to this shape. Leave unset to keep the source framing. | |
| tighten | No | Transcript-first cut: pauses over 0.5s close to 0.3s (0.45s at a sentence end), dead air before the first word and after the last goes, fillers ("um", "uh") are lifted out, and a sentence said twice keeps its last saying (the founder's retake). Every other word stays. The first thing to do to any recorded take. | |
| captions | No | Word-by-word captions over the cut, timed by forced alignment to what is actually said. Default libass-burn - the cheap tier, which ffmpeg burns in during the same pass, no browser. A cut with no speech in it is left alone whatever this says. Pass "off" to draw nothing: a music-only clip, footage that already carries subtitles, or a cut a project will caption itself. tiktok-pop, brand-block, clean-line and mini-doc are drawn by the browser: pick one when the look matters. | |
| overlays | No | Pictures ON the cut, on the words or seconds named, one per line or semicolon: "<mediaKey> <window> [full|anchor] [width%]". full fills the frame (the demo_page clip or a screenshot behind a cutout speaker); an anchor (top, top-right, right, bottom-left, ...) places a white card in the safe area, 46% wide by default, popping in. A video key plays, an image is drawn. The window is the words it goes on (@"paste the URL"..@"analyze") or seconds of the CUT, after tighten and the ranges, so the picture lands on the noun. A video holds its last frame once it ends: give a clip a window its length, or a longer clip (demo_page: more steps, or "for 2s" holds); the result names a hold. Never fill a window with a still: end the cutout beat where the clip ends instead. | |
| punch_in | No | Frame every other segment closer, each cut by its own amount (7 to 22%, never the same twice in a row), so each cut reads as a change of shot. With focus "face" the closer framing stays on the person. The jump-cut convention of every talking-head short. | |
| budgetUsd | No | Optional: the most this call may spend, in dollars, default 2, max 10. | |
| keep_text | No | The moments to KEEP, one span per "|", as beats from probe_media's transcript ("b1 | b4-b7 | b12") or as the take's own words ("That's exactly what I did ... make some money | I advise you to check it out"), joined in the order given. A quoted span runs from its first phrase to the end of its last ("..." between them); one phrase alone keeps just those words; it must open and close on a thought or a clause. Quote words as probe_media spells them; a phrase said twice takes #2 ("check it out#2"). The cut lands on the words, with a breath of air either side, never mid-word. | |
| media_key | Yes | The clip to edit, as a mediaKey from media_library, an upload, or find_footage. | |
| pad_color | No | The letterbox colour behind a 'contain' reframe, as hex. Default #000000. Match it to the clip or the brand - black bars on a light screen recording read as a broken export. Needs reframe. | |
| background | No | A media key drawn behind the matted speaker in every cutout beat, instead of the blur: a brand backdrop, a product shot, a gradient, or a video that loops (a rendered motion background, a find_footage b-roll). Overlays still sit on top of it. Needs cutout; replaces cutout_backdrop. | |
| keep_ranges | No | The moments to KEEP, in seconds of the source, joined in the order given: "12.5-18.2, 41-55.5". A timecode ("1:05-1:12") works too. For footage with no speech; a take is cut with keep_text. | |
| studio_sound | No | Studio sound for a recorded voice: rumble and room noise out, mud cut, presence lifted, sibilance tamed, then levelled to feed loudness. Use it on any take a person recorded; not on music or a produced mix. | |
| remove_ranges | No | The moments to DROP, same format; what remains is joined. Use instead of keep_ranges, never with it. | |
| caption_accent | No | Hex colour of the word being said in the captions - the karaoke highlight - and the cut's one accent: the pills' last word and the icon tiles wear it too. Match the brand; unset, the burned captions are plain white. | |
| caption_script | No | What is said in the cut, when you know it: aligning against a known script beats transcribing. Omit to transcribe the clip itself. Needs captions. | |
| cutout_backdrop | No | What fills the frame behind the cutout: "blur" (the media overlay on screen, enlarged to cover the frame and blurred, so the product's own colours bleed into the frame; the take itself when no media is on screen; the default) or a hex colour. Needs cutout. For a picture of your own there, use background instead. | |
| normalize_audio | No | Re-level the cut to broadcast loudness, keeping what was said, without the studio_sound cleaning. For a mix that was already produced. | |
| append_media_keys | No | Other clips joined on AFTER this cut, in the order given, as a comma-separated list of mediaKeys. Each is appended whole - trim it in its own edit first if you only want part of it. | |
| caption_foreground | No | Hex colour of the burned captions' other words. White by default. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | ||
| media | Yes | ||
| output | No | The tool's own result, shaped by the tool. | |
| chargedUsd | Yes |