SIMINPUTDocumentation

The desktop app

Connect over USB, tweak your buttons, axes, and rules, watch your inputs live, and flash firmware updates. All from one window, no drivers needed.

The desktop app is optional. A box works as a joystick without it. You want it when you need to change what the box does, when you want to see what it is actually sending, or when there is a firmware update.

Download

Grab the latest build from the releases page and pick the file for your operating system. It is a single file, no installation required.

On Windows, download siminput-updater-windows.exe and double-click to run. On Linux, download siminput-updater-linux, then make it executable and run it:

chmod +x siminput-updater-linux
./siminput-updater-linux

Linux notes

Serial access needs your user in the dialout group:

sudo usermod -aG dialout $USER   # log out and back in afterwards

If you hit a tkinter error, install it for your distro:

sudo dnf install python3-tkinter   # Fedora
sudo apt install python3-tk        # Ubuntu / Debian

One window, three pages

There is no connect button anywhere. The app scans for SIMINPUT boards by USB vendor ID, connects to the first one it finds, and shows a green dot with the box name in the top right once it has one. The sidebar switches between the three pages.

Device

Shows what the box is: name, firmware version, board revision, USB product ID. Below that sits the live monitor, a grid of all 128 buttons and bars for the eight axes, updating live as you press things. The box scans its inputs 200 times a second, so what you see is what the sim gets. That makes the monitor the fastest way to find a bad solder joint or work out which pin a control is wired to: press it and see which cell lights up.

Configure

Four tabs. Device holds the USB name, product ID, debounce time, and keep-alive. Variables are named on/off states for latches, each with a checkbox to persist across power cycles. Axes map a name to one of the eight HID axes, or to the backlight. Rules is the main event: every rule is a card with its fields inline and a plain English summary of what it does, reordered with arrow buttons. Order matters, because rules can read the outputs of earlier rules in the same cycle.

The editor works on a copy. Read from device pulls the box's current configuration in, Save to device validates everything, writes it back, and reboots the box; a save with an unknown pin or button in it is refused before anything is written. Import and export move the same configuration through JSON files, which doubles as backup and as the way to share a setup. The hands-on walkthrough, module by module, is in setting up the modules.

Update

Flashes firmware from a .zip package, with a button in the header that opens the latest release. The app verifies every file in the package against its checksums before sending anything, backs your configuration up to a SIMINPUT Backups folder in your home directory first, and stages the whole update on the box before committing it, so a failed transfer leaves the device unchanged. Packages deliberately do not contain a configuration file, so updating the firmware never touches your rules. Uploads go lib files first, then boot.py, then code.py last, since code.py is what runs.

Run it with --mock to explore the whole app against a simulated device. Useful if you are writing a config before your hardware arrives.

Building it yourself

It is built with customtkinter and uv, on Python 3.12 or newer. Clone the repository, run uv sync, then uv run siminput-updater. It is MIT licensed, same as the firmware.