
He input v2
OPad-dev/OPad
A deterministic, ultra-low-latency mechanical keypad and live telemetry HUD designed for competitive osu!, osu!lazer, and rhythm games on Linux and Windows 10/11.

A deterministic, ultra-low-latency mechanical keypad and live telemetry HUD designed for competitive osu!, osu!lazer, and rhythm games on Linux and Windows 10/11.
He input v1 is an open-source printed circuit board by OPad-dev, from the OPad-dev/OPad repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 52 × 24 mm with 15 parts on 8 nets, routed with 32 tracks and 22 vias.
It is built around the CC0603KRX7R9BB104 and SM08B-SRSS-TB(LF)(SN). Its parts include 3 capacitors, 2 resistors, 2 ICs, 2 switches and 1 connector.
Low-Latency ESP32-S3 Rhythm Gaming Keypad & Telemetry Display
A deterministic, ultra-low-latency mechanical keypad and live telemetry HUD designed for competitive osu!, osu!lazer, and rhythm games on Linux and Windows 10/11.
"If a feature measurably worsens keyboard latency or latency jitter, the feature is reduced, deferred, frozen during gameplay, or removed."
The keypad functions as a standalone 1000 Hz USB HID keyboard out of the box with zero host software running. Auxiliary features (LVGL telemetry, SQLite persistence, system tray, and tosu integration) are completely isolated from the keypress critical path.
+-------------------+
| osu!lazer |
+---------+---------+
| (observes)
v
+-------------------+
| tosu |
+---------+---------+
| (WebSocket v2)
v
+--------------------+ +-------------------------+
| opad-gui | | opad-daemon |
| (Rust/iced) |<->| (Rust) |
| - System Tray |IPC| - State Machine |
| - Layout Designer | | - SQLite Storage |
| - Configuration | | - Headless Service |
| - Diagnostics | | - tosu & Device Owner |
+--------------------+ +------------+------------+
|
USB CDC | USB HID (1000 Hz)
|
v
+-------------------------+
| ESP32-S3 Touch LCD 2 |Standard MX mechanical switches have no polarity. Connect each switch between its designated GPIO and ground:
| Input | Board Header & Pin | GPIO | Switch Connection |
|---|---|---|---|
Key 1 (Default Z) | Header P2, Pin 11 | GPIO 14 | Pin A -> Pin 11, Pin B -> GND (Pin 13) |
Key 2 (Default X) | Header P2, Pin 12 | GPIO 9 | Pin A -> Pin 12, Pin B -> GND (Pin 2) |
| Ground | Header P2, Pin 13 / Pin 2 | GND | Ground Reference |
Note: Pins 11, 12, and 13 are directly adjacent on Header P2 for simple breadboard/Dupont jumper wiring.
These are the defaults. Each key's pin can be changed in the app under Settings → Keys. The list only offers header pins that work with a switch to GND:
| Header | Pins (GPIO) |
|---|---|
| P1 | 1 (GPIO 2), 2 (GPIO 4), 3 (GPIO 6), 4 (GPIO 16), 6 (GPIO 18), 7 (GPIO 21), 8 (GPIO 8), 9 (GPIO 7), 10 (GPIO 10) |
| P2 | 7 (GPIO 15), 8 (GPIO 13), 9 (GPIO 11), 10 (GPIO 12), 11 (GPIO 14), 12 (GPIO 9) |
Left out: GPIO 19/20 (USB), GPIO 43/44 (UART0 console), GPIO 47/48 (touch and IMU I2C) and GPIO 17 (pulled down on the board). Most listed pins are also wired to the camera connector, so don't use them with a camera fitted.
sudo apt update
sudo apt install -y build-essential pkg-config libasound2-dev libudev-dev \
libx11-dev libxkbcommon-dev libwayland-dev libfontconfig1-dev libdbus-1-devcd desktop
cargo build --releaseThe compiled binaries are produced in desktop/target/release/:
opad-daemon: Background service.opad-gui: Graphical configuration, layout designer, and system tray.opadctl: Command-line management tool.cd firmware
idf.py set-target esp32s3
idf.py buildopadctl (Recommended)opadctl drives espflash directly and needs no shell script and no ESP-IDF
toolchain. It asks the daemon to release the serial port first, reboots the pad
into the ROM download bootloader hands-free, writes the image and reboots back
into the app — on Linux and on Windows, with the app running:
# Update the app image only (ota_0 at 0x20000)
opadctl flash firmware/build/opad-firmware.bin
# Recovery flash: bootloader + partition table + OTA data + app
opadctl flash --full firmware/buildIt also works with no daemon running at all, which is the state a recovery flash usually happens in.
cd firmware
idf.py -p /dev/ttyACM0 flashIf the pad will not enter download mode or has to be returned to stock, see Recovery, Reflashing & Unbinding.
The pad needs none of this to work as a keyboard. Plug it into any Windows
10 or 11 machine and it types immediately: HID binds to the inbox
hidclass.sys and the CDC port to the inbox usbser.sys. No .inf, no
WinUSB, no Zadig, no install. The software below is for configuring it, the
telemetry HUD and the lifetime counters.
opad-setup-<version>.exe from the GitHub Releases page and run it.opadctl, bundles tosu, and configures
both to start at login. There is nothing else to do.SmartScreen will warn you. The installer is not code-signed yet: OPad is applying to SignPath Foundation for free OSS signing, which requires the repository to be public first. Until then, Windows shows "Windows protected your PC" — choose More info → Run anyway. Check the download against
SHA256SUMSon the release page if you would rather verify it than trust the dialog.
Uninstall from Settings → Apps. It removes everything it installed, including
the two Run registry values, and asks before it touches your opad.db —
so a reinstall keeps your lifetime counters unless you say otherwise.
To reset a pad completely, or hand it to someone else, see Recovery, Reflashing & Unbinding. There is no unpair button in the app, deliberately: the only unbind is a documented reflash, and it erases the pad's lifetime counters along with the owner record.
Pre-built packages are on the GitHub Releases page. The .deb and .rpm set
up everything: the udev rule, the daemon's systemd user service, tray autostart,
the bundled espflash, and the ptrace capability tosu needs to read osu!'s
memory (see docs/troubleshooting.md §2).
Supported: every Ubuntu LTS and Debian release in support (Ubuntu 22.04, 24.04, 26.04; Debian 12, 13), RHEL / AlmaLinux / Rocky 9 and 10, current Fedora and Arch. The release packages, bundled tosu included, need glibc 2.28 or newer.
.deb):sudo apt install ./opad_<version>_amd64.deb
# Or via dpkg:
sudo dpkg -i opad_<version>_amd64.deb.rpm):sudo dnf install ./opad-<version>.x86_64.rpmchmod +x opad-x86_64.AppImage
./opad-x86_64.AppImageThe AppImage installs nothing system-wide. On first run it offers to install
the udev rule (it asks for your password), or run
./opad-x86_64.AppImage install-udev yourself. It cannot give tosu the ptrace
capability; opadctl setup and the Diagnostics page explain the alternative.
The repository's PKGBUILD builds from source (tosu runs on the system
nodejs, so see troubleshooting §2 about ptrace):
makepkg -simake
sudo make install~/.local):make
make install-user
systemctl --user daemon-reload
systemctl --user enable --now opad-daemon.serviceIf not installing from package, allow non-root user access to USB CDC and ROM bootloader devices:
sudo cp packaging/linux/udev/70-opad.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm triggeropadctl)# Check device, daemon, and tosu state
opadctl status
# Trigger safe reconciliation
opadctl sync
# Export portable JSON backup
opadctl export backup.json
# Import validated backup
opadctl import backup.json
# Flash firmware image directly over USB
opadctl flash firmware/build/opad-firmware.bin
# Recovery flash (bootloader, partition table, OTA data and app)
opadctl flash --full firmware/build
# Reboot the pad into the ROM download bootloader and leave it there
opadctl bootloader
# Stream real-time diagnostic logs
opadctl monitorOPad bundles or interacts with the following third-party software:
OPAD_TOSU_PATH (or legacy OSUPAD_TOSU_PATH) environment variable to a custom tosu executable, or configure an external path in the OPad desktop GUI (Settings → tosu).OPad is an independent open-source hardware and software project. OPad is not affiliated with, endorsed by, or sponsored by ppy Pty Ltd or osu!. "osu!" is a registered trademark of ppy Pty Ltd.
OPad is free and open source, software and hardware:
GPL-3.0-or-later).hardware/: the PCB designs, footprints and symbols, the enclosure CAD and the production files — is licensed under the CERN Open Hardware Licence v2, Strongly Reciprocal (CERN-OHL-S-2.0). The scripts in hardware/ that generate and check those files are software, under GPL-3.0-or-later.You may build, modify and sell OPad. If you distribute a modified version, of the software or of the hardware, you must publish its source under the same licence. Every file's licence is recorded in REUSE.toml.
Third-party components keep their own open licenses and ship with their notices:
Libraries pulled in at build time (Rust crates, ESP-IDF components such as LVGL and TinyUSB) are not stored here and are used under their own permissive licenses.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 3 | 100nF | osupad:C_0603_1608Metric | C1, C2, C3 |
| 2 | DRV5055A3 | osupad:SOT-23 | U1, U2 |
| 2 | MountingHole_2.2mm_M2 | osupad:MountingHole_2.2mm_M2 | H1, H2 |
| 1 | 100k | osupad:R_0603_1608Metric | R1 |
| 1 | 47k | osupad:R_0603_1608Metric | R2 |
| 1 | IO2 | osupad:TestPoint_Pad_1.0x1.0mm | TP3 |
| 1 | IO4 | osupad:TestPoint_Pad_1.0x1.0mm | TP2 |
| 1 | IO6 | osupad:TestPoint_Pad_1.0x1.0mm | TP1 |
| 1 | KEY1 | osupad:SW_MX_Hall_PlateMount_SolidCentre | SW1 |
| 1 | KEY2 | osupad:SW_MX_Hall_PlateMount_SolidCentre | SW2 |
| 1 | MODULE | osupad:JST_SH_SM08B-SRSS-TB_1x08-1MP_P1.00mm_Horizontal | J1 |
It measures 52 × 24 mm and has 2 copper layers, 1.6 mm thick.
15 parts, built around the CC0603KRX7R9BB104 and SM08B-SRSS-TB(LF)(SN). The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the OPad-dev/OPad repository on GitHub, at the commit this page was made from: the board is hardware/pcb/V1/HE/production/aisler/he_input_v1.kicad_pcb and its schematic hardware/pcb/V1/Carrier/controller_carrier_v1.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

OPad-dev/OPad
A deterministic, ultra-low-latency mechanical keypad and live telemetry HUD designed for competitive osu!, osu!lazer, and rhythm games on Linux and Windows 10/11.

OPad-dev/OPad
A deterministic, ultra-low-latency mechanical keypad and live telemetry HUD designed for competitive osu!, osu!lazer, and rhythm games on Linux and Windows 10/11.

OPad-dev/OPad
A deterministic, ultra-low-latency mechanical keypad and live telemetry HUD designed for competitive osu!, osu!lazer, and rhythm games on Linux and Windows 10/11.

ara-mkr/f405-flight-controller
This is a flight controller I designed as a side project. It was fun and pretty challenging, and I'm planning to build a drone with it at some point!

HeyPCB/iris-cortex
Iris Cortex: head controller of the Iris robot head. ESP32-S3 (16 MB flash, 8 MB PSRAM), OV2640 eye-camera FPC, iris-ring LED drivers, harness hub.

OpenDrone-hw/OpenESC-20x20
Open-source 4-in-1 AM32 ESC for FPV drones. 20x20 mm, 2-6S, one MCU per motor, CERN-OHL-S-2.0.

OpenDrone-hw/OpenFC-Lite-Mini
Open-source Betaflight flight controller. RP2354A, 20x20 mm, 6-layer, 3-6S, CERN-OHL-S-2.0.

OpenDrone-hw/OpenFC-Lite
Open-source Betaflight flight controller. RP2354B, 30.5x30.5 mm, 6-layer, 3-8S, CERN-OHL-S-2.0.

Caped-Crussader/VENDETTAFC
A fully open-source, custom-designed 4-in-1 ESC and F7 Flight Controller stack for FPV multirotors, designed from scratch in KiCad.

HazzerTheGreat/SPAR
A flight controller for fixed wing UAVs based on the STM32H7 and designed to run betaflight or INAV

HeyPCB/iris-brow
Iris Brow: forehead sensor strip of the Iris robot head. VL53L1X distance, APDS-9306 light, two I2S microphones 108 mm apart, touch pads, on a brow-shaped board. 2-layer KiCad 10 board, DRC-clean, fab-ready.