Everyframe · creative toolkit
The editing suite, as code.
The non-ML half of the SDK: 150+ typed operations for transitions, titles, grading, compositing, motion and audio finishing. The full FFmpeg toolbox without the FFmpeg strings, rendered on the Everyframe platform.
cut.ts
import { graph } from '@jtdigital/renderbox-sdk';
const g = graph();
const [intro] = g.open('clips/intro.mp4');
const [main] = g.open('clips/main.mp4');
const joined = intro.xfade(main, {
transition: 'circleopen',
duration: 1.0,
offset: 4.5,
});
g.writeVideo('renders/cut.mp4', joined);Cut like an editor, ship like an engineer
Two clips in, one timeline out. Transitions are ops on streams: pick a style, set a duration and offset, and the compiler wires the rest.
Crossfades
xfade blends two clips through dozens of transition styles: dissolves, wipes, slides, circle and clock reveals, pixelize, zoom.
Audio follows
acrossfade transitions the soundtrack in step with the picture; afade and fade handle in/out ramps on either stream.
Cuts & joins
trim and the snip recipe cut frame-accurately with timestamps reset; concat joins segments; tpad and loop stretch them.
Lower thirds, captions, boards
drawtext renders styled text with full expression positioning: centered, tracked to time, boxed. drawbox and drawgrid add graphics; subtitles burns SRT/ASS files.
titles.ts
import { graph } from '@jtdigital/renderbox-sdk';
const g = graph();
const [v, a] = g.open('clips/talk.mp4');
const titled = v
.drawtext({
text: 'Dr. Jane Kovac', x: 80, y: 'h-160',
fontsize: 44, fontcolor: 'white', boxcolor: 'black@0.45',
})
.drawtext({
text: 'Lead Researcher', x: 80, y: 'h-104',
fontsize: 28, fontcolor: 'white@0.85',
});
g.write('renders/titled.mp4', titled, a);Grade with LUTs, curves and scopes
Load a .cube LUT, stack tone curves with photo-style presets, balance shadows and highlights, warm or cool by temperature, then check the result with waveform, vectorscope and histogram monitors.
grade.ts
import { graph } from '@jtdigital/renderbox-sdk';
const g = graph();
const graded = g.openVideo('clips/raw.mov')
.lut3d({ file: 'kodak-2383.cube' })
.eq({ contrast: 1.05, saturation: 1.15 })
.vignette();
g.writeVideo('renders/graded.mp4', graded);Layer, key and stack streams
Every compositor is a typed combine op: watermarks, picture-in-picture, green-screen, split screens. Positions take FFmpeg expressions, so layouts stay resolution-independent.
brand.ts
import { graph } from '@jtdigital/renderbox-sdk';
const g = graph();
const [main, audio] = g.open('clips/main.mp4');
const logo = g.movie({ filename: 'logo.png' });
const branded = main.overlay(logo, {
x: 'W-w-40', y: 40, alpha: 0.9,
});
g.write('renders/branded.mp4', branded, audio);Layers
overlay positions any stream over another with expressions and opacity; blend mixes per-component; maskedmerge composites through a mask.
Keying
Green-screen with chromakey, flat-color keying with colorkey, static-background removal with backgroundkey, selective desaturation with colorhold.
Grids & walls
hstack, vstack and free-form xstack tile any number of streams into split screens and video walls.
Ken Burns, slow motion, stabilization
zoompan animates stills, minterpolate synthesizes slow motion, vidstab stabilizes handheld footage in two passes, and the makeSlideshow recipe turns a folder of photos into a finished video with 12 motion presets, crossfades and a music bed.
slideshow.ts
import { makeSlideshow } from '@jtdigital/renderbox-sdk';
const g = makeSlideshow('renders/slideshow.mp4', {
slides: [
{ path: 'photos/shoe-1.jpg', duration: 3, kenBurns: 'gentleZoomIn' },
{ path: 'photos/shoe-2.jpg', duration: 3, kenBurns: 'gentlePan' },
{ path: 'photos/shoe-3.jpg', duration: 3, kenBurns: 'zoomOut' },
],
resolution: [1920, 1080],
fps: 30,
transition: { type: 'dissolve', duration: 1.0 },
music: { path: 'audio/track.mp3', volume: 0.8, fadeIn: 1.5, fadeOut: 1.5 },
});Finish the sound, not just the picture
Broadcast loudness targets, limiting, compression, de-essing, silence removal and creative effects, plus visualizers that turn audio into video for waveform overlays.
polish.ts
import { graph } from '@jtdigital/renderbox-sdk';
const g = graph();
const [v, a] = g.open('clips/podcast.mp4');
const polished = a
.silenceremove({ stop_periods: -1, stop_duration: 0.6 })
.loudnorm({ I: -14 })
.alimiter({ limit: 0.95 });
g.write('renders/polished.mp4', v, polished);Every op typed. Every graph validated.
Browse the full reference, then describe your first cut. The SDK is free and open on npm.