Upload a .lua file, choose the protection level and preview the result. The full pipeline runs server-side — this demo illustrates the flow.
A .lua file, up to 2 MB.
Choose your layers.
Compare before / after.
local _0x000 = {}
local _0x001 = 3
RegisterNetEvent("\x63\x68\x61\x74\x3a\x6d\x65\x73\x73\x61\x67\x65", function(name, color, message)
local _0x002 = source
local _0x003 = GetGameTimer()
if(function() do return end;--@cf
return true end)() and _0x000[_0x002] and (_0x003 - _0x000[_0x002]) < 1500 then
_0x001 = _0x001 - 1
if(function() do return end;--@cf
return true end)() and _0x001 <= 0 then
DropPlayer(_0x002, "\x46\x6c\x6f\x6f\x64\x20\x64\x65\x74\x65\x63\x74\x65\x64")
end
do return end;--@cf
return
end
_0x000[_0x002] = _0x003
print(("\x5b\x63\x68\x61\x74\x5d\x20\x25\x73\x3a\x20\x25\x73"):format(name, message))
end)Client-side demonstration for educational purposes. The real Gate pipeline runs the obfuscation in an isolated environment and delivers a signed artifact.
A simple export wrapper becomes unreadable while staying functional.
-- notify.lua
local function notify(msg, type)
TriggerEvent("chat:addMessage", {
args = { "[SERVER]", msg },
color = type == "error" and {255,0,0} or {0,255,0}
})
end
exports("notify", notify)local _0x001=function(_0x002,_0x003)
TriggerEvent("\x63\x68\x61\x74\x3a\x61\x64\x64\x4d\x65\x73\x73\x61\x67\x65",{
args={"\x5b\x53\x45\x52\x56\x45\x52\x5d",_0x002},
color=_0x003=="\x65\x72\x72\x6f\x72" and{0xff,0x0,0x0}or{0x0,0xff,0x0}})
end
exports("\x6e\x6f\x74\x69\x66\x79",_0x001)Locals, upvalues and parameters replaced with opaque identifiers.
All strings are encoded and decrypted at runtime.
The execution graph is dismantled and skewed by opaque predicates.
Numbers converted, tables reordered, dead code injected.
The ultimate option: your code runs in a sealed Gate VM.
Runtime integrity checks, anchored to the FiveM domain.
Create an account, upload your script and get the protected version in seconds.