One funscript in. Ten estim outputs out. Character baked in.
A GUI and CLI for converting a single .funscript file into a complete set of restim-ready output files, with named estim characters that control how sensation moves and builds.
A funscript describes position over time — the stroke. Restim needs more: where the sensation is, how it moves, how intense it gets, how the pulse feels.
This tool takes the stroke and derives all of it. You pick a character — a movement personality — and it generates alpha, beta, pulse frequency, and seven other output files tuned to that character.
| Character | What it means |
|---|---|
| Gentle | Soft, slow-building. Narrow arc, soft pulse onset. Good for intimate or slow content. |
| Reactive | Sharp, tracks action closely. Wide arc, instant response. Good for fast, intense content. |
| Scene Builder | Builds gradually over the scene. Circular arc, slow ramp. Rewards patience. |
| Unpredictable | Random direction changes, varied character. Keeps you guessing. |
| Balanced | Middle of everything. Good starting point for any content. |
Pick a character. See 1–2 sliders that matter for it. Tune if you want. Process.
| File | What it is |
|---|---|
alpha.funscript |
Where — left/right electrode position |
beta.funscript |
Where — up/down electrode position |
pulse_frequency.funscript |
Intensity — tracks action speed |
Plus seven additional channels for specialist hardware (pulse_width, pulse_rise, E1–E4, prostate).
1. Drop a .funscript file
2. Pick an eTransform character
3. Tune 1–2 sliders (optional)
4. Process — takes seconds
5. Review: original / master / alpha / beta / pulse_frequency / explorer
6. Export to project folder
The Review tab shows six panels simultaneously. Original on the left. Five outputs on the right. The Explorer panel lets you inspect any additional channel. All panels update automatically when you change settings.
# Process with defaults
python cli.py process input.funscript
# List available eTransforms
python cli.py list-presets
# Process with a named character
python cli.py process input.funscript --preset Reactive
# Get config for a preset (JSON)
python cli.py get-preset "Scene Builder"
# Save current settings as a named preset
python cli.py save-preset "My Character" --from-config config.jsonpython cli.py process input.funscript --json | jq '.outputs'Download the latest release — no Python required.
git clone https://github.com/liquid-releasing/funscript-tools.git
cd funscript-tools
pip install -r requirements.txt
python forge.pyRequirements: Python 3.8+, NumPy, Matplotlib. Tkinter included with Python on Windows/macOS. Optional: pip install tkinterdnd2 for drag-and-drop.
All outputs go into a named project folder alongside the video:
my-scene/
my-scene.mp4
my-scene.funscript
my-scene.alpha.funscript
my-scene.beta.funscript
my-scene.pulse_frequency.funscript
... (all outputs)
Drop the folder into restim. Done.
Every parameter from the underlying processor is still accessible via Advanced in the UI, or as raw config in the CLI. The eTransforms are a starting point, not a cage.
Edger's full parameter set: algorithm, points per second, speed threshold, frequency ramp ratio, pulse frequency min/max, pulse width min/max, pulse rise min/max, and more.
tests/fixtures/big_buck_bunny.raw.funscript — original, unprocessed
tests/fixtures/big_buck_bunny.forged.funscript — after FunScriptForge cleanup
Convention: <name>.raw.funscript / <name>.forged.funscript
See docs/ARCHITECTURE.md for the adapter boundary design, the sensitivity matrix plan, and the agent loop spec.
Adapter boundary: forge_window.py imports only from cli.py. Zero upstream imports. The UI, the CLI, and FunScriptForge all call the same functions.
funscript-tools is the second stage of the estim pipeline:
FunScriptForge Explorer → FunScriptForge → funscript-tools → restim
(originate) (edit/shape) (estim character) (play)
The same five character names appear in FunScriptForge. Pick a character once — it flows through the entire pipeline.
Built on edger477/funscript-tools. The eTransforms system, guided UI, CLI preset API, and six-panel review are additions by liquid-releasing.