Tutorial: Buttplug C# App Suite 0.1.0


Hi! Welcome to the Buttplug C# App Suite 0.1.0 tutorial.

You’re probably wondering why this isn’t on the buttplug.io website.

Well, truth is, the website kinda sucks to edit right now and I’m running WAY behind, so we’re just gonna have this on the message board for the moment. This information will be migrating to the website as I figure out layouts and stuff, but until that’s done, I’ll keep it updated here.

First off, if you haven’t yet, it’s probably useful for you to actually download Buttplug C#. If you haven’t yet, it’s at the link below:

Buttplug C# Releases Website

We currently support the following hardware:

  • Vibrating Toys/Hardware
    • XInput gamepads
    • Lovense Toys (All)
    • Vibratissimo Toys (All?)
    • Magic Motion Toys (All?)
  • Stroking/Rotation Hardware
    • Fleshlight Launch
    • Vorze Interactive A10 Cyclone

A couple of notes on the platform:

  • If you are on Windows 7-10, you can at least use XInput (XBox) gamepads with this.
  • If you are on Windows 10 build 15063 (Creators Update), then you canuse bluetooth LE. To check this, run the “System Information” program and see what’s in the “Version” field. You’ll need a Bluetooth 4 Adapter for whatever machine you’re on.

What’s In the Buttplug C# Installer

When you install Buttplug C#, you’ll get two applications:

  • Buttplug Websocket Server
    • This will be the software you’ll probably use the most. It opens a local websocket server on your machine, that other applications and websites can talk to in order to control the sex toys available on your system. It does feature SSL via a self-signed certificate. For more info on this, see the SSL section below.
  • Kiiroo Platform Emulator
    • Emulates Kiiroo old toy control software, for use with certain legacy content.

But qDot, why didn’t you X/don’t you have X/why isn’t there X/etc

So the answer most likely is “Because there’s a grand total of 3 of us working on this project, and we’re doing it in our spare time for no pay (though we accept donations)”. But just in case, here’s a few answers for these types of questions.

Why does Buttplug only support bluetooth on Windows 10 15063?

That’s due to Microsoft. They only added ways to use BLE in the way we do as of that version, and they aren’t planning to backport it.

Why doesn’t Buttplug support other platforms like Mac, Linux, or phone OSs?

Yes, right now, this only runs on Windows. I realize this will probably not work for a lot of interested people, and we’re working on fixing that. See aforementioned tiny development team.

We went with windows first for 2 reasons. First off, most of the demand from people we were talking to was there. Also, we’re really interested in integrating this with game engines, and that’s the first platform of choice. Finally, there’s a good chance we can use the C# code with some extra additions and port to Xamarin for Android/iOS, giving us a foothold on some mobile development.

If you’re on Mac/Linux/Android/ChromeOS, we’ll be supporting those platforms first via Chrome WebBluetooth. Watch this bug for more info. Now that the C# is done, I’m going to be working on this full time so we can at least make web apps that talk to toys easily.

As for iOS, well, we’re still figuring that out. Navigating the app store with this stuff can be challenging, but we’ve got some plans.

In terms of native implementations for the above platforms, we’re hoping to do a completely cross platform implementation in Rust soon. See the buttplug-rs project for more details.

Why are all of the examples here straight porn? I thought this project was supposed to be inclusive?

We’re all for getting a variety of content, but there’s not a ton of free stuff out there right now. We’re trying to add some of our own encodings for things, but there’s only so much time in the day. If/when we figure out more content sources we’ll update this. Also, if you’re motivated enough to want to make your own encodings for videos, we’ve included instructions below on how to do that.

Why does it seem like the only thing there is to do with Buttplug is watch videos with toy sync?

We’re building a new platform here, one that hasn’t really existed in the open source space before. That means we’re having to ramp up content by ourselves too, and that requires balancing development work and content creation. We really do want to see games and webpages and all sorts of crazy shit made with this, it’s just going to take time.

However, my personal request: I really want a haptic game based in the twine engine. Just saying. :slight_smile:

Why doesn’t Buttplug support [unsupported toy] yet?

Once again, developer resources more than anything. We have a HUGE list of toys left to reverse and support, and we’re doing our damnedest to add them as we can. If you’re really interested in getting a certain toy working, please post in our device support request thread and we’ll see what we can do.

If Buttplug is open source, how can I develop for it?

Well we would love for you to develop for buttplug. There’s… just not a lot of documentation yet. See the end of this document for what information I do have available right now.

If you want to ask questions, our slack is the best place to get ahold of developers. More information on getting an invite is available in this thread.

Using the Websocket Server

The Websocket Server is the easiest way to access Buttplug capable hardware and features. This application will be how many applications written for Buttplug will access the server, so it will be the one that (hopefully) sees the most use.

Basic Setup

On running the websocket server, you will be presented with the server configuration screen. By default, the server runs on http://localhost:12345. There are options available to host it on all external interfaces (for instance, to be able to access the server from a mobile device), and to use the server via SSL.

Websocket SSL

There are times when access the Buttplug websocket server via SSL is needed.

  • When you want to be more secure in general (like pretty much always)
  • When accessing the server from secure context (translation: a website running over https)

In this case, you’ll want to:

  • Stop the server
  • Check the “SSL/TLS” box
  • Start the server

This generates a new self-signed certificate, specific to this installation of Buttplug. In order to use this from a browser, you’ll need to first go to the url of your websocket server from the browser and accept the certificate exception.


Syncydink is a web based movie player for Buttplug. It can play 2D videos as well as 180SBS VR movies (though that requires a browser that can support WebVR, like Firefox 55, experimental Chromium builds, or Android Chrome), using multiple haptics file formats.

The latest version of Syncydink is hosted at http://buttplug.world/syncydink.

For more information on using Syncydink and Buttplug, see the Syncydink Tutorial Thread. There’s also more discussions of syncydink support and development in the Syncydink Category.


ScriptPlayer is a C# based movie player that supports direct connect to the Launch, as well as connection via Buttplug. More information on ScriptPlayer is available at

Scripts for Syncydink/ScriptPlayer

Scripts for movies for these two players are available at:

Also, for Syncydink, VirtualRealPorn haptics files (.ini files in the videos/config directory of VirtualRealPlayer) work.

Using the Kiiroo Emulator

Before the days of FeelMe, Kiiroo used to distribute their own node.js based software platform that worked as a webserver to talk to their Onyx/Pearl toys. Applications like Flicker.tv movies and VirtualRealPorn’s VirtualRealPlayer use this protocol. With our emulator, you can let those applications talk to any toy that Buttplug can communicate with.

We doubt that the Kiiroo Emulator will be seeing much continued usage, as commercial companies are no longer developing for it. However, we’ve kept it in our installer so that people can get more mileage out of players like VRP for now.

Basic Usage

To use the Kiiroo Emulator:

  • Start the program. We start the server automatically on boot. Note that it will be listening on http://localhost:6969, a local but unsecured port. This is how the original Kiiroo Platform Server ran, and what applications expect to talk to.
  • You’ll be presented with the Kiiroo Emulator tab. The big box is your device list, which will populate when you scan for devices.
  • Hit the Start Scanning button. This will cause the application to scan XInput for gamepads, and on Bluetooth LE capable machines, will start a Bluetooth LE scan.
  • Once the device(s) you want to use show up in the list, hit stop scanning.
  • To let the program know which devices you want to use, select them in the list.

Once you’ve got the devices you want selected, it’s time to use a program!


Flicker.tv was a site put up by Kiiroo a long time ago, and I think they forgot about it. Lucky for Buttplug users, they left 3 videos up for free download, with full haptics capabilities. To use a Flicker.tv video:

  • Download one of the free videos with the zip file
  • Unzip the file
  • Run the Kiiroo Emulator, scan for/select your devices
  • Open the PLAY.html in your favorite modern web browser (Firefox/Chrome/Edge)
    • If the video is not showing the ability to play, that means it can’t connect to the emulator
    • If the video can play, you’re ready to go.

Note that the videos here aren’t real fantastic quality in terms of haptics, but they’re free, so there ya go.


VirtualRealPlayer is the VR movie player put out by VirtualRealPorn. It’s just a simple Unity 180SBS player with some extra settings.

Note: To get haptics to work with VirtualRealPlayer, you need to either have an active account with VRP, or be able to set up mitmproxy to send the correct JSON back to fool the player.

To use VRP with the Kiiroo Emulator:

  • Start the Kiiroo Emulator
  • Scan, pick toys
  • Before bringing up VRP, go to the VRPorn/Gay/Trans/Etc website and make sure the video you want to play supports Kiiroo. We do not currently support Lovense haptics
  • Bring up VRP
  • Log into your account. If you do not log in, even if you have the haptics file, haptics will not work
  • Play movie

Making Your Own Movie Encodings

If you’d like to make your own encodings to work with Syncydink or ScriptPlayer, there are instructions on using Blender for encoding at

There’s also some support messages about this in the following RealTouchScripts forum thread:


We are working on our own dedicated movie encoders, and will make updates when these are ready for use.

Coding for the Buttplug Protocol

Examples on Glitch.com

Introduction Thread
Software Tutorial List
Tutorial: Syncydink v20170821

I’m reading this, clicking the various links and so forth but not 100% sure I understand what this is. Can you summarize in a few sentences what Buttplug C# is and what is it’s intended usage? From what I gather it’s 1 or 2 desktop applications that allows the user to control existing sex toys of certain brands. Other applications on the internet can communicate with the desktop application via websockets, while the desktop application communicates with the sex toy over bluetooth?


Yup, that’s right! Things are just very abstract right now 'cause we’re still very early in development and figuring out how to explain all of this.

At its absolute core, Buttplug is just a protocol, defined by the Buttplug protocol spec: https://metafetish.github.io/buttplug/. The core protocol is language agnostic.

Buttplug C# is a C# implementation of that protocol. We have libraries that C# developers can use to easily talk to toys using the protocol, implemented in C#. We also have implementations in Javascript/Typescript, and we’re working on C/Java/Rust/Python/etc…

The app suite here is some applications we’ve implemented that use the protocol to make app development easier. For instance, the Kiiroo platform emulator can be used with VirtualRealPlayer for VR porn, if you want. The Websocket server makes it easy to develop apps that can use a web browser to talk to the hardware we support. That doesn’t even really need to be over a network, it can all happen locally. Websockets is just the easiest way to get the data out of the web browser to the application that talks to the hardware.

So yeah, there’s a lot of layers going on here. I’m gonna be working on some documentation and tutorial videos soon that might clear this up a bit more, this tutorial was just a “we need something now” effort. :slight_smile:


Oh I didn’t see the specification link. That gitbook answers a lot of questions. There is a lot going on here, let me see if I’m getting this right: So buttplug itself is a json protocol to communicate between a “client” and a “server”, but each implementation of a buttplug server (which can be implemented in any language) is meant to be run on a local machine and used as a proxy abstraction to simplify communication with a sex toy. So developers don’t need to know how to write USB drivers or know how bluetooth works, they just need to write websocket client to connect to the buttplug websocket server and we’re off to the races?


Yeah, that’s it exactly!

It can be even more abstract, as there’s nothing binding us to JSON or using websockets specifically. It could be msgpack over IPC, or something else. Those choices are mainly up to the server developer, we’ve just gone with json and websockets for the moment 'cause it’s the easiest to understand and debug, with the largest impact.


In the cases of C#, JS, Java and Go we already have client libraries, so the application developers don’t even need to learn about JSON message formatting/parsing or how to use websockets in order to communicate with the buttplug server.