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:
- Plugin config — name, version, description, and per-object annotations.
- Wasm layers — content-addressed with SHA-256 digests for integrity verification.
- Custom media types —
application/vnd.steel.plugin.layer.wasm.v1for registry tooling.
Registry Support
Pull plugins from any OCI-compliant registry:
- GitHub Container Registry (GHCR)
- Amazon Elastic Container Registry (ECR)
- Docker Hub
- Any private or self-hosted registry
- Local OCI archives for air-gapped environments
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
- Steel reads the OCI archive and verifies layer digests.
- Each Wasm layer is compiled with the wasmtime component model.
- The WIT world name is extracted from the component's custom sections.
- Each compiled object is wrapped as a
SteelObjectwith its facet and method metadata. - 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:
- Index — by position in the archive.
- World name — by its WIT world identifier.
- Type — by the object's content type.
- ID — by its unique
ObjectId.