Features
Everything on your bench, controlled and recorded the same way
BenchMesh is one desktop app for every instrument you own: it finds them, shows each in a consistent panel, confirms every change with the instrument itself and records all of them on one timeline.
Bench & panels
One panel per instrument class, laid out in a responsive rack. Every instrument of a class gets the same panel; what differs between manufacturers - limits, steps, ranges, modes, optional controls - comes from its definition, not from per-device UI code.
- PSUPower supplies
Voltage, current and power readouts with trends, digit-wise setpoints, headroom to the current limit, CV / CC / protection annunciators and an arm-to-enable output switch per channel.
- DMMMultimeters
Rotary function dial, the main reading with range bargraph, min / max / average, ranges, hold and relative, rate and temperature sensor options where the meter has them.
- ELLElectronic loads
CC / CV / CR / CP modes, input voltage, current and power, the setpoint of the active mode and an arm-to-enable input switch.
- AWGFunction / waveform generators
Per channel: waveform, frequency, amplitude, offset and output, with a preview of the shape that comes out.
- OSCOscilloscopes
One screen for all channels with graticule, trigger level and position, timebase and vertical scale steppers, channel strips and measurements.
- LCRLCR meters
Primary and secondary readouts, function keys L / C / R / Z / DCR, series or parallel, test frequency and level, range and speed, open / short correction with a prompt, bias.
- SALSpectrum analyzers
Spectrum screen with dB graticule, max-hold ghost and a marker you place with a click; soft keys for frequency, bandwidth, amplitude, sweep, trace, marker and tracking generator.
- Anything else
Instruments of other classes get a read-only generic panel with all their readings.
- Arrange mode: drag panels, move them with ◀ ▶, pick a width (S, M, L, W) or hide them. Columns follow the window width; the layout is remembered.
- Fold a panel to its header line (double-click the header), and open it again when you need it.
- Instruments drawer for configuration and Detect, and a request log of what the app asked of each instrument.
Three skins
Pick the look of the displays from the top bar; every panel, readout, trace and annunciator follows. The fonts (B612, B612 Mono, Chakra Petch) are bundled, so it looks the same offline.
Reflective LCD
the default: dark segments on grey-green glass, like a bench meter
LED segment
glowing digits on a dark rack, colour-coded volts, amps and watts
Cockpit glass
calm dark glass panels with B612 numbers, made for long sessions
Try all three live in the bench on the home page.
Every change confirmed by the instrument
A request that returns OK only means the command was sent. BenchMesh waits for the instrument to say it happened.
- After a change, the control pulses discreetly until the instrument’s reported value - its status, or a read-back for setpoints - equals what you asked for.
- No report within 6 seconds: a small red dot marks the change as not confirmed, so a silently ignored command never goes unnoticed.
- Arm-to-enable: anything that switches an output or input on takes two presses; switching off takes one.
- Setpoints are edited digit by digit and nothing is sent until you press Enter.
Detect & instrument identity
Plug an instrument in and press Detect. BenchMesh finds it, tells you how sure it is, and finds it again tomorrow on whatever port it is plugged into.
- Detect sends only identify queries, and only to USB ports no instrument is using; it runs in the background with per-port progress (probe on the wire, probes tried).
- A configured instrument can carry a match instead of a fixed port: USB vendor / product ID plus the adapter’s serial number or chip revision, the instrument’s own serial number from its identify reply, and the port position only as a tie-breaker.
- It works the same on Linux, Windows and macOS - no udev rules, no COM-port hunting, no admin rights. Each match says how certain it is (by serial number, by USB serial, by adapter type, or by port position only).
- On Windows, a USB-TMC instrument without a usable driver gets Install driver: BenchMesh binds Microsoft’s built-in WinUSB driver, with the one admin prompt Windows requires.
- OWON XDM1241Add/dev/ttyUSB0USB serialidentified by USB serial
- TENMA 72-2540Add/dev/ttyACM0USB serialidentified by adapter type
- RIGOL DHO804Add/dev/usbtmc0USBTMC · 1ab1:044didentified by serial number
- OWON OEL1515Add/dev/ttyUSB1USB serialidentified by USB serial
Transports
Whatever socket your instrument has, BenchMesh speaks it, with the same SCPI-style exchange on top.
USB-serial · RS-232
Any baud rate and frame format the instrument needs (9600 8N1, 115200 8N1, …), including hardware flow control.
USB-TMC
IEEE 488.2 over USB: the Linux kernel driver, BenchMesh’s own USB-TMC implementation on Windows and macOS, or an installed VISA loaded at run time.
LAN · SCPI socket
Raw SCPI over TCP, usually port 5025 or 5555.
LAN · VXI-11 / LXI
For network instruments without a raw socket.
Port discovery is native on every platform (Linux sysfs, Windows SetupAPI, macOS IORegistry). Each instrument runs on its own connection and reconnects by itself.
Recording on one timeline
The reason BenchMesh exists: readings from all instruments on one common time domain.
- One sampler ticks on whole seconds for every recording; intervals from 1 s to 1 h, and recordings running side by side share timestamps.
- Right-click any reading to add it to a recording; add and remove readings while it runs, pause, resume, run several at once, for hours.
- An instrument that stops answering leaves a gap, never a repeated stale value. Recording adds no instrument traffic.
- Recorder dock, recordings history, zoomable chart with one axis per series, rename, CSV export, delete - all stored locally.
Instrument console
An optional pane at the bottom of each panel showing exactly what goes over that instrument’s link.
- → sent, ← received, • port events, with reply chunks joined, from a ring of the last 2000 entries per instrument.
- Auto, Text or Hex view; pause; clear.
- Copy produces paste-ready evidence: instrument, model, identify reply, link and app version, then the log.
- Made for troubleshooting and for confirming an instrument for the community.
- 12:04:37.000•opened /dev/usbtmc0 (USBTMC)
- 12:04:37.600→*IDN?\n
- 12:04:38.000←RIGOL TECHNOLOGIES,DHO804,DHO8A123456789,00.01.03\n
- 12:04:38.800→:TIMebase:MAIN:SCALe?\n
- 12:04:39.100←1.000000E-06\n
- 12:04:39.700→:CHANnel1:SCALe?\n
- 12:04:40.000←1.000000E-02\n
- 12:04:40.700→:MEASure:ITEM? VPP,CHANnel1\n
- 12:04:41.100←4.890000E-02\n
- 12:04:41.800→:MEASure:ITEM? FREQuency,CHANnel2\n
- 12:04:42.200←4.000120E+05\n
- 12:04:42.900→:TRIGger:STATus?\n
- 12:04:43.200←TD\n
Panels in their own windows
Pull any panel off the bench into a window of its own - the scope on a second monitor, the meter always on top.
- In the desktop app a detached panel is a frameless window: drag it by its header, fold it to a strip, keep it on top of other apps, close it.
- A panel is never drawn twice: while its window lives, the bench lists it under “In own windows”. Closing it - or a crash - brings it back.
- Closing the main window closes the app and its panel windows. In a browser, detached panels open as popups.
API & automation
Everything the UI does goes through a local HTTP API, so scripts, Node-RED flows and your own tools can drive the same bench.
- REST:
GET /instruments/PSU/psu-1/1/voltagereads,POST /instruments/PSU/psu-1/1/voltage/5.0sets. GET resolves only to queries and POST only to setters - no arbitrary commands through the API. - Method discovery: every instrument lists its operations with value specs from its definition (type, min / max, format, unit, allowed values) and a flag for operations that energise an output.
- WebSockets for live status, recordings and metrics; OpenAPI JSON / YAML and interactive docs served by the app.
- Per-port utilisation and latency metrics, for when you push polling hard.
- Flows, flow assistant and MCP (next release): automations built in the app, assembled from a description by an AI model with your own key, or written by AI assistants such as Claude Code over MCP - every change confirmed, energising steps armed.
Device definitions & community coverage
Instruments are described in declarative definition files - commands, reply parsing, limits, modes, links - interpreted by one generic driver. Today: 98 families, 426 models from 22 manufacturers.
- Definitions are written from the manufacturers’ programming manuals, validated against a schema, and replayed against wire captures from real instruments in the test suite.
- Bench-tested (6 models) were verified on the maintainers’ bench; Community-confirmed (0) by users; Awaiting confirmation (420) are written from the manual and waiting for someone who owns one.
- Own an instrument that is awaiting confirmation? Run it, copy the console evidence and tell the community - it moves to confirmed.
The desktop app
Native, small and quiet: Rust and Tauri, with the bench UI inside.
- Windows, Linux, macOS. Works fully offline; no account. Configuration and recordings live in your home folder.
- Updates: once per start the app checks for a newer signed release and offers it in a dialog - nothing installs without you.
- Free and open source under the MIT license.