PinBench

A testbed for embedded hardware. Your real firmware, on an emulated board, with every peripheral on the bench.

PinBench is a desktop testbed for embedded devices. Describe a board as parts and pins, open your PlatformIO project, and PinBench boots the binary on an emulated ESP32. Every part on the board (displays, radios, Ethernet, touch, keyboards, buttons, card readers) gets a panel you can configure, poke and watch. Develop and test before the hardware is on your desk, or without it at all.

macOS on Apple Silicon · free and open source (MIT)

PinBench running the ThinkNode M9 board: the Library of parts on the left, a wiring canvas of the board's parts and nets in the middle with the LCD showing the firmware's home screen, the Inspector on the right and the serial monitor below with the firmware's boot log.
The whole bench. A ThinkNode M9 described as parts and nets, its firmware booted in the emulator, the serial log streaming underneath.
Close-up of the emulated 2.4-inch ST7789 LCD part on the canvas, drawing the M9 firmware's home screen: a status bar with battery and GPS fix, and Inbox, Channels and Settings tiles.
Pixel for pixel. The M9 firmware's own LVGL home screen on the emulated ST7789.
Close-up of the Heltec Wireless Paper's 2.13-inch e-paper part reading 'Heltec WP Repeater, FREQ 869.618 SF8, BW 62.50 CR 5', beside its Inspector entry for the UC8151 controller and its six display nets.
E-paper, rotated. An unmodified MeshCore repeater refreshing the UC8151 panel on a Heltec Wireless Paper.
The Inspector for the SX1262 LoRa radio: its pin map and SPI bus, an Input section with message, RSSI and SNR fields and buttons to send a channel or direct message, pair a sender, send an advert or an ack, and an Output section showing frequency, last RSSI of -80 dBm and airtime.
Talk to the radio. Inject a channel message into the SX1262 and watch the firmware receive it.

RUNS THE REAL BINARY

Open a PlatformIO folder and press ▶. PinBench builds it, flashes the image into a patched QEMU, and boots it. The binary is the same one you'd flash to a board, with no mocks and no special build.

A PANEL FOR EVERY PART

Displays show the real framebuffer. Radios show what the firmware transmits. Ethernet gets a real network. Every panel shows the part's bus, pins and the firmware call that drives it. New parts plug in through a small device-model API.

DRIVE THE INPUTS

Press buttons, type on keyboards, touch screens, insert SD cards, present RFID tags and inject radio packets. Each input raises the same pins and interrupts real hardware would, so the firmware's own handlers run.

WIRING CANVAS

The board is a canvas of parts and nets. Move, add and rewire them, verify the pin map against the board's rules, and generate a C pin header from it.

CODE STAYS IN YOUR IDE

PinBench never edits your source. When the hardware and the firmware disagree, it says what has to change, in a dock tab and in .pinbench/actions.md, so you or your coding agent can fix it.

AGENT CONTROL PLANE

A built-in MCP server lets a coding agent build and boot the firmware, read and write the serial port, inject radio traffic and read back device state. It's the same loop you use, driven by the agent.

  • Elecrow ThinkNode M9: ESP32-S3, LR1110 radio, ST7789 LCD, keyboard
  • Heltec Wireless Paper v1.1: ESP32-S3, SX1262 radio, UC8151 e-paper
  • Waveshare ESP32-S3-ETH with a GC9A01 round LCD and a TWN4 RFID reader
  • Waveshare ESP32-C6-Touch-LCD-1.28: RISC-V, GC9A01 display, CST816S touch

A board is a JSON file of parts, buses and pins, so any ESP32-S3 or ESP32-C6 design can be described. Add your own.

  • macOS on Apple Silicon for the signed, notarized download
  • PlatformIO on your shell's PATH (it isn't bundled)
  • Other platforms: build from source with Node 22+. See the README.