RBX Editor

A browser Luau editor with Roblox API autocomplete. Attach a game to run what you write.

RBX Editor lives at rbx.lol/editor, separate from the debugger tabs. It works with no game attached.

Works with no gameNeeds a game attached
Writing, saving, the file treeRun
Autocomplete for the Roblox API and executor functionsThe game's own modules
Lint markersLive console output

Attach a game at the top opens the same room panel the debugger uses. The room code is shared between the two pages, so a game attached on either shows up on both.

Files#

Two folders, modules/ and projects/. A new editor is seeded once with the Ember module, a runnable Ember showcase and a hello.luau.

Files are stored in this browser, in IndexedDB, separate from decompiled game sources. Clearing captured data does not touch them. Each open file keeps its own undo history, so undo in one never rewinds another.

Ctrl+S saves. New starts an unsaved scratch buffer that still survives a reload. Saving an unsaved buffer asks which folder it belongs in.

Running#

Ctrl+Enter or Run executes the script in the attached game, not in the browser. print and warn are captured in-game and returned with the script's return value, so output arrives even when the live stream is quiet. An error is caught and printed rather than lost.

The output pane filters by level, filters by text, and has a Live toggle that mirrors the game's own console into it. It keeps the last 2,000 lines.

Requiring modules#

require(Name) resolves to your own file in modules/ with that name. Referenced modules are compiled into the script that gets sent, so nothing has to exist in-game. Anything the editor does not own falls through to the real require.

Luau
local Combat = require(game.ReplicatedStorage.Modules.Combat)

A require of a game module works because your code runs inside the game. Naming one also decompiles that single module in the background so its functions autocomplete, which is why a path you just typed lights up a second later.

Relative paths are not resolved

require(script.Parent.Thing) runs fine, but the editor cannot tell which module you mean, so it offers no completions for it.