Choose the easiest way to protect your JavaScript

Start online when you want a quick test. Use WinUI Local Standard for offline basic ES5 .js, paid Local Advanced for source-local modern .js/.jsx and mixed HTML/server-script files (with the protection report written locally), or hosted mode for VM bytecode. For CI on a Windows build agent, cli\jso-local.exe from the desktop zip drives the same source-local pipeline headlessly (command-line guide). The npm/editor integrations send selected JavaScript to the hosted service.

The simplest path

Try a small sample, pick the protection strength, then use the desktop app when you need to protect real project files.

1. Open the online obfuscator and protect a small JavaScript sample.
2. Choose Standard, Balanced, or Maximum based on how much protection you need.
3. Download the desktop app when you want to protect folders, larger files, or embedded JavaScript.
4. Upgrade to a paid plan when the free limits are too small or you need stronger protection.
5. Add release integrations only when repeatable automation is actually needed.

Other release environments

If your organization does not use JavaScript tooling for releases, these options let the person who owns the release connect protection from the environment the team already uses.

Moving from somewhere else?

Use these comparisons when you are replacing another tool or deciding whether JavaScript Obfuscator is a better fit.

From a free open-source obfuscator

See what changes when you move from a self-managed package to a paid product with support and account limits.

From Jscrambler

Compare feature coverage, pricing visibility, and where each product is strongest.

Try readable error recovery

Preview how a protected error report can be translated for troubleshooting.

Frequently asked questions

Which integration should I choose?

The one matching the bundler you already use, because there are direct plugins for Vite, webpack and Rspack, Rollup, esbuild, Next.js, Parcel, Metro for React Native, and Bun. If your build does not use a bundler, the npm CLI operating on your output directory covers the same ground. The editor extensions are for local inspection rather than for producing release artifacts.

Do the bundler plugins exclude dependencies by default?

Not uniformly, and assuming they do is a common and expensive mistake. Only the Bun and Parcel plugins exclude vendor directories by default. With Vite, webpack, Rollup or the others, dependency code is in scope unless you configure an exclusion, which means longer builds and a much larger surface for an exclusion error to break something. Set the boundary explicitly rather than relying on a default.

Where in the build does the plugin run?

After bundling and before the output is written, which is the correct order because protection expects compiled JavaScript. It also means any step that needs to read your code must run earlier: static analysis, secret scanning and dependency review are all substantially less useful against protected output. Order the pipeline so review happens while the code is still readable.

Will protection break my source maps or error monitoring?

Error monitoring keeps working but the traces arrive with renamed frames, so they need translating. Symbolication does that against the protection report from the exact build that produced them, which makes archiving a report per release a hard requirement rather than good practice. Publishing ordinary source maps for protected code would undo the protection entirely, so the report is the mechanism rather than a public map.

How do I stop the build renaming names my consumers depend on?

Declare them as reserved names. Anything resolved by name from outside the protected build needs covering: exported functions, callbacks a framework invokes by name, property names read from templates, and identifiers another separately built bundle references. The engine cannot infer which names are public, so this list is how the boundary gets stated. Micro-frontend and module-federation setups need particular care, because a shared mapping does not cross a project boundary.

Can the same configuration drive both local builds and CI?

Yes, and it should. Keep the configuration in version control and let both paths read it, so a release artifact does not depend on which machine produced it. Where developers want a faster inner loop, run a reduced option set locally and the full profile in CI, but let CI be the only path that produces something a customer receives.