Mission control
for your bench

command your _ with Guppi

The command-and-control plane for anything with instruments: every instrument on your bench in one live dashboard — set outputs, watch channels stream, capture waveforms — and codify it all as Python test sequences.

One command on a Raspberry Pi or any Debian box. Free on your bench, forever — no account, no card.

Bench work still means custom scripts, driver hunts, and digging through shared folders.

We made it fast, integrated, and actually fun.

$ guppi rack
psu1Keysight N5772A
scope1Siglent SDS1104
temp1Lake Shore 336
3 instruments paired

Connect

Plug in and run one command. Guppi scans VISA, USB, Ethernet, serial, and CAN, and matches what it finds against 200+ built-in drivers — power, scopes, DMMs, RF, temperature, vacuum, motion, photonics. No config.

psu1.voltage48.00 V
psu1.current2.41 A
output

Control

The dashboard is a live control surface: set voltages, flip outputs, arm scope captures — from any browser on the LAN. Watchdog safety limits stand guard under everything you touch.

def check_rail(test, PSU):
PSU.set_voltage(1, 5.0)
test.measurements.vout =
✓ PASS 12/12 measurements

Automate

When a procedure matters, codify it: plain-Python tests drive the same instruments — phases, measurements, pass/fail limits, sweeps, operator prompts. History lands in plain Postgres.

Plug in. guppi does the rest.

Connect your instruments, run one command, and data streams straight to your browser — instantly. No drivers to hunt down, no addresses to wire up.

VISASCPIGPIBUSB-TMCEthernet / LXIRS-232RS-485ModbusCANUSB-CANI²CSPIPXISerial

A test is a Python file.
That's the whole contract.

Declare limits, assign measurements, list your phases. Guppi derives the test plan from your code, binds your real instruments as plugs, and streams every measurement live as it runs — on an open framework, not a proprietary sequencer.

Read the test-writing guide →
tests/check_rail.py
import openhtf as htf

@htf.plug(PSU=PSU1)
@measures(htf.Measurement("vout")
    .with_units(units.VOLT).in_range(4.9, 5.1))
def check_rail(test, PSU):
    PSU.set_voltage(1, 5.0)
    PSU.set_output(1, True)
    test.measurements.vout = PSU.measure_voltage(1)

TEST_PHASES = [check_rail]  # that's it
200+

instrument drivers, auto-detected by *IDN? reply

Python

tests are plain code on an open framework — no lock-in

Postgres

your data, on your box, in a normal database

Offline

no account, no cloud dependency, air-gap it

Runs on the bench you own.

Guppi installs like a CLI on a Raspberry Pi — no Docker, no database, no cloud credentials. One command and your whole bench is online, ready to run with guppi-rack.

$ sudo bash install.sh
dependencies installed
VISA bus scanned — 3 instruments
USB-CAN adapter detected
paired with agent · claim code A7F3
$ guppi-rack

Zero config

No address, database, or cloud credential to set.

Never inbound

It dials out. Nothing is ever exposed to the network.

Auto-detect

Scans the bus on every boot and finds your hardware.

Local-first. Cloud-powered.

Cloud test tools store your results. Guppi runs your bench — and the cloud comes with it. The bench you own is free and stays that way; the cloud adds memory, reach, and intelligence when your team needs it.

The bench

free, forever

A complete, deterministic test bench. Auto-detects hardware, runs your tests, and keeps working offline — no account, air-gapped if you want it.

The cloud

when you're ready

AI test authoring, fleet management, remote sharing, and long-term archive — the conveniences that are hard to self-host. Optional, metered, always additive.

RUNNINGtests/solar_array_qualification.py
  1. setup_array
  2. irradiance_sweep
  3. verify_recovery
  4. teardown
sas1.1.current-0.07 A
dut1.vout5.00 V
dut1.power_out-5 W

Get your bench up to speed

Blank SD card to live telemetry in under 15 minutes. No signup, no card, no setup call.

One command on a Raspberry Pi or any Debian box. Free on your bench, forever — no account, no card.