Installation
NyxUI is a standalone Windows x64 app. No installer, loader, or external UI asset download is required.
1
Download NyxUI-App.exe from the download page.
2
Run it. NyxUI opens directly, checks for app updates on launch, and restarts itself if an update is installed.
3
NyxUI opens. The WebSocket server starts automatically on port 33882. The status pill in the top-left shows ws :33882 when running.
Windows may show a SmartScreen warning on first run — click More info → Run anyway. This happens because the binary is not code-signed yet.
Connecting an Executor
NyxUI talks to Roblox via a local WebSocket server. Run a short Lua script inside your executor to establish the connection.
1
In NyxUI, open Settings (top bar) → WebSocket (left nav). Click Copy to Clipboard to copy the Lua client script.
2
Paste it into your Roblox executor and execute it. Within 2 seconds the client connects and appears in the Clients panel on the right side of NyxUI.
Save the script to your executor's autoexec folder so it runs automatically on every attach. You only need to copy-paste once.
How it works

The Lua client connects to ws://127.0.0.1:33882 and sends an auth handshake with your username, userId, and executor name. NyxUI assigns a stable client ID (saved to nyx_client_id.txt) so console logs stay consistent across reconnects. A keep-alive ping runs every 5 seconds. If the connection drops, the loop reconnects automatically.

Your First Script
Once an executor is connected, executing a script takes just a couple of clicks.
1
In the Clients panel (right side), click your executor to select it. Selected clients are highlighted with an accent border.
2
Type or paste a script in the center editor. Example: print("hello from NyxUI")
3
Press Ctrl+Enter or click the Execute button in the top-right of the editor.
4
If Route Console to NyxUI is enabled (Settings → Controls), output appears in the console panel at the bottom.
Tabs & Folders
The editor supports multiple tabs and folder groups to keep your scripts organized.
Tabs

Click + in the tab bar or press Ctrl+T to open a new tab. Each tab is an independent buffer. Right-click a tab to rename, save, hide, move to a folder, or close it. Drag tabs left or right to reorder. Unsaved tabs show a small dot indicator.

Folders

Click the Folder button in the tab bar to create a folder group. Drag a tab onto a folder header (hover 500 ms) to move it in. Folders can be collapsed to keep the tab bar tidy. Right-click a folder to rename or delete it.

Hiding tabs

Right-click a tab and choose Hide Script to obscure its name and content. Hidden tabs show as ••••••. An eye icon in the tab bar temporarily reveals them.

Executing Scripts
Scripts are sent to all selected clients simultaneously using chunked delivery — no practical size limit.

NyxUI uses a start/chunk/end framing protocol. Each chunk is 32 KB. The Lua client reassembles chunks and runs the script with loadstring(script, "@script"), which resets line numbers so error messages like @script:5: refer to your actual script lines.

Select your clients in the Clients panel, then press Ctrl+Enter or click Execute. The Execute button shows a badge for how many clients are currently selected.

Keyboard Shortcuts
ShortcutAction
Ctrl+EnterExecute script on all selected clients
Ctrl+SSave current tab to the Scripts folder
Ctrl+TOpen a new editor tab
Ctrl+FOpen the find / replace widget
EscapeClose the find widget
Alt+ZToggle word wrap
Enter (open block)Auto-insert end / until — works even when the opener has body on the same line, e.g. while true do task.wait()
Ctrl+Click URLOpen https://... URLs in the system browser
Right-click URLSame — opens the URL in the system browser
Right-click tabRename · Save · Hide · Move to folder · Close
Right-click scriptOpen · Rename · Favorite · AutoExec · Hide · Delete
Autocomplete
The Monaco editor provides multiple layers of intelligent completion.
Static Roblox API

All standard Roblox API members — services, instances, properties, methods, events — are available as completions. Type game:GetService(" to get service name suggestions.

Live workspace completions

When an executor is connected, type workspace. (or any service) to get live children from the running game, fetched directly from the connected Roblox session.

Executor function completions

Functions exposed by the executor (getgenv, hookfunction, readfile, etc.) appear as completions based on what the connected executor actually provides.

Snippets

Type fn, for, while, if, local, pcall, etc. to expand common Lua code blocks. Smart End Insertion adds end automatically when you press Enter after a block opener.

Scripts Sidebar
The left sidebar manages your saved scripts. Files are stored on disk and persist across sessions.

Press Ctrl+S or click Save to save the active tab to the Scripts folder. Saved scripts appear instantly. The sidebar has two tabs at the top: Scripts lists all saved files, AutoExec lists scripts set to auto-run on connect.

Right-click optionDescription
OpenLoad the script into a new editor tab
RenameRename the file on disk (updates open tabs too)
FavoritePin to the top of the list with a star icon
AutoExecToggle auto-run when an executor connects
HideObscure name and content with ••••••
DeletePermanently delete the file from disk
AutoExec
Scripts in the AutoExec list run automatically every time an executor connects — no manual execution needed.

To add a script: right-click it in the sidebar and choose Add to AutoExec. The script must be saved first. AutoExec scripts are shown with an orange play badge and listed in the AutoExec sidebar tab. Remove them via right-click.

Scripts run in the order they appear, sent as soon as the executor completes the auth handshake.

AutoExec runs on every connect. Guard session-sensitive scripts: if _G.__ran then return end; _G.__ran = true
Clients Panel
The right panel lists every connected Roblox session. Scripts only execute on selected clients.

Click a client to toggle selection. The Execute button badge shows how many are selected. Each entry shows the Roblox username, avatar headshot, executor name, and connection status. Use the All / None buttons at the bottom of the panel to select or deselect everything at once.

The client ID (a stable NYX-... identifier) is saved to nyx_client_id.txt in the executor workspace so the same client gets the same ID and console tab across reconnects.

Enable Hide Client Names in Settings → Controls to replace usernames with Client_1, Client_2… labels for privacy during screen recording.
Console Output
The console panel at the bottom of the editor shows real-time output from connected clients.

Drag the top edge of the console to resize it. There is a Global tab for system messages (server start, connections, execution results) and one tab per connected client for their individual output. Client tabs are created automatically on connect.

TypeColorSource
[SYS]Dim grey / italicNyxUI internal system events
(output)Lightprint(), rconsoleprint(), and rconsoleinfo() calls
[WARN]Orangewarn() calls
[ERR]Rederror() calls and runtime errors

Click and drag to select text, then release to copy to clipboard. Use the Export button to save all logs to a .txt file, or Clear to wipe the active tab.

Console Routing
NyxUI captures standard output, warnings, rconsole output, and errors from Roblox and displays them in real time, routed to the correct client tab.
Enabling

Go to Settings → Controls and enable Route Console to NyxUI. When an executor connects, NyxUI automatically installs hook scripts that mirror output through the WebSocket while preserving the executor's normal console behavior.

Per-client tabs

Each connected client gets its own console tab. Output from print, warn, rconsole*, and error is tagged with the client ID and routed to the correct tab — messages never mix between sessions.

How it works internally

A small Lua script runs on the executor at connect time. On executors that support hookfunction, it hooks print, warn, and rconsole functions directly so later loadstring chunks still route stdout. On executors without hook support, the globals are replaced as a fallback. Runtime errors are also captured via ScriptContext.Error and execution failures.

Hooks are installed once per connection, guarded by _G.__nyx_routing_installed. Disabling the toggle sends _G.__nyx_routing_enabled = false to all clients, silencing the hooks without removing them.

Environment Functions
Functions for accessing and modifying the Lua execution environment. Availability varies by executor.
Environment Access
getgenv()
Returns the global executor environment table. Functions stored here are accessible across all executor scripts.
getrenv()
Returns the Roblox global environment. Gives access to unmodified Roblox globals.
getsenv(script)
Returns the environment of the given LocalScript or ModuleScript.
getmenv()
Returns the main script environment. Available on some executors.
getfenv(fn)
Returns the function environment of fn.
setfenv(fn, env)
Sets the environment of fn to env.
getthreadidentity()
Returns the current thread identity level (0–8). Higher levels have more permissions.
setthreadidentity(n)
Sets the current thread identity to level n.
Script Utilities
getscripts()
Returns a table of all LocalScript and ModuleScript instances running in the game.
getrunningscripts()
Returns only scripts that are actively executing.
getloadedmodules()
Returns all loaded ModuleScript instances.
getcallingscript()
Returns the script that called the current function, or nil.
getscriptclosure(script)
Returns the Lua closure (function) for the given script object.
File System Functions
Read and write files in the executor's workspace folder. Paths are relative to the workspace root.
readfile(path)
Reads and returns a file's contents as a string.
writefile(path, data)
Writes data to the file at path. Creates the file if it doesn't exist.
appendfile(path, data)
Appends data to the end of a file.
isfile(path)
Returns true if a file exists at path.
isfolder(path)
Returns true if a folder exists at path.
listfiles(path)
Returns a table of file and folder names inside path.
makefolder(path)
Creates a directory (and any missing parent directories).
delfolder(path)
Deletes the folder and all its contents.
delfile(path)
Deletes the file at path.
loadfile(path)
Reads a file and returns it as a callable Lua function.
dofile(path)
Reads and immediately executes a Lua file. Returns whatever the script returns.
Hooking Functions
Intercept and replace Lua functions at runtime.
hookfunction(fn, hook)
Replaces fn with hook. Returns the original so you can call it inside the hook.
hookmetamethod(obj, meta, hook)
Hooks a metamethod (e.g. __index, __newindex) on the given object's metatable.
newcclosure(fn)
Wraps a Lua function as a C closure. Used to make hooks appear as C functions to detection.
iscclosure(fn)
Returns true if fn is a C closure.
islclosure(fn)
Returns true if fn is a Lua closure.
checkcaller()
Returns true if the current function was called from an executor script.
clonefunction(fn)
Returns a new function that is an exact clone of fn, sharing the same upvalues.
Closures & Upvalues
Inspect and modify Lua closures and their captured upvalues.
getupvalues(fn)
Returns a table of all upvalues captured by fn.
getupvalue(fn, idx)
Returns the upvalue at index idx of fn.
setupvalue(fn, idx, val)
Sets the upvalue at index idx of fn to val.
getprotos(fn)
Returns a table of all nested function prototypes inside fn.
getproto(fn, idx)
Returns the nested prototype at index idx inside fn.
getconstants(fn)
Returns a table of all constants used in fn's bytecode.
getconstant(fn, idx)
Returns the constant at index idx from fn's bytecode.
setconstant(fn, idx, val)
Sets the constant at index idx of fn's bytecode to val.
Memory & Instances
Inspect Roblox instances and interact with game objects in ways not normally possible.
getinstances()
Returns a table of all Instance objects currently in memory.
getnilinstances()
Returns instances that have been parented to nil but are still in memory.
getconnections(signal)
Returns all connections attached to a RBXScriptSignal (event).
fireclickdetector(part, dist?)
Fires the ClickDetector on part as if clicked from dist studs.
fireproximityprompt(prompt)
Triggers a ProximityPrompt as if the player interacted with it.
firetouchinterest(part, target, toggle)
Fires touch events between part and target. toggle: 0 = touch, 1 = touch end.
Miscellaneous Functions
Utility functions commonly available across most executors.
General
loadstring(src, chunk?)
Compiles and returns a Lua chunk from src. Optional chunk name appears in error messages.
identifyexecutor()
Returns the executor name and version as two values.
setclipboard(text)
Copies text to the system clipboard.
getclipboard()
Returns the current contents of the system clipboard.
setfpscap(fps)
Sets the Roblox frame rate cap. Pass 0 to uncap.
getfpscap()
Returns the current frame rate cap value.
messagebox(msg, title, flags)
Shows a Windows message box. flags controls button style (e.g. 0 = OK only).
consolecreate()
Opens an external console window. Use consoleclear() to clear, consoledestroy() to close.
HTTP
request(options)
Makes an HTTP request. options: { Url, Method, Headers, Body }. Returns { Body, StatusCode, Headers, Success }.
HttpGet(url)
Shorthand GET request. Returns the response body as a string.
Cryptography
crypt.base64encode(s)
Encodes a string to Base64.
crypt.base64decode(s)
Decodes a Base64-encoded string.
crypt.generatekey()
Generates a cryptographic key for use with encrypt/decrypt.
crypt.encrypt(data, key, iv, mode)
Encrypts data. Common modes: "CBC", "CFB".
crypt.decrypt(data, key, iv, mode)
Decrypts previously encrypted data.
crypt.hash(data, algo)
Hashes data. Algorithms: "sha256", "md5", "sha1".
RakNet
Low-level network packet manipulation. Only available on executors with RakNet support.
Sending malformed packets may cause disconnection or moderation action. Always test in a private server.
hookpacketsend(fn)
Hooks outgoing packets. fn(packet) receives raw bytes. Return modified bytes or nil to block.
hookpacketreceive(fn)
Hooks incoming packets. fn(packet) receives raw bytes. Return modified bytes or nil to drop.
sendpacket(packet)
Sends a raw RakNet packet to the server.
blocksendpacket(id)
Blocks outgoing packets with the given packet ID.
blockrecvpacket(id)
Blocks incoming packets with the given packet ID.
getpacketid(packet)
Returns the numeric ID of a packet from its raw bytes.
NyxUI Functions NyxUI Exclusive
These globals are injected by the NyxUI Lua client script. They are not part of any standard executor API and will not be present if you are not using NyxUI.
NyxUI Globals
_G.__nyx_ws
The active WebSocket connection to NyxUI. A WebSocket object with a :Send(msg) method. nil when disconnected.
_G.__nyx_client_id
The stable NYX-... client ID for this session. Persisted across reconnects via nyx_client_id.txt.
_G.__nyx_routing_enabled
Boolean. Set to false to silence console routing. Set to true to re-enable it. Does not remove hooks.
_G.__nyx_routing_installed
Boolean. true after routing hooks are installed. Guards against double-installation on reconnect.
_G.__nyx_funcs_cache
Table of executor function names sent to NyxUI for autocomplete. Populated at connect time from getgenv().
Sending a custom log to NyxUI

Forward any message to the NyxUI console from your own scripts using the WebSocket connection:

local HS = game:GetService("HttpService") if _G.__nyx_ws then _G.__nyx_ws:Send("log:" .. HS:JSONEncode({ id = _G.__nyx_client_id or "unknown", type = "output", message = "Custom message!", timestamp = math.floor(tick() * 1000) })) end

The type field controls color in the console: "output" (light), "warn" (orange), "error" (red), "system" (grey italic).

Toggling console routing from a script
-- Pause NyxUI output capture _G.__nyx_routing_enabled = false -- Resume it _G.__nyx_routing_enabled = true
Themes & Appearance
NyxUI is fully themeable — accent color, background, code syntax, font, and more. All changes are live-previewed.
Accent Colors

Go to Settings → Appearance. Choose from 33 built-in accents or create a fully custom theme with your own accent, background, panel, and border colors. Right-click a custom theme to edit or delete it.

Backgrounds

21 dark backgrounds (Default, Midnight, Ocean, Abyss, and more) and 10 light backgrounds (White, Paper, Snow, Cream, etc.). Light mode is fully supported across all UI components.

Code Themes

12 Monaco syntax themes including Nyx Dark (default), Dracula, Nord, One Dark, Monokai, Solarized Dark/Light, and more.

Font

Choose from JetBrains Mono, Fira Code, Cascadia Code, Consolas, Inconsolata, Source Code Pro, or Ubuntu Mono. Applied to both the editor and monospace UI elements.

UI Density

Three presets — compact, normal, spacious — that scale the spacing of every panel and row. Useful on small laptop screens or 4K monitors.

Corner Style

sharp for a flat, rectilinear editor look, normal for the default rounded corners, or round for softer pill-style edges. Affects every panel, button, and input simultaneously.

Settings Reference
SettingLocationDescription
Route Console to NyxUIControlsHook print, warn, rconsole, and error output in Roblox and route it to the NyxUI console
Auto-blur EditorControlsBlur the code editor when the app loses focus
Auto-hide KeysControlsAutomatically censor script content in selected tabs
Hide Client NamesControlsReplace usernames with Client_N labels across the entire UI
Show MinimapEditorToggle the Monaco editor minimap
Word WrapEditorSoft-wrap long lines (also toggled with Alt+Z)
WebSocket PortWebSocketPort the server listens on (default: 33882)
Scripts Sidebar SideLayoutLeft or right placement of the scripts sidebar
Clients Panel SideLayoutLeft or right placement of the clients panel
Console HeightLayoutDrag the resize handle above the console — persists across sessions
Accent ColorAppearanceChoose a built-in accent or create a fully custom theme
BackgroundAppearanceDark and light background presets
Code ThemeAppearanceMonaco editor syntax highlighting theme
FontAppearanceMonospace font for the editor and UI elements
WebSocket Protocol
For advanced users who want to understand or extend how NyxUI communicates with the executor.
Connection & Auth flow
local ws = websocket.connect("ws://127.0.0.1:33882/") ws:Send(HS:JSONEncode({ type = "auth", username = player.Name, userId = player.UserId, executor = executor, funcs = _G.__nyx_funcs_cache, clientId = _G.__nyx_client_id })) -- NyxUI responds: { type="handshake", clientId="NYX-..." }
Script delivery (chunked)

Scripts are split into 32 KB chunks to avoid WebSocket frame limits:

{ "type": "exec_start", "execId": "abc123" } { "type": "exec_chunk", "execId": "abc123", "chunk": "..." } { "type": "exec_end", "execId": "abc123" }
Console log format
"log:" .. HS:JSONEncode({ id = _G.__nyx_client_id, type = "output", -- "output" | "warn" | "error" | "system" message = "hello", timestamp = math.floor(tick() * 1000) })
Other messages
MessageDirectionPurpose
ping / pongClient ↔ ServerKeep-alive heartbeat every 5 s
compile_err:...Client → ServerLua parse or runtime error from a script
funcs:[...]Client → ServerExecutor function list for autocomplete