PRODSovereign European BaaS platformOpen Dashboard →

Engineering · 8 min read

Wasmtime vs Wasmer for production Edge Functions

Affane Daylami · Fondateur · June 25, 2026

Back to blog

Wasmtime and Wasmer are the two most commonly used WebAssembly runtimes for running code outside of the browser, on the edge, or server-side. Aurabase has decided: the native WASM execution mode of its Edge Functions embeds Wasmtime, not Wasmer, verified directly in the Cargo.toml of the service concerned.

This English text was generated automatically from the French original and has not been reviewed yet.

This choice is not a facade preference. This article compares the two runtimes on what is actually verified, governance, compilers, WASI standard, security model, then details the Wasmtime implementation that Aurabase runs in production, fuel metering, epoch interruption, memory limits, without providing an unmeasured cold start figure.

The essentials

  • Wasmtime: Bytecode Alliance project, written in Rust, Cranelift production compiler, Apache-2.0 license with LLVM exception.
  • Wasmer: runtime developed by Wasmer Inc., three interchangeable compilers (Singlepass, Cranelift, LLVM), MIT license.
  • Aurabase declares wasmtime = { version = "43", features = ["async", "cranelift"] } as an actual production dependency in aura-functions, verified in Cargo.toml.
  • Native WASM mode applies by default a memory cap of 64 MB, a fuel budget of one billion units and a timeout of 10 seconds, all three adjustable by environment variable.
  • This WASM mode coexists with the default mode of Aurabase Edge Functions (Deno runtime): it is a second execution path, not the default path.
#
Context

Two runtimes, the same WebAssembly base

WebAssembly has long designated a runtime format for the browser. For several years, it has also been used to execute sandboxed code on the server side or at the edge: a bytecode compiled once, portable on any host machine, isolated by default without a container or complete virtual machine. Wasmtime and Wasmer carry this extension out of the browser, both written in Rust, both capable of executing the same .wasmfile.

Wasmtime is a project hosted by the Bytecode Alliance, the organization that manages several components of the WebAssembly server ecosystem, including the Cranelift compiler. Wasmer is developed by Wasmer Inc., a company which publishes the runtime as open source while marketing complementary services around it (edge ​​deployment, tooling). Two different governance models, no judgment on the quality of the code produced by one or the other.

The remainder of this article compares four verifiable fields, licensing and governance, available compilers, WASI standard and Component Model, security model, then explains, with supporting code, why Aurabase's Rust core runs Wasmtime in its Edge Functions engine.

#
Governance & licensing

Multi-vendor foundation versus commercial publisher

Wasmtime is released under the Apache-2.0 license with LLVM exception, a permissive license common in the compiler ecosystem. Its governance follows the Bytecode Alliance model: several organizations contribute to the project, none owns it alone.

Wasmer is published under the MIT license, even more permissive on paper, but its technical direction remains concentrated at a single publisher, Wasmer Inc. This is not a fault in itself: many successful open source projects follow this model. It's simply a different risk profile if your organization values ​​distributed governance across multiple entities.

#
Compilers

One backend versus three: Cranelift, Singlepass, LLVM

Wasmtime compiles in production via Cranelift, a code generator also from the Bytecode Alliance. The crate also documents an additional compiler, Winch, designed to reduce compilation time compared to Cranelift in cases sensitive to startup. The Cargo.toml ofaura-functions only activates the cranelift feature: it is this compiler, and it alone, which processes each WASM module loaded in production.

Wasmer takes the opposite path: three interchangeable backends. Singlepass compiles in a single pass, almost instantly, at the cost of less optimized machine code. Cranelift offers a balanced compromise. LLVM aims for the best possible execution throughput, with the longest compilation time of the three. A single runtime, three compromise profiles chosen during configuration.

#
Standards

WASI Preview 2 and Component Model

WASI, the WebAssembly System Interface, standardizes access to files, clocks and the network from a WASM module, without depending on the browser. Its most recent version, WASI Preview 2, is based on the Component Model: a mechanism for composing modules written in different languages, with shared typed interfaces rather than a binary format specific to each runtime. Both Wasmtime and Wasmer are working on implementing this standard, each at their own pace.

Wasmer additionally documents WASIX, an extension that aims to cover POSIX primitives that the official WASI standard does not yet cover, such as threads or more comprehensive network sockets. This is not a standard supported by the WebAssembly working group, but an extension specific to the Wasmer ecosystem.

What Aurabase WASM Mode Does Not Use

Aurabase's native wasm mode, verified in wasm/mod.rs, currently uses neither WASI Preview 2 nor the Component Model. This is a homegrown minimal host ABI, four functions exposed to the guest module, not the full standard. The Cargo.toml also does not activate the wasi feature on the wasmtimecrate.

#
Security

Memory isolation and timing: fuel, epoch, limits

Both runtimes isolate each module in its own linear memory, with no direct access to the host system outside of explicitly imported functions. This is the basis of the WebAssembly security model, common to both projects.

Wasmtime also exposes a native execution footage API, fuel: each instruction consumes a budget fixed in advance, and execution stops properly once this budget is exhausted. A second API, the epochinterruption, allows you to impose a timeout without blocking the engine while waiting. Wasmer documents his own mechanics of metering and per-instance memory limits; This article has not verified them in a third-party repository, so does not break them down figure by figure.

This is exactly what Aurabase's aura-functions service enables, detailed in the next section with the actual source code.

#
The Aurabase choice

Wasmtime checked in code, not a declared preference

The aura-functions service declares wasmtime as a production dependency, without deactivation comments or dev-dependency configuration. No file in the repository, neither Cargo.toml nor .rsfile, mentions Wasmer.

Cargo.tomltoml
# WASM Runtime
wasmtime = { version = "43", features = ["async", "cranelift"] }

The initialization code explicitly activates fuel and interrupt by epoch, then bounds the memory by invocation with StoreLimits:

wasm/mod.rsrust
let mut cfg = Config::new();
cfg.consume_fuel(true);
cfg.epoch_interruption(true);
let engine = Engine::new(&cfg)?;

// by invocation:
let limits = StoreLimitsBuilder::new()
    .memory_size(self.max_memory_mb as usize * 1024 * 1024)
    .build();
store.set_fuel(self.max_fuel)?;
store.epoch_deadline_async_yield_and_update(1);

All three limits are configurable per environment variable, with default values checked in config/mod.rs: WASM_MAX_MEMORY_MB at 64, WASM_TIMEOUT_SECS at 10, WASM_MAX_FUEL at one billion units. The timeout is triggered in the background: a tokio::spawn waits the configured duration then increments the engine epoch, without blocking the current execution while waiting.

The ABI exposed to guest modules remains intentionally minimal: four host functions, aura.log, aura.get_input, aura.set_output and aura.get_env, registered via linker.func_wrap. It is not the Component Model, nor WASI Preview 2: it is an in-house contract, narrower, designed for a single use, executing an HTTP edge function and recovering its JSON response.

This wasm mode is a choice per function, not a global toggle. The Aurabase architecture overview details the other path, the default denomode, which executes JavaScript/TypeScript in a separate service. Both coexist in the same aura-functionsservice.

Verified vs. product objective

What is checked here is the actual Wasmtime implementation and its default resource limits. No cold start figures are stated: see our dedicated analysis of the WebAssembly cold start for what is measurable, and what is not yet.

#
Overview

Wasmtime and Wasmer, side by side

GovernanceBytecode Alliance, multi-organizationWasmer Inc., commercial publisher
LicenseApache-2.0 with LLVM exceptionMIT
Implementation languageRustRust
CompilersCranelift (Winch optional, not activated at Aurabase)Singlepass, Cranelift, LLVM of your choice
WASI standardWASI Preview 2 + Component ModelWASI Preview 2 + WASIX (extension specific to Wasmer)
Running footageFuel + interrupt by epoch (verified native API)Mechanisms specific to Wasmer, not verified here
Used by AurabaseYes, aura-functions, version 43 pinnedNo, no dependency, direct or transitive

Sources: Cargo.toml and wasm/mod.rs from the Aurabase repository, verified directly on August 24, 2026. General Wasmtime and Wasmer characteristics taken from the public documentation of each project; no third-party benchmark figures are republished in this table.

#
Decision

Who should choose what

You start a new edge runtime, with no existing dependencies. Wasmtime, supported by a multi-vendor foundation, reduces the risk of depending on a single publisher for the future of the project.

You have very frequent and short-lived cold starts. Wasmer's Singlepass backend directly responds to this need, almost instantaneous compilation, at the cost of less optimized machine code.

You need POSIX primitives beyond the current standard WASI. WASIX, the Wasmer extension, covers threads and extended sockets that WASI Preview 2 alone does not yet cover.

You want a native footage and timeout API, without third-party middleware. Wasmtime exposes fuel and epoch directly in the crate, exactly what aura-functions enables at Aurabase.

#
Frequently Asked Questions

FAQs

Is Wasmtime faster than Wasmer?+
No comparative performance figures are stated here voluntarily. The two runtimes expose different compilers (Cranelift for Wasmtime; the choice of Singlepass, Cranelift or LLVM for Wasmer), which respond to distinct trade-offs between compilation speed and execution speed. See our dedicated analysis of the WebAssembly cold start for encrypted and sourced processing.
Can we use Wasmtime and Wasmer in the same project?+
Technically yes, since both consume the same .wasm format. But that doubles the integration surface area, two host APIs, two configuration models, with no net benefit for most teams. Aurabase only ships one, verified in the Cargo.toml of the aura-functions service.
Do all Aurabase Edge Functions run on Wasmtime?+
No. The default mode of Aurabase Edge Functions runs JavaScript/TypeScript through a separate Deno service. Wasm mode, powered by Wasmtime, is a second execution path, chosen on a function-by-function basis, not the default path.
What does the WebAssembly Component Model actually provide?+
The Component Model standardizes the composition of WASM modules written in different languages, with shared typed interfaces, without depending on a binary format specific to a runtime. Aurabase's native WASM mode does not use it today: it is a home-made minimal host ABI, not the Component Model.

READY TO DEPLOY?

Your backend in five minutes.

No credit card required · 500 MB free · 50,000 MAU