pionxzh/wakaru

🔪📦 Javascript decompiler for modern frontend

Rust

1,012

2,568 commits

updated Oct 11, 2026

See the code

README

Wakaru

Unpack. Unminify. Understand.

Wakaru is a JavaScript decompiler. It splits production bundles into modules and restores readable, modern syntax from minified and transpiled code.

CI npm Telegram

Try it in the playground

Quick start

Run without a global install:

npx wakaru input.js -o output.js       # decompile a file
npx wakaru bundle.js --unpack -o out/  # unpack and decompile a bundle
npx wakaru dist/ --unpack -o out/      # scan a bundle output directory

See the CLI reference for rewrite levels, source maps, and more options.

Install

For regular use, install the CLI globally:

npm install -g wakaru@latest

Standalone binaries are available from GitHub Releases.

What it does

Wakaru rewrites the JavaScript AST to recover modern syntax, remove recognized runtime helpers, and split supported bundles into modules.

Minified Babel output:

"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadProfile=void 0;
var _api=_interopRequireDefault(require("./api"));
function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}
function _asyncToGenerator(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var a=e.apply(t,r);function i(e){c(a,n,o,i,u,"next",e)}function u(e){c(a,n,o,i,u,"throw",e)}i(void 0)})}}
function c(e,t,r,n,o,a,i){try{var u=e[a](i),c=u.value}catch(e){return void r(e)}u.done?t(c):Promise.resolve(c).then(n,o)}
var loadProfile=function(){var e=_asyncToGenerator(function*(e){var t=yield _api.default.fetchUser(e),r=null!=t.name?t.name:"anonymous";return{name:r,avatar:null==t.profile?void 0:t.profile.avatar}});return function(t){return e.apply(this,arguments)}}();exports.loadProfile=loadProfile;

Wakaru output:

import _api from "./api";
export const loadProfile = async (e)=>{
    const t = await _api.fetchUser(e);
    const name = t.name ?? "anonymous";
    return {
        name,
        avatar: t.profile?.avatar
    };
};

The helpers become async/await, the null checks become ?? and ?., and CommonJS imports and exports become ESM. Some names, such as e and t, stay short because the input does not provide their original names.

What it handles

  • Bundles: split webpack, esbuild/Bun, Browserify, and Metro output into readable modules.
  • Transpiled code: recover modern syntax from Babel, TypeScript, and SWC output.
  • Minified code: expand compact expressions and simplify control flow.

See supported inputs for the full list and format-specific limits.

Guides

Tested like a compiler

We test both behavior and recovery against real compiler and minifier output:

Use cases

  • Security and supply-chain review: inspect the JavaScript a site or dependency ships, with supported bundles split into modules.
  • Debugging third-party SDKs: follow the code behind a stack trace or investigate behavior in a distributed build.
  • Source recovery: recover readable modules when only build artifacts remain, or extract original files embedded in source maps.

Works with other tools

Wakaru focuses on minifier and transpiler recovery. For supported obfuscation patterns, a deobfuscator such as webcrack can prepare the input before Wakaru processes it. Heavy control-flow or VM-based obfuscation needs a dedicated approach.

For AI-assisted identifier naming, see humanify. Inferred names are reading aids; source maps are the source of original names when available.

Use it from an agent

Give your coding agent readable modules to search and inspect. With the Wakaru skill, it can unpack a bundle and focus on the files relevant to your question, keeping unrelated code out of context.

Install via skills.sh:

npx skills add pionxzh/wakaru

In development: package inventory

Package inventory is under development: identify which npm packages and versions a production bundle contains. It is not part of the current release.

Share your use case to help shape its scope and priority, or contact hello@wakarujs.com.

Contributing

Small fixes, missing recovery patterns, and correctness reports are welcome. For a bug report, include the input, command, current output, and expected behavior. A clear issue is useful even without a proposed fix.

See CONTRIBUTING.md for setup and PR guidance, and docs/README.md for the development documentation.

License

Apache-2.0

Usage of Wakaru for attacking targets without prior mutual consent is illegal. End users are responsible for complying with all applicable laws.

ast
babel
browserify
bun
bundler
cli
debundle
decompiler
esbuild
javascript
reverse-engineering
rust
swc
unbundle
unminify
unpack
webpack

pionxzh/wakaru

🔪📦 Javascript decompiler for modern frontend

Rust

1,012

2,568 commits

updated Oct 11, 2026

See the code

README

Wakaru

Unpack. Unminify. Understand.

Wakaru is a JavaScript decompiler. It splits production bundles into modules and restores readable, modern syntax from minified and transpiled code.

CI npm Telegram

Try it in the playground

Quick start

Run without a global install:

npx wakaru input.js -o output.js       # decompile a file
npx wakaru bundle.js --unpack -o out/  # unpack and decompile a bundle
npx wakaru dist/ --unpack -o out/      # scan a bundle output directory

See the CLI reference for rewrite levels, source maps, and more options.

Install

For regular use, install the CLI globally:

npm install -g wakaru@latest

Standalone binaries are available from GitHub Releases.

What it does

Wakaru rewrites the JavaScript AST to recover modern syntax, remove recognized runtime helpers, and split supported bundles into modules.

Minified Babel output:

"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadProfile=void 0;
var _api=_interopRequireDefault(require("./api"));
function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}
function _asyncToGenerator(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var a=e.apply(t,r);function i(e){c(a,n,o,i,u,"next",e)}function u(e){c(a,n,o,i,u,"throw",e)}i(void 0)})}}
function c(e,t,r,n,o,a,i){try{var u=e[a](i),c=u.value}catch(e){return void r(e)}u.done?t(c):Promise.resolve(c).then(n,o)}
var loadProfile=function(){var e=_asyncToGenerator(function*(e){var t=yield _api.default.fetchUser(e),r=null!=t.name?t.name:"anonymous";return{name:r,avatar:null==t.profile?void 0:t.profile.avatar}});return function(t){return e.apply(this,arguments)}}();exports.loadProfile=loadProfile;

Wakaru output:

import _api from "./api";
export const loadProfile = async (e)=>{
    const t = await _api.fetchUser(e);
    const name = t.name ?? "anonymous";
    return {
        name,
        avatar: t.profile?.avatar
    };
};

The helpers become async/await, the null checks become ?? and ?., and CommonJS imports and exports become ESM. Some names, such as e and t, stay short because the input does not provide their original names.

What it handles

  • Bundles: split webpack, esbuild/Bun, Browserify, and Metro output into readable modules.
  • Transpiled code: recover modern syntax from Babel, TypeScript, and SWC output.
  • Minified code: expand compact expressions and simplify control flow.

See supported inputs for the full list and format-specific limits.

Guides

Tested like a compiler

We test both behavior and recovery against real compiler and minifier output:

Use cases

  • Security and supply-chain review: inspect the JavaScript a site or dependency ships, with supported bundles split into modules.
  • Debugging third-party SDKs: follow the code behind a stack trace or investigate behavior in a distributed build.
  • Source recovery: recover readable modules when only build artifacts remain, or extract original files embedded in source maps.

Works with other tools

Wakaru focuses on minifier and transpiler recovery. For supported obfuscation patterns, a deobfuscator such as webcrack can prepare the input before Wakaru processes it. Heavy control-flow or VM-based obfuscation needs a dedicated approach.

For AI-assisted identifier naming, see humanify. Inferred names are reading aids; source maps are the source of original names when available.

Use it from an agent

Give your coding agent readable modules to search and inspect. With the Wakaru skill, it can unpack a bundle and focus on the files relevant to your question, keeping unrelated code out of context.

Install via skills.sh:

npx skills add pionxzh/wakaru

In development: package inventory

Package inventory is under development: identify which npm packages and versions a production bundle contains. It is not part of the current release.

Share your use case to help shape its scope and priority, or contact hello@wakarujs.com.

Contributing

Small fixes, missing recovery patterns, and correctness reports are welcome. For a bug report, include the input, command, current output, and expected behavior. A clear issue is useful even without a proposed fix.

See CONTRIBUTING.md for setup and PR guidance, and docs/README.md for the development documentation.

License

Apache-2.0

Usage of Wakaru for attacking targets without prior mutual consent is illegal. End users are responsible for complying with all applicable laws.

ast
babel
browserify
bun
bundler
cli
debundle
decompiler
esbuild
javascript
reverse-engineering
rust
swc
unbundle
unminify
unpack
webpack

Project health

Latest release

1.14.0 · Oct 10, 2026

Releases this year

7

Significant stargazers

(top 24 of 37)

Paul Irish

32,122 followers · starred May 2026

Robert Jackson

1,195 followers · starred Nov 2024

Mads Marquart

221 followers · starred Nov 2023

PJ Eby

187 followers · starred Aug 2026