decompile

Decompiles Luau bytecode into source text.

Syntax

decompile(source: LuaSourceContainer | string, options: DecompilerOptions?) -> string
DecompilerOptions.new() -> DecompilerOptions
DecompilerFormatter.new() -> DecompilerFormatter

Parameters

ParameterTypeDescription
sourceLuaSourceContainer | stringA client-visible script or raw Luau bytecode
optionsDecompilerOptions?Optional decompiler settings

Description

Pass a script to decompile it directly, or pass a Luau bytecode string. Server-running Script instances are not supported.

The function yields until decompilation finishes and raises an error if the input cannot be decompiled.

DecompilerOptions

DecompilerOptions.new() initializes its fields from Volt's current decompiler settings.

PropertyTypeDescription
SmartVariableRenamerbooleanImprove generated local-variable names
FunctionDeclarationsbooleanRecover declaration-style functions when possible
GuardClausesbooleanRecover guard-clause control flow
ConstantFoldingbooleanFold eligible constant expressions
ConditionalStructurerbooleanReconstruct conditional control flow
DoBlockInsertionThresholdnumberThreshold used when inserting do blocks
FormatterDecompilerFormatterFormatter configuration

DecompilerFormatter

DecompilerFormatter.new() also uses the current Volt settings as its defaults.

PropertyTypeDescription
IndentWidthnumberSpaces used for each indentation level
ColumnLimitnumberPreferred output column limit
ParenthesizeConditionsbooleanAdd parentheses around conditions
AppendSemicolonsbooleanAppend semicolons to statements
FunctionMetadataEnabledbooleanEmit function metadata
FunctionMetadataLayoutnumberMetadata layout constant
FunctionMetadataIncludeNamebooleanInclude function names in metadata
FunctionMetadataIncludeLinebooleanInclude source lines in metadata
FunctionMetadataIncludeUpvaluesbooleanInclude upvalue information
FunctionMetadataUpvalueFormatnumberUpvalue-format constant

Metadata Constants

DecompilerFormatter.FunctionMetadata.Layout.Block
DecompilerFormatter.FunctionMetadata.Layout.Inline

DecompilerFormatter.FunctionMetadata.UpvalueFormat.Name
DecompilerFormatter.FunctionMetadata.UpvalueFormat.Kind
DecompilerFormatter.FunctionMetadata.UpvalueFormat.KindAndIndex

Example

local module = getloadedmodules()[1]
assert(module, "No loaded ModuleScript was available")

local options = DecompilerOptions.new()
options.SmartVariableRenamer = true
options.GuardClauses = true
options.Formatter.IndentWidth = 4
options.Formatter.ColumnLimit = 100
options.Formatter.FunctionMetadataEnabled = true
options.Formatter.FunctionMetadataLayout =
    DecompilerFormatter.FunctionMetadata.Layout.Block

local success, sourceOrError = pcall(decompile, module, options)
if success then
    print(sourceOrError)
else
    warn("Decompilation failed:", sourceOrError)
end

Raw Bytecode

local module = assert(getloadedmodules()[1])
local bytecode = getscriptbytecode(module)
local source = decompile(bytecode)
print(source)