Skip to content

About

A timeline-based clip editor for Windows. Trim, split, fade, zoom and shake; record mic punches; snap to beats; export lossless keyframe-aligned cuts or re-encode via ffmpeg. Electron + vanilla JS.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Clip Merger

A simple, DaVinci-like clip merger desktop app for Windows (Electron + ffmpeg). Put clips, transitions and sounds on a timeline, cut them around, and export a single merged video — lossless-first (stream-copies keyframe-aligned cuts when the source already matches the export size/FPS).

Clip Merger screenshot

Features

  • 3 bins (resizable in both directions, collapsible, thumbnail grids with own scrollbars): Media (videos and images), Transitions (Fade In / Fade Out), and Sounds (incl. music). Each points at a folder (set with 📁 or in Settings); folders are watched, so files added in Explorer appear automatically. An IMAGES subfolder is pinned to the top of Media, an INTERMISSIONS (or INTERSTITIALS) folder is pinned right below it and keeps the blue transition colour on its cards and clips, and any PNG/JPG/JPEG/WebP/GIF/BMP file can be dropped on MAIN or ALT as a 3-second still. The Effects bin's panel sits under Transitions and Sounds; every panel's size and collapsed state is remembered for the next launch.
  • Timeline (bottom, full-width, height-resizable): drag clips from the bins onto it, click-drag to move, drag edges to trim (yellow snap guide), ✂ Split cuts exactly at the orange marker.
  • Playhead/marker follows your pointer exactly — what you see is where Split cuts (press ◆ Marker to leave a marker at the playhead).
  • Snapping toggle: snap to timeline start, the marker, and clip/sound edges while moving/trimming. Trim edges also snap to source keyframes to keep cuts lossless.
  • Floating editor (top-right when a clip/sound/marker is selected): timeline start, source in/out, Full clip, Mute, Detach audio, volume, ♫ Detect beats, Delete.
  • Audio: per-clip Mute; Detach audio pulls that clip's exact cut onto the sound lane (movable/trimmable/deletable); real waveform drawn on every sound; beat markers auto-detected from a sound's transients so you can snap clips to music beats, explosions, shots, etc.
  • Mic recorder: the red Mic button (Sounds bin header) opens a compact audio timeline with a ruler, lane, zoom/Fit, snap, split/delete, undo/redo, a jog/shuttle bar (start / prev cut / next cut / end) and the main editor's shortcuts (Space, R, S, Del, Ctrl+Z/Y, A/D, F, Ctrl+wheel, middle-drag pan). Record punches in at the playhead; drag takes to move (the view auto-scrolls near the edges), drag edges to trim (both directions), and double-click a take to delete it or a gap to close it. Waveforms stay locked to the ruler while you scroll, jog or play, and playback always starts at the take's real in-point. Save writes one 48 kHz mono WAV under Sounds → Mic Record; takes are not auto-added.
  • Fade transition (Transitions bin: double-click to add one at the playhead, or drag it onto MAIN, ALT or SOUND): Fade In (black → picture) and Fade Out (picture → black). The band is a normal effect band — drag it to move it, drag its ends to set how long the fade lasts (double-click deletes it) — and a new fade starts at 3 s. Select it to get an Opacity slider with a % box, the Start/End switch for the end you are editing, and a Fade Audio checkbox (on by default for a clip; a fade dropped on a SOUND item always fades the audio). The preview shows the fade as a black overlay, so it matches the render exactly, and a fade stretched across two clips keeps ramping.
  • Camera effects (Effects bin: drag onto a clip or double-click the card): zoom in/out and shake. Pick Start or End pose, then set the zoom with the FX panel slider or by typing a percentage (5%–800%); drag the picture to move the centre, double-click the preview to reset the pose, and the wheel zooms (Shift = fine). To aim the move, right-click the spot you want to end on and choose End zoom point here (or Start zoom point here); the zoom amount stays whatever the slider says. Pan and zoom run as one camera move, so the destination slides straight to the middle and stays on screen the whole way instead of arriving on the last frame. A zoom always magnifies the clip's Framing — "whole frame + blurred background" keeps its margins, "fill & crop" stays cropped — in the preview and in the export.
  • Favorites: right-click any bin item (including effects) to rate it 1–5 stars, clear the rating, or reveal it in Explorer. Favorites sort above unstarred items and persist per path in the app's user data folder.
  • Freeze frame: with the playhead over a video clip, click Freeze in the Effects bin. It splits the clip if needed and inserts a 3-second hold, then ripples every lane and marker right. Freezes trim like clips, accept camera effects, and exports regenerate the frame from the source at that timestamp — no extra file is saved.
  • Custom timeline scrollbar (drag the thumb / click the track) and a ✋ hand tool to pan the timeline like a touchpad (middle-drag always pans; wheel works too).
  • Export: merges clips in timeline order and preserves gaps as black video with silence, so output time matches the editor and sounds stay aligned. Keyframe-aligned cuts are stream-copied when the source already matches the output size/FPS; other cuts are re-encoded with an auto-detected encoder (AMD AMF / NVIDIA NVENC / CPU libx264). A fade changes the pixels of the frames it covers, so the clips under a fade band are re-encoded too — the rest of the timeline still copies.
  • Save/Open projects (JSON v7; older projects are normalized on load).
  • Settings persist: your ffmpeg/ffprobe paths, the three bin folders, output folder, encoder, size/FPS and normalize flag are remembered between launches.

Requirements

  • Node.js 18+ and npm (tested on Node 24 / npm 11).
  • ffmpeg + ffprobe on your PATH (the gyan.dev full build is recommended, e.g. ffmpeg-*-full_build). If they aren't on PATH, you can point to them in Settings → ffmpeg path / ffprobe path. Install anywhere and put the bin folder on PATH, or set the full paths to the ffmpeg.exe / ffprobe.exe.

Install & run

npm install
npm start

npm start launches the app. On first launch it auto-detects available video encoders (the first detected one becomes the default; change it in Settings).

Usage quick-start

  1. (Optional) Put clips into clips/ (or pick any folder in the Media bin with 📁).
  2. Drag clips from the Media bin onto the Clips lane → they insert at the drop position (snap respected). Double-click a tile to append at the end.
  3. Drag sounds/music from the Sounds bin onto the Sounds lane; drag the right edge to trim, adjust volume in the editor.
  4. Click a clip to move it; drag its edges to trim; put the marker where you want a cut and press ✂ Split. Select a clip and use Mute / Detach audio as needed.
  5. ◆ Marker to add markers; select a sound and ♫ Detect beats to wing beats onto the timeline, then snap clips onto them.
  6. Click Mic in the Sounds bin header to record. Use the mini timeline like the main one — Space play, R record, S split, Del (or double-click a take) delete, Ctrl+Z/Y undo/redo, A/D jump, F fit, Ctrl+wheel zoom, middle-drag pan, and the jog bar to shuttle. Double-click a gap to close it. Save writes the take to Sounds → Mic Record; drag the WAV onto the timeline.
  7. Put the playhead over a video clip and click Freeze in the Effects bin to hold a frame for 3 seconds and ripple the edit. Images dropped on MAIN/ALT start at 3 seconds and can be trimmed longer. For a transition, double-click Fade In / Fade Out in the Transitions bin (or drag it onto a lane), then drag the band's ends to set how long the fade lasts.
  8. Right-click any bin item to rate it (favorites sort to the top) or reveal it.
  9. Choose an output path and Export.

Project layout

package.json          npm/Electron metadata (npm start)
electron/
  main.js             window + IPC (scan bins, thumbnails, waveform, mic, export, save/load)
  preload.js          safe bridge exposed to the UI (window.api)
  image-meta.js       still-image metadata (default duration / no audio)
  library.js          favorites store (normalized path keys)
  mic-save.js         mic filename/path helpers
  ffmpeg/
    encoders.js       encoder detection + process runners
    probe.js          ffprobe metadata + keyframes
    export.js         the export pipeline (lossless cut → concat → soundboard mix)
renderer/
  index.html          layout (bins / viewer / timeline)
  styles.css          dark theme, timeline, bins, editor
  timeline-ops.js     pure timeline/effect math (unit tested)
  mic-wav.js          PCM16 WAV encoder / trim helpers
  app.js              all UI logic
merge.bat             your older one-shot batch merge script (kept, not used by the app)

Troubleshooting

  • “Electron failed to install correctly” (Windows): the npm postinstall download can silently fail. Fix:
    1. Remove-Item -Recurse -Force node_modules\electron\dist
    2. node node_modules\electron\install.js
    3. If it still only writes LICENSES.*, extract the cached zip manually:
      tar -xf "$env:LOCALAPPDATA\electron\Cache\*\electron-vXX-win32-x64.zip" -C node_modules\electron\dist
      Set-Content node_modules\electron\path.txt -Value "electron.exe" -NoNewline
  • Export fails / “ffmpeg was not found”: make sure ffmpeg and ffprobe work in a terminal, or set their full paths in Settings.
  • Media bin is empty even though the folder has clips: the app reads each clip's metadata (duration, resolution) with ffprobe, and skips files it can't probe — so if ffprobe is missing the grid stays empty. Install ffmpeg/ffprobe (on PATH) or set their paths in Settings (saved between launches).
  • Slow encode: first cuts that land on keyframes are lossless (fast); non-keyframe trims need re-encoding. Enable Snap when trimming and you'll tend to land on keyframes (little white ticks on the clip).
  • Preview is per-clip/gap-jumping: scrubbing is exact; continuous playback jumps across cut boundaries (a small gap is normal).

Known limits

  • Timeline gaps are preserved on export as black video with silence; output time matches the editor, and sounds are mixed at their timeline positions.
  • Two video lanes: MAIN and ALT. A MAIN clip wins wherever the lanes overlap; clips on the same lane may not overlap (the editor blocks export until they are resolved).
  • Still images and freezes hold a single frame; they are always re-encoded on export so they can be looped to any trimmed duration.
  • Mic recording uses the current Windows default input device. To use another microphone, change the system default input before opening the recorder.
  • Clips parked in the editing pre-roll (before 0:00) are trimmed to the 0:00 boundary on export.
  • No built-in frame thumbnails on timeline clips (bins show real frame previews).

Changelog

Current version: 0.9.4. See CHANGELOG.md for the full version history (every release, newest first).

License

MIT © 2026 PlayMaGame

About

A timeline-based clip editor for Windows. Trim, split, fade, zoom and shake; record mic punches; snap to beats; export lossless keyframe-aligned cuts or re-encode via ffmpeg. Electron + vanilla JS.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages