CLI tool
bytecodealliance/wasmtime avatar
bytecodealliance/wasmtime

Wasmtime: a standalone WebAssembly runtime for embedding and the CLI

A lightweight WebAssembly runtime that is fast, secure, and standards-compliant

18,667 stars1,839 forksRustApache-2.0

At a glance

What is it?
Wasmtime is a Bytecode Alliance WebAssembly runtime built on the Cranelift code generator, with a CLI, a Rust crate and bindings for C, C++, Python, .NET, Go and Ruby. The Apache-2.0 licence and the embedding story are strong; the release cadence and the gaps in the documentation are the parts to check before you commit.
Who is it for?
Adopt Wasmtime if you need a standalone WebAssembly runtime or an embeddable one from Rust, C, C++, Python, .NET, Go or Ruby, and you are willing to track a fast release train. Do not adopt it if you need a stable ABI across major versions or a runtime with no fuzzing and security-review overhead in your supply chain.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Rust, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Wasmtime solves, and who it is for

WebAssembly is a portable binary format, but a binary format on its own does not run. Wasmtime is the piece that executes it: a standalone runtime that takes a .wasm file or a WebAssembly component and runs it, either from the command line or embedded inside a host program. The README calls it "A standalone runtime for WebAssembly" and names the Bytecode Alliance as the project owner.

The audience splits in two. The first group wants a CLI: you have a wasm binary and you want to run it, possibly with WASI access to files, environment variables and clocks. The second group wants to embed a runtime in an application and call into wasm from Rust, C, C++, Python, .NET, Go or Ruby. The README lists all six as officially supported by the Bytecode Alliance, with Elixir and Perl listed as community-supported. That split matters because the CLI and the embedding API have different upgrade pressures: a CLI user cares about the command surface, an embedder cares about the crate or library API.

Cranelift, WASI and the component model: how Wasmtime actually runs code

The execution engine is Cranelift, described in the README as "the optimizing Cranelift code generator" that produces machine code "either at runtime or ahead-of-time". That one sentence covers two distinct modes. In the JIT path, wasm is compiled to machine code when the module is instantiated. In the AOT path, the same compiler runs ahead of time and the result is stored, so the runtime does not pay compilation cost at startup. The README frames the goal as "efficient instantiation, low-overhead calls between the embedder and wasm, and scalability of concurrent instances", which tells you the design cares about per-instance overhead rather than raw single-function throughput.

Around that core sit three layers. WASI is the host interface: the README says Wasmtime "supports a rich set of APIs for interacting with the host environment through the WASI standard". The component model is the newer packaging layer, and the README's own example compiles Rust to the wasm32-wasip2 target and calls the result a component. Standards compliance is claimed via the official WebAssembly test suite, the official C API of wasm, and implementation of future proposals. The repository layout backs this up: cranelift/, crates/, winch/ (a separate baseline compiler), pulley/ and fuzz/ sit at the top level alongside src/ for the CLI.

On the security side, the README points to Rust's runtime safety guarantees, an RFC process for features, "24/7 fuzzing donated by Google's OSS Fuzz", a defined security policy, and mitigations for issues like Spectre. It also mentions collaboration with academic researchers on formal verification of critical parts of Wasmtime and Cranelift. These are process claims, not measured results, and the README does not publish timing or throughput numbers to back the word "Fast".

Installing the Wasmtime CLI and running a first component

The README gives a one-line install for Linux and macOS. It places the executable in $WASMTIME_HOME/bin, where $WASMTIME_HOME defaults to $HOME/.wasmtime. Windows users, and anyone who prefers a package, are directed to the GitHub Releases page for installers and binaries.

bash
curl https://wasmtime.dev/install.sh -sSf | bash

After the script finishes, the README says to follow the on-screen instructions, which is where the PATH setup happens. For the first real run you need a wasm binary. The README's example starts from Rust source and compiles it to the wasm32-wasip2 target, which produces a component rather than a plain module:

bash
rustup target add wasm32-wasip2
rustc hello.rs --target wasm32-wasip2

Then you run it with the CLI, passing the output file:

bash
wasmtime hello.wasm

For a hello-world program, the README says you should see the text "Hello, world!" printed. One caveat is stated directly in the README: the rustup target add command may install the target for the wrong copy of Rust if you also have a toolchain from a system package manager, so install Rust through rustup and avoid a second toolchain on the same machine. Embedders do not use the CLI at all; they add the wasmtime crate from crates.io, or the equivalent PyPI, NuGet, Go, Ruby or C/C++ package listed in the README's language support section.

Where Wasmtime is the wrong tool

Wasmtime is a general-purpose runtime, and that generality costs. The README's own language support list is a good map of the boundary: if your host language is not Rust, C, C++, Python, .NET, Go or Ruby, you are outside the officially supported set, and the community-supported entries (Elixir via wasmex, Perl via Wasm::Wasmtime) are maintained on a different schedule than the core. Embedding from an unsupported language means going through the C API yourself.

A second boundary is the release train. The repository's recent releases include v48.0.2 and v36.0.15, both dated 2026-09-10, alongside a dev tag from 2022. Two supported lines being patched on the same day is normal for a project with a documented release policy, but it means an embedder cannot treat the runtime as a fixed dependency. If your product ships a plugin ABI that third parties compile against, the wasmtime crate API is the contract you are exposing, and the README does not promise that it will not change between major versions.

The third boundary is the security posture itself. The README leans on fuzzing, an RFC process, Spectre mitigations and formal verification work. Those are reasons to trust the project more than an unmaintained runtime, but they are also work you inherit: if your threat model does not include hostile wasm, you are paying for sandboxing machinery you may not need. A runtime that executes only code you wrote and control is a different problem from one that executes code from strangers, and Wasmtime is built for the second.

Wasmtime compared with Wasmer and WasmEdge

The comparison people search for most is Wasmtime versus Wasmer, and the honest answer from this material is that the README does not discuss Wasmer at all. What the README does establish is Wasmtime's approach: a Rust codebase, Cranelift as the code generator, a component-model example built on wasm32-wasip2, and Bytecode Alliance ownership. Wasmer and WasmEdge are separate runtimes with their own code generators and their own host-interface stories, and the README makes no claims about how they compare. Any performance comparison between them would need measurements this material does not contain.

The more useful distinction is architectural rather than competitive. Wasmtime's design centers on embedding: the README lists six languages with official bindings and points to a C API that implements the official wasm C API. If your integration path runs through a host language on that list, the binding surface is the deciding factor. If you need a runtime that ships as a single binary with no embedding story, the CLI is what you get, and the CLI is a thin layer over the same engine. The README also notes that Wasmtime passes the official WebAssembly test suite and implements future proposals, which is a standards-position claim rather than a feature comparison.

Licensing, release cadence and what you actually maintain

The repository is Apache-2.0, and the CLI package's Cargo.toml records the licence as "Apache-2.0 WITH LLVM-exception". That distinction is worth noting if you redistribute the CLI: the LLVM exception is a permissive addition that relaxes certain patent and attribution terms, but whether it changes your obligations depends on how you ship the binary. This is not legal advice; read the licence texts in the repository before you redistribute.

Maintenance cost is dominated by the release train. The last push to the repository was on 2026-09-20, and the recent releases show v48.0.2 and v36.0.15 both dated 2026-09-10. Two lines being patched at once suggests a policy of backporting fixes to an older major version, which is good for embedders who cannot move quickly, but it also means the project expects you to choose a line and track it. The README points to the online book's stability-release page for currently supported versions; that page, not the release list, is where the supported-version policy is defined. The repository also carries SECURITY.md and a security policy link, so vulnerability handling has a documented path.

For an embedder, the practical upgrade cost is the crate API plus the WASI and component-model surfaces. The README's example already uses the component-model target, so if you adopt that path you are adopting a part of the stack that the project describes as future proposals being implemented, not as a frozen interface.

Editorial conclusion

Adopt Wasmtime if you need a standalone WebAssembly runtime or an embeddable one from Rust, C, C++, Python, .NET, Go or Ruby, and you are willing to track a fast release train. Do not adopt it if you need a stable ABI across major versions or a runtime with no fuzzing and security-review overhead in your supply chain. Before you commit, verify the CLI install path works on your platform (the README's install script covers Linux and macOS; Windows users download from the GitHub Releases page), confirm which release line you are pinning to, and read the security policy and release policy pages rather than assuming the defaults match your threat model.

Frequently asked questions

What is Wasmtime?

Wasmtime is a standalone runtime for WebAssembly, developed by the Bytecode Alliance. It runs wasm from a CLI or as an embedded library, and it is built on the Cranelift code generator.

How do I install Wasmtime?

On Linux and macOS, the README gives a one-line install script that places the executable in $WASMTIME_HOME/bin, defaulting to $HOME/.wasmtime. Windows users and anyone who prefers a package download installers and binaries from the GitHub Releases page.

How do I use Wasmtime to run a WebAssembly component?

Compile your program to the wasm32-wasip2 target, then pass the resulting file to the wasmtime command. The README's example compiles a Rust hello-world and runs it with wasmtime hello.wasm, which prints "Hello, world!".

Which is better, Wasmer or Wasmtime?

The README does not compare Wasmtime with Wasmer, so there is no project-side answer to this. What the README documents is Wasmtime's own position: a Rust implementation on Cranelift, official bindings for Rust, C, C++, Python, .NET, Go and Ruby, and compliance with the official WebAssembly test suite.

Official sources

  1. bytecodealliance/wasmtime on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/bytecodealliance-wasmtime.svg)](https://hysenlabs.com/projects/bytecodealliance-wasmtime)