Production-ready Bazel rules for building WebAssembly components across multiple languages with native WASI 0.2 support.
Note
Part of the PulseEngine toolchain. Used across all PulseEngine projects for hermetic component builds.
- Multi-language: Build components from Rust, Go (TinyGo), C++, JavaScript/TypeScript
- Production Ready: OCI publishing, cryptographic signing, WAC composition, AOT compilation
- Bazel Native: Hermetic builds, aggressive caching, cross-platform (Windows/macOS/Linux)
- Zero Shell Scripts: Pure Bazel implementation for maximum portability
Add to your MODULE.bazel:
bazel_dep(name="rules_wasm_component", version="1.0.0")load("@rules_wasm_component//rust:defs.bzl", "rust_wasm_component")
rust_wasm_component(
name="my_service",
srcs= ["src/lib.rs"],
wit=":service_wit",
profiles= ["debug", "release"],
)load("@rules_wasm_component//go:defs.bzl", "go_wasm_component")
go_wasm_component(
name="calculator",
srcs= ["main.go"],
wit=":calculator_wit",
world="calculator",
)load("@rules_wasm_component//cpp:defs.bzl", "cpp_component")
cpp_component(
name="calculator",
srcs= ["calculator.cpp"],
wit=":calculator_wit",
cxx_std="c++20",
)load("@rules_wasm_component//wac:defs.bzl", "wac_compose")
wac_compose(
name="full_system",
components= {
":frontend": "app:frontend",
":backend": "app:backend",
},
composition=''' let frontend = new app:frontend { ... }; let backend = new app:backend { ... }; connect frontend.request -> backend.handler; export frontend as main; ''',
)- Rust (1.90.0+): Multi-profile builds, Clippy integration, Wizer pre-initialization
- Go (TinyGo 0.39.0): Native WASI 0.2, hermetic Go module resolution
- C++ (WASI SDK 27): C++17/20/23, cross-package headers, LTO optimization
- JavaScript/TypeScript (jco 1.4.0, Node.js 20.18.0): NPM dependencies, componentize-js
- WAC Composition: Official WebAssembly Composition standard for multi-component systems
- OCI Publishing: Push components to Docker/OCI registries
- Cryptographic Signing: wasmsign2 integration for supply chain security
- AOT Compilation: Wasmtime precompilation for 87% size reduction and faster startup
- Wizer Pre-initialization: 1.35-6x startup improvement for Rust components
- Multi-Profile Builds: Debug, release, and custom optimization profiles
- Hermetic Toolchains: All tools downloaded automatically, no system dependencies
- Cross-Platform: Native Windows/macOS/Linux support without WSL
- Comprehensive Examples: 20+ working examples from basic to advanced patterns
See MODULE.bazel for current versions — the single source of truth.
All toolchains are hermetically downloaded and version-pinned for reproducible builds.
Complete Rule Reference — All rules, attributes, and providers
Guides:
Examples:
- WIT-enabled Go components currently fail due to upstream TinyGo limitations
- Tracking: Issue #82
- Basic Go components (without WIT) work perfectly
- WASI disables C++ exceptions by default for size/performance
- Use
enable_exceptions = Truefor components that require exceptions (Issue #83)
Contributions welcome! See CONTRIBUTING.md for details.
Apache-2.0 — see LICENSE.
Part of the PulseEngine toolchain.