Invisible Hand
Overview
Invisible Hand (IVH) is a toolset that turns common microcontrollers (MCUs) — such as those in the ESP32 family — into programmable keyboards and mice. Depending on the capability of the MCU, this can be achieved over Bluetooth or USB.
For detailed documentation, check out the wiki.
Setup
Windows
Installer
Download the Windows installer from the releases page and run it. This includes start menu and desktop shortcuts.
Python
You can also install the Python package directly. Note that this method does not create start menu or desktop shortcuts.
pip install ivh
ivh start
Linux
The only supported installation method on Linux is via the Python package. This requires Python 3.10 or later.
pip install ivh
ivh start
The desktop interface requires the tk and imagetk libraries. On Debian-based distros (Ubuntu, Mint, etc.), install them with:
sudo apt update
sudo apt install python3-tk python3-pil.imagetk
macOS
⚠️ macOS is not officially supported. Installing the Python package may work, but is untested.
Make sure Python 3.10+ is installed, then run:
pip install ivh
ivh start
Preparing Your Hardware
You will need:
- An ESP32 board with onboard Bluetooth support
- A data-capable USB cable to connect your board to your PC (not a charge-only cable)
Windows USB Drivers
On Windows, you may need to install a driver to enable serial communication with your board. The chip used varies by board model — check the small IC near the USB port and install the appropriate driver:
| Chip | Driver |
|---|---|
| CP210x | Installation guide — Random Nerd Tutorials |
| CH34X | Installation guide — Adafruit |
| FTDI | VCP drivers — ftdichip.com |
Not sure which chip you have? Check your board's documentation or look for a small square IC labelled with one of the chip names above near the USB connector.
Linux Serial Port Permissions
For Invisible Hand (IVH) to access your PC's serial ports on Linux, you may need to add the necessary permissions to your user account as follows:
Debian (Ubuntu, Mint, etc.)
sudo usermod -aG dialout $USER
Fedora (RHEL, CentOS, etc.)
sudo usermod -aG dialout $USER
Arch
sudo usermod -aG uucp $USER
After running the command, you may need to log out and log back in, or reboot your system, for the permission changes to take effect.
Configuring Your Hardware
For Invisible Hand to communicate with your board, the Invisible Hand firmware must be installed on it. To do this:
-
Open the Invisible Hand configuration dialog by clicking the "Config" button.
-
To figure out which port your board is connected to, unplug it and plug it back in. An advisory message will appear under the port selection, indicating which port was most recently connected. Select the reported port. If the advisory message doesn't change when you (un)plug the board, make sure the required drivers are installed and that you're using a cable capable of data transfer.
-
Select your board from the dropdown.
-
Click "Flash" and wait for the firmware upload to complete.
-
Close all dialog windows.
-
Unplug your board, then plug it back in. It should now appear selected in the device selection dropdown.
-
If your board uses Bluetooth HID (most ESP32 boards do), open your computer's Bluetooth settings and pair with the board, which will appear under the name "Hand."
Creating Your First Macro
-
Click the "Add Macro" button in the "Macro files" pane.
-
A dialog will open. Enter the name of your new macro and click "Okay."
-
A command list will appear on the right. You can drag commands into the macro body area. The commands are simple and include keyboard actions, mouse actions, delays, and looping and randomization controls. Commands in the "Control" section are block commands, so you can drag other commands into them to create a hierarchy.
Running Your First Macro
-
Once you've finished creating your macro, plug in your board and click "Upload." This uploads the macro to the board.
-
If the board is properly paired (via Bluetooth or USB), the macro should start executing immediately.
-
You can pause the macro using the play/pause button next to the board name in the top left. You can also toggle play/pause using the Caps Lock key on another keyboard connected to your PC.
Saving Your First Macro to Your Board
The macro you uploaded previously will disappear once you unplug your board from power. Once a macro has been uploaded at least once, a "Flash" button will appear in the top right. To permanently store that macro on the board:
- Click the "Flash" button.
- A dialog will appear asking you to confirm. Click "Flash" in the dialog to write the macro to the board.
- Once flashing is complete, click "Finish" to close the dialog.
- You can now unplug your board and plug it back in. The flashed macro should start immediately.
⚠️ Only flash the final version of your macro, as flash storage can wear out permanently with repeated writes.
Release files for ivh 2026.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ivh-2026.0.5.tar.gz | 2.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ivh-2026.0.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 4.6 MB
Release files / ivh-2026.0.5.tar.gz
| Download URL | ivh-2026.0.5.tar.gz |
|---|---|
| Size | 2.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1592990d08f68d08e3c9e7ee974913d9a41cfed52179aa4bf1511875e3a64c8e
|
|
BLAKE2b-256 checksum How to use checksums |
f78f26d7836af7bb2ebb834d282596abb12210597a951f5784e30bfbe2360c88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / ivh-2026.0.5-py3-none-any.whl
| Download URL | ivh-2026.0.5-py3-none-any.whl |
|---|---|
| Size | 2.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6ac540fe92f3b3c2e8fc900b5631c33ecd84c8c25875a197707a57cc207d4f86
|
|
BLAKE2b-256 checksum How to use checksums |
a94327ce1efc5a2d7ac170841c9040dd133733641114d4f01bd11bd29fd11ceb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|