Awesome Wasm Components

May 6, 2026 · View on GitHub

A curated list of WebAssembly Component tooling and ready-to-use components.

What are Wasm Components?

WebAssembly (Wasm) Components are a typed package format that packages core Wasm Instructions into typed libraries and binaries. Wasm Components are also used by the Wasm System Interface (WASI) to create standard interfaces for various environments.

Without a standard package format every language, toolchain, and platform has to define their own way of packaging up Wasm instructions. WebAssembly Components standardize this, enabling tools, languages, and platforms to all natively interoperate with each other.

Wasm Components follow a structure that is very similar to other platforms, here is how they compare:

WebAssemblyLinuxWindowsmacOS
Instruction FormatCore Wasmx86, ARM, etc.x86, ARMARM
Container FormatWasm ComponentsExecutable and Linkable Format (ELF)Portable Executable (PE)Mach-O
Interface Definition LanguageWasm Interface Types (WIT)C header filesWindows Metadata (WinMD)(Objective-)C header files + Mach IDL + Swift Modules
System InterfacesWasm System Interface (WASI)POSIX + Linux User-Space APIsWin32 + UWPPOSIX + Darwin Syscalls

Note

WASI 0.1 was released in late 2019 and was exclusively designed for UNIX-like environments. That meant that all the work put into WASI couldn't be reused for the web and other environments. Wasm Components were released in early 2023 together with WASI 0.2, which is entirely portable across environments.

WASI 0.3 is planned for the end of 2025, using the newly added native async support in Wasm Components. This will enable components with async interfaces to directly link to each other. WASI 0.2 was a big departure from WASI 0.1. WASI 0.3 will be a relatively small iteration of WASI 0.2.

Tools

Programming Language Support

These languages can be compiled to Wasm Components. Some languages have first-party support for Wasm Components, while other languages rely on externally maintained tools.

LanguageNameWASI VersionMaintained ByNotes
C and C++wasi-sdk0.2 + 0.3W3C Wasm CG0.3 is in-progress
C#componentize-dotnet0.2Bytecode Alliance
Gogo-modules0.2Bytecode Alliance
Javagraal-OraclePlanned - Tracking Issue, Roadmap
JavaScript and TypeScriptjco0.2Bytecode Alliance
JavaScriptcomponentize-qjs0.2 + 0.3Tomasz Andrzejak
KotlinKotlin0.2JetBrains
Pythoncomponentize-py0.2Bytecode Alliance
Pythoncpython0.2PythonIn-progress
Rubyruby.wasm0.2RubyIn-progress
Rustwasm32-wasip2 compiler target0.2 + 0.3Rust Project0.2 Introduction, 0.2 Stabilization, 0.3 is planned
SwiftSwift0.2SwiftPlanned - Roadmap Accepted

Bindings Generators

Being able to compile a language to Wasm Components is a good first step, but it’s also important to be able to make function calls. Most languages don’t yet provide a native way to call Wasm functions, so the second best option is to use bindings generators that can generate those calls for you.

FromToName
Wasm Interface TypesC and C++wit-bindgen c
Wasm Interface TypesC#wit-bindgen csharp
Wasm Interface TypesJSON Schemacomponent2json
Wasm Interface TypesMarkdownwit-bindgen markdown
Wasm Interface TypesMoonbitwit-bindgen moonbit
Wasm Interface TypesRustwit-bindgen rust
WebIDLWasm Interface Typeswebidl2wit

Host Runtimes

Host runtimes can take Wasm Components and execute them. Runtimes can either be loaded as language-native libraries, run as standalone binaries, or be hosted by third party providers:

KindNameWASI VersionMaintained ByNotes
AI Agent PlatformNoorle0.2NoorlePlugin system
AI Agent RuntimeCapsule0.2Mohamed Diallo
Bazel ExtensionWebAssembly Component Rules0.2Pulse Engine
BrowserGoogle Chrome-GoogleWasm Component model under evaluation
Buck2 ExtensionWasmono0.2 + 0.3Tomasz Andrzejak
Build SystemMS Build0.2MicrosoftProposed
C LibraryWasmtime crate0.2 + 0.3Bytecode Alliance0.3 support in-progress
Command LineWasmtime0.2 + 0.3Bytecode Alliance0.3 support in-progress
Command Linezwasm0.2ClojureWasm
Durable ComputeGolem0.2Golem Cloud
Durable ComputeObelisk0.2Obelisk
Edge ComputeEdgee0.2Edgee
Edge ComputeFastly Edge Compute0.2Fastly
EditorVS Code0.2MicrosoftPlugin system
EditorZed0.2Zed IndustriesPlugin system
Go LibraryGravity0.2ArcjetIn-progress
GraphQL PlatformGrafbase0.2GrafbasePlugin system
Hypervisor GuestHyperlight Wasm0.2CNCF0.2 async APIs in-progress
KubernetesSpinKube0.2CNCF
KubernetesWasmCloud0.2CNCF
MCP ServerWasMCP0.2WasMCP
MCP ServerWassette0.2Microsoft
Node.js + WebJco0.2 + 0.3Bytecode Alliance0.3 support in-progress
Rust LibraryWasmtime crate0.2 + 0.3Bytecode Alliance0.3 support in-progress
Serverless RuntimeSpin0.2CNCF
Web FrameworkLeptos0.2LeptosPlugin system

Registries

Wasm Components can be uploaded to any OCI v1.1-compatible registry, using the Wasm OCI Artifact Layout. The following registries support pushing and pulling Wasm Components:

Tip

Pulling Wasm Components from OCI Registries To download a .wasm application, library, or interface from an OCI registry we want to use wkg. With it we can download Wasm Components from OCI URLs:

$ wkg oci pull ghcr.io/yoshuawuyts/fetch:latest -o fetch.wasm

Components

Applications

Wasm Components don't really distinguish between libraries and applications; Components are always sets of function imports and exports. Still though, there are components which don't define their own typed interfaces and instead directly map to common environments such as wasi:http or wasi:cli. These components feel very much "binary-shaped" and tend to be easy to run.

Libraries

Wasm Components provide fully typed interfaces, which can be linked to from any language using Bindings Generators. This makes Wasm Components a particularly portable way to package up libraries. Libraries can also be layered and implemented in terms of one another. This makes it possible to bring a large amount of complex functionality out of the runtime, and into components.

Interfaces

Interfaces in Wasm are defined using WebAssembly Interface Types, or WIT for short. There are the standard WASI-based interfaces which are developed as part of the Wasm SG in the W3C. But anyone can define their own .wit interfaces and package them up.

  • wasi:io (package): Standard interfaces for I/O stream abstractions.
  • wasi:clocks (package): Standard interfaces for reading the current time and measuring elapsed time.
  • wasi:random (package): Standard interfaces for obtaining pseudo-random data.
  • wasi:filesystem (package): Standard interfacing for interacting with filesystems.
  • wasi:sockets (package): Standard interfaces for TCP, UDP, and domain name lookup.
  • wasi:cli (package): Standard interfaces for Command-Line environments.
  • wasi:i2c: Standard interfaces for reading and writing data on embedded devices over an I²C connection.
  • wasmcp:mcp (package): A WIT representation of the MCP specification.
  • zed:extension: The extension interface for the Zed editor. Includes support for interacting with LSP and DAP.
  • browser.wit: An automatic translation of the browser's Web APIs into WIT.
  • grafbase:sdk: Extensions to the Grafbase GraphQL Gateway.

Tip

To convert a directory of .wit files to a .wasm file to publish it on a registry you can use wkg:

$ wkg wit build -d wit/ -o my-interface.wasm

To get the interfaces from a .wasm and store it as a .wit you can use wasm-tools:

$ wasm-tools component wit my-interface.wasm -o my-interface.wit

Resources

Tutorials

License

Apache-2.0 with LLVM Exception