See every transform side-by-side

Real input on the left, real protected output on the right. Outputs can vary from run to run, so the shapes below are representative rather than exact copies of what the online tool returns.

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 online tool handles larger files, multiple presets, and the same protection choices shown here.

Open the live demo Read the full docs ›