Plugins

Steel plugins are WebAssembly components packaged as OCI artifacts. Define interfaces with WIT, compile to wasm32-wasip2, and distribute through any container registry.

Packaging as OCI Artifacts

Every Steel plugin is an OCI image layout archive. This means plugins travel through the same infrastructure as container images — registries, mirrors, air-gapped environments, and local archives all work out of the box.

A plugin archive contains:

Registry Support

Pull plugins from any OCI-compliant registry:

Interface Definition with WIT

Plugin interfaces are defined using WIT (WebAssembly Interface Types). WIT gives you a language-neutral way to describe functions, types, and interfaces that work across Rust, Go, C, Python, and any language that compiles to Wasm.

// Example WIT interface
package steel:example;

interface example-facet {
    hello-world: func() -> string;
    echo: func(value: u32) -> u32;
    add: func(a: u32, b: u32) -> u32;
}

world example {
    export example-facet;
}

Automatic World Discovery

When a plugin is loaded, Steel automatically extracts the WIT world name from the compiled Wasm binary. No separate type registry needed. You can look up objects by world name at runtime:

let obj = plugin.object_by_world("steel:example/example")?;

Content Addressing

Every plugin layer is content-addressed using SHA-256. Identical Wasm binaries produce identical digests. Registry deduplication works automatically, and integrity is verified on every load.

Building Plugins

The steel-tools CLI builds your Wasm components into OCI packages ready for distribution:

# Build a Wasm component into a Steel OCI package
steel-tools build --input plugin.wasm --output my-plugin.oci.tar.gz

# Inspect an existing package
steel-tools inspect my-plugin.oci.tar.gz

What Happens at Load Time

  1. Steel reads the OCI archive and verifies layer digests.
  2. Each Wasm layer is compiled with the wasmtime component model.
  3. The WIT world name is extracted from the component's custom sections.
  4. Each compiled object is wrapped as a SteelObject with its facet and method metadata.
  5. Objects are ready for binding and invocation with policy enforcement.

Plugin Objects

Each loaded plugin contains one or more objects. An object represents a single Wasm component with a specific interface. You can query objects by: