Neruvex
A single-file Roblox interface library. Load it, get a window back, build with colon syntax.
- Runtime
- Roblox client
- Distribution
- One Lua file
- Returns
- A ready hub object
local Neruvex = loadstring(game:HttpGet("https://neruvex.lol/neruvex.lua"))()
No matches
Nothing in the documentation matches that filter.
Loading
The script ends with return Hub.new(), so loadstring(...)() hands back a ready window object. The first window never needs .new().
Fetch
game:HttpGet downloads the raw source from your host.
Compile
loadstring turns the source into a callable chunk.
Receive
Calling the chunk returns the hub. Add tabs straight away.
Load methods
local Neruvex = loadstring(game:HttpGet("https://neruvex.lol/neruvex.lua"))()
local Neruvex = require(path.to.NeruvexModule)
Requirements
Serve the file as plain text: raw GitHub, a raw paste URL or your own server. An HTML page URL fails to compile.
The library parents its UI to Players.LocalPlayer.PlayerGui and uses RenderStepped.
loadstring and game:HttpGet do not exist in a normal LocalScript. Elsewhere, paste the file into a ModuleScript and use require, which returns the same object.
Quick start
Call window, add a tab, add a control. Use colon syntax on the hub, tabs and controls.
local Neruvex = loadstring(game:HttpGet("https://neruvex.lol/neruvex.lua"))()
Neruvex:window("My Hub", "Preparing interface", true, "Sidebar")
local main = Neruvex:addtab("Main", nil, "home")
main:addbutton("Say hello", function()
print("hello")
end, { Description = "Prints to the output" })
window() mounts the UI. If you skip it, adding the first tab mounts the UI on the next frame.
Full example
Every control type, a section, an event hook and a config export in one script.
local Neruvex = loadstring(game:HttpGet("https://neruvex.lol/neruvex.lua"))()
Neruvex:window("My Hub", "Preparing interface", true, "Sidebar")
Neruvex:configure({
Theme = "Violet",
PillTitle = "My Hub",
ToggleKey = "RightShift",
Size = Vector2.new(560, 470),
})
local main = Neruvex:addtab("Main", nil, "home")
local visuals = Neruvex:addtab("Visuals", nil, "eye")
main:addtoggle("Enabled", false, function(value, control)
print("enabled:", value)
end, { Flag = "enabled", Description = "Master switch" })
main:addslider("Speed", 0, 100, 16, function(value)
print("speed:", value)
end, { Flag = "speed", Step = 1 })
main:adddropdown("Mode", { "Safe", "Normal", "Fast" }, "Normal", function(value)
print("mode:", value)
end, { Flag = "mode" })
main:addinput("Name", "player", function(text)
print("name:", text)
end, { Flag = "name", Placeholder = "Enter name" })
main:addkeybind("Action key", "F", function(active, control)
print("action:", active)
end, { Mode = "Toggle" })
local progress = main:addprogress("Loading", 0)
progress:set(60)
local section = visuals:addsection("Advanced")
section:addtoggle("Outlines", true, function(v) print(v) end, { Flag = "outlines" })
section:addselect("Quality", { "Low", "Mid", "High" }, "Mid", function(v) print(v) end, {
Flag = "quality",
Descriptions = { Low = "Fastest", Mid = "Balanced", High = "Sharpest" },
})
Neruvex:on("loaded", function()
Neruvex:notify("My Hub", "Interface ready", 4)
end)
print(Neruvex:exportconfig())
Window options
Set options with Neruvex:configure({ ... }), or pass the table to Neruvex.new({ ... }).
Options
Window title and loading-screen heading.
Loading-screen subtitle.
window() sets this to true unless you pass false.
Text on the collapsed pill.
Icon preset name or asset ID.
See themes and icons.
Capped to 90% of screen width and 82% of screen height.
Clamped between 120 and 240.
Icon-only sidebar.
"Sidebar" or "Tabs" for a horizontal bar.
When false, the pill is shown instead of the panel.
Clamped between 0 and 0.8.
Clamped between 0 and 56. Blurs the 3D scene, not the GUI.
An Enum.KeyCode name.
Animated gradients on themes that have them.
The pill is +1, the loading screen +2.
ScreenGui name. Only honoured in Neruvex.new.
Only honoured in Neruvex.new.
window(title, description, loadingScreen, layout)
A convenience wrapper over configure and mount. The loading screen runs for up to about four seconds and the main panel appears when it ends. Pass false as the third argument to skip it.
Additional windows
local Second = Neruvex.new({ Id = "MySecondHub", Title = "Second" })
Tabs
Returns a tab. A nil position appends. The icon is a preset name or asset ID and defaults to "home".
Show this tab.
Change the title.
Change the icon.
Reorder the tab.
Remove the tab and all of its controls.
Select by tab object, index or title.
A copy of the tab list.
Controls
Every add* call returns a control. The options table is always optional.
Constructors
(control)
No callback.
No callback.
(boolean, control)
(string, control). Fires when focus is lost.
(number, control). Snapped to Step.
(item, control)
(item, control). A segmented selector.
A disabled 0 to 100 slider. Update it with :set().
(active, control)
Returns a section. See below.
Options
Secondary text.
Required for getvalues, getcontrol and config export and import.
Insert index. Nil appends.
False hides the row.
True makes it non-interactive.
Increment. Defaults to 1.
Text shown when the field is empty.
A table mapping each item to its description.
"Press" (default), "Toggle" or "Hold".
Sections
addsection returns an object with the same add* methods. Controls created through it are grouped under a header that collapses when clicked. It also provides :setcollapsed(bool), :rename(title) and :remove().
Control methods
Set the value. The callback fires only if the value changed and notify is not false.
The current value.
Replace the callback.
Restore the initial value.
Change the title.
Change the description. Only works if one was set at creation.
Show or hide the row.
Enable or disable the control.
Reorder within the tab.
Sliders only.
Destroy the row.
Keybind controls only.
Hub methods
Configure, mount and optionally run the loading screen.
Update window options.
Build the UI. Usually automatic.
Show the panel (true) or the pill (false).
Switch theme.
Change the pill text.
"Sidebar" or "Tabs".
Collapse the sidebar.
Show a toast for 0.5 to 60 seconds, default 4. Returns an item with :close().
Register a global hotkey. Returns a connection.
Filter control rows by title and description. Pass an empty string to clear.
Open the built-in interface settings tab. The gear icon does the same.
The control with that flag, or nil.
A table mapping each flag to its value.
Add a theme from two Color3 values.
Add an icon preset.
Runs once the UI is mounted.
Remove all UI, connections and blur effects.
Events
Subscribe with on. It returns a connection you can disconnect.
local connection = Neruvex:on("loaded", function(hub)
print("ready")
end)
connection:Disconnect()
When the loading screen finishes.
After importconfig.
At the start of destroy().
Config
Export every flagged control to JSON, restore it later, or reset to defaults.
local json = Neruvex:exportconfig()
Neruvex:importconfig(json, false)
Neruvex:resetconfig()
A JSON string. Only controls with a Flag are saved, plus the theme and pill title.
Validates types and dropdown options and errors on a mismatch. Pass true to also fire callbacks.
Return all controls to their defaults.
Persisting the string, for example with writefile in an executor, is up to you.
Themes and icons
Themes
Animated themes. The full list is also available as Neruvex.Themes.
Icons
Any numeric asset ID or rbxassetid://ID also works. Unknown names raise an error. See Neruvex.Icons.
Notes
Run in task.spawn under pcall. Errors print as Neruvex callback: ... and never break the UI.
adddropdown and addselect fall back to the first item if the initial value is not in the list. set() errors on unknown items.
notify needs a mounted UI. Call it after window(), or inside an onready or loaded handler.
Ignored while a TextBox has focus. Change it in the settings tab or with configure({ ToggleKey = "..." }).
Call Neruvex:destroy() before re-running your script to avoid duplicate windows, or give each window a unique Id.