# unreadable.gg docs

This is a decompiler for [Luau](https://unreadable.gg/luau) bytecode. It turns compiled scripts back into readable source, and marks anything it isn't sure about instead of guessing.

## quickstart

### on the site

Drop a compiled file on [the home page](https://unreadable.gg). `.rbxl`/`.rbxm` files work too (or their XML versions). They open in your browser, only the bytecode is sent, and you get the file back with every script decompiled.

### on discord

In [our Discord server](https://discord.gg/8gXdq43sK8), run `/decompile` with your file attached. You get the source back as a `.luau` file only you can see. It starts on `balanced`, or pick another preset in the command. You need the Verified role (`/verify`) and an account at least 7 days old.

### in an executor

Run this, then use `decompile` like you normally would. Your executor needs `WebSocket.connect` and `getscriptbytecode`. Options, keys and errors are on the [stream page](https://unreadable.gg/docs/stream#client).

```lua
shared.UNREADABLE_KEY = "ugk_..." -- optional: decompile as your account
loadstring(game:HttpGet("https://unreadable.gg/decompile.lua"))()
```

### over http

Send the compiled file as the body. You get JSON back with the source, a verdict and notes. The [API page](https://unreadable.gg/docs/api) has Python, JavaScript and options.

```sh
curl https://api.unreadable.gg/v1/decompile \
  -H "Content-Type: application/octet-stream" \
  --data-binary @module.luac
```

```powershell
# Windows, in PowerShell
curl.exe https://api.unreadable.gg/v1/decompile `
  -H "Content-Type: application/octet-stream" `
  --data-binary "@module.luac"
```

## what's the price?

You get 100 free decompiles a day, no account needed. The site, the executor and the API share them, and they reset at midnight UTC. One connection is one IP address (with IPv6, one /64 range). The Discord bot has the same limit, counted per Discord account.

## verdicts

Every result has a verdict. It tells you how much to trust the source.

| verdict | meaning |
| --- | --- |
| decompiled-unverified | Everything decompiled, nothing marked. It isn't recompiled or run to check, so it's our best answer, not a proof. |
| marked | Some spots couldn't be printed exactly. Each one gets a `-- unreadable:` comment instead of a guess. |
| refused | Some functions couldn't be decompiled. Each one is a stub that errors if called, with its instructions beside it. Everything else is still there. |

The [notes](https://unreadable.gg/docs/api#notes) say what was marked or refused, and where.

## which preset should I use?

Use `balanced` if you don't want to think about it.

Use `faithful` if you want source that compiles to the same bytes, or stack traces that point into the right function. Just know it can be quite verbose.

Use `readable` if you want the cleanest result. It turns every switch on, so names, types and line numbers can differ from the original.

The site, the executor and the Discord bot start on `balanced`. The API and the MCP server start on `faithful`. Every preset runs the same as your original. Details are on [readability](https://unreadable.gg/docs/readability).

## the other pages

- [api](https://unreadable.gg/docs/api): requests, responses, options, errors, limits, keys and accounts.
- [readability](https://unreadable.gg/docs/readability): the presets, and what each switch does.
- [stream](https://unreadable.gg/docs/stream): the executor client, and many decompiles over one WebSocket.
- [agents](https://unreadable.gg/docs/agents): markdown pages, the OpenAPI schema and the MCP server.
