Your workflow. Every instrument. From anywhere.
Deploy an edge daemon on each bench. Connect your existing Jupyter notebooks and Python scripts. Control any SCPI instrument from anywhere — with AI that handles the parts you hate.
86 instruments · 20 manufacturers · MIT licensed
$ galois-edge status
galois-edge active (running)
galois-edge-daemon active (running)
Mesh: tailnet-lab-01.ts.net
Instruments: 4 connected
Keithley 2400 GPIB::24
Keysight 34461A USB
Rigol DS1054Z LAN
SRS SR830 GPIB::8
gRPC: :50051 ready
WebSocket: :8765 readyEdge daemon for instrument control
galois-edge connects any instrument to a secure mesh network. Two static binaries. Zero runtime dependencies. Profile-driven control with gRPC and WebSocket APIs.
instrument:
name: Keithley 2400
manufacturer: Keithley
type: SourceMeter
identity:
pattern: "KEITHLEY.*MODEL 2400"
command: "*IDN?"
commands:
measure_voltage:
command: ":MEAS:VOLT?"
returns: float
set_current:
command: ":SOUR:CURR {value}"
params:
value: { type: float, unit: A }
sequences:
iv_sweep:
steps:
- set_current: { value: 0.001 }
- measure_voltage: {}
- set_current: { value: 0.01 }
- measure_voltage: {}86 profiles. 20 manufacturers.
Every supported instrument has a declarative YAML profile that describes its identity, commands, and measurement sequences. Adding a new instrument is as simple as writing a new file.
Your notebooks. Your scripts. Now instrument-aware.
This is what makes Galois different. Your existing code doesn't change. pyvisa-galois is a drop-in PyVISA backend. Change one line and your notebook running in the cloud reaches instruments at the edge.
# Before — only works at the bench
rm = pyvisa.ResourceManager()
# After — works from anywhere
rm = pyvisa.ResourceManager("@galois") # ← this line
# Everything else is identical
dmm = rm.open_resource("GPIB0::22")
print(dmm.query("*IDN?"))
print(dmm.query(":MEAS:VOLT:DC?"))Your laptop in a coffee shop. Your Keithley on a bench in Building 4. One line of code.
You: Hey Ev, measure the IV curve on the Keithley 2400
from 0 to 100mA in 10 steps.
Evariste: I see you ran a similar sweep last Thursday
on the same device — 0 to 50 mA, 5 steps.
I'll reuse that config with your new range.
✓ Connected to Keithley 2400 (GPIB::24)
✓ Configured source current mode
✓ Running 10-step sweep: 0 → 100 mA
✓ Captured 10 voltage measurements
Results saved to project "GaN FET Characterization".
Peak voltage: 2.34V at 100mA.
Want me to plot this against last Thursday's run?Talk to your instruments
An AI assistant that understands your hardware and remembers your work. Evariste learns your measurement sequences, project context, and instrument configurations — so every session picks up where the last one left off. Describe measurements in plain English, generate profiles from PDF manuals, and run multi-step test sequences with safety checks before every command.
Unified data platform
Every measurement, every run, every annotation — stored in a single queryable system that scales with your team.
- Live ingestion from daemon gRPC and WebSocket streams
- Full-text search across all experiments and datasets
- Fine-grained access control and audit logging
- Versioned datasets for reproducibility
from galois import Client
client = Client(team="photonics-lab")
# Query last week's IV sweeps
runs = client.runs.search(
query="IV sweep Keithley 2400",
since="7d",
)
for run in runs:
print(f"{run.timestamp} — {run.instrument}")
print(f" Peak voltage: {run.result['v_max']:.3f}V")name: IV Characterization
instrument: Keithley 2400
steps:
- set_source: { mode: current, range: 100mA }
- sweep:
parameter: current
start: 0
stop: 100mA
points: 50
measure: [voltage, current]
- save:
dataset: iv_sweep
tags: [characterization, keithley]Test orchestration
Define, schedule, and monitor multi-step test protocols from a single interface — or via the API.
- One-click test execution
- Declarative test workflows
- Full run history and provenance tracking
Your instruments are waiting
galois-edge is MIT-licensed and free forever. Deploy it in five minutes. Add the cloud platform when your team is ready.