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.

Dashboard

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.

psu1 — BK Precision 9131B
1.voltager/w48.00V
1.currentread2.412 A
1.powerread115.7 W
1.outputwrite
Data views

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.

Live · last 5 min
psu1.1.voltageVdut1.temp°C
50403020
14:06:00
28.48 V
21.9 °C
14:05:0014:07:3014:10:0014:12:30now
Tests

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.

tests/power_qualification.pydut SN-0042 · exec 7f3a91c2
setup_array
irradiance_sweep
vout_min4.96 V4.9–5.1
harvest_ratio0.93≥ 0.85
verify_recovery
prompt · confirm DUT bolted to cold plateanswered by operator
teardown
12/12 measurements in limits