See every transform side-by-side

Real input on the left, real protected output on the right. Outputs are slightly polymorphic between runs — the shapes below are representative, not byte-for-byte identical to what a live API call returns for the same input.

standard 1. Name Mangling

Source 102 bytes
function calculateLicenseHash(productKey, accountId) {
    const salt = "JSO-2026";
    return productKey + ":" + accountId + ":" + salt;
}
Protected 87 bytes
function _0x4f2a(_0xae,_0x21){
    const _0xbc="JSO-2026";
    return _0xae+":"+_0x21+":"+_0xbc;
}

balanced 2. String Array (Move Strings Into Array)

Source 141 bytes
function greet(user) {
    if (user.role === "admin") {
        return "Welcome, administrator!";
    }
    return "Hello, " + user.name;
}
Protected 208 bytes
var _$a=["admin","Welcome, administrator!","Hello, ","role","name"];
function _g(u){
    if(u[_$a[3]]===_$a[0]){
        return _$a[1];
    }
    return _$a[2]+u[_$a[4]];
}

balanced 3. String Encryption

Source 141 bytes
function greet(user) {
    if (user.role === "admin") {
        return "Welcome, administrator!";
    }
    return "Hello, " + user.name;
}
Protected 312 bytes
var _$e=["bER0aW4=","V2VsY29tZSwgYWRtaW5pc3RyYXRvciE=",
         "SGVsbG8sIA==","cm9sZQ==","bmFtZQ=="];
(function(a,b){var c=function(i){return atob(a[i]);};
 _$d=function(i){return c(i);};})(_$e);
function _g(u){
    if(u[_$d(3)]===_$d(0))return _$d(1);
    return _$d(2)+u[_$d(4)];
}

maximum 4. Control Flow Flattening (Flat Transform)

Source 126 bytes
function sum(n) {
    let total = 0;
    for (let i = 1; i <= n; i++) {
        total += i;
    }
    return total;
}
Protected 298 bytes
function _s(n){
    var _st="3|0|4|2|1".split("|"),_i=0,_t,_x;
    while(true){
        switch(_st[_i++]){
            case "0": _t=0; continue;
            case "1": return _t;
            case "2": if(_x>n){_i=4;continue;} _t+=_x; _x++; _i=2; continue;
            case "3": _x=1; continue;
            case "4": _i=1; continue;
        }
        break;
    }
}

maximum 5. Dead Code Insertion

Source 62 bytes
function isPaid(user) {
    return user.tier >= 2;
}
Protected 214 bytes
function _ip(u){
    if(!![]){
        return u["tier"]>=2;
    }else{
        var _z=function(a){return a*0x71+0x1f;};
        for(var i=0;i<3;i++){_z(i);}
        throw new Error("never");
    }
}

maximum 6. Protect Members & Member Mapping

Source 155 bytes
const license = {
    productKey: "ABC-123",
    expires: "2027-01-01",
    isValid() { return Date.now() < Date.parse(this.expires); }
};
Protected 196 bytes
var _$m=["ABC-123","2027-01-01"];
const _l={
    _0xae: _$m[0],
    _0xbf: _$m[1],
    _0xc1(){ return Date.now() < Date.parse(this._0xbf); }
};

maximum 7. Self-Defending Integrity Guard

Source 66 bytes
function chargeCard(amount) {
    api.post("/charge", {amount});
}
Protected 320 bytes
(function _sd(){
    var _exp="a7c9...c2";
    var _f=arguments.callee.toString().replace(/[^a-z0-9]/gi,"");
    var _h=0; for(var i=0;i<_f.length;i++)_h=(_h*31+_f.charCodeAt(i))>>>0;
    if(_h.toString(16)!==_exp){ window.__jso_tamper(); return; }
    setTimeout(_sd, 5000);
})();
function _c(_a){_api.post("/charge",{amount:_a});}

Try it on your own code

The examples above are short for readability. The live obfuscator handles thousands of lines, multiple files, and every preset shown here in a single API call.

Open the live demo Read the full docs ›