BadBLE
Bluetooth HID keyboard — DuckyScript over BLE
BadBLE runs DuckyScript payloads as a standard Bluetooth HID keyboard (HOGP). The device advertises as a BLE keyboard, you pair it with a phone, laptop, or tablet, and payloads (or live typing) play out as keystrokes on the paired host — no USB cable required.
Supported Devices
Enabled by default on Bluetooth-capable targets:
- ESP32 (original)
- ESP32-C3 / ESP32-C5 / ESP32-C6
- ESP32-S3
ESP32-S2 is not supported (no Bluetooth radio).
Using BadBLE
Open BadBLE from the main menu on the device:
- Run Script — pick a payload from
/mnt/ghostesp/badble/(or the built-in Ghost Art script, which needs no SD card). The device advertises and waits; once a host pairs, the popup flips from “Waiting” to “Running” and the script plays out. Cancel (tap anywhere, or confirm/back on joystick, Enter/Esc on keyboard, encoder press) stops it. - BLE Keyboard — live typing screen. Every key is forwarded to the paired host as you press it; exiting the screen stops BadBLE.
- Set Name — change the advertised name (max 31 characters, saved to NVS).
- Status — current state, advertised name, and whether a host is connected.
- Stop BadBLE — tear down the BLE profile; WiFi/AP are restored.
The same feature is available from the CLI and the WebUI (BLE page → BadBLE tab).
Pairing
- Pairing uses a “Just Works” exchange — no passkey to enter.
- The device initiates pairing as soon as a host connects; accept the pairing/passkey-optional prompt on the host.
- As with any BLE keyboard, the link must be encrypted before the host delivers keystrokes — pairing normally takes care of this automatically.
- Default advertised name:
GhostESP BadBLE.
Note: Only one host can be paired at a time. If the host drops, the device re-advertises so you can reconnect.
Script Files
- Place scripts in
/mnt/ghostesp/badble/ - File extension:
.txt(only.txtfiles are listed) - Size limit: 64 KB per script
- The built-in Ghost Art script always appears first in the picker and runs without an SD card
CLI
badble status
badble list
badble run <filename|"Ghost Art (Built-in)">
badble stop
badble keyboard_start
badble keyboard_stop
badble type <text>
badble keysend <modifier> <keycode>
badble name
badble set_name <text>
Limitations
- BadBLE owns the BLE radio while active: BLE scans, the BLE bridge, and other BLE tools are unavailable until BadBLE is stopped.
- One host at a time; script execution waits until a host is connected.
- BLE mouse/trackpad reports are not supported.
