| Funscript | |
|---|---|
| Extension | .funscript |
| Format | JSON |
| Created | ~2015 |
| Standard | Community de facto |
| Used by | OpenFunscripter, MultiFunPlayer, ScriptPlayer, The Handy |
A funscript is a JSON-based file format that encodes time-synchronized haptic motion data for interactive sex toys, stroker devices, and other actuators. The format serves as the de facto interchange standard across the interactive media ecosystem, supported by every major scripting tool, player, and hardware manufacturer.
Overview ยง
The funscript format stores a sequence of actions: timestamped position values indicating where a device's actuator should be at a given moment in time. Values range from 0 (fully retracted / bottom position) to 100 (fully extended / top position). By interpolating between successive action points, compatible players drive device hardware in real-time synchronization with video playback.
A minimal funscript file looks like:
{
"version": "1.0",
"inverted": false,
"range": 90,
"actions": [
{ "at": 0, "pos": 0 },
{ "at": 500, "pos": 100 },
{ "at": 1000, "pos": 0 },
{ "at": 1500, "pos": 100 }
]
}Where:
- at โ timestamp in milliseconds from the start of the associated video
- pos โ position integer from 0 to 100
Metadata Fields ยง
| Field | Type | Description |
|---|---|---|
version | String | Format version (typically "1.0") |
inverted | Boolean | If true, 0 = top and 100 = bottom |
range | Integer | Maximum stroke range (0โ100) used during playback |
actions | Array | The core data: list of {at, pos} objects |
metadata | Object | Optional: creator, description, license info |
rawActions | Array | Legacy/deprecated; often stripped by tools |
Multi-axis scripts ยง
A single .funscript file encodes one axis of motion. Multi-axis setups (e.g., OSR2, SR6) use multiple files simultaneously, each targeting a different axis:
- L0 โ Stroke (up/down) โ the primary/default axis
- L1 โ Surge (forward/back)
- L2 โ Sway (left/right)
- R0 โ Twist (rotation)
- R1 โ Roll
- R2 โ Pitch
These axis names are defined by the T-Code protocol specification and used by multi-axis players like MultiFunPlayer.
History ยง
The funscript format grew out of earlier interactive script communities. The RealTouchScripts community (which later became EroScripts) used proprietary formats tied to the RealTouch device. As the Fleshlight Launch and similar devices emerged, community developers created open JSON-based formats. The .funscript extension was standardized through community adoption and the ScriptPlayer software, and was subsequently documented in the buttplug.io specification.
File placement ยง
For automatic recognition by most players, a funscript file must:
- Be placed in the same directory as its matching video file
- Share the same base filename (e.g.,
scene.mp4โscene.funscript)
Some players (like MultiFunPlayer) support script repositories โ configurable folders scanned for matching scripts.