Decompile Luau bytecode — the dialect Roblox runs — back to readable source.
Drop your Luau bytecode file, whatever it happens to be named.
The dialect is identified from the file header before decompiling.
Read the recovered Luau source in your browser.
Luau is the programming language Roblox games are written in. It began as a fork of Lua 5.1 and remains broadly source-compatible with it, but Roblox rewrote the compiler and the virtual machine from scratch. The result is a language that looks like Lua and adds gradual type annotations, new syntax such as compound assignment and continue, and a much faster interpreter — running on a bytecode format that shares nothing with either standard Lua or LuaJIT.
That last point is the one that matters here. Luau bytecode has no \x1b escape header at all: the very first byte of a Luau chunk is the bytecode version number. Standard Lua decompilers check for \x1bLua, find something else, and refuse the file immediately.
Files from all three implementations get saved as .luac, which is the root of most of the confusion:
1B 4C 75 61 (\x1bLua). Handled by the Lua decompiler.1B 4C 4A (\x1bLJ). Handled by the LuaJIT decompiler.You do not have to work out which you have. Upload the file and the header is read for you.
Roblox compiles scripts server-side and ships bytecode with debug information removed. This is a deliberate protection measure and it sets a hard ceiling on what any decompiler can recover:
In practice this means output that reads like source written by someone who names every local v1, v2, v3. The logic is intact and the API calls are legible, which is normally what you are after.
Beyond the stripping, Luau's compiler is an optimising one. It performs constant folding, dead code elimination, inlining of small functions and loop unrolling before it emits bytecode, so the instruction stream frequently has no one-to-one correspondence with anything the author wrote. A decompiler can only recover a program with equivalent behaviour, not the original text.
Luau also evolves quickly. The bytecode version has been revised repeatedly and new opcodes appear with new engine releases, so a file compiled by a recent Roblox client may use instructions that a decompiler has not been taught yet. When that happens you will get a note explaining it rather than silently wrong output.
Decompiling bytecode you own or are authorised to analyse is ordinary engineering work: recovering your own lost source, auditing a third-party module before you take a dependency on it, investigating a malicious script that appeared in your game, or learning how a technique is implemented. Roblox's Terms of Use govern what you may do with other people's content on their platform, and this tool does not change that — it does not bypass any protection, it only reads bytecode you already have.
Roblox's own dialect of Lua. Derived from Lua 5.1, with gradual typing and new syntax, but a completely different bytecode format and virtual machine. Standard Lua decompilers cannot read it.
Luau bytecode has no \x1bLua header and a different instruction set, so a standard Lua decompiler rejects the file before reading a single instruction.
Usually not. Roblox strips debug information, so local names, comments and line numbers are gone. Control flow, string constants and code structure do come back.
This tool decompiles Luau bytecode. .rbxl and .rbxm files are containers holding scripts among much else — extract the bytecode first, then upload it.
Unrelated projects. LuaJIT is a just-in-time compiler for standard Lua 5.1 used in servers and games; Luau is Roblox's interpreter and language dialect. Their bytecode formats are mutually unreadable.