RzWeb is a browser UI for Rizin compiled to WebAssembly. You drop a binary in. Analysis stays on this machine. Rizin runs in a Web Worker so the page does not freeze while WASM loads. aaa still owns that worker until the command returns.
Each open binary is a context. Artifact bytes, a current .rzdb, and a short revision history live in IndexedDB. Home can resume a hash or start a new context on the same file. One tab is one worker. Close the tab and that core dies.
The WASM build comes from rzwasi. Stock Pages WASM has no jsdec or rz-ghidra. Decompiler view uses pdg, pdd, or pdc when the build ships one, otherwise pdf with asm.pseudo.
An MCP server lives in mcp/. Same wasm, contexts on disk. Point any MCP client at it. See that folder.
Homepage
Terminal
Disassembly
Decompiler
Cross-references
Control flow graph
Hex dump
Strings
Imports
Exports
Sections
Binary info
- Tabs, each with its own worker
- Terminal with catalog autocomplete
- Disassembly, decompiler, xrefs, CFG, hex, strings, imports, exports, sections, bin info
- Scripts view (rizin cmd or JS with a sync
rzAPI) - Themes. Terminal and graph follow the active one
- Palette (
Ctrl/Cmd+K) and view shortcuts (Alt+1..9) - Snapshot, history, and
RZWEBPRJexport that embeds the binary - Hex and write-mode patches, then save the file
Formats are whatever the bundled Rizin build opens. ELF, PE, Mach-O, raw dumps.
- Open the app.
- Drop a binary. Resume the old context or start a new one.
- The worker mounts the file. Analysis runs as a job on that tab.
- Snapshot or export
RZWEBPRJwhen you want a copy. History applies an older.rzdbonto the open file.
Files stay on the device. WebAssembly memory and IndexedDB only. Nothing is uploaded.
- No
ptracein the browser. - One
RzCoreper live context. That worker cannot take other commands untilaaareturns. - Cancel works between stages (
aathenaaa/aaaa). Not mid-command. - Restore needs
rzweb_apply_projectin the wasm you load. Older dists fall back toPoand show a notice. - jsdec is an opt-in rzwasi build. Point
VITE_WASM_BASE_URLat that dist. Do not make it the default Pages build.
Vitest cannot load rizin.wasm. After a wasm publish, click through:
- Two tabs. Rename in A, switch to B and back. The rename is still in A.
- Cold
RZWEBPRJfrom Home. - Restore an older snapshot from history.
- Depth 2 job banner. Cancel between
aaandaaa. - Missing
rzweb_apply_projectshows the apply-project notice.
Node 20.19+ or 22.12+. Ubuntu apt nodejs is 18. Vite then dies with crypto.hash is not a function. The repo pins 22 in .nvmrc.
If node -v still prints v18:
mkdir -p "$HOME/.local"
curl -fsSL https://nodejs.org/dist/v22.23.2/node-v22.23.2-linux-x64.tar.xz -o /tmp/node22.tar.xz
tar -xJf /tmp/node22.tar.xz -C "$HOME/.local"
ln -sfn "$HOME/.local/node-v22.23.2-linux-x64" "$HOME/.local/node"
export PATH="$HOME/.local/node/bin:$PATH"Put that export in ~/.bashrc so new terminals keep it.
cd rzweb
node -v
npm install
npm run devnode -v must print v22. Open http://localhost:3000. Default wasm is the GitHub Pages rzwasi build. Leave VITE_WASM_BASE_URL unset unless you are testing a local dist.











