Overview
CANbench is a desktop app for talking to CAN devices from a laptop through a USB-CAN adapter. You can send frames, watch what comes back, and check a device's behavior before it ever goes on a vehicle.
Why I built it
Bringing up boards and debugging nodes for Princeton Racing Electric kept turning into the same routine: plug a USB-CAN adapter into my laptop, send a few frames by hand, watch the responses, check the timing, and repeat. The existing ways of doing that were clunky for such a common task.
So I'm building the tool I wanted: something that makes that loop fast. It comes straight from a problem I kept hitting in real embedded work.
System
CANbench is a Tauri app. A Rust core handles the adapter and the frames, and a TypeScript UI sits on top. Tauri keeps the app lightweight and native on the desktop, and Rust is a good fit for the part that talks to hardware.
What it does
- Transmit CAN frames to a device or bus.
- Receive and inspect incoming frames.
- Validate that a node responds with the right IDs and data.
- Check timing of messages and responses.
- Test nodes off the vehicle during board bring-up, before full integration.
Engineering decisions
Build for the actual workflow. The feature set comes from what I actually do when bringing up a node: send, watch, compare, repeat. It isn't meant to be a general-purpose protocol analyzer.
Rust for the hardware side. The part that talks to the adapter needs to be reliable and fast. Keeping it in Rust and separate from the UI makes that boundary clear.
What I learned
The best tooling usually starts as a workflow you're tired of doing by hand.