Using Voltfuscator
Follow the steps for a web build, Discord bot, or API request. This guide covers runtimes, presets, macros, limits, and common errors.
local function greet(name)
return "Hello, " .. name
end
print(greet("world"))Getting started
Sign in with Discord, open the dashboard, paste your Lua or Luau source, then choose a preset and runtime. Normal is a good starting point when you want a balance of protection and speed. Max applies the strongest available protection. Light is not available yet.
Keep passwords and tokens out of your scripts, and only obfuscate code you own or have permission to process.
Build from the dashboard
Sign in with Discord and open the dashboard. Paste your code or upload a file, choose Lua 5.1 or Executor / Luau, select Normal or Max, then press Obfuscate. Copy or download the result before leaving the page.
Use the Discord bot
Send the bot a .lua or .txt file in a DM. On your first use, accept the Terms and Privacy Policy. Choose Normal or Max, press Next, then select Lua 5.1 or Executor / Luau. The promotional Discord status requirement is turned off. Each user has a ten-minute bot cooldown.
API request body
Every account can create private API keys. Sign in, open API Keys, and keep the key on your server. Send this JSON to POST /v1/obfuscate:
{
"code": "print('hello')",
"preset": "normal",
"runtime": "luau"
}Basic accounts get 3 successful builds per rolling 12 hours; Pro gets 12 and Elite gets 120. Daily maximums are 6, 24, and 240, respectively, and reset at 00:00 UTC. The allowance is shared across the website, bot, and API. Failed builds do not count. API keys expire after 30 days without use.
Full HTTP example
Send requests from your server with your private API key in the Authorization header. Replace the asterisks below with the key. Never put a key in browser code or a public repository.
POST https://voltils.cc/v1/obfuscate
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{"code":"print('hello')","preset":"normal","runtime":"luau"}All signed-in users can use the website. API clients need a private bearer key. Basic gets 3, Pro gets 12, and Elite gets 120 successful jobs per rolling 12 hours, shared across website, API, and bot. Daily maximums are Basic 6, Pro 24, and Elite 240; days reset at 00:00 UTC. Keys expire after 30 days without API use.
Choose a runtime
Choose Lua 5.1, Roblox / Studio, or Roblox Executor. Roblox / Studio supports developer scripts in Studio and published games, including LocalScripts. Executor mode requires a Roblox client, a working getgenv(), and a nonblank name returned by identifyexecutor() or getexecutorname(). Checks run automatically at startup.
Macros
Use macros to mark functions for different protection and performance behavior, or add checks to your script.
Performance macros
VLT_JIT(function() ... end) uses a faster virtualized profile. VLT_JIT_MAX(function() ... end) uses the lightest virtualized profile. VLT_NO_VIRTUALIZE(function() ... end) emits a native function for maximum speed. Use them around hot loops and frequent callbacks such as RenderStepped or Heartbeat.
VLT_JIT(function()
for i = 1, 1000 do
-- repeated work
end
end)()
game:GetService("RunService").RenderStepped:Connect(VLT_NO_VIRTUALIZE(function()
-- frequent callback
end))VLT, MV, and LPH prefixes are supported; JIT_MAX and JITMAX are aliases. Pass an inline function. Captured locals stay live, including writes and callbacks used after the script returns. Reflective environment/debug access in marked functions is unsupported. Native Lua 5.1 functions require Lua 5.1 syntax; native Luau functions can use supported Luau syntax.
These profiles trade protection for speed: native function code can be read, and JIT functions use lighter VM protection. Unmarked functions keep the selected preset. Local arithmetic benchmarks measured about 1.2–1.9× faster JIT execution; results depend on the workload and captured-variable traffic.
VLT_JITVLT_JIT_MAXVLT_NO_VIRTUALIZELPH_ENCFUNCLPH_ENCSTRLPH_ENCNUMLPH_NO_VIRTUALIZELPH_JITLPH_JIT_MAXLPH_NO_UPVALUESLPH_OBFUSCATEDLPH_LINELPH_CRASHMV_JITMV_JIT_MAXMV_NO_VIRTUALIZEMV_ENC_FUNCMV_NO_OPMV_OMITMV_VMMV_OBFUSCATEDMV_LINEMV_CRASHVOLTFUSCATOR_ENCFUNCVOLTFUSCATOR_NO_VIRTUALIZEVOLTFUSCATOR_OBFUSCATEDVOLTFUSCATOR_LINEVOLTFUSCATOR_CRASHLimits and build times
Basic accounts can submit up to 350 KB of source; Pro and Elite accounts can submit up to 450 KB. Size is measured in UTF-8 bytes (1 KB = 1,024 bytes). Upload a .lua, .luau, or .txt file, or paste your source into the editor. Each job has a 60-second compiler limit and uses one compiler slot. If the compiler is busy, the service returns a retry delay instead of queuing the job. If a job is interrupted, its reservation is released within 90 seconds unless the build was already confirmed as successful.
Troubleshooting
- Login expired: sign in with Discord again.
- Runtime mismatch: choose Lua 5.1 for standard hosts. Roblox Executor requires Roblox APIs, getgenv() and an executor name; missing or inconsistent APIs stop execution with a code-only error.
- Syntax error: test your script before obfuscating and remove executor-only syntax when possible.
- Rate limited: follow the retry delay. Each quota slot returns 12 hours after its successful build; failed jobs do not use it.
