FunClipper - simple app for merging/cutting videos and scripts and creating compilations

Since this is built using Electron, is a macOS version possible?

@cstimmer
You are reading my mind :grinning_face_with_smiling_eyes: I already implemented it. I added a separate merge mode that allows instant video merging if they are identical. It will be available in the next version as soon as I finish implementing support for multi axis scripts

@wallballs
For now I don’t have it planned, but I will think about it

2 Likes

UPDATE 1.3.0

  • Merge Mode
    Added a new “Merge” mode alongside the existing “Edit” mode. Switch between them using the buttons at the top of the settings panel. Merge mode is merging clips together losslessly using -c copy, no re-encoding, no quality loss, instant. Works only when all clips have matching codec, resolution and FPS. A live compatibility indicator shows whether your clips can be merged losslessly, with details on what differs if they can’t

  • Multi-Axis Funscript Support
    Now detects and processes multi-axis funscripts. If your clips have .pitch.funscript, .roll.funscript, .surge.funscript, .sway.funscript, .twist.funscript files alongside the main script, they will all be trimmed and merged correctly
    Multi-axis script preview is not available yet. I need to figure out how to implement it without making a mess in the UI

  • Apply to All Clips
    New bar above the clip list lets you set Start and End time for all clips at once. If any clips are shorter than the entered End time, they get trimmed to their maximum duration and you get a notification listing which ones were affected

  • Script Preview Moved to Player
    Removed the “Script” button from each clip card. Instead, a “Show script” / “Hide script” button now appears in the player bar next to the volume slider. Switching preview to a different clip while the script is visible automatically refreshes the script for the new clip

  • Recursive Folder Import
    “Add Folder” now scans all subfolders recursively. Files are sorted alphabetically by full path

  • H.264 + High Resolution Warning
    When H.264 is selected as GPU encoder and a resolution above 4K is chosen, the app automatically switches to HEVC and shows a notification explaining why

  • Preview Uses GPU
    Generate Full Preview now uses GPU encoding if available instead of always using CPU

  • Bug Fixes
    Fixed thumbnails - now appear as soon as they’re ready instead of waiting for the next clip to be added
    Fixed drag & drop not working
    Fixed crash when loading a project with an unrecognized encoder value
    Fixed crash when loading a corrupted/incomplete project file
    Fixed funscript read crashing on malformed files
    Fixed disk space estimate always using “balanced” quality regardless of selected setting
    Fixed GPU encoder warning toast appearing once per clip instead of once per export
    Fixed video files with # in the filename not loading in the player
    Fixed disk space check failing on Windows 11 24H2

4 Likes

The first test of the merge feature worked for me, but now I keep getting “Merge failed: Concat failed”

Log attached but I’m not sure what is different from my first run that would cause this

funclipper-error-2026-04-23T16-38-22-524Z.txt (7.2 KB)

Try 1.3.1b and let me know if it works → 1.3.1b
It’s also possible that one of your vids has a slightly different format that slipped past the compatibility check, this version should handle this better

UPDATE 1.3.1

Bug Fixes

  • Separate Video & Script Fade Controls
    Fixed - now you can apply fade independently to the video and the script

  • Video Playback with Special Characters
    Fixed a bug where video files with # in their filename would fail to load in the preview player

  • Audio Sync in Preview
    Fixed audio desync in the preview player. Audio now correctly follows the current video position within a clip instead of always starting from the beginning of the audio track

  • Export Button Locked After Mode Switch
    Fixed a bug where switching from Merge mode (with incompatible clips) back to Edit mode left the Export button permanently grayed out

  • Cancel Button Race Condition
    Fixed a race condition where clicking Cancel would briefly re-enable the Export button before the main process confirmed the task was stopped

  • Funscript Errors Now Logged
    Parsing errors for funscript files are no longer silently swallowed. Invalid or corrupted funscript files will now produce a warning in the log

  • Audio Path Validation
    Added validation for the audio path before starting export. A missing or invalid audio file now produces a proper error instead of crashing the FFmpeg process

  • Windows Reserved Filenames
    Output filenames that match Windows reserved names (CON, NUL, COM1, etc.) are now automatically prefixed to prevent export failure

Performance & Stability

  • Faster Clip Loading
    Loading clips (both when adding files and when opening a saved project) is now done in parallel instead of one-by-one. Large clip lists load significantly faster

  • Smoother Script Preview
    The script waveform preview no longer recalculates canvas dimensions on every animation frame. Canvas metrics are now cached and only refreshed on window resize

  • Funscript Cache Limit
    The funscript data cache is now capped at 50 entries to prevent unbounded memory growth when working with many files across a long session

  • Temp Folder Cleanup on Startup
    Leftover temporary folders from previous crashed or interrupted sessions are now automatically cleaned up when the app starts

  • Merge Disk Space Estimate Fix
    Fixed an incorrect disk space calculation for Merge mode. The estimate now correctly accounts for temporary segment files and the final output existing on disk at the same time

Merge Mode

  • Merge Mode Compatibility
    Merge Mode compatibility has been improved. It will now check more accurately whether video files are identical and suitable for merging with -c copy to avoid faulty exports + better error logs
2 Likes

UPDATE 1.3.2

Bug Fixes

  • Portrait Mode Now Works with Custom Resolution
    Fixed a bug where selecting Portrait orientation with a custom resolution didn’t swap width and height. Portrait mode now correctly applies the swap to custom values as well as presets

  • Mix Mode Falls Back When Source Has No Audio
    Fixed a crash when using Mix audio mode with a video file that has no audio track. Mix mode now automatically falls back to Replace mode if the source video is silent, with a notification explaining the change

  • Empty Funscript Output Prevented
    Fixed an edge case where funscript extraction could produce an empty merged result, causing a corrupted .funscript file. Empty funscripts are now skipped with a log warning

  • Load Project Guard
    Fixed being able to load a project file while an export, preview, or merge was already running, which could cause state corruption

  • Task Cancellation Speed
    Cancelling an export, preview, or merge now stops immediately between processing stages, instead of waiting for the current FFmpeg operation to finish

2 Likes

Do the videos I want to merge all have to have the same FPS?
I tried merging with five videos and some parts have very high artifacts and are sped up by a lot.

Example clip:

Clips don’t have to share the same FPS, FunClipper re-encodes them to your chosen output FPS. The artifacts + speed up you saw usually point to VFR (variable frame rate). The file says “30/60 fps” but the frames are actually unevenly spaced and the encoder currently doesn’t smooth that out

I think I know how to fix it and avoid similar situations, but before I push it I’d like to reproduce your exact case. Could you send me the clips you tried to merge? I’m close to finish 1.4.0 and if I can confirm the fix I will include it with that release

3 Likes

Yes, of course. I will send you the videos via dm. Thank you!

UPDATE 1.4.0

New Features

  • Multi-Axis 3D Preview
    Real-time 3D preview of multi-axis funscripts. When a clip has axis scripts (.pitch / .roll / .twist / .sway / .surge), a “Multi-axis 3D” button appears in the player and opens a separate, resizable window showing a 3D stroker. Available both in the main player and in Generate Full Preview. The 3D window always stays on top of other app windows, and remembers its size and position between sessions.

  • Remove All Clips Button
    Added a “Remove All Clips” button on the right side of the Apply to All bar. Clicking it opens a confirmation dialog before removing all clips

  • Comprehensive Logging
    The app now keeps a log of everything that happens during exports, previews and merges, plus any errors. Useful when something goes wrong and you want to report a bug. Logs are kept for 30 days

  • Time Format Now Shows Hours
    All time displays (clip duration, player, total output, timeline) now automatically switch to H:MM:SS format when duration exceeds 59 minutes

  • Export Complete Notification
    When an export finishes, a popup dialog appears

  • Sound Effects
    The app now plays sound effects for key events: confirmation dialogs, export completion, and errors. All sounds are optional and they can be toggled off in Settings

  • Settings Panel
    Added a Settings button in the header. Contains a Sounds on/off toggle and a Theme picker with 6 accent color presets

Bug Fixes

  • Funscript Drifting Out of Sync on Multi-Clip Output
    Fixed a critical bug where the merged funscript would drift further out of sync the longer your output video was

  • Export / Merge Failing When Output Folder Missing
    Fixed a bug where Export or Merge would fail with an “no such file or directory” error if the chosen output folder was deleted, renamed, or never created

  • Generate Full Preview Player Too Small
    The video in the preview window starts bigger and now grows together with the window when you resize it, instead of staying small while only the script panel got taller

  • Visual Artifacts at Clip Boundaries
    Fixed a class of glitches (blocky pixels, brief stuttering, tiny speed-ups) right where one clip ended and the next started, especially when source clips had different frame rates. Most players hid the problem, but stricter players like OFS / ScriptPlayer would show it clearly. Thanks @Slibowitz :smiling_face_with_three_hearts:

  • Audio Hanging Mid-Playback on Mixed Audio
    Fixed a bug where Generate Full Preview would freeze partway through (and exports could glitch) when source clips had different audio formats - for example one stereo and one 5.1. If every clip has the same audio layout it’s preserved, otherwise everything is converted to stereo

  • Generate Full Preview Failing on Intel QSV
    Fixed Generate Full Preview crashing with an “Error -22” when the Intel QSV encoder was selected

  • Replace Audio Cutting Video to Audio Length
    Fixed a bug where using “Replace Audio” would produce an output as long as the audio file instead of the video. Video now keeps its full length, audio shorter than video is followed by silence

  • Portrait Mode Resolution Labels Not Updating
    Fixed a bug where switching to Portrait orientation left the resolution dropdown showing Landscape dimensions. Labels now update dynamically to reflect the correct swapped resolution

  • Export Crashing on Clips With No Audio
    Fixed a bug where exports would fail with a “no audio stream” error if any of the clips were silent (no audio track). Such clips are now correctly handled and exported without audio

  • Empty Axis Funscript Files Written
    Fixed an edge case where exporting could produce empty .pitch.funscript / .roll.funscript etc. when your clip ranges happened to trim out all axis actions. Empty axis files are now simply skipped, same as already worked for the main funscript

  • Project Load Crash on Corrupted File
    Fixed a crash when loading a project file with a missing or invalid resolution value. The app now falls back to 3840×2160 in that case instead of crashing

3 Likes

Thats just what I asked for in a thread a few weeks ago, lol! Thanks a lot I will be trying it out extensively :slight_smile:

2 Likes

Thank you very much for the fix! It works perfect now. No more artifacts, nothing is sped up anymore. Absolutely flawless compilation now. Thank you again for your time and releasing this :slightly_smiling_face:

Quick question, that I forgot to ask last time. When choosing for example 4k as an output resolution, does the video get upscaled in any way? So would the quality be noticeable better?

Not currently. Right now there is only downscale if you add clips larger than your selected output resolution.

But I want to add it. The plan is to include video upscale and frame interpolation. I want to do it in two ways, fast and slow:

  1. Simple methods directly through ffmpeg, which is already built into the app
  2. A second option using some external open source models that give better results but will be much slower
2 Likes

Thank you for considering this. Would be a nice feature. Doesn’t have to be any Topaz quality of upscaling. Just something that improves the quality would be enough.

Exactly. Upscaling at Topaz level quality doesn’t really make sense in a small app like this

For now I managed to implement frame interpolation using the RIFE model and I’m surprised how well it works and how fast it is.
Upscaling via ffmpeg works and the results are decent, but I’m still looking for something better

1 Like

UPDATE 1.5.0

New Features

  • Upscale
    Upscale your videos to higher resolution. Two modes available. Fast uses the FFmpeg and is very quick, good for casual upscale. Quality is AI-powered, much sharper but slower. When you pick Quality, choose between “Real-life / 3D” for live action and CGI footage, or “Anime / 2D” for cartoons and anime. Needs a Vulkan-capable GPU - the app auto-detects and disables the option if not supported

  • Frame Interpolation
    Generate intermediate frames to raise output framerate (e.g. 30 fps source → 60 fps output). Toggle under Output FPS. Powered by RIFE

  • AI Models Bundled
    All AI models are included inside the app - no extra downloads, no separate setup. Just run and use

Known Limits

  • Quality upscale (AI) is slow. Expect roughly 30 seconds per 1 second of 720p → 4K footage with the Real-life model. The Anime model is about 3× faster
  • Upscale here is best for small bumps (e.g. 720p → 1080p). For top-quality results, use a dedicated tool like Topaz Video AI

My tests on RTX 3090:

  • Upscale Quality real + Frame Interpolation - 720p30fps → 4k60fps - 19m49s
  • Upscale Quality anime + Frame Interpolation - 720p30fps → 4k60fps - 06m51s
  • Upscale Fast + Frame Interpolation - 720p30fps → 4k60fps - 0m33s
  • Frame Interpolation only - 720p30fps → 720p60fps - 0m21s
2 Likes

Nice, that was fast. I thought implementing an upscale feature would take a bit. Looking forward testing it and seeing the result. I will do another compilation this month and will try the new feature out.
Thank you for the great update :slightly_smiling_face:

1 Like

It happened so quickly cuz I had this idea in mind from the very beginning and had been preparing for it. I always had situations where I was combining several videos, for example in 1080p, and there were one or two lower resolution like 720p I also wanted to include, but the lower quality would ruin the whole thing. So upscaling for compilations seemed obvious to me, and something I would have to add sooner or later

As for frame interpolation, all credit goes to the people behind RIFE. It is rare to find something that is soooo implementation friendly

3 Likes

UPDATE 1.5.1

Bug Fixes

  • Preview Window Now Updates After Regenerating
    Fixed a bug where the preview window would keep showing the old video after you changed your clips and generated a new preview. Now it refreshes automatically without having to close and reopen it

  • Existing .funscript Files No Longer Overwritten Silently
    Fixed export and merge not warning you when a .funscript file (or axis scripts like .pitch.funscript) already existed in the output folder. The app now checks all output files, not just the .mp4, before overwriting

  • Merge Compatibility Check Now Looks at Audio Too
    Fixed merge mode marking clips as “compatible” when they had matching video but different audio formats (e.g. one clip AAC 44.1kHz, another AAC 48kHz). Compatibility now checks audio codec, sample rate, and channel layout in addition to video codec, resolution, and FPS

  • Two Copies of FunClipper Could Run at Once
    Fixed that launching the app twice would let both copies run simultaneously, which could corrupt temporary files and active exports. Now only one instance runs at a time - opening the app again just brings the existing window to front

  • Quality Export Filling Up Disk Mid-Export
    Fixed Quality mode (AI upscale + frame interpolation) not warning about the massive temporary disk space it needs. The disk check now estimates the hundreds of gigabytes of temporary PNG frames that AI processing creates and warns before starting

  • Long Quality Export Without Warning
    Added a confirmation popup before very large Quality exports. When AI processing would create more than ~20 GB of temporary frame data, the app warns first since these jobs can take 30+ minutes even on fast hardware

  • Error Log Files Never Deleted
    Fixed error log files (error-*.txt) piling up forever in the logs folder. They’re now cleaned up along with regular logs

  • Error Logs Contained Personal Folder Paths
    Fixed saved error logs including your Windows username and folder paths (like C:\Users\YourName\...). These are now automatically replaced with [REDACTED] before saving

  • Potential Corrupted Save Files on Crash
    Fixed a small risk of corrupted project files or window settings if the app crashed exactly while saving. Saves are now written to a temp file first and safely moved into place

  • Crash With Rare Corrupted Video Metadata
    Fixed a possible crash during export when a video file had unusual frame rate metadata (e.g. reporting “0/1” frames per second)

Stability

  • Export Processes Properly Closed on App Exit
    Fixed AI processing tasks (RIFE, Real-ESRGAN) sometimes staying alive in the background after closing FunClipper mid-export. All background processes are now forcefully terminated when the app closes

  • Faster Project Loading
    Loading a saved project with many clips is now faster. Clip probes are limited to running a few at a time instead of all at once

3 Likes