Web-based PC controller for the DG-Lab Coyote 3.0 e-stim, direct over Bluetooth LE — no phone bridge. Dual-channel frequency explorer, sweep, random generator, stage + drawable waveform editor with live preview, playlist runner, interactive-content (funscript) player, plus balance and soft-cap controls. Python backend + plain HTML/CSS/JS UI.
A web-based PC controller and creation suite for the DG-Lab Coyote 3.0 e-stim device. Connects directly over Bluetooth LE — no phone, no WebSocket bridge required. Dual-channel control with a frequency explorer, sweep, random generator, drawable waveform editor, playlist runner, and an interactive-content (funscript) player. Python backend + plain HTML/CSS/JS browser UI — no Node.js or build step needed.
The in-app title remains "Coyote 3.0 Console" — the project name (Studio) reflects the creation suite as a whole; "Console" is the runtime UI title.
- Dual-channel Explorer — independent frequency and intensity per channel, with a +4-per-input rate-limiter on intensity slips.
- Frequency Sweep — walk a frequency range over a fixed duration, mark interesting moments mid-sweep.
- Random Generator — per-channel random
freq/intensitywithin configurable bounds at a chosen cadence. - Waveform Editor — stage-based editor + drawable curve canvas with live SVG preview, click-to-seek progress line, save/load library.
- Playlist Runner — chain saved waveforms with per-item durations and channel overrides for a full-session experience.
- Interactive Player — load a video file and matching
.funscript; stroke direction drives Channel A vs B, stroke velocity drives intensity. - Favorites Library — save discovered frequency/intensity points with optional notes; replay or delete from a grid.
- Safety controls — persistent soft cap (BF command), balance parameters (frequency / intensity balance), intensity rate-limiter, and an always-visible STOP button in the nav bar. Esc stops both channels instantly.
- DG-Lab Coyote 3.0 (Pulse Host model
47L121000) with appropriate electrodes. - A Windows PC with Bluetooth LE. (macOS/Linux should work too —
bleakis cross-platform — but only tested on Windows.) - Python 3.9 or newer.
-
Clone or download this repo.
-
Install Python 3.9+ from python.org. Tick "Add Python to PATH" during install.
-
Double-click
start.batin the repo root.First run creates
prototype/.venv/, installs dependencies (bleak,fastapi,uvicorn,pydantic), starts the server, and opens your browser to http://127.0.0.1:8000.Subsequent runs just start the server and open the browser.
-
In the Setup tab of the web UI, paste your Coyote's MAC address and click Connect. (Get the MAC from Windows Settings > Bluetooth, or run
prototype\.venv\Scripts\python.exe prototype\discover.pyto list nearby BLE devices.) -
Set a conservative Soft Cap in the nav bar (start at 30/200, raise gradually after you understand the device).
-
Start exploring on the Explorer tab. Use the device wheel for channel intensity (voltage).
See START_HERE.txt for more detailed setup and troubleshooting.
Browser (HTML + vanilla JS)
↕ HTTP + WebSocket
FastAPI server (server.py)
↕
Streamer (streamer.py) ← owns BLE connection + 100ms B0 loop
↕ Bluetooth LE
Coyote 3.0
- The FastAPI server holds the BLE connection across page reloads. A WebSocket pushes state changes and B1 echoes to the browser in real time.
- The streaming loop sends a B0 command every 100 ms (the protocol's required cadence). State changes (slider drags, waveform plays, playlists, random mode) just mutate the per-channel
prog_a/prog_bprograms; the next B0 tick picks up the change automatically. - All persistent user data — favorites, saved waveforms, saved playlists — lives in
prototype/library/as plain JSON files.
This project implements the V3 Bluetooth protocol for the Coyote 3.0 Pulse Host, as published by DG-Lab:
- Upstream protocol repo: dungeonlab-open/dglab-bluetooth-protocol
- Upstream WebSocket samples: dungeonlab-open/dglab-websocket-simple
The included Coyote V3 Protocol Summary.md is an English summary of the V3 protocol I wrote while building this — meant as a quick reference for anyone else writing a Coyote 3.0 client.
- DG-Lab for designing the Coyote 3.0 hardware and publishing the Bluetooth protocol as open source, making third-party clients like this possible.
- Built on bleak (cross-platform Python BLE), FastAPI, uvicorn, and pydantic.
MIT. DG-Lab's protocol documentation is published as open source for non-commercial use; this project follows that intent. Do not redistribute this as part of a commercial product without contacting DG-Lab.
Electrical stimulation carries real risks if used incorrectly. By using this software you accept responsibility for understanding those risks and operating the device safely.
- Do not place electrodes across your heart, head, neck, eyes, or anywhere current could cross the chest cavity.
- Do not use if you have a pacemaker, implanted defibrillator, or any other implanted electronic medical device.
- Do not use if you have a heart condition, epilepsy, are pregnant, or are under the influence of substances that impair judgment.
- Start at very low intensity. Set the soft cap (in the nav bar) to single digits before connecting internal electrodes (urethral, anal); start at ~30/200 for surface electrodes.
- Test off-body first. Verify the waveform feels the way you expect on a small patch of skin before applying to sensitive areas.
- Esc stops both channels instantly. The nav-bar STOP button and the Stop buttons in the Explorer panel do the same thing. Keep a hand near the keyboard.
- This is not medical advice or a medical device. The author makes no claims about therapeutic or clinical use.
- Use of saline-filled penis pumps, internal electrodes reaching the prostate, or other unconventional setups carries elevated risk — including risk of permanent damage to autonomic nerves controlling continence and sexual function. Understand the risk before attempting.
If anything feels wrong — sharp pain, sudden urge to urinate, muscle spasms outside your expected pattern — stop immediately and reassess.
Built by a hobbyist for personal use, then polished enough to share. Not affiliated with DG-Lab.