Every language, in one polyglot WebAssembly runtime: compile a real multi-module project to wasm and run it
side by side with your scripts, all on one engine. Sealed by default, deterministic to the last bit,
fuel-metered. burn compile turns any program into a single portable artifact;
burn run executes it anywhere with no recompile and zero config.
Each one compiles to WebAssembly with
its own native toolchain, and each one has a REPL. Pick a tab.
Firecracker, Daytona, a Docker container: each boots a fresh sandbox for every run. A resident sandbox runtime skips that, so a sandboxed run takes about 500 microseconds and turns around a couple thousand times a second.
time to a run (lower is better)
runs per second (more is better)
Point burn at a source file and it picks the toolchain, compiles to wasm, and runs the module,
in C, Rust, Go, TypeScript, or Python. Point it at a folder and it builds the whole package.
Need a sandbox? --sandbox seals every capability; --allow-fs,
--allow-net, --allow-env grant exactly the surface a program needs. Same run, same
bytes, every time.
WebAssembly is the common substrate. Afterburner adds the toolchains, the sandbox, the determinism, and the packaging on top.
Every language compiles to WebAssembly and runs side by side.
One burn binary, one execution model, no per-language runtime to install.
A real cargo project, a go module with sub-packages, a multi-file C/C++ project. Cross-module calls and
language-native encapsulation (pub, exported caps, static), not one file dressed
up.
burn repl --lang rust, go, c, cpp, ts, or
js. The compiled languages run evcxr-style: each line recompiles, session state carries
forward. Toolchain errors are clear, never a crash.
Canonical NaN, relaxed-SIMD pinned to one result, threads off, fuel-metered. The same module returns the same bytes on an AVX-512 server and an Arm laptop. Reproducible runs, no flake.
A program starts with no filesystem, no network, no environment. Grant exactly what it needs with
--allow-fs, --allow-net, --allow-env. Every capability is denied
until you say otherwise.
A deterministic instruction budget bounds every run; a hard memory cap and a wall-clock timeout back it up.
An infinite loop surfaces as FuelExhausted, not a hung host.
Content-addressed by SHA-256, byte-reproducible (sorted entries, zeroed timestamps, zstd). A package
carries its manifest, its sealed capability manifold, its source, and an optional precompiled
main.wasm.
burn publish, burn install, burn add, burn search.
Dependencies pin by digest in afb.toml; installs land in a shared content-addressed cache.
Reproducible from the same digest, every time.
burn compile turns your program into a single portable artifact burn run executes
anywhere with no recompile and zero config. Drop it in a container and go. Runtimes auto-fetch on first
use; deps with only a native build are rejected at compile time with a clear message.
Run a single file, build a multi-module package, open a REPL, or seal the sandbox. The same controls span every language.
Afterburner packages are native multi-module projects built by their own toolchain. Exported APIs over private helpers, cross-module calls, the encapsulation each language already gives you, compiled into one self-contained WebAssembly module.
afb.toml # name, namespace, version, entry manifold.json # sealed capability set Cargo.toml source/ ├─ main.rs # calls across both modules ├─ geometry.rs pub fn rectangle_area(..) │ # private fn scale(..) stays internal └─ stats/ └─ mod.rs pub fn mean(..) # sum(..) private # Go: capitalized identifiers exported across packages. # C/C++: all of source/** linked into one WebAssembly module, # static helpers encapsulated behind the header.
One workflow, every language. Scaffold, build, package, publish.
burn new geo --lang rust scaffolds a project with a sealed
manifold.burn run ./geo compiles the whole package and runs the
entry.burn package ./geo -o geo.afb builds a content-addressed
.afb, source plus optional precompiled wasm.burn publish geo.afb uploads it; burn install
geo pulls it back, digest-pinned.Declare packages in afb.toml under [dependencies], pinned to a
sha256: digest. burn add writes the pin; installs resolve and land in a shared
content-addressed cache, so the same digest always rebuilds the same bytes.
Nothing is hardcoded. Set the budgets that match your workload. Deny every capability by default, then grant exactly the surface a program needs. Every knob is on the CLI and in the package manifold.
A deterministic op counter bounds every run. A tight loop trips the gauge regardless of
host speed and surfaces as FuelExhausted. Set the budget, or disable it.
A hard cap on linear memory, enforced per run. Over-budget growth fails inside the module. Your host never gets OOM-killed by a misbehaving guest.
A backstop for work that doesn't burn fuel. Independent of fuel and memory. Set it in milliseconds, whatever fits the workload.
Canonical NaN, relaxed-SIMD pinned to one result, threads disabled. The same module yields byte-identical output across host CPUs. Run it again and get the same answer.
Sealed until granted. Whitelist exact roots, read-only or read-write. A program reaches only the paths you list, and nothing else.
Outbound access gated by host. Use host, host:port,
*.suffix, or *. The program reaches exactly the services you allow.
Let customers extend your product in the language they know, Rust, Go, C, TypeScript, or Python. One sealed runtime gates every one of them the same way, so a plugin's bug stays out of your process.
Ship a transform as a package and pipe rows through burn thrust. Determinism means the same
input gives the same output on every machine, byte for byte, in whichever language fits the job.
Each request runs sealed by default. Outbound HTTP needs an allow-list; the filesystem stays off until you grant it. Production-shaped isolation you can test on your laptop.
Replace ad-hoc shell with a version-pinned package that gets only the capabilities the step needs.
burn run --allow-fs=./out --allow-env=CI build.ts beats a brittle 200-line Bash file.
burn compile produces a single portable artifact any host can burn run with no
recompile and no config. Drop it in a container, send it over a release pipeline, or cache it by digest.
One artifact, any supported host.
An agent emits Python, JavaScript, or Go you have never seen. burn run --sandbox runs it sealed,
no network or filesystem until you grant it, and deterministic every time, so a bad generation hits an empty
box instead of yours.
Install the binary, point it at any source file, and watch it compile to WebAssembly and run, sealed and deterministic.
Pin a version with BURN_VERSION=vX.Y.Z · custom dir with
BURN_INSTALL=/usr/local/bin