One timeline.
Drop video, photos or audio from Finder. Photos become 3 s clips you can stretch to 60 s. Drag a clip and its neighbours slide out of the way and snap into place.
BetterEdits is a deliberately small, fast, single-timeline video editor for the Mac, in the spirit of Instagram's Edits. Drop in footage, cut, add voiceover and subtitles, export. Nothing ever waits on you.
Free to try · 38 MB · no account required to edit
Native AVFoundation for media, AppKit and Core Animation for the timeline, SwiftUI for the chrome. The preview renders at 1080p so scrubbing stays snappy on 4K HDR footage.
Drop video, photos or audio from Finder. Photos become 3 s clips you can stretch to 60 s. Drag a clip and its neighbours slide out of the way and snap into place.
Drag either edge of a clip and the viewer shows the exact frame at that edge while you drag. S splits at the playhead. ⌫ deletes.
⌘R records from the playhead while the timeline plays, drawing the take live. Music ducks under voiceovers automatically.
The track's sound goes to Deepgram and comes back split into short bars on a Subtitles track. Edit them inline, pick a style with a live 9:16 preview, and they burn into the export with the same renderer the viewer uses.
Classic, Modern, Strong, Neon, Typewriter, Meme, Elegant and more, bundled as Google Fonts. Every text owns its look; save the ones you like as favorites.
Paste a link. The reel is fetched, Gemini watches it, and a model turns every shot and on-screen text into a template of named placeholders. The original rides along at 50% so you can match shots.
HD, 2K or 4K at 24, 30 or 60 fps. iPhone HLG footage stays HDR through the preview and the HEVC 10-bit export. 9:16, 16:9, 1:1 and 4:5 canvases keep everything where it was.
Projects are folders of JSON. Footage in your shoot folders is used in place, never duplicated; a one-off file travels with its project. Edit project.json on disk and it lands as one undoable step.
The shortcuts you know from Final Cut and Premiere, without the menus you don't. Full undo and redo for everything, including edits made from the command line.
Every library ships with a generated guide and a CLAUDE.md that imports it. Open Claude Code in the folder and it can import media, cut, caption, retime text and export, over a Unix socket to the running app.
BetterEdits cli clip-split v1:1 --at 2
BetterEdits cli captions-generate --track v1
BetterEdits cli text-add "No talking heads." --at 0.3 --for 3.7
BetterEdits cli export --resolution 4k --fps 30Where videos live: a folder of plain files that saves itself and never duplicates a shoot.
A library is a folder with library.json, a settings/ folder, projects/<Name>/project.json and a cache/. Create Library... asks for a name and a place; the welcome screen lists libraries opened before.
New Project asks for a name, creates the folder, and saves the project a second after each change. No dirty state, no recovery prompt, and full undo and redo.
Open, rename, duplicate, trash and reveal projects from the welcome window; each card shows its size on disk. Close forgets the library and shows the empty state, deleting nothing.
Files inside the library's media folders or the library itself are used where they are. Anything else is copied once into the project's media/ folder and stored by relative path, so a project moves as one piece.
Removing a media folder that videos still use warns first and offers to copy the files into each video's own media/ folder before the folder goes (media-folders --remove --consolidate, or --force).
Save a Copy As... writes a project as one .be file, JSON with media references. Import Project File... copies a .be into the library.
Changes to project.json or the settings JSON files on disk are picked up while the app runs. A project rewrite lands as one undoable "Edit on Disk".
The Library button in the project toolbar opens a panel with the library's location, its media folders, and the media the open video uses, copied or in place.
One timeline where footage is dropped, trimmed, split, rearranged and stood in for.
Drop video, photos or audio from Finder, or press ⌘I. Photos become 3 s clips you can stretch to 60 s.
Drag either edge of a clip; the viewer shows the exact frame at that edge while you drag. S or ⌘B splits the selected clip, else the active track, at the playhead. ⌫ deletes the selection.
Drag a clip along the track and its neighbours slide out of the way and snap into place. Drag it up or down to move it between tracks of the same kind.
N toggles snapping to clip edges and the playhead. On a free track ⌥← and ⌥→ nudge a clip by a frame, ⌥⇧← and ⌥⇧→ by a second.
⌘C and ⌘V paste at the playhead on the active track. ⌘D puts a copy right after the original and selects it; it works for clips, placeholders, texts and subtitle bars.
⇧⌘P drops a named stand-in clip at the playhead. On a video track it plays as a black plate with its name, in the viewer and in exports; on an audio track it is silent. Trim, move, split and copy it like any clip.
Replace with File..., the sidebar's Replace... button, or a file dropped on a placeholder takes the clip's spot and length. A shorter file asks whether to keep its own length or fill the rest with a placeholder.
Edit Range... (sidebar, right-click menu, clip-slip) slides which part of a file a clip plays without moving it. The sheet shows the whole file as a strip with a window the clip's length to drag along it.
Video, audio, text and subtitles rows, each with its own panel, lock, visibility and opacity.
On a magnetic track clips stay packed: trims ripple, deletes close gaps, dragging a clip reorders it. On a free track a clip lands at the nearest spot that fits. Text tracks can be magnetic too.
Click a track header to open its properties on the left: name, magnetic, visibility, mute, level, ducking, order and delete. The header itself keeps only magnetic, mute, solo and, on video, the eye.
A locked track refuses every edit: moves, trims, splits, deletes, drops, level and framing changes, and on a subtitles track the bars, style and position. Mute, solo and level still work.
The headphones button solos a track. The eye hides a video, subtitles or text track from the preview and the export; a hidden video track's sound still plays, and hidden tracks dim in the timeline.
Video tracks have an opacity (track panel, track-set --opacity). Below 100% the tracks beneath show through; placeholders take their track's opacity. Headers show a quiet badge when level or opacity is not 100%.
Click a header, or empty space in its row, to focus a track. S, ⌘V and Add Placeholder act there when nothing is selected. Drag the bar above the tracks to resize the area; it scrolls when tracks overflow.
Recording from the playhead, music that ducks, and sound that cuts separately from picture.
⌘R or the mic button records while the timeline plays, drawing the take live on a voiceover track. The transport shows a countdown, then the input device and a live level meter. Stop with Space.
⇧⌘M or drop an audio file on the bottom track. Drag to position, trim the edges, set the volume. A voiceover take is a clip like any other: trim, move, split, level.
Music ducks under voiceovers automatically. Ducking is a per-track switch in the track panel.
Hover a clip with sound to reveal its Final Cut style level line; drag it up or down (snaps at 100%, yellow otherwise). Clips not at 100% wear a speaker badge. Tracks have their own level from 0 to 150%.
⇧⌘D copies a video clip's sound onto a new audio track and silences the video clip, so picture and sound cut separately: a J-cut is a trim away.
Exporting a selected audio clip saves its sound alone as an M4A. A hidden video track's sound still plays; mute the track or set the clip's level to zero to silence it.
Transcribe a track with Deepgram, fix the bars, pick a style, and burn them in.
⌥⌘T (or Generate Subtitles... in a track's panel or context menu) mixes a video or audio track down, sends it to Deepgram, splits the transcript into short bars, and adds a Subtitles track on top.
The bars panel lists every bar for inline editing: click a time to seek, ⋯ or right-click to merge, split or delete. Clicking a bar in the timeline selects it and seeks; Esc drops the selection.
The subtitles track panel has lock, visibility, style, position (Top / Middle / Bottom plus inset), Re-split / Regenerate (which asks which track to transcribe) and arrange/delete.
Settings > Subtitle Styles edits caption styles with a live 9:16 preview: font, size, colours, background, outline, shadow, uppercase, word highlight. The style menu previews each style in its own look.
Settings > Transcription holds the Deepgram key, model, language and the bar rules: max words, max seconds, break on punctuation. Keywords boosts names and jargon Deepgram would otherwise mishear.
Transcripts are cached on disk per track content, so regenerating after a style change costs nothing. The Deepgram key stays in this Mac's defaults, never in the library.
The eye hides a subtitles track from the preview and the export. Visible bars are burned in with the same renderer the viewer uses. Lock the track once the bars are right so they keep lining up.
On-screen text with 17 Edits-style looks, edited in the sidebar and saved as favorites.
⌘T puts a text at the playhead on a Text track on top of the timeline, adding the track if there is none, and focuses its words in the clip sidebar. Double-click an existing text to type.
Click a text in the viewer to select it, drag it to move (snaps to the centre), drag a corner to resize so the whole look scales, double-click to edit its words.
Edited in the sidebar: font, size in points, colour, uppercase and spacing, background box, shadow and outline, plus X / Y and Center.
Classic, Modern, Strong, Neon, Typewriter, Meme, Elegant, Literature, Directional, Signature, Editor, Bubble, Deco, Poster, Squeeze, Journal and Rosalia: the closest Google Fonts, bundled with the app.
The Mac's fonts are there too, and the font menu lists every font rendered in its own typeface.
Saved looks, separate from subtitle styles. The Apply menu shows each favorite's name in that look; Save... stores the current one. Settings > Text Styles edits and reorders them; the default dresses new texts.
Texts trim, move, split, copy and delete like any clip and text tracks can be magnetic. The eye hides a text track from preview and export; exports burn texts in. Text never lengthens the piece.
Paste a reel's link and get a project with the same structure, as editable JSON.
⇧⌘N takes a reel's link and builds a project with its structure. The reel is fetched at its best resolution with yt-dlp (H.264 from VP9); a 720p copy goes to the analysis, the full one stays as the reference.
Gemini reports every shot, on-screen text and sound with timings. The analysis is kept as reel.json in the project folder.
A model behind Vercel AI Gateway (Claude Opus by default, any gateway model id) turns the analysis into named placeholders ("Talking head: hook line"), music and voiceover placeholders, and texts in a matching favorite.
Text the drafting model adds on its own is dropped, and burnt-in captions are noted rather than copied. Without a gateway key the analysis is mapped to a template directly.
The original rides on a "Reference" video track at the top at 50% opacity and 50% level, over the placeholders. When nobody speaks, its sound goes to reference-audio.m4a on the audio track as music.
Keys and models live in Settings > AI and this Mac's defaults, or GEMINI_API_KEY and AI_GATEWAY_API_KEY in the environment. Public posts need no login; yt-dlp can read a browser's cookies for the rest.
A template describes a video without footage: video and audio segments with name, start, duration and notes; texts with words, timing, favorite, position and look; plus name and notes.
Import Template... starts a project from one: segments become named placeholders in order, texts become text clips. template prints the open project as one; template-import --here adds one to it.
Four canvases, on-canvas framing, and an export sheet that follows the footage.
9:16 by default. The pill in the viewer's top-right corner opens into 9:16, 16:9, 1:1 and 4:5 with miniatures and asks before changing (ratio 16:9 on the command line). A cloned landscape reel makes a landscape project.
Positions and scales are normalized, so switching the canvas keeps clips, text and captions where they were. Exports follow the canvas, grown to the footage's size.
Drag the selected video clip in the viewer to move it, pinch or scroll to scale, drag the corner handles, or use Crop mode's edge handles.
The Guides menu on the viewer shades the Reels UI and the feed/grid crop zones, so text and captions land where the app won't cover them.
⌘E opens options like the Edits share sheet: HD / 2K / 4K, 24 / 30 / 60 fps, Normal / HDR. HDR is offered only when the footage is HDR; Normal tone-maps to Rec. 709. Defaults follow the footage.
iPhone HLG footage stays HDR through the preview and the HEVC 10-bit export; otherwise exports are H.264/AAC MP4. The preview renders at 1080p; the export at the footage's size, up to 4K.
Exports burn the visible subtitles and texts in with the same renderer the viewer uses. Hidden tracks are left out. Files land in the project's exports/ folder.
⇧⌘E or the button in the clip sidebar exports just the selected clip: a video clip renders its stretch of the timeline with everything on it.
Every edit is a command over a Unix socket, with a guide in each library so Claude Code can drive the app.
Each library carries BetterEdits.md, a guide rewritten on every launch, and a CLAUDE.md that imports it. It names the binary, lists every command and its options, and explains how tracks, clips, text and captions behave.
The command line is the app's own binary: /Applications/BetterEdits.app/Contents/MacOS/BetterEdits cli. The library's .claude/settings.json pre-approves only that binary, and the path heals itself if the app moves.
Commands reach the running app over ~/Library/Application Support/BetterEdits/cli.sock, launching it in the background if needed, and land as ordinary undo steps. BETTEREDITS_NO_CLI=1 keeps the socket closed.
Tracks are v1, a1, t1, s1, a name or an id; clips are v1:2. Times are seconds, 1:02.5, end or playhead. Positional values fill required options (clip-split v1:1 2); relative paths resolve from the library.
status, timeline, media, probe, favorites, guide and help report the open project, every track and clip, the media in use, a file on disk before adding it, and the saved looks.
track-add/set/remove; media-import, clip-add, placeholder-add, clip-replace, clip-slip, clip-split/trim/move/remove/set/duplicate; text-add/set; transcript, captions-generate, captions, caption-edit, captions-style.
frame --at writes the picture at a time as a PNG with text and captions drawn on. contact-sheet writes one PNG of many frames labelled with their time, 12 by default, to cache/frames/ or --out.
seek, select, app-show, undo and redo; library, media-folders, projects, project-new/open/save, ratio, reel-clone; export with --preview (540p), --resolution, --fps, --hdr and --out, to exports/ by default.
Every key the editor listens to, so your hands stay on the keys.
Space plays and pauses. ← and → step a frame, ⇧← and ⇧→ a second, Home and End jump to the start and end. Click or drag in the ruler or empty track space to scrub.
S or ⌘B split, ⌫ deletes, ⌘C / ⌘V / ⌘D copy, paste and duplicate, ⌥← ⌥→ nudge, N toggles snapping, ⌥⌘L locks the active track, ⌘Z / ⇧⌘Z undo and redo.
⌘R records a voiceover, ⇧⌘M adds music, ⌘T adds text, ⌥⌘T generates subtitles, ⇧⌘D detaches audio, ⇧⌘P adds a placeholder.
Pinch or ⌘-scroll to zoom, ⌥⌘= and ⌥⌘- step it, ⌥⌘0 or the Fit pill resets. Two-finger scroll pans.
Pinch, ⌘-scroll or ⌘= / ⌘- zoom the timeline; ⇧Z fits the whole piece. Two-finger scroll pans it.
⌘N new project, ⇧⌘N clone reel, ⌘O open, ⌘S save, ⌘W close project, ⌘E export, ⇧⌘E export the selected clip, ⌘, settings. Esc deselects the clip, then closes the track panel.
The subscription pays for the parts that cost us money to run: transcription, reel clones and the 4K HDR path.
The editor. Cut, caption, export.
Both apps, one subscription. Footage in, reel out.