Releases: OrellBuehler/kerf
Release list
v0.14.0
Highlights
Cut to the beat
Analyzed music now projects its beat grid onto the timeline: cyan beat ticks appear on the ruler above any audio clip whose analysis detected a tempo, and clip drags, drops and edge-trims snap to the beat — alongside the existing clip-edge, playhead and origin snap targets — so cuts land on the music. The grid follows the clips it belongs to, honors clip speed, skips low-confidence tempo estimates, and fades out automatically when zoomed too far out to be useful. The regular snapping toggle governs it.
v0.13.0
Highlights
The app stays responsive — everything runs off the main thread
The big one: no Tauri command runs on the main thread anymore. Exports, analysis, preview frames, waveforms and imports all run on background threads, and the ffmpeg-heavy paths no longer hold the shared project lock while they decode — so the GUI stays fluid during an export, and an agent skimming footage over MCP no longer stalls your edits (or vice versa). A minutes-long agent export no longer pins a tokio worker, both lock helpers recover from a poisoned mutex instead of bricking every command after a panic, multi-file imports probe in parallel, and agent-edit refresh bursts coalesce into a single re-fetch.
Audible playback
The preview now plays real audio: a Web Audio engine fetches clip PCM windows, schedules them with volume, fades, speed and reverse applied, and the playhead follows the audio clock. Edits mid-playback re-anchor seamlessly.
J/K/L shuttle and in/out marks
Standard NLE transport — J/K/L shuttle with repeat-tap speed doubling up to ±8×, plus I/O to set in/out marks at the playhead (⇧I/⇧O to clear).
Range export
The marks drive export: with in/out set, the export dialog offers Range: in → out and renders only that span — boundary clips are retrimmed honoring speed/reverse, keyframes resampled, overlays clipped.
Edge-drag trim
Drag a clip's edges on the timeline to trim — clamped to source handles, neighbors and a minimum length; left-edge trims keep the right edge put; stills extend freely.
Track ducking and loudness normalization
Flag a music track DUCK and export sidechain-compresses it under the rest of the mix (music dips under dialogue). A one-click Normalize loudness export option masters the final mix to -14 LUFS.
Transcript-based editing
The transcript tab is now an editing surface: click a line to seek, hit × to cut that sentence out of the timeline (removed from the clip and rippled closed). Cut lines render struck through.
System fonts for text overlays
Text overlays can use any installed system font, not just the bundled default.
v0.12.1
Fixes
- Responsive media import — importing many large sources (e.g. GoPro footage) no longer saturates the CPU and freezes the GUI and the agent. Preview-proxy generation now runs through a bounded background worker pool, and each encode is CPU-thread-capped to leave a core free.
Tuning (env vars)
KERF_PROXY_WORKERS(default1) — how many proxy encodes run at onceKERF_PROXY_THREADS(default: cores − 1) — CPU threads per encode
Keep WORKERS × THREADS ≤ core count to avoid oversubscription.
v0.12.0
Highlights
Custom right-click menus
The desktop app no longer falls back to the browser's context menu. Right-click now opens a native-feeling, view-aware menu wherever you are, and editable text fields keep the OS menu so copy / paste / spell-check still work.
- Timeline clip — split at playhead, toggle fade-in / fade-out, remove, ripple-delete.
- Timeline track header & empty canvas — add video / audio track, remove track, toggle snapping.
- Media bin asset — add to the timeline, analyze / re-analyze.
- Inspector — reset transform / color, remove or ripple-delete the clip, add a text overlay, generate captions.
- Agent panel — copy the MCP endpoint or the connect command, quick-queue any preset task.
- Preview — play / pause, jump to start / end.
Preview shows the real composite
The preview now renders the composited timeline frame under the playhead — every visible clip and text overlay layered exactly as it will export — instead of a single source frame, and the preview badge tracks the asset actually under the playhead.
v0.11.0
Highlights
Effects, keyframes, and text overlays
Kerf clips now carry real, non-destructive effect chains and animation, and the timeline carries titles and captions — all rendered through the same positional filter_complex export the engine already used, exposed in the GUI inspector and over MCP.
- Per-clip video effects — blur, sharpen, hue, negate, vignette, and chroma-key (keeps alpha so a lower track shows through).
- Per-clip audio effects — highpass, lowpass, equalizer, compressor, and gate.
- Transform keyframes — animate zoom, position, rotation, and opacity over a clip with piecewise-linear interpolation; the Transform panel auto-keyframes at the playhead.
- Text overlays — titles, lower-thirds, and captions as
drawtexton the final composite, with their own keyframe animation and full text / timing / position / size / color / box / bold controls. - Captions from transcript plus SubRip (
.srt) export. - Wired end to end: new
Projectops inkerf-core, exposed as both MCP tools and Tauri commands, with an inspector UI for editing the chains.
Faster export
- GPU-accelerated export — hardware encoders and decode when available, with an automatic fall back to software decode when
-hwaccelis broken. - Deduplicated inputs — identical export inputs are coalesced and fanned out with
split, so a source used by many clips is decoded once. - Streamed waveform decode — waveforms stream the decoded PCM instead of buffering the whole stream in memory.
v0.10.0
Highlights
Audio analysis for the agent
Kerf now extracts loudness and musical metadata so a connected agent can reason about audio, not just pictures. All of it is cached on the asset's analysis and surfaced over MCP, and runs on the FFmpeg binaries plus light in-house DSP — no new dependencies, and it works in the no-dev-libraries build.
- EBU R128 loudness (integrated LUFS, loudness range, true peak) — level a clip to a target or balance a voiceover against a music bed instead of guessing at a linear gain.
- RMS energy envelope (
get_energy) — a perceptual loudness-over-time curve to find quiet/loud passages and match cut pacing to energy. - Onset / transient detection — snap cut points to hits so edits land on the beat.
- Tempo & beat grid — estimated BPM and beat times with a confidence score, for cutting on the beat.
- Speech-vs-music classification — route ducking/leveling automatically (duck music under dialogue).
Faster preview
- Preview proxy media — an all-intra ~720p proxy is generated per source for instant, smooth scrubbing.
- Further speedups to timeline preview scrubbing.
Editor
- Import still images (PNG / JPEG / …) as timeline clips.
- MCP connection info shown in the agent panel.
- Timeline grid lines are hidden on an empty timeline.
- Windows: the ffmpeg subprocess no longer flashes a console window over the GUI.
v0.9.0
Highlights
Faster exports
- Per-input fast-seek: exporting a cut made of clips from deep in a long source now decodes only the kept regions instead of the whole source from the start — verified frame-accurate, with a large drop in decode time on long sources.
Export progress & cancel
- The export dialog now shows a live progress bar, percentage and ETA while rendering.
- A Stop button cancels an in-flight export; the half-written file is cleaned up.
Performance & responsiveness
- Long operations (export, analysis) no longer hold the project lock, so the GUI and the MCP agent stay responsive during multi-minute renders.
- Process-global frame cache — scrub-back, pause and replay reuse decoded frames instead of re-spawning ffmpeg.
- Preview frames are now JPEG (much smaller, faster scrubbing), playback shows a moving preview, and timeline duration/waveform/ruler work was made cheaper.
- Atomic timeline edits, DB indices, and more robust history recovery.
Editor UX
- File shortcuts (Save / Open / New / Export / Import) and transport keys (←/→ frame-step, Home/End), with seeking clamped to the timeline.
- Undo toast on destructive removals, an honest analysis spinner, live Inspector slider readouts, and assorted accessibility fixes.
v0.8.0
Smoother import & drag-to-timeline
A frontend UX pass focused on getting media into the timeline faster.
Media bin
- Multi-file import — import several files at once. A failed file no longer aborts the batch; it's skipped and reported.
- Import spinner — the media bin shows a loading spinner during the probe phase, and badges the specific asset being analyzed in a multi-import batch.
Timeline
- Bin → timeline drag — drag assets straight from the media bin onto a matching-kind track. A snapped drop ghost previews the placement and turns red to reject overlapping drops (mirroring
move_clip's non-overlap invariant).
Polish
- Text-selection control — chrome text is now non-selectable, with selection opted back in only where it's worth copying: transcripts, agent output, the export ffmpeg command/summary, and inspector timecodes.
Full changelog: v0.7.0...v0.8.0
v0.7.0
See the footage: LLM-visible framegrabs
A connected agent can now actually see the media it edits over MCP — three visual tools return real image content blocks an LLM can look at, not just JSON.
New MCP tools
get_framenow returns a real image block (a low-res JPEG drill-in at a timestamp) instead of an unusabledata:URL string.skim_asset— a tiled contact-sheet montage of an asset sampled across a range, plus a text index mapping each cell to its timestamp, for finding the good parts of footage.preview_timeline— the composited cut at a given timeline time: every clip visible at that moment overlaid onto a black canvas, mirroring the export geometry, so the agent can see the edit.
Engine
New frame_jpeg, contact_sheet, and timeline_frame in the always-on CLI engine (driven by the ffmpeg/ffprobe binaries — no dev libraries needed, works in the --no-default-features build). The build_* argument builders are pure and unit-tested.
get_info now points the agent at the visual tools.
Full changelog: v0.6.0...v0.7.0
v0.5.0
Clip move + ripple-delete and a multi-track timeline
Free positioning & ripple
- Drag clips anywhere on the timeline (pointer tool) — free positioning with gaps, snapping to clip edges, the playhead, and 0.
- Ripple-delete closes the gap a clip leaves (later clips on the track shift left):
Shift+Delete, or the Inspector's "Ripple delete · close gap" button. PlainDeletestill leaves a gap.
Multi-track
- Layer footage on multiple tracks — e.g. B-roll over the interview.
+ V/+ Ain the timeline toolbar add tracks; each track header has a×to remove one. - Drag clips across same-kind tracks (video→video, audio→audio).
Export reflects all of it
The CLI export is now a positional, multi-track render: every video clip is composited at its timeline position (later tracks on top, gaps fall through to black) and every audio-bearing clip is mixed in at its position. Clip placement, gaps, and track layering all render — not just on screen.
Agent / MCP
New tools: move_clip, ripple_delete, add_track, remove_track (also Tauri commands), so a connected LLM can assemble layered, freely-positioned edits.