Skip to main content
Experimental Feature: The Funscript Player uses streaming mode, which is experimental and not recommended for general play. The protocol and behavior may change in future firmware updates. Use at your own risk and always test at low intensity first.
Sync your OSSM with funscript files for video-synchronized playback. Load a video and matching .funscript or .csv file, connect via Bluetooth, and enjoy automated motion control.

Requirements

  • OSSM firmware: Version 3.0 or later (with BLE streaming support)
  • Compatible browser: Chrome, Edge, or Opera on desktop/Android
  • Bluetooth: Enabled on your device
  • Funscript file: A .funscript or .csv file matching your video
Web Bluetooth is not supported on iOS devices (iPhone/iPad) or in Safari/Firefox browsers. For these platforms, consider using third-party funscript players with Buttplug.io integration.

How to Use

1

Load your media files

Click the file pickers to select your video file and matching .funscript or .csv file. The funscript filename should match the video filename (e.g., my-video.mp4 and my-video.funscript).
2

Connect to your OSSM

Click Connect to OSSM and select your device from the Bluetooth list. The OSSM will automatically enter streaming mode.
3

Play the video

Press play on the video player. Position commands are sent in real-time as the video plays, keeping your OSSM synchronized with the content.

What is Funscript?

Funscript is a JSON-based file format used to synchronize toy movements with video content. Each funscript contains a series of position/time pairs that define where the device should move at specific moments during playback.
Example funscript structure
{
  "version": "1.0",
  "actions": [
    { "pos": 0, "at": 1000 },
    { "pos": 99, "at": 2000 },
    { "pos": 0, "at": 3000 }
  ]
}
  • pos: Position from 0 (fully extended) to 100 (fully retracted). Yes, this seems backwards, but it’s how funscripts are implemented.
  • at: Timestamp in milliseconds
Funscripts can be created using tools like OpenFunscripter or purchased from marketplaces like RealSync.

Alternative CSV format?

A CSV file can be used in place of a funscript. The player expects a pair of values. The time value first and the position value second. Each new line of the file defines where the device should move at specific moments during playback.
Example CSV structure
0,100
25294,100
27567,100
28167,50
29067,90
29667,40
31100,100
  • Timestamp in milliseconds
  • Position from 0 (fully extended) to 100 (fully retracted). Yes, this seems backwards, but it’s how funscripts are implemented.

Playback Settings

SettingDescription
Max SpeedSet the max speed of your device. If a move is unable to be completed in the alotted time it will be shortened automatically at the expense of accuracy.
Max Stroke LengthSets the length of the rail that will be used. If the depth is less then this value the entire depth will be used.
Max DepthSets the maximum depth to be used by the funscript.
Max AccelerationSets how quickly the OSSM is allowed to reach a particular speed. Reduce this value to limit jerkiness at the expense of accuracy on fast moves.
Device BufferAttempts to smooth out latency by adding a small amount of buffer to all commands. Automatically included in time offset to keep video in sync.
Time OffsetAdjust sync timing (-50ms to +50ms). Use positive values if the OSSM is behind the video, negative if ahead.

Safety Features

  • Auto-stop on disconnect: If Bluetooth connection is lost, the OSSM ramps down safely
  • Return to menu on disconnect: When you disconnect, the OSSM returns to the main menu
  • Manual control: You can pause the video at any time to stop motion
  • Max Speed and Acceleration: These settings will slow down the motion to reduce intensity.
  • Dynamic Stroke Length: OSSM will reduce stroke length as necessary if a move is beyond the capabilities of the machine or user limits, at the expense of positional accuracy.
Always ensure you have easy access to pause the video or disconnect from the OSSM. Start with slower content to verify sync timing before using faster scripts.

Troubleshooting

  • Ensure the OSSM shows “streaming” mode on its display after connecting
  • Check the debug logs for any error messages
  • Try disconnecting and reconnecting
  • Verify your OSSM firmware supports streaming mode (v3.0+)
  • Adjust the Time Offset slider to compensate for delays
  • Ensure your device isn’t experiencing Bluetooth interference
  • Verify the file has a .funscript or .json extension
  • Check that the file contains valid JSON with an actions array
  • Look for parsing errors in the debug logs
  • Increase buffer setting
  • Close other Bluetooth-connected devices to reduce interference
  • Stay within 10 meters of your OSSM
  • Try reducing video quality if your device is struggling
  • Use a funscript with fewer per stroke. Funscripts with commands only when the machine changes directions are smoothest.

Technical Details

The funscript player uses the OSSM’s native streaming protocol via BLE:
  • Command format: stream:position:time where position is 0-100 and time is milliseconds to reach the target
  • Update rate: Commands are sent every 2ms when new actions are due
  • BLE characteristic: Uses the primary OSSM command characteristic (522b443a-4f53-534d-1000-420badbabe69)
Position streaming is experimental. The firmware calculates the required speed to reach each target position within the specified time, using maximum acceleration for responsive motion. If the BLE connection is lost, the OSSM automatically ramps down and stops over 2 seconds.

BLE Protocol Documentation

Full streaming command reference and protocol details.

Operating Modes

Learn about streaming mode and other operating modes.