- A tool that turns a LILYGO ESP32 T-Dongle S3 (or any ESP32-S3 with native USB) into a Wi-Fi-controlled USB keyboard.
- The device appears to the target machine as a normal USB HID keyboard, and you drive it from any web browser on your network.
- Type free-form text, or save reusable presets (with optional special-key combos like
<CTRL><ALT><DEL>) and send them with a single click. - My use-case is to input long usernames and passwords without typing them manually, or to send CLI / BIOS / LUKS input where SSH is not possible (different networks, pre-boot environments, ...).
- Works with an ENG (US) keyboard layout on the target.
IMPORTANT - security
- All text is sent as PLAINTEXT. The web UI is protected only by HTTP Basic authentication (
MASTER_USER/MASTER_PASS). - Use this device only on trusted local networks.
- Preset values marked Hidden are never sent back to the browser - they are typed straight from the device - but they are still stored in plaintext in the device's flash.
- Free-text typing - type anything into a textarea and send it.
Entersends,Shift+Enterinserts a newline; an optional trailing newline can be added. - Presets - save reusable snippets (name -> value) and send them with one click.
- Groups - organise presets into collapsible groups. A name must be unique within a group but may repeat across different groups.
- Per-preset visibility:
- Plaintext - value is shown in the UI.
- Masked - value is shown as
••••. - Hidden - value never leaves the device; it is typed straight from flash and never sent to the browser.
- Special keys / chords - preset values can embed
<TOKEN>keys that plain text can't produce (see below). A visual special key builder in the editor inserts them for you.
- On-device status - the display (and UART log) show the device IP once Wi-Fi connects; the web UI footer shows the firmware and storage-layout versions (from
/info).
Inside a preset value, wrap a key name in < > to send a raw key instead of literal text. Token names are case-insensitive.
Special keys use a chord model: each <TOKEN> is pressed and held as it is read, and the next typed character (if any) is pressed together with all held keys, then the whole chord is released at once. A token with no following character is pressed and released on its own.
| Preset value | Result |
|---|---|
<CTRL>c |
Ctrl + C |
<CTRL><ALT><DEL> |
Ctrl + Alt + Del (pressed together) |
<WIN>r |
Win + R (Run dialog) |
<F5> |
F5 on its own |
password<ENTER> |
types password, then Enter |
Supported tokens:
- Modifiers:
CTRL/CONTROL,SHIFT,ALT,WIN/GUI/WINDOWS/META - Editing / whitespace:
ENTER/RETURN,ESC/ESCAPE,BKSP/BACKSPACE/BS,TAB,SPACE/SPC - Locks / system:
CAPS/CAPSLOCK,PRTSC/PRINTSCREEN/PRTSCR,SCRLK/SCROLLLOCK,PAUSE/BREAK,NUMLK/NUMLOCK,MENU/APP/APPLICATION - Navigation:
INS/INSERT,HOME,PGUP/PAGEUP,DEL/DELETE,END,PGDN/PAGEDOWN,LEFT,RIGHT,UP,DOWN - Function keys:
F1-F12
Tokens are only parsed for presets. The quick Type text box sends everything literally, so
<CTRL>there types the characters<CTRL>.
- LILYGO ESP32 T-Dongle S3, or any other ESP32-S3 with native USB
- A web browser to access the GUI
- A target machine that will receive the keystrokes
- Download and open the PlatformIO project in VS Code (PlatformIO IDE extension).
- Edit
config.h:- Set
WIFI_SSID,WIFI_PASS,MASTER_USERandMASTER_PASS. - If using a board other than the LILYGO ESP32 T-Dongle S3, adjust the other board-specific values in
config.h/platformio.inias needed.
- Set
- Compile & flash.
html.cppandhtml.hare generated automatically during the build (fromweb/index.html).
- Plug the native USB port into the target machine (and UART into another machine if you want to see the IP or logs).
- On a successful Wi-Fi connection, the device IP is shown on the display and printed over UART.
- Open
http://DEVICE_IPin a browser (default port is80), log in, and start typing / managing presets.
- Presets are stored in the ESP32's flash (NVS). The firmware tracks a storage-layout version (
STORAGE_VERSION); if it opens flash written by a different layout, the preset store is wiped and reinitialised - so a firmware upgrade that bumps that version will clear existing presets.