✳ OMNIVIEWER

Decompile a WebAssembly module.

safe · secure · no server · works offline · fast

…or just start typing at the cursor.

Or try it now

↓ scroll for about & FAQ

Read a WebAssembly module online — without a toolchain

OmniViewer opens a .wasm module — the binary WebAssembly format browsers, Node, Wasmtime and edge runtimes execute — right in your browser. Drop the file and you get a readable WAT decompile: the module’s types, the host functions it imports, every function with a real bytecode disassembly of its body, its memory and globals, and everything it exports. There is no upload and no server, and the parse runs in a background Web Worker so the page never freezes.

Why even a huge module maps instantly

A .wasm file is section-first: after an 8-byte preamble it is a flat list of sections, each a (id, length, payload) record. OmniViewer walks that section table by reading only each section’s few-byte header — so the byte map of a module with a giant embedded data segment (a whole game, a Python runtime) is built from a handful of small reads, and the data payload is never pulled into memory. The WAT decompile reads a bounded prefix that covers the code, so it stays fast and flat no matter how big the file is.

What each tab does, in plain terms

For a byte-level walk through the format — the magic, the section ids, LEB128 encoding and how a function body disassembles — see our deep dive into the WebAssembly binary format.

OmniViewer opens every file format, powered by the same viewing engine as fastjsonviewer.com and hugecsv.com.

FAQ

Is my WASM file uploaded anywhere?

No. OmniViewer is a static page with no server-side processing: your .wasm is read directly by your browser, and every tab — WAT, interface, sections and stats — runs locally in a Web Worker. The module never leaves your computer.

What is WAT, and is this a real decompiler?

WAT is the WebAssembly text format — the human-readable S-expression form of a module. OmniViewer disassembles the binary bytecode of each function into its instructions (local.get, i32.add, call, block/loop/if and the rest) and prints the module as WAT, the same shape wasm2wat produces, entirely in your browser.

How can a multi-gigabyte module open instantly?

A .wasm is a flat list of sections, each prefixed with its byte length, so OmniViewer walks the section table by reading only the headers — a few kilobytes of reads at any size. The large data payload is never loaded into memory, and the WAT decompile reads only the bounded prefix that holds the code.

Can I see what a module imports and exports?

Yes — that is the Interface tab. It lists every import (the module and field name, the kind, and the signature) the module needs from its host, and every export it exposes to your code. It is the fastest way to audit an untrusted or undocumented .wasm.

Which WebAssembly features does the disassembler understand?

The full MVP instruction set plus the common extensions: sign-extension, saturating float-to-int truncation and bulk-memory operations (the 0xFC prefix), reference types, and SIMD/v128 opcodes (the 0xFD prefix). An unrecognized opcode stops that one function’s disassembly cleanly and the tool re-syncs at the next function, so the output is always complete and readable.

Do I need wasm2wat, wabt or emscripten installed?

No. OmniViewer parses and disassembles the module in pure JavaScript, so it works in any modern browser on Windows, Linux, macOS or a phone. No wabt, no emscripten, no Rust or Node install.

Can it open .wasm from Rust, C/C++, Go or AssemblyScript?

Yes. The format is the same whatever the source language, so a module compiled from Rust, C/C++ (Emscripten or WASI), Go, TinyGo, AssemblyScript or Zig all open the same way. When the module carries a custom “name” section, the WAT and interface show the original function names.