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, stream channels, capture waveforms — then lock it down as Python tests.
One command on a Raspberry Pi or any Debian box. Free on your bench, forever — no account, no card.
One plane of control,
three ways to hold it.
Watch it on the dashboard, explore it in data views, codify it as tests — the same instruments, the same live data, three levels of rigor.
Every instrument on one live surface
The moment the rack pairs, every instrument it found appears as a panel: channels streaming live, setpoints you can type into, outputs you can toggle, captures you can arm — from any browser on the LAN.
Hardware abort limits stand armed underneath everything. Cross a threshold and the rig de-energizes itself — the watchdog doesn't care whether a test or a human was driving.
Every value lands, every window is explorable
Everything that streams also persists. Data views replay any time window: overlay channels, zoom into a transient, and hover to read exact values at any instant. Test runs paint the timeline green and red, so you can see at a glance where things passed and where they didn't.
Scope captures pin to the timeline where they happened, attached to the run that produced them. Underneath it's plain Postgres on your box — psql, pandas, and Grafana all work.
Procedures become code, results become records
A test is a Python file: phases, measurements, pass/fail limits. Guppi derives the plan from your code, shows it for approval, then drives the same instruments the dashboard does — sweeps, operator prompts, safety guards included.
Every run is a permanent record: measurements against limits, waveforms, logs, and the DUT it ran against — reopenable in seconds.
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 →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 itinstrument drivers, auto-detected by *IDN? reply
tests are plain code on an open framework — no lock-in
your data, on your box, in a normal database
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 to configure, no cloud credentials. One command and your whole bench is online, ready to run with 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, foreverA 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 readyAI test authoring, fleet management, remote sharing, and long-term archive — the conveniences that are hard to self-host. Optional and always additive; your bench never depends on it.
- ▶setup_array
- ○irradiance_sweep
- ○verify_recovery
- ○teardown
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.