luau bytecode decompiler
Drop your bytecode,
get source back.
upload a compiled luau file and decompile it instantly โ no key required
๐
Drop compiled file here
or click to browse ยท .luac .luau .lua .lc .bin
API Docs
integrate medal decompile into your own tools
Base URL
https://medaldecompile.pages.dev
Endpoints
POST
/decompile
HTTP ยท returns decompiled source as plain text
Request
| field | type | description |
| body | bytes | luau bytecode encoded as base64 |
JavaScript Example
const encoded = btoa(String.fromCharCode(...bytecodeBytes))
const res = await fetch("https://medaldecompile.pages.dev/decompile", {
method: "POST",
body: encoded
})
const source = await res.text()
Python Example
import base64, requests
encoded = base64.b64encode(open("script.luac", "rb").read())
r = requests.post("https://medaldecompile.pages.dev/decompile", data=encoded)
print(r.text)
Responses
| code | description |
| 200 | plain text โ decompiled luau source |
| 400 | invalid bytecode โ body is not valid base64 |
WS
/decompile_ws
WebSocket ยท async batch decompile with message IDs
Send (JSON)
| field | type | description |
| id | string | any string, echoed back in response |
| encoded_bytecode | string | base64 encoded luau bytecode |
Receive (JSON)
| field | type | description |
| id | string | same id you sent |
| decompilation | string | decompiled source code |
JavaScript Example
const ws = new WebSocket("wss://medaldecompile.pages.dev/decompile_ws")
ws.onopen = () => ws.send(JSON.stringify({
id: "job_1",
encoded_bytecode: btoa(String.fromCharCode(...bytecodeBytes))
}))
ws.onmessage = e => {
const { id, decompilation } = JSON.parse(e.data)
console.log(id, decompilation)
}
Notes
โน
Base64 required. always encode bytecode to base64 before sending โ raw bytes will be rejected.
โน
Luau only. lua 5.1 .luac bytecode format is different โ make sure your file is compiled luau.
โน
WebSocket for bulk. /decompile_ws lets you send multiple jobs at once, each identified by id.