aboutsummaryrefslogtreecommitdiff
path: root/content
diff options
context:
space:
mode:
authorsoaos <soaos@soaos.dev>2026-01-29 22:14:15 -0500
committersoaos <soaos@soaos.dev>2026-01-29 22:14:15 -0500
commit152c53851f6b8737e2ad8a203523ee0032d95ce8 (patch)
tree64d61629ed4b78422fd8b15f0faa09373aaa3291 /content
parentaa16df00b4a6eefd72871723317856503c19283c (diff)
vscode-buttplug post
Diffstat (limited to 'content')
-rw-r--r--content/blog/vscode_buttplug/buttplug-0.0.1.vsixbin0 -> 632364 bytes
-rw-r--r--content/blog/vscode_buttplug/index.md63
2 files changed, 63 insertions, 0 deletions
diff --git a/content/blog/vscode_buttplug/buttplug-0.0.1.vsix b/content/blog/vscode_buttplug/buttplug-0.0.1.vsix
new file mode 100644
index 0000000..f57f8d3
--- /dev/null
+++ b/content/blog/vscode_buttplug/buttplug-0.0.1.vsix
Binary files differ
diff --git a/content/blog/vscode_buttplug/index.md b/content/blog/vscode_buttplug/index.md
new file mode 100644
index 0000000..6abe64d
--- /dev/null
+++ b/content/blog/vscode_buttplug/index.md
@@ -0,0 +1,63 @@
++++
+title = "Visual Studio Code Buttplug Integration"
+description = "Vibe coding."
+date = "2026-01-29"
++++
+
+[tl;dr: download VSIX here lol](./buttplug-0.0.1.vsix)
+
+This is perhaps one of the most important project ideas I've come up with in a while. I pounded a redbull at like 8pm and then an angel of the Lord appeared to me and said "Man, it would be really funny if you added buttplug support to vscode". So I did. I was inspired by various buttplug mods for random games that probably have no business having buttplug mods, like Ultrakill's [UKButt](https://github.com/PITR-DEV/ukbutt-mod) mod and the pioneering mind who made one for [Webfishing](https://github.com/elliotcubit/WebfishingButtplug).
+
+I've been wanting to dip my toes into VS Code extension development for a while, and something like buttplug integration seemed like an interesting step up from a basic hello world. Plus I get to be the guy who made a buttplug extension for a text editor, and bring that up at networking events, parties, and job interviews.
+
+So you might be wondering what the hell "buttplug integration" actually means. As it turns out, ass hardware is pretty advanced these days, with all kinds of bluetooth doohickeys that irradiate your insides and connect to your Google Home to your prostate and shit. Naturally, open source protocols for interfacing with smart sex toys have also emerged. [Buttplug.io](https://buttplug.io/) seems like a pretty popular choice for this, and it's actually pretty easy to work with.
+
+That still leaves the question of what buttplug integration should look like for a text editor. This is a subject that invites rigorous debate. I was looking at this from a very practical standpoint, so my main goal was to provide developers with an enhanced level of immersion that would boost their coding productivity. When I think of immersion, I think of the main document I'm editing. I want to *feel* the code as I'm writing it... in my ass. So that's where I started:
+
+```ts
+// Vibe on type
+context.subscriptions.push(vscode.workspace.onDidChangeTextDocument(async (e) => {
+ if (config!.get('typingStrength') === 0) { return; }
+ //...
+ const activeEditor = vscode.window.activeTextEditor;
+
+ if (!activeEditor) {
+ return;
+ }
+
+ await selected_device?.vibrate((config!.get('typingStrength') as number) * (config!.get('strength') as number));
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ timeout = setTimeout(async () => await selected_device?.stop(), config!.get('typingDuration') as number * 1000);
+}));
+```
+(The full code for this extension is available [here](https://git.soaos.dev/vscode-buttplug.git/tree/).)
+
+Basically what this snippet does is watches for any edits to the currently open text editor and provides "haptic feedback" for each keystroke.
+I made the strength and duration of these vibrations, along with an overall strength multiplier, configurable by the user.
+
+This on its own would be great, but it isn't enough. This extension needs to be a holistic overhaul of the modern developer experience. And as modern developers, actually writing code takes up such a miniscule amount of our time. Sitting on your ass waiting for your insanely bloated app to build is a much more important activity, and one that is normally very boring. Well, no more:
+
+```ts
+// Vibrate continuously while building
+context.subscriptions.push(vscode.tasks.onDidStartTask(async e => {
+ if (config!.get('buildStrength') === 0) { return; }
+ if (e.execution.task.group === vscode.TaskGroup.Build) {
+ building = true;
+ await selected_device?.vibrate((config!.get('buildStrength') as number) * (config!.get('strength') as number));
+ }
+}));
+
+// Stop vibration once build tasks all finish
+context.subscriptions.push(vscode.tasks.onDidEndTask(async e => {
+ if ((vscode.tasks.taskExecutions).every(t => t.task.group !== vscode.TaskGroup.Build)) {
+ building = false;
+ await selected_device?.stop();
+ }
+}));
+```
+
+The extension obliterates your asshole relentlessly while a build task is in progress (sorry rust devs, although I have a feeling you won't mind). This is extremely useful, since the vibration only stops once all build steps are complete, letting you know it's ok to stop scrolling Instagram reels and get back to work.
+
+That covers the basic functionality of the extension, outside of a few utility commands like a killswitch. If you want to try it out, just download the [intiface central](https://intiface.com/central/) app, install the extension, connect and install your hardware, and godspeed. \ No newline at end of file