From 152c53851f6b8737e2ad8a203523ee0032d95ce8 Mon Sep 17 00:00:00 2001 From: soaos Date: Thu, 29 Jan 2026 22:14:15 -0500 Subject: vscode-buttplug post --- config.toml | 6 +-- content/blog/vscode_buttplug/buttplug-0.0.1.vsix | Bin 0 -> 632364 bytes content/blog/vscode_buttplug/index.md | 63 +++++++++++++++++++++++ static/98.css | 2 +- static/style.css | 4 ++ 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 content/blog/vscode_buttplug/buttplug-0.0.1.vsix create mode 100644 content/blog/vscode_buttplug/index.md diff --git a/config.toml b/config.toml index a63e891..dd2361a 100644 --- a/config.toml +++ b/config.toml @@ -13,11 +13,11 @@ generate_robots_txt = true generate_sitemap = true [markdown] -# Whether to do syntax highlighting -# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola -highlight_code = true external_links_target_blank = true +[markdown.highlighting] +theme = "everforest-dark" + [extra] # Put all your custom variables here 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 Binary files /dev/null and b/content/blog/vscode_buttplug/buttplug-0.0.1.vsix 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 diff --git a/static/98.css b/static/98.css index 5f2d3d8..dd99965 100644 --- a/static/98.css +++ b/static/98.css @@ -851,7 +851,7 @@ pre { code, code * { - font-family: monospace; + font-family: 'unifont'; } summary:focus { diff --git a/static/style.css b/static/style.css index 202b0ad..804ce8d 100644 --- a/static/style.css +++ b/static/style.css @@ -35,6 +35,10 @@ html { image-rendering: pixelated; } +a:not(:has(img, div))[href$=".vsix"]::after { + content: " ⮋"; +} + a:not(:has(img, div))[target="_blank"]::after { content: " ⎘"; } -- cgit v1.2.3