Hi everyone ![]()
I’d like to share StrokeClick, an extension for OpenFunscripter (OFS) 3.2.0 on Windows that lets you create funscript actions by clicking with your mouse.
I’m not sure if something similar already exists for OFS, but here it is anyway
All of the code was generated with GPT-6.1 Sol, with the features and workflow developed through testing in my own OFS setup.
The idea came from wanting to script certain scenes with my mouse, where clicking directly on the movement felt more practical than entering each position value manually.
With StrokeClick, the workflow becomes:
Advance a frame → click the object → action added.
You still decide what to follow and where to click. Your mouse acts as a manual tracker.
Download: Gofile — Cloud Storage Made Simple
What does it do?
After a short calibration, StrokeClick converts each click into a position between 0 and 100 and creates an action at OFS’s current playhead in the active funscript.
You can use it frame by frame or while the video is playing, including at reduced playback speed.
-
Actions use OFS’s normal history, so Ctrl+Z works.
-
Clicking again at the same timestamp updates the existing action.
-
Arrow-key navigation remains available after placing a point.
-
Holding Ctrl while using your configured Ctrl+Arrow navigation also works.
Installation
You need:
-
OFS 3.2.0
-
Windows
-
Python 3 with Tkinter — included in a standard Windows Python installation
Extract the downloaded StrokeClick folder into:
%APPDATA%\OFS3_data\extensions\
You should end up with:
%APPDATA%\OFS3_data\extensions\StrokeClick\main.lua
Keep strokeclick.py in that same folder.
Enable StrokeClick through OFS’s Extensions menu and open its panel. The Python companion launches automatically in the background, so you control everything from OFS.
1 & 2. Choose where to click and calibrate 0–100
Set player area: the rectangle that receives your clicks
Click 1. Set player area, then drag a rectangle wherever you want to use StrokeClick.
This rectangle is the capture area: while Capture is ON, clicks inside it are received by StrokeClick and converted into funscript actions. Clicks outside it are not captured.
Despite the button’s name, you do not have to select the video player. Choose whichever area suits your workflow:
-
Select the video to click directly on the movement you’re following.
-
Select the OFS simulator to place positions by clicking on its visual scale.
-
Select another convenient area within OFS if you simply want a mouse-controlled position scale.
Calibrate: place your 0–100 axis anywhere inside that rectangle
Click 2. Calibrate 0-100, then drag from the position you want to call 0 to the position you want to call 100.
You can place this axis anywhere inside your capture area. It does not need to be centered, match the rectangle’s edges, or cover its full width or height. It can be vertical, horizontal or diagonal.
The rectangle and the axis have different purposes:
-
The rectangle defines where clicks are captured.
-
The axis defines how those clicks become positions between 0 and 100.
StrokeClick projects each click onto the axis. You can click anywhere inside the rectangle; you don’t have to click directly on the calibration line. Sideways distance from the line does not affect the calculated position.
If a click projects beyond either end of the axis, the result is clamped to 0 or 100.
During calibration, the line shows ten equal segments, with red ticks at 0, 50 and 100.
The Show / Hide buttons beside the two setup steps let you display or hide the capture rectangle and calibration axis. Both guides can remain visible during Capture.
The selected area is anchored to your screen, not to the OFS window, so avoid moving or resizing OFS after setting it. Locking the player is recommended to keep everything in a fixed position.
3. Enable Capture and start clicking
Click 3. Capture ON, then click inside your selected area.
If you selected the video, click the hand or object you’re following. If you selected the simulator or another area, click the position you want along your calibrated scale.
Each accepted click adds an action at the current OFS playhead.
Click 3. Capture OFF whenever you want normal mouse interaction with OFS again.
You can also hold the mouse button while following movement. Held input is filtered to limit the number of points, but click-by-click scripting is the main intended use.
Options
Snap: 5 / 10 / Off
Rounds the calculated position to the nearest step. The default is 5.
For example, a calculated position of 73 becomes:
-
75 with Snap 5
-
70 with Snap 10
-
73 with Snap Off
Show value / Hide value
Displays the position that would be placed beside your mouse pointer.
Show / Hide guides
The capture rectangle and calibration axis can remain visible during Capture.
Keyboard shortcuts
There are no shortcuts enabled by default. You can assign StrokeClick commands through OFS’s own keybinding settings.
Stop / Restart
Closes or relaunches the background companion.
Safety and limitations
-
Capture temporarily pauses when you switch to another application and resumes when you return to OFS.
-
If the main OFS window moves or changes size during Capture, StrokeClick asks you to redraw the capture area and recalibrate.
-
If you load another video, Capture stops and requires a new calibration.
-
The background companion closes automatically after OFS stops, with a fallback delay of up to about 15 seconds.
-
Recalibrate when a new shot changes the movement’s direction or range.
-
During playback, OFS uses its playhead when it processes the click. Frame-by-frame scripting remains the most precise workflow.
-
Extremely rapid clicks may be skipped while the previous click is waiting for acknowledgement.
-
A faint tint over the capture area is expected while Capture is ON: the click overlay is nearly transparent.
-
Always check which funscript is active before clicking.
StrokeClick is expected to work on Windows PCs running OFS 3.2.0 with Python 3 and Tkinter installed. It has been tested in my own setup; feedback from other configurations is welcome.
Feedback
If you run into a problem, please include your OFS version, Python version, and the steps that reproduce it. A short video can help too.
The download includes the Lua and Python source files, with English comments, and an English README.
I hope this makes manual scripting a little quicker and more comfortable!
![]()