FunHalver 0.3.0 - Make any funscript half-speed without losing sync or stroke length

Note! FunHalver is now obsolete! Its functionality (and more!) is now contained in my new site

You can read about here

:brain: Concept

FunHalver halves the intensity of .funscripts by changing every up and down stroke into a single direction. This makes the script twice as easy to last through without sacrificing stroke-length or video-synchronization.

Main use-cases:

  • Cock Hero and PMV
  • VR and other full-length, intense videos
  • Converting Handy/OSR2 videos for use with Launch
  • Marathon sessions


:inbox_tray: Download v0.3.0 (13th February 2021)

:rainbow: Features

  • Works on any funscript
  • Maintains stroke timing
  • Maintains stroke positions (generally)
  • Respects pauses
  • Heatmap preview (thanks @Lucifie!)
  • Funscript actions preview
  • No internet connection required

:information_source: Instructions

  • Drag any .funscript onto the main window to load it in
  • Preview your script by moving your mouse over either of the heatmap previews
  • For cock hero, PMV and other music-based scripts, check the ‘Match First Downstroke’ box

:stars: Planned Features:

  • Respect speed modulations for intermediate funscript actions
  • Mac + Linux support…maybe

This project is open-sourced on GitHub!

:hourglass_flowing_sand: ChangeLog


Download v0.3.0 from GitHub

  • Added

    • FunHalver can now function in command-line mode! See below for more information
    • User can now ensure that the first downstroke in a group will be respected - very important for Cock Hero and PMV style scripts
    • User can now ensure that the position of the Slider matches the original script’s intended position at the end of each group
    • Added tooltips to each option to provide more information
  • Known Bugs

    • In some situations, the half-speed script will be full-speed
    • In some situations, the half-speed script will just stop moving for a number of actions

Download v0.2.0 from GitHub

  • Added

    • User can now choose whether they’d like the position to reset after pauses
    • User can now choose to remove small pauses in the script, making everything smoother
    • Average intensity is now displayed in each script’s metadata, rather than action count
  • Fixed

    • Added a small offset to the pink script preview line - In situations where the original and converted scripts share a number of actions, the pink line would obscure the white line
    • For slow actions, or for high zoom levels, lines would be cut off if one of their actions fell outside the preview window. This has been fixed
  • Known Bugs

    • In some situations, the half-speed script will be full-speed
    • In some situations, the half-speed script will just stop moving for a number of actions

Download v0.1.0 from GitHub

  • Features

    • Works on any funscript
    • Maintains stroke timing
    • Maintains stroke positions (generally)
    • Respects pauses
    • Heatmap preview (thanks @Lucifie!)
    • Funscript shape preview - pink is the half-speed script, white is the original script
    • No internet connection required
  • Planned Features

    • User-configurable options to fine-tune
    • Respect speed modulations for intermediate funscript actions
    • Mac + Linux support…maybe

To be clear, I haven’t tried out the program yet, but just reading about it: AMAZING and beyond useful. :muscle:
Since I got into funscripts I’ve been wondering all the time about why nobody programmed this exact feature into one of the countless apps here.

Thank you so much for this, @defucilis!


THANK YOU!! @defucilis



Nice, you did it :slight_smile:

I am just thinking loud…

Do you think it’s possible to call this tool by command line or an other way so I could include your feature to HandyControl. I could pass a parameter with source and target location and your app does the conversion. Or can you create a .dll without the GUI? Will it still be 120mb? If not I could also just link a button to your app to pass over a file. Currently this is not supported. If I drop a file on the app icon the app opens but does not load the file.

You could also use HandyControl command line support to open the script in HandyControl after the conversion (user presses a button). So you can test how it runs.

Looks like you have the same problem than me when I did the Half to Full Speed conversion feature. Depending on how a section starts, the stroke directions gets inverted. Fixing this would mean to analyse and identify the beat patterns and gaps which would require more time than I would like to spend on this so I left this as it is and blame the script creator instead :wink:. The problem is that there are so many pattern types that you can’t build them all correctly.

It would be much easier if a CockHero script section always starts in the same direction so the first stroke always goes down.

Left inverted - Right not inverted

It happens every time when a white gap line changes direction.

Bug or script type not supported?

The white line is missing in this section.

Cock Hero Crescendo.funscript (361.8 KB)


tl;dr if you’re not Lucifie - version 0.2.0 is now available with some bugfixes and improvements I was too sleepy to put in last night - download link in the original post :slight_smile:

Hmm…maybe? It would have to be written in node.js, so anyone using HandyControl would have to have node.js installed on their machine (kind of like if it was a python script). But it definitely looks like it wouldn’t be too hard.

That said, the script that actually turns a .funscript JSON object into a half-speed one is only 120 lines long so I think it would be much easier to just recreate it in HandyControl directly.

Ah yeah - The way I’m currently doing it is that each group of strokes starts ‘up’ - since that ensure that cock hero beat patterns never end up getting ‘flipped’. I basically flipped a coin whether I wanted the first action to be sourceActions[0].pos or just 100, but yeah now that you mention it it’s pretty important that it starts at the same to avoid being half-a-beat off. I’ve added it as a user-configurable option, turned off by default.

Just checked this out- they’re not missing, they’re just hidden by the pink lines! I added a 2px offset to the pink lines so that you can see when there’s a white line behind them. It’s definitely a bug that the script is being reduced in that section though - that particular script you linked has revealed a bunch of bugs that I’m looking into now!

In .NET it’s quite simple to include command line parameters in the app without being a command line app itself. You just have to anylyse the parameter afterwards and do something. This way you can load a file for example when you drop it on the application or just doubleclick it if the file extension is linked to the app.

I am not sure if its right to just copy your code to HandyControl. Linking the apps some way seems to be better so you can expand and update your app independant.

One example how to load a script to HandyControl.
…\HandyControl.exe /load “C:\filename.funscript”

In the apps misc settings is a button that shows all available commands.

I made it open-source because I want people to copy it :stuck_out_tongue: Although I suppose I see your point in that it would be good if HandyControl could benefit when I make improvements to the core algorithm, rather than it needing you to go through and update the .NET port…

I just took a moment to look into it and it seems that I can get command-line arguments passed into my app. Although I’m not sure that I can make the app release control of the terminal, so it might be necessary to add a manual 3-second wait timer or something and then close it from your end.

I’ll make sure version 0.3.0 can be run from the command line with options for input file path, output file path, all user-configurable options and perhaps a ‘verbose’ mode.

1 Like

Any way to modify this app to also provide a stroke-length and position offset to keep the movement the same, just shorter-length strokes?

You can do this in HandyControl afterwards.

Version 0.3.0 is done! The main changes are a few new options, including the all-important (for Cock Hero and PMV videos) “Match First Downstroke” option - this will stop your half-speed script from being half-a-beat out of sync!

Download links are in the opening post in this topic.

@Lucifie, this version has command-line support, the GitHub release page for v0.3.0 has more detail in regards to the command line params and whatnot :slight_smile:


Would it be possible to add the functionality to DOUBLE (not Half) the speed of strokes, for those with fast servos and a slowly written script?

I’ve just started messing around with this and has made so many scripts that were already fantastic even better, by lowering the intensity it makes climaxing with these scripts that much more sustainable and satisfying i usually get overwhelmed with normal speed scripts but by using this i can just bask in the euphoria I’m feeling in the moment and it really allows me to slow down my favorite deepthroat scenes into a longer throat worshipping session. Fantastic tool to further improve what I love about my Handy.

Hey! Glad you like it - just FYI you can use it without a download now by going to and heading to the “Modify Script” section :slight_smile:


Just found this and tried it…game changer for me ! Thanks a LOT ! @defucilis :partying_face:

1 Like

Just wanted to say thank you for the effort that must have gone into this.

Amazing work.

1 Like

No worries! :smiley:

fwiw this functionality has been rolled into so if you like halving your script speeds I’d suggest doing it over there (any algorithm improvements are only applied to that site, not this app)

1 Like

I noticed that the fundoubler there often generates 2 points very close to each other (several ms apart), while it should just be a single node:

What i suspect is that it tries to have both up and downstrokes at the exact same speed, and therefor gets a misalignment there. But what i think would be better here is that it only takes 1 of the 2 nodes:

  • in the case of an upper node, take the last (puts emphasis on the downstroke)
  • in the case of a lower node, take the first (better timing alignment)

Another thing (which i used in the chgen plugin), is that especialy in CH’s the downstroke/upstroke alignment matters, so speeds should be equal for those 2 actions. Therefor, something like this is undesired:

In this case the lower point is from a faster pattern. Yet the speed going to it is still from the slower one. The upper position here should in this case align with the faster pattern starts. Either by adding an additional node, or just moving that upper node to the right.

While a half speed CH doesnt realy care much about this (as patterns can take any alignment they like). For a full stroke script its something that becomes relevant.