Since this is built using Electron, is a macOS version possible?
@cstimmer
You are reading my mind
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
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.funscriptfiles 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
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
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 copyto avoid faulty exports + better error logs
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
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
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
-
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.funscriptetc. 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
Thats just what I asked for in a thread a few weeks ago, lol! Thanks a lot I will be trying it out extensively ![]()
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 ![]()
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:
- Simple methods directly through ffmpeg, which is already built into the app
- A second option using some external open source models that give better results but will be much slower
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
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
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 ![]()
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
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.funscriptfile (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 (likeC:\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