Connect Claude

Auto Edit Flow speaks the Model Context Protocol. Claude — or any agent that supports MCP — connects to the app on your Mac and edits through 321 tools.

Claude Desktop or Claude Code talks to a small stdio bridge, which talks to Auto Edit Flow's local control server on port 5599, which drives the editor. ClaudeDesktop · Code · any MCP agent stdio bridgestarts the app if needed local server127.0.0.1:5599 · token/mcp · /api/cmd/<tool> Auto Edit Flowtimeline · preview · render scripts and other agents can call the same tools over plain HTTP
  1. ClaudeDesktop, Code or any MCP agent
  2. stdio bridgestarts the app if needed
  3. local server127.0.0.1:5599, token required
  4. Auto Edit Flowtimeline, preview, render

Set it up once

  1. Install the app and open it

    The app starts a private server on your Mac. It only listens on this computer and every request carries a token.

  2. Claude Code

    Run this in a terminal:

    claude mcp add scenely -- node "/Applications/Auto Edit Flow.app/Contents/Resources/app/mcp/stdio-shim.mjs"

    The exact line for your Mac is also in the app under Preferences.

  3. Claude Desktop

    Add the same command as an MCP server in Claude Desktop's settings (name: scenely). The bridge starts the app for you if it isn't open.

  4. Ask for an edit

    Try: “Open my voiceover in Auto Edit Flow and make a seven-minute history video with characters and real maps.”

Ready-made workflows

Pick one in Claude's prompt menu; each spells out the steps and where it stops for your approval.

auto_edit
Build a full edit from a voiceover and a folder of pictures or clips, then review it.
raw_edit
Turn raw camera footage into a finished talking-head, podcast or vlog edit, with three points where you approve.
review_pass
Go through an existing edit and fix pacing, layout and sound.
make_short
Cut a vertical Short from the long edit, reframed and re-captioned.
finish_documentary
Title, chapters, name tags, quotes, ambience and an end screen.
caption_style
Restyle the captions in one of the built-in looks.

Every tool

321 tools, the same names over MCP and over plain HTTP (POST /api/cmd/<name>). Search by what you want to do.

321 tools

  • accents_autoSet the DNA's punch-in accents (density 0..1 of trigger words, scale e.g.
  • accents_datestampsWherever the narration names a year ("In 1554…") a typewriter lower-third appears — "1554 · ALEPPO" when a place is named nearby — on the Accents track, at most one per gapSec (default 40
  • accents_namesWhen the narration introduces a person ("a physician named Walter Oliver", "Walter Oliver, a physician,") a lower third appears — WALTER OLIVER · PHYSICIAN — once per name, on the Accents track.
  • accents_quotesA line worth hearing twice goes on screen, large, while it is said — the captions under it step aside, and the word being spoken lights up.
  • adjust_addAdd an ADJUSTMENT LAYER (grades everything below it) for a time range with effects.
  • align_reportPer-scene alignment confidence for the open project: low-confidence scenes (conf < maxConf, default 0.6) with their VO text and start time; all=true lists every scene.
  • ambience_layLay AMBIENCE beds (room tone / nature under the narration): one looped clip per run [{media, start, end, key}] in frames on an "Ambience" track, low (default −26 dB) with soft fades.
  • app_commandsList every command/tool with its description.
  • app_fontsFont families available to text clips: the bundled Inter, JetBrains Mono and Source Serif 4, plus CapCut fonts and ~/Library/Fonts.
  • app_helpRead this first: how to drive Scenely — conventions (frames vs seconds, track ids, transform units), the recommended workflow for building and reviewing an edit, and which tools to use for what.
  • app_notifyShow a short toast message in the editor UI.
  • app_redoRedo.
  • app_stateEditor state: open project path, playhead, selection, dirty flag, undo/redo depth, duration, track summary, inbox (todo markers + questions the user asked you).
  • app_undoUndo the last project change.
  • assets_fetchDOWNLOAD online candidates — ONLY after the user said yes in chat to these exact files (show title, provider, size, licence first).
  • assets_keysWhich online asset providers are ready (Openverse / Wikimedia always; Pexels / Pixabay / Freesound need the user's own key file) and where each key file goes.
  • assets_online_searchSEARCH ONLINE for B-roll the app can't make (a real place, person, product, event): kind photo | video | svg | sfx.
  • assets_searchSEARCH THE APP'S OWN ASSETS in one go: library drawings (2,000+ story / riso icons), built-in + Lucide icons, your library pictures / clips, blocks and scene templates — for a word ("piggy bank", "house", "rocket").
  • attributes_pasteCopy attributes from one clip to others. fields default: transform, effects, filters, transition, motion, motionParams, mask, crop, blend, fit, style, anim, keyframes, speed.
  • audio_addPlace an audio media on a track (default: sfx track) at a frame/second.
  • audio_add_musicAdd a background music file as a full-length bed on the Music track (-18 dB default, fades, auto-ducked under the voiceover).
  • audio_beatsDetect beats/onsets in a media (default: the music track's clip).
  • audio_carveVOICEOVER CARVE (idea from HyperFrames' audio mixer): keep the music bed alive under the voice.
  • audio_dialogue_chainDIALOGUE CHAIN in one step (the pro voice chain): high-pass 80 Hz → denoise → body / presence EQ → de-ess → compress → −16 LUFS. preset youtube (default) | podcast (heavier) | doc (gentle), or your own fx list.
  • audio_musicAdd a background music bed from an already-registered media id: full length (looped if shorter), gain dB (default -18), fades, auto-ducked under the voiceover track.
  • audio_normalizeMeasure loudness (LUFS) of audio clips and set each clip's gain so it hits targetLufs (default −16 for voice, use −20 for music).
  • audio_processRender audio FX into a new media file and swap it into the clip (player + render both use it): fx types loudnorm | denoise | eq-voice | eq-music | compress | lowpass | highpass | reverb | deess, amount 0..1.
  • audio_silencesFind silent stretches in a media/clip's audio (thresholdDb default −35, minSec 0.6).
  • backdrop_addKind office | hall | war-room | snowfield | sea | beach | ruins | map-paper | desk-top | street | forest-hq | factory | harbor | sky | road | bunker-lin
  • background_addType aurora | mesh | glow | grid | dots | spotlight | stripes | noise | waves | solid; colors [base, c1, c2, c3?] (hex or $bg/$primary/$accent brand tokens — default the brand), spe
  • block_from_clipsTurn clips into a BLOCK object (relative times, positions, looks, keyframes) — what 'Save as block' stores.
  • block_insertA whole designed motion-graphic moment in one call: block = a built-in id (block_list: title-card, lower-third, stat-cards, logo-reveal, cta, checklist, quote-card, icon-row, toast, split-compare, progre
  • block_listThe built-in motion-graphic BLOCKS (templates): id, name, category, what it is, length and its params with defaults.
  • brand_getThe project's brand kit with defaults filled in (what $primary, $accent… resolve to).
  • brand_setBRAND KIT for this project: colors {primary, accent, bg, surface, text, muted} (hex), fonts {heading, body}, logo (image path), name.
  • broll_applyPLACE THE B-ROLL from build/broll-plan.json (or beats): side beats = a card in the look-space (the side the speaker is NOT on, from media_faces) with the drawing drawn on + a chip label, or a counting number; full beats
  • broll_clearRemove every clip broll_apply placed (meta.broll).
  • broll_planB-ROLL PLAN from the A-roll transcript: when to cover the speaker and with what.
  • build_preflightCheck a build's inputs before running it: how many scenes the chunk list parses to, how many of them have a matching clip/image (and which are missing or unused), and — when the voiceover has already been transcribed — w
  • build_projectBUILD A WHOLE EDIT from assets: voiceover + clips/images (+ optional blueprint with per-scene VO text, music).
  • callout_addCALLOUT stuck to an object: a label / bubble / price tag next to a clip (side top | bottom | left | right), with a short pointer line to it — both FOLLOW the object if it moves.
  • callout_beside_faceA key point / stat / word in the look-space right next to the speaker's head (media_faces), at eye level, with a short hand-drawn arrow pointing back at them — the 'he's thinking it' talking-
  • camera_coverageSHOT COVERAGE for one scene: instead of one slow push, the camera cuts (or eases) between a WIDE, MEDIUM and CLOSE shot of the subjects every `every` seconds (≈1.2–2 s — flat history explainers change the picture eve
  • camera_moveMOVE THE CAMERA in one call: from startSec over durationSec to {x, y, zoom, rotation, focus, dof} with ease (default ease-in-out) — a push-in on a detail, a pan across a wide scene, a rack focus.
  • camera_pathCAMERA PATH in one call — a list of stops [{t (sec), zoom?, look? [px,py], rotation?}] the camera flows through without stopping (ease smooth: speed carries through every stop, it only eases in at the first and out at th
  • camera_set2.5D CAMERA over the whole edit: x / y pan (frame units, + = right / up), zoom (1 = none), rotation (roll, degrees), dof (depth-of-field blur, px per depth unit) and focus (the depth that stays sharp).
  • captions_autoGenerate caption clips from the project's voiceover word timings (captions.words).
  • captions_clearRemove generated captions (meta.auto) from the text track (or all text clips with all=true).
  • captions_embedWORD BEHIND THE SPEAKER (the 'embedded caption' look): a huge word sits behind the person — MODNet cuts the speaker out of every frame of the stretch on this Mac (≈0.4 s a frame), the cut-out (VP9 with alpha) goes on a t
  • captions_embed_placeP42 (used by captions_embed): lay out a word-behind-the-speaker moment from a ready cut-out — footage → the word (its own text track above the footage) → the speaker cut out (its own overlay track above the word), the cu
  • captions_generateBuild caption text clips from word timings (seconds).
  • captions_styleRestyle every CAPTION at once (style/anim/transform patches are shallow-merged; preset switches the base look).
  • captions_sync_wordsAttach word timings to caption clips that have none, from the project's transcript (words).
  • captions_transcriptAttach a transcript to the project: the words.json and .srt the transcription produced.
  • captions_words_on_screenHow many words a generated caption shows at once — 1 to 12, or null for the length-based default.
  • chapters_applyChapter markers + 2.5 s title cards (chapter-title preset, on the Accents text track) at the scenes given: [{title, scene}] where scene = a scene number (meta.scene) or a clip id.
  • chapters_from_blueprintRead `#`/`##` headings from the project's blueprint (or the given path) → chapter markers + 2.5 s title cards on the Accents text track; the DNA's chapter transition lands on those cuts.
  • chapters_styleRe-draw the chapter cards of the chapters already set, in another look: card (big centred title), label (small numbered label top-left — documentaries), rank ("RANK n · NAME" — ranking videos), or none (markers stay, car
  • character_sayShow an expression from a moment (startSec or at:{word}) — expression = a name from character_set (fuzzy: "shock" finds Extreme_Shock).
  • character_setSet the presenter once for this project — dir = a folder of expression pictures (Milo: Holding_Phone.png, Extreme_Shock.png…), side left|right, scale, distance from the centre, y; apply=true restyles the clips
  • chart_addDATA CHART, animated: type line | area | crossing (two series; the crossing point is marked, props.crossLabel names it) | bar | hbar | stacked | timeline.
  • clip_addAdd a clip to a track. Give start/end (frames) and media id OR text. On overlay/text/shape tracks a taken time goes to the next free LAYER (a new "Overlay 2" track above) — clips never pile on one row. Returns the clip i
  • clip_animateANIMATE a property in one call (writes the keyframes for you): prop x | y | scale | rotation | opacity | gain | fx.<effect> | shape.w | shape.h | shape.progress; from (default: the clip's current value) → to, starting at
  • clip_batchApply several clip/track commands atomically as ONE undo step.
  • clip_cropCrop a clip by fractions of each side (l,t,r,b in 0..1; round = rounded corners in % — a presenter in a rounded card), or to any polygon: poly [[x,y],…] in fractions of the clip box (a triangle of a picture, the flap of
  • clip_deleteDelete clips by id. ripple=true closes the gap on each track. Callouts, labels and connectors attached to a deleted clip go with it (children:false keeps them).
  • clip_depthPARALLAX DEPTH under the 2.5D camera: 0 = the screen plane (moves with the camera), 1–5 = further back (moves less, e.g.
  • clip_duplicateDuplicate a clip right after itself (ripples later clips on that track).
  • clip_effectsSet color-grade/effects on a clip. effects: [{type, amount}] with types exposure|contrast|saturation|temperature|tint|highlights|shadows (−1..1), sharpen|grain|glow|blur|vignette|bw|sepia|clear|warm|cool (0..1), lut {pat
  • clip_expressionEXPRESSION on a property (After Effects style), evaluated every frame on top of its keyframes: prop x | y | scale | rotation | opacity | shape.progress | shape.trimStart | shape.trimEnd | shape.trimOffset | shape.w | sha
  • clip_filterAdd/replace a look filter on a clip (clear|contrast|warm|cool|vignette|bw|blur…) — stored as an effect (U1 merged filters into effects).
  • clip_fit_speedSet a video clip's speed so its whole source fits the clip length (in=0), or given targetSpeed.
  • clip_freezeFreeze frame: insert a still of the clip's frame at atSec (relative to the clip) for durationSec, splitting the clip and pushing the rest right.
  • clip_insertINSERT a media or text clip at a time, pushing every later clip on that track (or all tracks with rippleAll) to the right by its duration.
  • clip_keyRemove a green (or blue) backdrop from video / picture clips — a colour-difference key that also handles low-saturation olive / teal screens, plus spill suppression.
  • clip_keyframeSet keyframes for a property: scale, x, y, rotation, opacity, rotX / rotY (3-D tilt in degrees on ANY clip — pictures, shapes, text: a glass card turning, a coin spinning, paper flipping), fold (degrees about transform.f
  • clip_maskSet a mask on a clip: shape rect|rounded|circle|ellipse, x/y centre (−1..1), w/h (0..1 of canvas), radius, feather (0..1), invert.
  • clip_matteTRACK MATTE (After Effects): the clip shows only inside the shape of `source` (mode alpha) or only outside it (alpha-inverted) — a rect, rounded, circle, ellipse, a drawing, or any object's box — and follows it as it mov
  • clip_motion_blurMOTION BLUR on moving objects and icons: trailing sub-frame copies while it moves (samples 2–16, shutter = how much of a frame they cover).
  • clip_motion_presetONE-CLICK LIVING MOTION on any clips (expression presets): wiggle | shake | float | pulse | swing | bounce | spin | breathe, amount (1 = subtle, 5 = strong — degrees / % / px-ish), speed (cycles-ish per second).
  • clip_moveMove a clip to a new start (frames, or startSec), keeping its duration; optionally onto another track.
  • clip_parentPARENT a clip to another (After Effects parenting / null object): it keeps where it is now but from then on moves with the parent — and with inherit ["rotation", "scale"] also turns and grows with it (a label on a spinni
  • clip_pathSend a clip (object, icon, text, picture) along a path — a coin flying into a jar, a plane across a map.
  • clip_punch_inPunch-in on one clip at a time (seconds, absolute; default = its start + 0.3 s): a quick scale-up that holds until the cut.
  • clip_replaceReplace a clip with the given JSON (the Code drawer's Clip JSON) — validated against the clip schema, id kept, same track.
  • clip_replace_mediaREPLACE THE PICTURE of a scene (or any media clip) with another media item, keeping its place on the timeline, its length, transition and camera move.
  • clip_reverseReverse a video clip (renders a reversed media file and swaps it in).
  • clip_setPatch any clip fields (start, end, in, speed, gain, muted, motion, transform, transition, text, style, anim, filters, keyframes, meta…).
  • clip_slipSlip a clip: shift its source offset (`in`) by deltaSec without moving it on the timeline.
  • clip_speed_rampSPEED GRAPH for a video clip (time remap): ramp = [[timeSec relative to clip start, speed], …] (first point at 0).
  • clip_splitSplit a clip at an absolute frame (or seconds) into two clips.
  • clip_split_editJ-CUT / L-CUT (split edit) on a video or audio clip — the editor's way to make cuts feel smooth.
  • clip_transitionSet the transition INTO a clip.
  • clip_trimTrim a clip's edges. start/end move the timeline edges; `in` shifts the source offset. ripple=true shifts later clips on the same track by the change in end.
  • clip_zBring a clip to the front / send it to the back of its track, or set z (higher = in front).
  • clips_animateANIMATE MANY clips the same way in one call (e.g.
  • clips_cascadeSTAGGERED ANIMATION of any property across many clips (After Effects offset): each clip gets prop keyframes from → to over durationSec, the n-th one starting stepSec later (order: as given | reverse | center-out | random
  • clips_effects_allApply the same effects patch to every clip on a track (default: first video track) — a quick grade for the whole video.
  • clips_filter_allAdd/replace a filter on every clip of a track (amount 0 removes).
  • clips_groupGroup clips into a compound: they get one group id, so clicking any of them selects the whole group and moving, trimming or transforming one does it to all.
  • clips_group_renameRename a compound group (the name on its bar in the timeline).
  • clips_motion_allSet Ken Burns motion for every IMAGE clip on a track (includeVideo:true = video clips too).
  • clips_nudgeShift several clips by a frame delta (negative = earlier).
  • clips_select_whereFind clip ids by rule: track, kind, minDurSec/maxDurSec, textContains, voContains, confBelow, mediaKind, between (startSec,endSec).
  • clips_set_manyApply the same clip.set patch to many clips (ids) or to every clip on a track.
  • clips_snapMove clips so they START on the nearest of `times` (seconds) when one is within maxFrames — B-roll / graphics entrances landing on the music's beats.
  • clips_staggerMany similar clips enter one after another — each starts stepSec after the previous (in the order given), all keep their end (they leave together unless keepEnd=false, which shifts them whole).
  • clips_transition_allSet the transition INTO every clip on a track (default: the first video track).
  • clips_ungroupBreak a compound back into loose clips. Pass ids (every clip's own group is dissolved) or a group id.
  • clips_varyGive the scenes a fresh look (camera motions on images + transitions) — a thin wrapper over dna.reroll {parts:[motion,transitions]}. style: calm | doc | dynamic; seed to reshuffle deterministically.
  • code_addCODE CARD on screen, in one call (no code writing): a code / terminal window whose lines type in, with a title bar, highlighted rows and an optional footer verdict.
  • color_correctCOLOUR CORRECT each camera (correct before you grade): measures the footage (ffmpeg signalstats over ~10 frames) and fixes exposure (midtones toward ~45 % luma, gently) and white balance (the white patch — the brightest
  • color_lutA 3-D LUT over the corrected footage, mixed by amount (0..1, default 0.7).
  • color_lutsThe looks color_lut can use: built-in ones and your .cube files.
  • color_matchMake every other camera look like `ref` (a media or clip id) — channel gains from the colour means (on the SKIN when both have media_faces, else the whole frame), gamma from luma, contrast from the spread.
  • color_reportRead-only: per camera — luma % (45 ≈ well exposed), colour cast (distance from neutral; under 4 is clean), before and after the current grade, and flags (dark / bright / colour cast).
  • color_resetUndo colour: swap the original footage back for the given clips / media (default all footage).
  • component_addA Remotion component as a timeline clip — for motion graphics the native tools can't do.
  • component_editReplace a code clip's source: compiles it (errors come back with line numbers and nothing changes), updates the clip live, and writes the .tsx back when the clip came from a file (writeFile:false to skip).
  • component_placePlace an already-compiled code clip (use component_add, which compiles a .tsx file or inline code).
  • component_props_setChange a code clip's props (merged unless replace=true) — e.g.
  • component_refreshRecompile code clips from their source files (after you edited the .tsx) — one clip (id) or all.
  • component_sourceRead a code clip's source (from its .tsx file, or the inline code it was added with) and its props — to edit it.
  • component_updateSwap a code clip's compiled code (used by component_refresh after the source file changed).
  • connectCONNECT two objects with an arrow / line that draws on from one to the other and FOLLOWS them if they move; route curve | elbow (flow-chart right angles) | straight, mid = arrow in the middle too, flow = dashes travel al
  • cursor_addCURSOR / HAND for UI demos and promos, in one call: a real cursor (pointer | click | hand | tap | grab | open-hand — Phosphor, MIT) that travels through points [{x, y, t}] (px of its TIP — the pixel the click lands on —
  • cut_silencesJUMP-CUT a talking-head/podcast clip: remove silences longer than minSec (keeps paddingSec around speech), rippling the track.
  • cuts_to_beatsFinds the music bed's beats (audio_beats) and moves B-roll beats, lower thirds, face callouts and social cards (or ids; all:true = every overlay / shape) so they start on the nearest beat with
  • diagram_addType balance — a balance whose beam turns and settles (props: pivot {x,y}, half, hang, panHalf, panDepth — fractions of the box; from / to degrees, + = right end down; at / dur seconds; left / right: coins [{x,
  • dialogue_mirrorP43 (used by audio_dialogue_chain): the A-roll's sound, cleaned, on its own Dialogue track — one audio clip per footage clip (same start / end / in / speed, so every cut, ripple and jump cut stays in sync), the footage c
  • dna_applyRe-apply the stored DNA (all parts or some) — e.g.
  • dna_getThe project's Edit DNA (seed, style, every look decision, locks) with a one-line summary per part.
  • dna_lockLock/unlock parts or fields of the DNA so rerolls keep them: paths like "captions", "grade.preset", "motion.family".
  • dna_rerollNew random choices for the unlocked parts (default all: motion, transitions, captions, grade, music, accents, counters, intro, outro) and repaint them.
  • dna_setPatch the Edit DNA (deep-merged, e.g. {captions:{preset:"hormozi"}}, {style:"dynamic"}, {grade:{amount:0.3}}) and re-apply the parts you touched (style change → all unlocked parts regenerate from the same seed). apply=fa
  • easing_listEvery easing curve name usable in clip_keyframe / keyframes_ease / clip_animate / clip_speed_ramp, grouped, with the bezier numbers for the curve ones.
  • edit_reviewEVERY GATE AT ONCE before handoff: pacing (dead stretches, busy moments), B-roll coverage, layout (small / outside safe / collisions incl.
  • export_capcutWrite the open project as a native CapCut draft (clips/photos on the main track with trims & speed, voiceover/music/SFX audio tracks, captions as CapCut text in the house style with typewriter/slide animations).
  • export_capcut_draftsList CapCut drafts on this Mac (name + track kinds) and whether CapCut is running.
  • export_chaptersYouTube chapters text from markers (00:00 Title per line), also written to <project>/chapters.txt.
  • export_creditsCREDITS for the video description: the attribution line of every downloaded asset still used in the project (from broll/credits.json); writes broll/CREDITS.txt.
  • export_frameExport one frame as PNG at full project resolution (exact Remotion render).
  • export_srtWrite the project's caption clips as an SRT file (default: <project>/<name>.srt).
  • flow_addFLOWCHART that lays itself out: nodes [{id, label, color?, icon? (drawing name)}], edges [[fromId, toId, label?]…], direction right | down, inside box [cx, cy, w, h]. Nodes appear in topological order stepSec apart, each
  • framing_rhythmFRAMING RHYTHM for a talking head after the rough cut: every A-roll cut alternates the framing (base ↔ alt, e.g.
  • gfx_setChange a chart / path / mockup: its props (merged unless replace=true), type, or box size.
  • group_transformMOVE / SCALE A GROUP OF OBJECTS as one: group = a group id (clips_group) or ids = clips; dx / dy in pixels, scale around the group's centre (objects grow, and their spacing with them), or to = [cx, cy] px to put the grou
  • icon_addAdd an icon overlay: name = a built-in id or any of the 1,854 Lucide icons (icons_list {query}), or an absolute image path.
  • icons_listIcon ids usable with icon_add: the built-in set, plus the 1,854 Lucide icons (pass query to search them by name, e.g.
  • image_animateANIMATE PICTURES BY HAND, FROM THE SCRIPT (no DNA): one call, many scenes (items).
  • images_analyzeRead-only: for image files, where the subject sits (x, y from −0.5…0.5, y down) and what the picture looks like overall (mean/std brightness, 64-bit dHash).
  • images_animate_aiEach image scene (all, those in fromSec–toSec, or ids) gets the camera move a human editor would pick for what is said over it — push in on a number, pull back on 'the whole world
  • images_animationTurn image animation (Ken Burns camera moves + punch-in accents) ON or OFF for the whole project — both ways, any time.
  • images_focusFind where the subject sits in every still (a quick saliency pass on a thumbnail — faces, figures, whatever stands out; cached) and make each image clip's zoom/push pivot on it instead of t
  • images_looksThe ways a still can move that are NOT a zoom: float (a floating framed print), ripple (water), haze (heat), rgb-glitch (colour-split glitch on a word), vhs (old tape), pulse (heartbeat), tilt-shift (mini
  • images_scriptEvery image scene (or those in fromSec–toSec) with what the voiceover says over it, its key words and when they are said (seconds), its current move, the subject focus, whether it is lo
  • images_sketchThe picture DRAWS itself on screen — its own line-art becomes pen strokes drawn in a natural order with a pencil at the tip, then the colour picture fades in over the drawing.
  • keyframes_easeGRAPH EDITOR for many keyframes at once: set the easing curve of keyframe segments.
  • layout_applyArrange clips into a split-screen / PiP layout by setting their transform+crop: presets split-lr, split-tb, pip-br, pip-bl, pip-tr, pip-tl, quad, triptych.
  • layout_arrangeArrange clips (text, shapes, icons, charts, mockups) in a row, column or grid — sized from what they are, centred on x,y, gap as a fraction of the canvas.
  • layout_reportLAYOUT / TYPOGRAPHY CHECK (read-only) — measures where text sits, in screen pixels at each text's middle frame (camera applied; camFixed clips ignore it): SMALL text (under minPx — default 28 px at 1080p 16:9, 40 px in 9
  • lower_third_addWho is speaking: name (+ role) in one of 9 designed styles: clean-bar (white bars, ink text) | kicker-name (small accent role over a big name, no box) | side-rule (an accent rule that grows, text beside
  • map_addTrue country borders (Natural Earth) in Mercator, full frame by default.
  • map_placesThe place names map_add understands (WW2 cities, battles, regions) and the named views.
  • marker_addAdd a marker/chapter at a frame.
  • marker_removeRemove a marker.
  • marker_setPatch a marker: label, note, kind (marker|chapter|todo|done), color, frame/seconds.
  • markers_listMarkers with their kind and note, seconds and the scene under each.
  • media_addRegister a media file (path, kind) in the project media pool.
  • media_analyzeAnalyze a media: duration, size, fps, loudness (audio), scene-change count (video), silence ratio.
  • media_auditCheck every media entry's file against disk.
  • media_cutoutCUT AN ELEMENT OUT of a flat illustration so it can move on its own (a character, an object): keep = the region {x,y,w,h} (fractions of the picture) around the element; the background inside it (any colour — sampled from
  • media_facesFind the speaker's face in footage (YuNet, on this Mac — nothing uploaded) at fps samples a second (default 2), smooth it into a track and store it on the media.
  • media_fix_missingOne click after importing replacements: (1) relink every offline media entry (offlineIds, from media.audit) to a same-named non-offline entry if one exists — clips keep their exact timing, the now-redundant duplicate is
  • media_importProbe and register files (or every media file in a folder) into the project media pool.
  • media_probeFfprobe a file: duration, width, height, fps, has_audio.
  • media_probe_dirCount the media files in a folder (videos / images / audio) — quick check before build_project.
  • media_pruneRemove media entries no clip uses. Returns the removed ids.
  • media_relinkPoint an existing media entry at a different file on disk — for a source that moved, was renamed, or lives on a drive that changed letter/mount.
  • media_relink_by_nameBulk-fix offline media by filename: pass the offline ids (from media.audit).
  • media_removeRemove a media entry (fails if any clip uses it).
  • media_set_facesStore a face track on a media (what media_faces measured).
  • media_set_focusRecord where the subject sits in stills (x, y from −0.5…0.5 of the picture's centre, y down) and aim every image clip's camera at it: zoom-type moves then pivot on the subject instead of the frame's centre.
  • media_swapPoint every clip that uses media `from` at media `to` instead (same length — a graded or cleaned copy), carrying the face track / focus / alpha over.
  • media_thumbnailReturn a thumbnail IMAGE of a media item (video frame at `seconds`, or the image) so you can see what it shows.
  • media_transcribeTRANSCRIBE any audio/video file (AssemblyAI) → word timings in seconds (first 400 unless full=true) plus the .words.json / .srt it wrote next to the file.
  • mockup_addKind phone | browser | form | dropdown | toast.
  • motion_onionONION-SKIN MOTION CHECK (idea from HyperFrames' keyframe diagnostics): renders `samples` frames between fromSec and toSec and blends them into ONE ghost image, so an agent can see motion instead of guessing: evenly space
  • music_layLay a SCORE: one music clip per segment (frames), each looped to fill it, crossfading into the next (the two alternate between two music tracks so the fades really overlap), faded in at the start and out at the end, and
  • music_scoreMusic from a folder (dir, or Preferences ▸ music folder, default ~/Desktop/Finance/tools/music) or given files — a new track at each chapter (never sooner than minSec, default 60), crossfaded, ducked under the voi
  • music_suggestThe tracks in your music folder (Preferences ▸ Music folder, sub-folders = moods) ranked for a mood and a length — mood from the folder or file name, duration fit, and the tempo when it can be measured.
  • number_addBIG NUMBER as an object ("$10,272", "15%", "40 years"): counts up to `value`, two-tone (the part before the first comma / point in `fill`, the rest in `fill2` — or splitAt), outlined, with a soft ground shadow under it.
  • number_wheelA big number whose digits roll into place like a slot machine (left digit stops first), with a short line under it.
  • objects_rowLAY OUT A ROW OF OBJECTS in one call — the fastest way to build a scene: items [{kind | svg, label, sub, atSec or at:{word}, fill, accent, …}] are sized, spaced and centred in a region (full | left | right | center, or [
  • outro_roomMake room for an end screen AFTER the voice: when the narration runs to the last frame, the last scene is held sec seconds longer (a still picture simply lasts longer; a clip freezes on its last frame), so the end screen
  • overlay_addFINISHING OVERLAY over the whole frame: grain (film grain), black-noise (P47: fine dark specks that change every frame + a faint flicker — old film / night footage; 0.15–0.35 is subtle), film-dust (P48: the 'white noise'
  • pacing_reportPACING / RETENTION CHECK (read-only) — measures the edit against the pro-editing rules: DEAD STRETCHES (no new element and no camera move for longer than maxGapSec, default 7 s — explainers want a visual change every 4–7
  • particles_addPARTICLES in one call — preset coin-burst | confetti | sparkles | money-rain | dust | hearts, from a point (x, y px) or over a box (money-rain falls across it), at startSec (or at:{word}) for durationSec; any particles f
  • path_addA PATH drawn on: props.points [[x,y],…] in 0..1 of the box (smooth unless smooth=false) or props.d (SVG path in box px); stroke, width, dash, glow, arrow (head at the end), at / dur (seconds).
  • precomp_expandUN-NEST a precomp: its clips go back onto the main tracks at their times (the precomp clip's own start); the precomp clip is removed.
  • preview_contact_sheetOne IMAGE with N frames sampled across the timeline (or a range) in a grid — the fastest way to see the whole edit at a glance.
  • preview_diagWhy is the preview blank? The editor's recent errors (composition crashes, unhandled rejections, console errors) and the player's on-screen state: stage and player size, how many layers are mounted, the frame it thinks i
  • preview_framesOne grid image of the frames at the given seconds (≤ 36), each labelled with its time — for reviewing graphics and cuts in one look.
  • preview_gifA GIF of fromSec–toSec (default 6 s): renders that range at draft size and converts it with a per-clip palette.
  • preview_highlightFlash clips in the timeline so the user sees what was just changed (does not change selection).
  • preview_pausePause playback.
  • preview_playStart playback in the editor.
  • preview_qualitySwitch the editor preview between 'proxy' (fast, low-res) and 'full' (original media).
  • preview_screenshotCapture the preview canvas at a frame (seeks there first) and return it as an image.
  • preview_seekMove the preview playhead. Give frame OR seconds.
  • preview_selectSelect clips in the editor UI (ids) and scroll the timeline to the first one.
  • progress_ringPROGRESS RING (a radial gauge) that fills to `value` (0..1) with a counter in the middle: box [cx, cy, size, size] px, startSec, endSec, fillSec, color / gradient [a,b], track colour, thickness (fraction), label under th
  • project_checkRun before rendering: black gaps on the scene track (and a black ending), missing media (pass offline ids from media_audit), scenes under 0.4 s, clips that freeze on their last frame, >2.5× fast-forward, t
  • project_closeClose the open project and go back to the projects screen.
  • project_duplicateSave a copy of the open project as a new project folder (media stays where it is — paths become absolute).
  • project_getGet the project. mode=summary (tracks + clip counts + first/last clips), tracks (all clips, compact), full (entire project.json).
  • project_listEvery project on this Mac (projects folder + recent): folder path, name, size, fps, length, scene/caption counts, whether it has music, last modified, and which one is open.
  • project_list_recentRecently opened project paths.
  • project_newCreate and open a new EMPTY project (default tracks: Scenes, Objects, Captions, Voiceover, Music, SFX) saved as <dir or ~/Desktop/Finance/projects>/<name>.fsproj.
  • project_openOpen a Scenely .fsproj folder, a project.json, or a legacy Finance Editor timeline.json (auto-migrated).
  • project_restoreReplace the open project with a snapshot file (from project.snapshots).
  • project_retimeChange the project frame rate WITHOUT changing the edit: every frame-valued field (clip starts/ends/ins, transitions, keyframes, fades, markers…) is rescaled so timing in seconds stays identical.
  • project_saveSave the project. Optional path (.fsproj folder) for Save As / first save of a migrated project.
  • project_setSet project-level fields (name, width, height, background, speech ranges, the blueprint/chunk-list path, the transcript refs).
  • project_snapshotWrite a labelled snapshot of the current project into <project>.fsproj/history/ (restore with project.restore).
  • project_snapshotsList snapshot files for the open project.
  • project_summary_textHuman-readable summary of the edit: tracks, scene list with times and VO, captions count, markers.
  • proxies_buildBuild low-res intra-only preview proxies (VideoToolbox) for every video in the project — makes scrubbing/playback instant.
  • proxies_cancelStop the running proxy build.
  • proxies_statusProxy build progress {total, done, failed, active, building}.
  • range_deleteCut a time range out of the WHOLE timeline — every unlocked track is razored at both ends, what lies inside is deleted and everything after slides left (voiceover included, so narration and scenes sta
  • ranges_deleteRange_delete for many ranges at once (one undo).
  • raw_ingestImport the raw recordings (files or folders), lay them in order on the A-roll (video → Scenes track, audio-only → Voiceover), transcribe each with AssemblyAI (speaker labels on, for interview
  • raw_rough_cutROUGH CUT in one pass: dropped takes + false starts, fillers (um/uh), stutters, dead air shortened to a natural pause and the head/tail trimmed — breaths kept (leadSec before the next word, tailSec a
  • razor_allSplit every clip on every (unlocked) track at a time — like a razor across the whole timeline.
  • recipe_applyEdit the open project the way this kind of video is edited, in one step — camera, cuts, grade, accents, chapter look, name tags, date stamps, pull quotes, key words, ambience, score, title after the cold ope
  • recipe_listThe Edit Recipes — how each kind of video is edited (documentary, explainer, ranking, story, podcast, shorts): id, what it does.
  • reframe_projectChange the canvas aspect (9:16, 1:1, 4:5, 16:9, 4:3) and refit every video/image clip.
  • render_cancelCancel the running render.
  • render_draftDRAFT FOR REVIEW in one call: renders a 720p draft (preset x-720p; fromSec/toSec for a part) into <project>/renders/drafts, then a hook GIF (first hookSec, default 6) and a contact sheet (sheetCount frames) from it, and
  • render_queue_addQueue a render of the open project (saved first) or of any saved project (projectPath = .fsproj folder).
  • render_queue_clearClear finished (default) or all not-running queue items.
  • render_queue_listThe render queue (queued / running / done / error) with output paths.
  • render_queue_removeRemove one queued item by id.
  • render_startRender the open project to MP4 with Remotion (blocks until done; poll render.status from another call for progress).
  • render_statusCurrent render state (staging/rendering/done/error), frames, fps, ETA, output path, GPU info and presets.
  • resources_addADD A RESOURCE to the edit by id (from resources_list) at atSec — does the right thing per kind: sfx → placed on an SFX lane (gain), music → a bed, image/video → a clip (as:'scene' for the scenes track, else overlay; x/y
  • resources_importCopy files into YOUR resource library (the originals stay put): kind sfx | music | image | video | component | block | brand, category (a folder), and — for anything downloaded — license + source so the terms travel with
  • resources_linkLink a folder as a resource source without copying it (a stock-footage drive, another SFX pack): dir, kind (image/video/sfx/music).
  • resources_listEverything to edit with, searchable: kind sfx | music | image | video | block (motion-graphic templates) | background (animated) | component (code clips) | brand (colour kits) | shape (flat objects and
  • resources_removeRemove an item from YOUR library (moved aside, not deleted).
  • resources_save_blockSAVE clips as a reusable BLOCK in your library (their texts become {{text1}}, {{text2}}… params) — insert it again anywhere with resources_add.
  • resources_save_brandSave the project's brand kit (brand_set) to your library so other projects can use it.
  • resources_save_componentSave a Remotion component (code or a .tsx path) to your library as a reusable code resource.
  • resources_save_sceneSAVE A WHOLE SCENE as a template in your library (objects, titles, connectors, callouts and their sounds between startSec and endSec, links kept): name, desc, tags.
  • resources_save_shapeSAVE A DRAWING to your library so it can be used again in any project (resources_list kind shape): svg = markup (with {fill} {stroke} {accent} tokens) or path data, or id = a svg shape clip on the timeline; name, desc, t
  • roomtone_fillROOM TONE under the A-roll: takes the quietest ≥0.6 s of the recording's own silence, loops it on the Ambience track under the whole A-roll (−40 dB) so jump cuts never drop to digital silence.
  • scene_checkLOOK FOR LAYOUT PROBLEMS in object scenes without rendering: samples the edit (every stepSec, or at seconds) and reports objects overlapping objects, text over objects or over the character, anything leaving the frame, t
  • scene_fixFIX WHAT scene_check FINDS, in one call: overlapping objects are pushed apart, anything over the character moves away from it, things off the frame come back in, tiny text grows to minTextPx.
  • scene_from_lineThe nouns in text are matched to the object library (rent → house, coffee → mug, salary → bill, savings → piggy bank, market → growth chart…), laid out as a labelled row where each obje
  • scene_insert_templatePUT A SCENE TEMPLATE on the timeline at atSec (or at:{word}): its clips come back with their timing (stretched to durationSec if given), links and attachments; replace {"old text": "new text"} rewrites its titles / label
  • scene_precomposePRECOMPOSE (After Effects): everything that starts between startSec and endSec (objects, drawings, titles, icons, graphics — sfx=true takes their sounds) becomes ONE clip holding a nested scene: move, scale, fade, matte,
  • scene_retimeMove a scene clip's START to a frame (or seconds) and keep the track continuous: the previous clip's end follows, both clips' speed is refit for 8 s clips.
  • scene_selectEvery object, drawing, icon, title, graphic (and with sfx=true its sound effects) that STARTS between startSec and endSec — not captions, the backdrop, pictures on Scenes or the character.
  • scene_shiftMOVE / RETIME A SCENE as one unit: the objects that start between startSec and endSec (see scene_select; sfx=true takes their sounds too) move by bySec, or are stretched to fit toStart..toEnd (their timing inside the sce
  • scene_to_templateEverything that starts between startSec and endSec (objects, drawings, titles, connectors, callouts, icons, graphics and — sfx=true — their sounds) as a reusable template: times relative to the sce
  • scenes_detectDetect scene changes inside a video media (threshold 0..1, default 0.35).
  • scenes_plan_missingWhere each MISSING scene actually belongs, from the chunk list.
  • scenes_reviewMark scenes as looked-at (reviewed=true) or not — the Scenes panel's "Needs a look" filter and the N / ⇧N jumps skip reviewed scenes.
  • script_runRun JavaScript against the editor as ONE undo step.
  • sfx_autoAuto-place SFX from the library: a whoosh on transitions, an optional impact on markers, and sounds on trigger words (triggers: {money:'cash', number:'click', 'explosion|boom':'impact'} — keys are money|number|pause or a
  • sfx_findSearches the library with what each sound IS (duration, peakSec = when its hit / swoosh tops out, onsetSec, levelDb) so you can place it without measuring.
  • sfx_libraryBrowse the sound-effects library (~/Desktop/Finance/tools/sfx/pack): categories with file paths.
  • sfx_placeRegister a sound file (from sfx.library or any path) and place it at frame or seconds — the time is never moved: if that spot on the SFX track is taken, another SFX lane is used (or added) and returned.
  • shape_addAdd a shape (svg paths may carry data-arrow="size" — an arrowhead that rides the trim end, and dashed strokes draw on with trim too; finish: dropShadow {x,y,blur,color,alpha}, glow {blur,color,alpha}, backdrop = frosted-
  • shapes_catalogEvery shape kind (with what it draws, its natural width÷height and the params that matter), the entrances / exits, the colour tokens for svg drawings, and a worked example.
  • shorts_makeTurn a stretch of the open long edit into a new vertical Short project — everything outside startSec…endSec is cut away (voiceover, scenes, captions and word timings stay in sync), the canvas is reframed (d
  • skills_appendAdd what you just learned to a skill (a recipe that worked, a pitfall) — appended under '## Learned' with the date; a built-in skill is copied to the user library first.
  • skills_listEDITING SKILLS built into Scenely (and the ones you saved): name + one-line description of each — how to make a kinetic-type reel, an explainer, a UI promo, recreate a reference, sound design, visual style… Read `start-h
  • skills_readRead one editing skill (markdown) by name — method, recipes, exact parameters, pitfalls.
  • skills_saveWrite / overwrite an editing skill in the user's library (wins over a built-in of the same name): name (kebab-case), description (one line: when to use it), content (markdown body).
  • social_cardA post / comment the speaker is talking about, drawn natively and animated in: platform x (post: avatar, name, @handle, text, replies/reposts/likes) | reddit (r/sub · u/user, title, body, upvotes) | you
  • sound_ambienceRead each scene's narration for where we are (cave, rain, fire, river, night, forest…) and lay a quiet looped bed from the SFX library under those stretches (−26 dB, soft fades) on an Ambience track.
  • stage_clearCLEAR THE STAGE at a moment: every object, drawing, icon and title on screen at atSec leaves together — style undraw (outlines rub out) | fade | drop | pop | fly-left | fly-right — staggered by `stagger` s.
  • style_applyApply a saved style to the open project (captions restyled, transitions set, grade applied).
  • style_listList saved styles.
  • style_saveSave the current look as a reusable style: caption style/anim, transition type, music gain/duck, adjustment effects.
  • table_addCOMPARISON TABLE that builds row by row: columns [header…], rows [[cell…]…], highlight (a column index that wins — tinted + bold), check / cross marks (cells "✓" / "✗" are coloured).
  • takes_detectRETAKES + FALSE STARTS in the A-roll transcript: groups of attempts at the same line ("So the thing is—" / "So the thing is that…"), each attempt scored (complete, fluent, confident) and the one to keep chosen (ties → th
  • template_applyApply a template to the open project: its DNA is set and painted; its music is added when the project has none (music=false skips).
  • template_listList project templates.
  • template_saveSave the open project as a reusable TEMPLATE (Edit DNA, caption preset, music file, canvas + fps) in ~/.config/scenely/templates/<name>.json.
  • text_addAdd a text clip. style.maxLines N = FIT TO N LINES (the size shrinks, never grows, until the text wraps to at most N lines — a number or a title never breaks onto a second line when maxLines is 1). preset: plain (DEFAULT
  • text_kineticKINETIC TYPOGRAPHY in one call — the Apple / promo style where a line builds word by word.
  • text_kinetic_relayoutRe-measure a kinetic line (text_kinetic) with the real font and put its words back at the right spacing — the editor runs it by itself once a web font finishes loading; group = the line's id (meta.kinetic.group), or all
  • text_pathThe text runs along svg path data `d` (canvas px — e.g.
  • text_presetsList text presets with their default style/anim/transform.
  • theme_applySTYLE KIT in one call — sets the brand colours + fonts, lays the background and returns the palette / fonts / tips to build with.
  • timeline_atWhat is on screen / audible at a time: every clip covering that moment (track, id, media, text, vo).
  • toon_addAn original flat character that breathes, blinks, TALKS (its mouth flaps over talk ranges — pass words = the voiceover words or talk = [[startSec,endSec]…]), changes walks (w
  • toon_crowdRows × cols of small people (heads + shoulders, mixed coats and skin tones, some caps) filling a box (canvas px [cx,cy,w,h]); during cheer = [[startSec,endSec]…] (timeline seconds) their arms go up and they bo
  • track_addAdd a track. kind: video|overlay|text|audio|music|sfx. Optional index.
  • track_close_gapsRemove empty gaps between clips on a track (shifts clips left).
  • track_heal_gapsClose tiny gaps BETWEEN clips by extending the earlier clip up to the next one (keeps every clip's start, so audio sync is untouched).
  • track_moveReorder a track to a new index (0 = bottom-most / first rendered).
  • track_removeRemove a track and all its clips.
  • track_setPatch a track (name, locked, muted, solo, hidden, duck).
  • track_spread_layersA track whose clips overlap in time (things piled on one row) is split into layers — each overlapping clip moves to the next free layer of the same kind, keeping its time.
  • track_stack_layersThe numbered layers of a track (Shapes 2, Shapes 3… Titles 2…) are merged into the first one, their clips drawn in sub-rows on one timeline row — the inverse of track_spread_layers.
  • transitions_aiEach cut (all, those in fromSec–toSec, or the scenes in `ids`) gets the transition an editor would pick for what is said either side of it — a wipe up on gro
  • transitions_catalogEVERY TRANSITION and every picture look the editor has: id, label, natural length (seconds), energy (soft | medium | loud — loud ones are seasoning), what it does and what it is good for, and (transitions) the kind of so
  • transitions_scriptEvery cut between two scenes on the Scenes track (or those in fromSec–toSec) with the words said either side of it, the pause between the two lines, its current transition (type, frames), w
  • transitions_setSET TRANSITIONS BY HAND, FROM THE SCRIPT (no DNA): one call, many cuts.
  • transitions_sfxEvery transition on the Scenes track gets the sound that fits its type — a whoosh / sweep for slides and wipes, a hit for zoom-punch and bump, a click for blinds and the clock, a glitch for RGB
  • ui_showDrive the editor UI like a person would: open a left-panel tab (scenes|media|text|effects|audio), a drawer (problems|history|script|agent, or none), the Export dialog (dialog:'export'|'none'), help (how|shortcuts|claude|
  • voiceover_cleanRenders a new audio file with the cuts removed (12 ms fades at every join) and — gaps:true (default) — every silence longer than maxGap (1.6 s) shortened to keepGap (0.75 s), plus the dead air at bot
  • voiceover_cutCUT THE VOICEOVER in the app: keep:"cut" removes startSec–endSec, keep:"range" keeps only that stretch (a 2-minute cut of a long piece).
  • voiceover_junkFIND JUNK IN THE VOICEOVER (from its word timings + confidences): fillers (um, uh), stutters (the same 1–3 words twice in a row), TTS gibberish (a line with several low-confidence words, or a short line with a word that
  • words_deleteF6 filler removal: cut every occurrence of the given words (default um/uh/erm/hmm) out of the whole timeline with range_delete (voiceover, scenes, captions all slide together).
  • words_findSearch the voiceover transcript for a word/phrase; returns the times it is spoken (seconds).
  • words_listThe voiceover word timings [{text,start,end}] in seconds (from captions.words).

Safe by default

  • The server listens on 127.0.0.1 only — nothing on your network can reach it.
  • Every request needs the token the app writes on your Mac.
  • Downloads from the web happen only after you say yes, with the source and licence shown.
  • Your footage is never uploaded; only transcription audio goes to the provider you set.