Every layer talks to the next one through a protocol, never through a
direct call. That is what makes a step replaceable, a language a free
choice, and a simulated instrument indistinguishable from a real one.
Anvil
v0.1.0 · in beta testing
Test sequencer
Runs sequences of steps against real equipment, retries what fails and
reports the result. The sequence is data, not code: the engine walks
it without knowing what each step does, and invokes every step
by name over gRPC — never through a direct call. That
isolates steps from each other and leaves the door open to writing
them in any language.
- Rust compiled to
wasm32-wasip2, hosted by wasmtime
- One self-contained binary — nothing to install
- Setup → Main → Cleanup, per-step retries, JSON and CSV sinks
- Process models as sequences, not as engine callbacks
Crucible
runtime working · serving SCPI
The digital twin of the bench
An open standard for describing and simulating test benches. You
describe how a Keithley 2400 behaves — its state, its
commands, its measurement model — and a runtime serves it, speaking
the right protocol over the right transport, like a real device.
Simulink for instruments, not for physics.
- Three layers kept apart: device, protocol, transport
- SCPI and Modbus; TCP first, then GPIB, USB, serial, PXI
- Deterministic models — a seeded run is a repeatable run
- pyvisa, LabVIEW, MATLAB, C# or plain
netcat, unmodified
wasi-grpc
v0.1.0 · published
gRPC on native WASI sockets
Rust's gRPC stack does not reach WebAssembly: tonic needs
hyper, hyper needs tokio, and
tokio rejects the net feature on wasm. But
wasmtime does ship native TCP through wasi:sockets.
What was missing was HTTP/2 on top. This is that piece.
- Unary RPC, client and server, blocking I/O
- HTTP/2 framing and full RFC 7541 HPACK with Huffman
- No tokio, no hyper, no async runtime
- Codec-agnostic — protobuf messages stay
prost's job