Open Source — MIT Licensed

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
$ 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 ready
Open Source

Edge 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.

keithley_2400.yaml
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.

Remote Kernels

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.

Cloud compute, edge I/O
Run heavy analysis on cloud GPUs. SCPI commands route transparently to edge daemons over the Tailscale mesh. No SSH. No VPN. No port forwarding.
Drop-in PyVISA backend
pyvisa-galois implements the standard PyVISA backend interface. ResourceManager("@galois") routes every call through gRPC to your edge instruments. Zero code changes beyond the backend string.
Streaming with backpressure
gRPC server-streaming for continuous acquisition. Circular buffer patterns ensure no data loss under load. Real-time data flows from edge to cloud.
Evariste
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?
AI Assistant

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.

Natural language instrument control
Describe what you want to measure. The assistant selects instruments, configures parameters, and executes — with confirmation before every hardware action.
Add instruments from manuals
Upload a PDF datasheet. The assistant extracts SCPI commands, parameters, and sequences into a validated YAML profile — ready to use in minutes.
Diagnostics and troubleshooting
Automated self-test routines, connection diagnostics, and step-response analysis. The assistant reads instrument manuals so you don't have to.
Safety-first execution
Every hardware command requires explicit confirmation. Dangerous operations are flagged before execution — no silent writes to your instruments.
Remembers your work
Evariste retains context across sessions — your measurement sequences, instrument configurations, project notes, and past results. Ask it to rerun last week's sweep and it knows exactly what you mean.
Data

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]
Control

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.