wasmcart
Write games in Godot. Ship them as cartridges.
The Godot 4 engine compiled to standalone WebAssembly — no browser, no DOM, no JS glue. Your .pck export becomes the cart.
Five prebuilt carts ship with every release. Download a .wasc and run it — no Godot install, no export templates, no build:
npx wasmcart roboblast.wasc
Each cart carries the Godot 4.4 engine and the game's own .pck. Nothing to install but Node 22+.
Everything below lives in wasmcart/wasmcart-godot.
You need the Godot editor to author, but nothing else — no Emscripten, no C++ toolchain, no engine build. The runtime is prebuilt.
Set Rendering > Renderer to Compatibility (GLES3). Forward+ and Mobile are Vulkan renderers, and a cart has no path to Vulkan. Then export a .pck and pack it:
npx wasmcart pack --wasm godot.wasm --assets assets \
--name my-game --width 1280 --height 720 -o my-game.wasc
Declare --width/--height to match your project's viewport size. A host sizes its window and GL context before the cart runs, so without the declaration the runtime falls back to 640x480 whatever the project asks for.
The examples repo ships make_pck.mjs, a pure-JS Godot 4.4 .pck builder. It walks a project directory and packs it, so a project that is already authored becomes a cart with no editor involved:
node make_pck.mjs my_project/ game.pck --patch-renderer
--patch-renderer rewrites project.godot from Forward+ to gl_compatibility for you.
Godot 4.4 itself, not a reimplementation: the scene tree, GDScript, physics, animation, the resource loader. Your .pck is loaded exactly as the engine expects.
The GLES3 Compatibility renderer's draw calls become WASM imports the host satisfies, so they reach the real GPU. The examples include a 1080p third-person action game.
Godot's own web export needs a DOM, a WebGL canvas, AudioWorklet and JS glue. This is standalone WASM with none of that, which is why it reaches devices Godot has no export for.
The same .wasc plays on your desktop, in a browser, through RetroArch via the libretro core, or on a retro handheld running Batocera, KNULLI or ROCKNIX — platforms with no native Godot export.
WASM memory isolation: the game cannot reach the host filesystem, network or processes. The .pck is mounted in an in-memory filesystem the engine reads as if it were real.
Godot's Input reads the host pad state directly. On a desktop the keyboard maps onto pad 1, so you can test without a controller.
The engine gets a platform/wasmcart port — an OS layer, display server and audio driver, plus the wc_* ABI entry points — the same way Godot's own platform ports are structured. Upstream needs only 16 changed lines across 7 files, all guarded by WASMCART_ENABLED: a couple of GLES3 fixes for an EGL pbuffer config and for shader caching that a read-only filesystem cannot do. Building the runtime takes one command and about six minutes.