Recipes
Short answers for common edits: grades, captions, speed ramps, transitions and more, each one a few props away.
Assemble a rough cut#
Clips back-to-back on V1; each start = running sum of previous durations.
Insert / replace at playhead 3-point editing#
Load media into the Source monitor (double-click a bin item or timeline clip), mark the window with I/O, then , (insert icon) splits straddling clips on targeted tracks at the playhead, ripples everything later to the right by the window length, and drops the Source window in - video brings its linked audio stems. . (replace icon) overwrites instead: punches the placement tracks (V1 + linked stems) over [playhead, +window) with no ripple. Placement lanes are resolved against the live track list and follow targeting - if V1 / A1 / A2 were removed or untargeted, the lowest remaining targeted lanes of the right kind are used instead. Locked clips are never punched or split. A locked clip loaded into Source can't be retargeted with . (toast) until it is unlocked. When Source was loaded from a timeline clip, . instead retargets that clip's In/Out (and its linked stems) and ripples later clips on its tracks if the duration changed.
Ripple delete#
Select clip(s), then ⇧Del or the timeline-toolbar Ripple delete - removes the selection (linked partners included) and pulls later clips left on each targeted track to close the gap. Plain Del lifts (leaves a gap). Sync lock applies: linked partners on untargeted tracks move with the ripple, and locked clips are neither deleted nor moved. An unselected clip that merely overlaps the deleted range stays put - its overlap ends up bridging the shifted-in clip, so a crossfade across the cut survives.
Tighten a cut without breaking the rest#
Ripple edit (B) on the tail of the shot that runs long - the rest of the edit follows. To change where a cut falls between two shots without shifting anything else, Rolling edit (R) the cut. To keep a shot's timing but use a better take of the same moment, Slip (Y) it. To pull a whole segment out of the middle: set IN / OUT around it and Extract (').
Jump to cut#
Select a clip, then ↑ / ↓ - playhead snaps to its In, then Out (further taps walk neighboring cuts). No selection → previous / next cut on targeted tracks. Source monitor: same keys jump among 0 / In / Out / duration.
Protect finished work#
Lock the lanes you are done with (lockedTracks, or the padlock), e.g. setProject {lockedTracks:["A3"]} for a music bed. Now insert, ripple delete and close gap re-time the picture without touching it. To try an alternative without deleting a clip, disable it (⇧E / disabled:true).
Title card#
{kind:"text", mediaId:null, track:"V2", props:{text,fontSize,color}}.
Music bed#
Audio file on A1, props.volume: 0.3, trim with in/duration.
Center a mono stem#
Linked or standalone audio clip with props.pan: 0 (inspector Pan slider, −1…+1). Stereo video stems default to L −1 / R +1; set A1 to 0 to center that channel in the mix.
Cinematic grade#
props.filterPreset: "teal-orange" (tweak with temperature/vignette on top).
Green-screen composite#
Subject clip on V2 with props: {chromaKey:"#00ff00", chromaTolerance:30, chromaSoftness:15}, background footage on V1.
Remove background without a green screen people#
props: {bgRemove:true} - then put anything behind it on V1.
Picture-in-picture#
Clip on V3 with props: {scale:0.35, x:380, y:-200, cornerRadius:24} - add transitionIn: {type:"slide-right", duration:0.5} to fly it in.
Slow motion / timelapse#
props.speed: 0.5 (half speed) or 4 (4×). Remember the source window is duration × speed.
Speed ramp the reel move - fast into slow on the beat#
keyframes: { speed: [ {t:0, v:3}, {t:1.1, v:3}, {t:1.3, v:0.4, "ease":"ease-out"} ] } - sync the drop (t:1.3) to a marker; add transitionIn:{type:"whip",duration:0.2} before it.
Impact hit#
Adjustment layer, 0.25–0.4 s at the hit: {kind:"adjust", track:"V3", props:{shake:20, rgbSplit:8}} + impact-hit.mp3 from library/sfx on A2.
VHS / glitch look#
props: {rgbSplit:4, grain:35, saturation:120} + library/elements/vhs-scanlines.svg on V3 with blend:"soft-light", fit:"stretch". Cut between shots with transitionIn:{type:"glitch",duration:0.3}.
Film look#
Adjustment layer across the whole edit: props: {filterPreset:"cinematic", grain:18} - one clip grades every shot.
Neon caption#
props: {glow:60, glowColor:"#22d3ee", color:"#ffffff", font:"Bebas Neue", textAnim:"wave"} on a dark shot.
Light leak accent#
library/elements/light-leak-warm.svg on V3, props:{blend:"screen", fit:"cover", opacity:0.7}, 1–2 s at scene changes, transitionIn/Out: fade.
Light-leak / dust overlay#
Element from library/elements on V3 with props: {blend:"screen", opacity:0.6, fit:"cover"}.
Reel caption#
Text clip with props: {textAnim:"word-pop", wordRate:0.15, strokeWidth:6, bgColor:"#000000", bgOpacity:0.45, fontSize:88}. karaoke dims words until "spoken"; typewriter for terminal vibes.
RTL / Hebrew / Arabic caption#
Omit direction (defaults to "auto") or set direction:"rtl" explicitly; pick a font with the script's glyphs (Google Fonts work). Animations wipe and stagger in reading order automatically. letter-pop / wave animate whole words on Arabic/Indic lines (not isolated letters) so cursive joining stays correct.
Branded title#
props: {font:"Bebas Neue", weight:700, letterSpacing:6, uppercase:true, color:"#ffffff", color2:"#7b6cff", textShadow:20} - any Google Font name just works.
Kinetic font-cut title rhythmic typeface cuts on the beat, then settle#
props: {font:"Bebas Neue", fontSize:120, uppercase:true, color:"#ffd166", textAnim:"font-cut", fontCutSet:["Anton","Bebas Neue","Archivo Black","Oswald"]}.
Elegant clip-on title letters wipe in#
props: {font:"Playfair Display", fontSize:88, color:"#ffffff", color2:"#ffd166", letterSpacing:2, textAnim:"clip-reveal"} - centered, one clean sweep.
Lower-third reveal#
props: {font:"Archivo Black", fontSize:92, uppercase:true, textAnim:"rise-mask", y:<height*0.30>} - the line rises from behind its baseline. Pair with a serifDrop/zoom-in kicker above it.
Custom font#
Drop MyBrand.ttf into library/fonts/, then props.font: "MyBrand".
Animated sticker#
Author an SVG (convention above) into library/svg/, register {kind:"svg", src:"/library/svg/foo.svg"}, clip on V2/V3. Scale/move/ rotate with normal props & keyframes; the SVG's own CSS animation plays on top, frame-accurately.
Whoosh on a cut#
0.4 s sfx clip from library/sfx on A2 aligned to the cut.
Ken Burns slow push on a photo#
keyframes: { scale:[{t:0,v:1},{t:D,v:1.2,ease:"linear"}], x:[{t:0,v:0},{t:D,v:-40,ease:"linear"}] }.
Crossfade#
Overlap two clips on the same track by ~1 s; later clip gets transitionIn: {type:"fade", duration:1}.
Whip-pan cut#
A gets transitionOut:{type:"whip",duration:0.25}, B gets transitionIn:{type:"whip",duration:0.25}.
Beat-synced cut#
Write beat times into markers, then align clip starts to them (the UI also snaps drags to markers).
Label the structure#
Write named, coloured markers for sections the user can jump between (⇧M / Alt+⇧M, or the Markers list): setProject {markers:[{t:0,label:"intro",color:"blue"},{t:8.5,label:"drop",color:"red"},{t:24,label:"outro",color:"purple"}]}. setProject replaces the whole list - include the existing markers you want to keep.
Music fade-out#
Audio clip keyframes: { volume:[{t:D-3,v:0.8},{t:D,v:0}] } or simply transitionOut: {type:"fade", duration:3}.
Pulse / emphasis#
keyframes: { scale:[{t:0,v:1},{t:0.3,v:1.12},{t:0.6,v:1}] }.
Reframe horizontal → vertical#
Keep a wide composition canvas and crop for delivery - e.g. width:1920, height:1080 with exportFrame:{x:656,y:0,w:608,h:1080} (9:16 fitted to canvas height). Position footage with clip x/y/scale; the export frame can be dragged in the UI. Omit exportFrame to export the full canvas.
Vertical reel#
Set project width:1080, height:1920; use the UI's safe-area guides (▦) to keep captions out of platform UI zones.
Project frame rate#
Set fps in project.json (or the Program Monitor FPS dropdown - 24 / 25 / 30 / 50 / 60). Preview stepping, timecode frames, Fast / WebCodecs / Realtime export, and /api/export/begin all use this value; pass the same fps when starting an export via the API.