Aspects
Nine presets: 9:16 (Shorts/Reels/TikTok), 4:5, 1:1 (square), 3:4, 2:3, 4:3, 16:9 (landscape), 1.85:1, and 2.35:1 (cinematic). Switch aspects and the preview reflows; the crop rectangle is yours to move and resize.
Trim & cuts
Every clip arrives with suggested in/out points from the hook-detect pass. Drag the handles on the timeline to tighten. Press [ and ] to snap the playhead to the boundaries, drag the playhead itself to scrub the preview frame-by-frame. Add inner cuts to drop dead air or fluff in the middle of a take — the renderer concatenates the kept ranges with frame-accurate trim+setpts.
Text overlays
Add multiple text blocks per clip. Each one has its own timing (in/out), font, size, weight, color, position, animation, and effects. Fonts available:
- DejaVu (fallback, always loaded on the render node)
- Inter · Roboto · Open Sans · Liberation Sans · Noto Sans
Animations: none, fade, slide-left, slide-right, bounce, typewriter, pop. Typewriter reveals one character at a time; pop scales 60%→110%→100% over the first ~350ms for an emphatic entry.
Effects: drop-shadow (offsetX/Y + color) and outline (width + color) — both round-trip from the editor preview to the ffmpeg shadowx/shadowy/borderwparams, so what you see is what gets rendered.
Image overlays
Drop logos, lower-thirds, watermarks. Each image gets independent timing, position (xFrac/yFrac), width (% of output), opacity, rotation, and the same shadow/outline effects as text. Reorder via drag-handles in the layer panel — top of the list renders last (on top of everything below).
Position keyframes
For text and images: add ≥2 keyframes touching x or y and the renderer builds a piecewise-linear motion expression for the affected axis. Static-position items just sit at their xFrac/yFrac; mixed (e.g. animated x, static y) work too.
Speed ramps
Slow down for a beat-drop, speed up through filler. Ramps are normalized to non-overlapping ranges, audio is retimed with atempo(chained for ratios outside 0.5×–2.0×), and the editor preview shows the actual time you’ll see in the output (output-ms, not source-ms).
Background treatments
Three options when the clip aspect doesn’t match the source:
- Solid color — pick any hex.
- Blurred source — the original frames, scaled + gaussian-blurred. Good default.
- None — pillarbox with workspace background color.
Filters & LUTs
Eight presets, each a tuned curves combo:
- Cinematic · Vintage · B&W · Warm · Cool · Pop · Faded · Sharpen
Bring your own grade by uploading a .cube 3D LUT in Brand Kit. Once attached to a clip the renderer applies it via lut3d after the preset adjustments — preset and custom LUT compose.
Effects
- Zoom — ease-in-out from 1.0× to 1.2× over the clip duration.
- Fade — in/out durations independently configurable (0–1s each).
- Speed — 0.5× through 2.0× playback with pitch-preserved audio.
Audio
Upload an additional track (music, VO) — it mixes under the source audio with independent volume + offset. The ducking curve is linear; we may add ducking-on-voice in a later pass.
Multi-source stitching
Add additional source clips and the renderer concatenates them with optional xfade transitions (fade, dissolve, wipe-l/r/u/d, slide-l/r/u/d, circleopen, circleclose, radial). Each additional source resolves a stored clipIdto a fresh presigned URL at render time, so re-renders don’t break when URLs expire.
Brand kits
Save fonts, colors, logo, watermark, and LUT as a kit. Apply a kit to a project and every new text block inherits the kit’s defaults. The active kit is sticky per editor session — open another clip in the same project, the kit is still selected.
Multi-select
Shift-click overlays in the layer panel to select multiple, then mass-style: same color, same font, same animation, same position. Cuts down on per-block tweaking when you want ten captions to share a look.
Export
Hit Export and we POST to the Hetzner render service with your full config. ffmpeg produces MP4 (H.264, AAC) targeted at the selected aspect, writes to the workspace S3 bucket, and writes a new Assetrow. Typical render: 15–45 seconds for a 60-second clip. Failed renders surface in /renders with a Retry button (orRetry all failed if a deploy regressed a batch).