Skip to main content
Generaldvcrn

toybridge

Control any BLE toy that has been reverse-engineered and connected via the ToyBridge server. Calls a local HTTP API to send vibrate/stop commands. Requires the ToyBridge server running on the same machine.

Stars
15
Source
dvcrn/openclaw-skills-marketplace
Updated
2026-05-29
Slug
dvcrn--openclaw-skills-marketplace--toybridge
View on GitHubRaw SKILL.md

// install — copy + paste into any project

mkdir -p .claude/skills && curl -fsSL https://raw.githubusercontent.com/dvcrn/openclaw-skills-marketplace/HEAD/plugins/amandaclarke61--toybridge/skills/toybridge/SKILL.md -o .claude/skills/toybridge.md

Drops the SKILL.md into .claude/skills/toybridge.md. Works with Claude Code, Cursor, and any agent that loads SKILL.md files from .claude/skills/.

ToyBridge — Universal BLE Toy Control

Control any BLE toy through OpenClaw, as long as you have the ToyBridge server running.

This skill is for devices that are not supported by Buttplug.io/Intiface — devices with proprietary or unknown protocols that you've reverse-engineered yourself using the ToyBridge toolkit.

If your device IS supported by Buttplug.io, use the intiface-control skill instead — it's easier.


Prerequisites

  1. You've reverse-engineered your device's BLE protocol using ToyBridge
  2. You've configured 4-bridge/ble_worker.py for your device
  3. The ToyBridge server is running: uv run 4-bridge/server.py

See the full setup guide for step-by-step instructions.


Commands the agent will use

Vibrate at intensity

curl -s -X POST http://host.docker.internal:8888/vibrate \
  -H "Content-Type: application/json" \
  -d '{"intensity": 60}'

intensity: 0–100 (0 = stop)

Stop immediately

curl -s -X POST http://host.docker.internal:8888/stop

Check status

curl -s http://host.docker.internal:8888/status

If OpenClaw runs natively (not in Docker), replace host.docker.internal with localhost.


Intensity guide

Range Feel
1–20 Gentle
30–50 Medium
60–80 Strong
90–100 Maximum

Preset patterns

Pattern What it does
pulse Bursts of 80%, 5 times
wave Ramp up 20→100%, then back down, x2
tease 30% → 70% → 100%, escalating, then stop

To run a pattern:

curl -s -X POST http://host.docker.internal:8888/vibrate \
  -H "Content-Type: application/json" \
  -d '{"pattern": "wave"}'

Agent rules

  • Always stop (intensity 0) after a timed session unless user says to keep going
  • Do not use the notify tool — use bash with curl
  • Replace host.docker.internal with localhost if OpenClaw is not in Docker

Troubleshooting

Problem Fix
connection refused Make sure uv run 4-bridge/server.py is running
Device doesn't respond Check your device config in ble_worker.py
Wrong intensity Values are clamped to 0–100