Documentation
Build with Interium.
Every window, control and system in the interface, with the options each one accepts.
On this page
Overview
Interium is an in-game interface for Roblox. It gives you a draggable window with tabs, two-column sections, a full set of controls, a colour picker, keybinds, notifications, a live HUD, themes, configs and a player list.
Every snippet on this page uses UI, the interface object. Controls are created from a section, identified by a string id, and read back through UI.Flags or UI.Options.
| Piece | What it is |
|---|---|
| Window | The draggable menu. Holds the tab bar, the search box and the pages. |
| Tab | A page of the window. Holds sections in a left and a right column. |
| Section | A titled panel inside a tab. Controls are added to it. |
| Control | A toggle, slider, dropdown, textbox, button, label or list. |
| Built-in tabs | Players and Config tabs that are added for you. |
Every control in every tab is searchable from the magnifier in the header. Selecting a result switches to its tab, scrolls to the control and highlights it.
Loading
Run this in your executor while you are in a game. It needs loadstring and HttpGet, which every mainstream executor provides.
loadstring(game:HttpGet("https://useinterium.cc"))()The menu opens as soon as the script runs. Press Insert to hide and show it. You can rebind that key in the Config tab.
Running the script again replaces the previous instance instead of stacking a second one, so only one interface exists at a time.
Quick start
A window with one tab, one section and a few controls:
local Window = UI:CreateWindow({ Folder = "Interium" })
local Main = Window:AddTab("Main")
local Aim = Main:AddSection("Aim Assist", "Left")
local Enabled = Aim:AddToggle("aim_enabled", { Text = "Enabled" })
Enabled:AddKeybind("aim_key", { Default = "MB2", Mode = "Hold" })
Aim:AddSlider("aim_fov", { Text = "FOV", Min = 10, Max = 500, Default = 120, Suffix = "px" })
Aim:AddDropdown("aim_part", { Text = "Target Part", Items = { "Head", "Torso" }, Default = "Head" })
Aim:AddButton({
Text = "Say hello",
Callback = function()
UI:Notify({ Title = "Interium", Text = "Hello" })
end,
})Controls are read with UI.Flags:
if UI.Flags.aim_enabled then
print(UI.Flags.aim_fov, UI.Flags.aim_part)
endCore concepts
Ids
Every control takes a string id as its first argument. The id is how the control is stored in UI.Flags and UI.Options, and how it is saved in a config. Ids must be unique across the whole interface. Pass nil for a control you never need to read or save.
Callbacks
Pass Callback in the options to run code when the value changes. Controls also expose OnChanged(fn) so you can attach more listeners later.
Configs
Every control with an id is saved and restored by the config system. Add NoConfig = true to the options of any control you want left out.
Sides
Sections take "Left" or "Right". Leave it out and the section goes to whichever column has fewer sections.
Window
local Window = UI:CreateWindow({ Folder = "Interium", ToggleKey = Enum.KeyCode.RightShift })| Option | Type | Default | Description |
|---|---|---|---|
Name | string | "Interium" | Title shown in the header and the watermark. |
Folder | string | "Interium" | Folder in the executor workspace used for configs and settings. |
ToggleKey | Enum.KeyCode | Insert | Key that hides and shows the menu. |
Size | Vector2 | 642 x 520 | Size of the window. |
Position | UDim2 | centred | Starting position. The window can be dragged by its header. |
Builtin | boolean | true | Set to false to skip the Players and Config tabs. |
| Member | Description |
|---|---|
Window:AddTab(name) | Creates a tab and returns it. Adding the same name twice returns the existing tab. |
Window:SelectTab(tab) | Switches to a tab. |
Window:SetVisible(visible) | Shows or hides the window. |
Window:AddBuiltinTabs() | Adds the Players and Config tabs now. They are otherwise added automatically once your script finishes, so call this yourself at the end if your script yields. |
Window.Visible | Whether the window is currently shown. |
Window.Tabs | Array of every tab. |
Tabs
Tabs appear in the header in the order they are created. The first tab is selected automatically.
local Combat = Window:AddTab("Combat")
local Visuals = Window:AddTab("Visuals")
local Misc = Window:AddTab("Misc")Sections
A section is a titled panel. Everything on this page from here on is a method you call on a section.
local Left = Combat:AddSection("Aim Assist", "Left")
local Right = Combat:AddSection("Triggerbot", "Right")Tabbed sections
AddTabSection creates one section whose header switches between several sets of controls. It returns a table keyed by tab name.
local Filters = Combat:AddTabSection({ "Filters", "Weapons" }, "Right")
Filters.Filters:AddToggle("flt_knocked", { Text = "Ignore Knocked" })
Filters.Weapons:AddDropdown("wpn_mode", { Text = "Mode", Items = { "Any", "Hitscan", "Melee" }, Default = "Any" })Toggle
local Toggle = Section:AddToggle("esp_enabled", {
Text = "Enabled",
Default = false,
Tooltip = "Master switch",
Callback = function(value)
print(value)
end,
})| Option | Type | Default | Description |
|---|---|---|---|
Text | string | the id | Label shown next to the checkbox. |
Default | boolean | false | Starting value. |
Callback | function(boolean) | none | Runs when the value changes. |
Tooltip | string | none | Shown after hovering for a moment. |
NoConfig | boolean | false | Leave out of saved configs. |
| Member | Description |
|---|---|
Toggle.Value | Current boolean value. |
Toggle:SetValue(value, silent) | Sets the value. Pass true as silent to skip callbacks. |
Toggle:OnChanged(fn) | Adds a listener. |
Toggle:AddColorPicker(id, options) | Attaches a colour picker to the right side of the row. |
Toggle:AddKeybind(id, options) | Attaches a keybind to the right side of the row. |
Slider
Section:AddSlider("aim_smooth", {
Text = "Smoothing",
Min = 0,
Max = 100,
Default = 35,
Suffix = "%",
Callback = function(value)
print(value)
end,
})| Option | Type | Default | Description |
|---|---|---|---|
Text | string | the id | Label shown above the track. |
Min | number | 0 | Lowest value. |
Max | number | 100 | Highest value. |
Default | number | Min | Starting value. |
Rounding | number | 0 | Decimal places kept. |
Prefix | string | "" | Text before the value. |
Suffix | string | "" | Text after the value, such as px or %. |
Callback | function(number) | none | Runs while the value changes. |
NoConfig | boolean | false | Leave out of saved configs. |
| Member | Description |
|---|---|
Slider.Value | Current number. |
Slider:SetValue(value, silent, instant) | Sets the value. instant skips the animation. |
Dragging only starts on the track itself. Clicking the label above it does nothing, and once a drag starts it keeps following the mouse until you let go.
Dropdown
Section:AddDropdown("aim_part", {
Text = "Target Part",
Items = { "Head", "Torso", "Left Arm" },
Default = "Head",
})
Section:AddDropdown("trig_hitboxes", {
Text = "Hitboxes",
Items = { "Head", "Torso", "Arms", "Legs" },
Multi = true,
Default = { "Head", "Torso" },
})| Option | Type | Default | Description |
|---|---|---|---|
Text | string | the id | Label shown above the box. |
Items | table | {} | List of strings. |
Default | string or table | first item | A string, or a list of strings when Multi is on. |
Multi | boolean | false | Allows several selections. |
Callback | function(value) | none | Receives a string, or a table of name = true when Multi is on. |
NoConfig | boolean | false | Leave out of saved configs. |
| Member | Description |
|---|---|
Dropdown.Value | A string, or a table of name = true for multi dropdowns. |
Dropdown:SetValue(value, silent) | Sets the selection. |
Dropdown:SetItems(items) | Replaces the list of items. |
The list opens directly under the box as part of the section and pushes the controls below it down. Click the box again, press Escape or click anywhere else to close it.
Textbox
Section:AddTextbox("ms_tag", {
Text = "Custom Tag",
Placeholder = "shown on the watermark",
Callback = function(text)
UI:SetWatermark({ Extra = text })
end,
})| Option | Type | Default | Description |
|---|---|---|---|
Text | string | the id | Label shown above the box. |
Default | string | "" | Starting text. |
Placeholder | string | "" | Hint shown while empty. |
Callback | function(string) | none | Runs when the box loses focus. |
NoConfig | boolean | false | Leave out of saved configs. |
| Member | Description |
|---|---|
Textbox.Value | Current text. |
Textbox:SetValue(text, silent) | Sets the text. |
Label
local Status = Section:AddLabel("Status", "idle")
Status:SetRightText("running")
Section:AddLabel("Accent"):AddColorPicker("accent_color", { Default = Color3.fromRGB(204, 51, 71) })
Section:AddLabel("Menu key"):AddKeybind("menu_key", { Default = "Insert", Mode = "Always", Simple = true })| Member | Description |
|---|---|
Section:AddLabel(text, rightText) | Adds a line of text with optional dimmed text on the right. |
Label:SetText(text) | Changes the left text. |
Label:SetRightText(text) | Changes the right text. |
Label:AddColorPicker(id, options) | Attaches a colour picker. |
Label:AddKeybind(id, options) | Attaches a keybind. |
Listbox
local Spots = Section:AddListbox("tp_spot", {
Items = { "Spawn", "Market", "Harbor" },
Default = "Spawn",
Height = 110,
NoConfig = true,
})
Spots:OnChanged(function(name)
print(name)
end)| Option | Type | Default | Description |
|---|---|---|---|
Items | table | {} | List of strings. |
Default | string | first item | Initially selected item. |
Height | number | 110 | Height of the box in pixels. Rows scroll with the mouse wheel. |
Empty | string | "Nothing here" | Text shown when the list is empty. |
Format | function(item) | none | Returns dimmed text to show on the right of each row. |
Callback | function(string) | none | Runs when a row is selected. |
| Member | Description |
|---|---|
Listbox.Value | Selected item. |
Listbox:SetValue(item, silent) | Selects an item. |
Listbox:SetItems(items) | Replaces the rows. |
Divider and custom
Section:AddDivider()
local Holder = Section:AddCustom(120)
local Label = Instance.new("TextLabel")
Label.Size = UDim2.fromScale(1, 1)
Label.BackgroundTransparency = 1
Label.Text = "Your own instances go here"
Label.Parent = Holder| Member | Description |
|---|---|
Section:AddDivider() | Adds a thin separator line. |
Section:AddCustom(height) | Reserves a transparent frame of the given height and returns it so you can parent your own instances to it. |
Colour picker
A colour picker is a small swatch attached to a toggle or a label. Clicking it opens a picker with a saturation and value square, a hue strip, an alpha strip and hex and RGBA inputs. The Animation tab adds fading, rainbow and pulse.
local Row = Section:AddToggle("esp_health", { Text = "Health Bar", Default = true })
local Picker = Row:AddColorPicker("esp_health_color", {
Default = Color3.fromRGB(95, 200, 120),
Color2 = Color3.fromRGB(230, 75, 85),
Animation = "Fading",
Speed = 20,
Callback = function(color, alpha)
print(color, alpha)
end,
})| Option | Type | Default | Description |
|---|---|---|---|
Default | Color3 | white | Starting colour. |
Alpha | number | 1 | Starting opacity from 0 to 1. |
Color2 | Color3 | purple | Second colour used by the fading animation. |
Animation | string | "None" | None, Fading, Rainbow or Pulse. |
Speed | number | 50 | Animation speed from 0 to 100. |
Callback | function(Color3, number) | none | Receives the colour and the alpha. Fires every frame while an animation runs. |
NoAlpha | boolean | false | Hides the alpha strip. |
NoAnim | boolean | false | Hides the Animation tab. |
NoConfig | boolean | false | Leave out of saved configs. |
| Member | Description |
|---|---|
Picker.Value | The current colour. This is the animated colour when an animation is running. |
Picker.Color | The base colour you picked. |
Picker.Alpha | The current opacity. |
Picker:SetValue(color, alpha, silent) | Sets the colour and opacity. |
Picker:SetAnimation(name, speed, color2) | Changes the animation from code. |
A toggle or label can carry several pickers. Each one needs its own id.
Keybind
local Row = Section:AddToggle("aim_enabled", { Text = "Aim Assist" })
local Bind = Row:AddKeybind("aim_key", {
Default = "MB2",
Mode = "Hold",
Callback = function(active)
print(active)
end,
})| Option | Type | Default | Description |
|---|---|---|---|
Default | string | "None" | A key name such as V or LeftShift, or MB1, MB2, MB3 for mouse buttons. |
Mode | string | "Toggle" | Always, Toggle or Hold. |
Text | string | parent label | Name shown in the keybind list. |
ShowInList | boolean | true | Whether the bind appears in the on-screen list. |
Callback | function(boolean) | none | Runs when the bind turns on or off. |
NoConfig | boolean | false | Leave out of saved configs. |
| Member | Description |
|---|---|
Bind.Key | Current key name. |
Bind.Mode | Current mode. |
Bind.State | Whether the bind is currently on. This is the value stored in UI.Flags. |
Bind:SetKey(name) | Changes the key. |
Bind:SetMode(mode) | Changes the mode. |
Bind:SetState(state, silent) | Turns the bind on or off directly. |
In the menu
Click the bracketed key to rebind it, then press a key or mouse button. Escape or Backspace clears it. Right-click the key to open a small menu with the mode selector and a toggle for showing it in the list.
| Mode | Behaviour |
|---|---|
| Always | The bind is always on. |
| Toggle | Each press flips it. |
| Hold | On while the key is held down. |
Reading values
local fov = UI.Flags.aim_fov
local slider = UI.Options.aim_fov
slider:SetValue(200)
UI.Options.aim_fov:OnChanged(function(value)
print("fov is now", value)
end)
UI:SetFlags({ aim_fov = 150, aim_part = "Torso", aim_enabled = true })| Member | Description |
|---|---|
UI.Flags[id] | The current value of a control. Toggles give a boolean, sliders a number, dropdowns a string or table, colour pickers a Color3 and keybinds a boolean. |
UI.Options[id] | The control object itself, with its methods. |
UI:SetFlags(map, stagger) | Sets many controls at once from an id = value table, with a short animated stagger between rows. |
Notifications
UI:Notify({ Title = "Teleport", Text = "Going to Harbor", Duration = 4 })
UI:Notify("Saved", 2)| Option | Type | Default | Description |
|---|---|---|---|
Title | string | none | Optional bold first line. |
Text | string | "" | Message. |
Duration | number | 4 | Seconds before it slides away. Click a notification to dismiss it early. |
Notifications stack in the top right under the watermark.
Watermark and keybind list
UI:SetWatermark({ Name = "Interium", Fps = true, Ping = true, Time = true, Extra = "v1" })
UI:SetWatermarkVisible(true)
UI:SetKeybindListVisible(true)| Option | Type | Default | Description |
|---|---|---|---|
Name | string | window name | Title shown on the watermark. |
Fps | boolean | true | Show the frame rate. |
Ping | boolean | true | Show the network ping. |
Time | boolean | true | Show the local time. |
Extra | string | none | Extra text appended to the watermark. |
The watermark sits in the top right. The keybind list shows every bind that has ShowInList on, lights up the active ones, and can be dragged anywhere by its header. Its position is saved with your config. Both can be switched off from the Menu section of the Config tab.
Themes
A theme is five colours. Every other shade in the interface is derived from them, so light and dark themes both work.
| Colour | Used for |
|---|---|
Accent | Highlights, filled toggles, slider fills, the active tab. |
Background | The window background. |
Panel | Section panels. |
Outline | Borders and dividers. |
Text | Primary text. Dimmer text is derived from it. |
Built-in themes: Interium, Midnight, Ocean, Forest, Amethyst, Sunset, Mono and Light.
UI:SetThemeSpec({
Accent = Color3.fromRGB(96, 138, 255),
Background = Color3.fromRGB(8, 10, 18),
Panel = Color3.fromRGB(12, 15, 26),
Outline = Color3.fromRGB(28, 34, 54),
Text = Color3.fromRGB(222, 226, 240),
}, "My Theme")
UI:SetThemeSpec(UI.Builtin[2])
UI:SetAccent(Color3.fromRGB(255, 140, 66))| Member | Description |
|---|---|
UI:SetThemeSpec(spec, name) | Applies a five-colour theme everywhere at once. |
UI:SetAccent(color) | Changes only the accent colour. |
UI:SetTheme(token, color) | Overrides a single derived token such as Border, Box or TextDim. |
UI.Builtin | Array of the built-in theme specs. |
UI.CustomThemes | Table of saved custom themes by name. |
UI.CurrentTheme | The theme currently applied. |
In the Config tab, the Theme section has a dropdown of every theme, a colour picker for each of the five colours, and Save Theme and Delete Theme buttons. Custom themes are stored inside your configs, so loading a config brings its themes back with it.
Configs
The Config tab lists your saved configs and gives you Save, Load, Overwrite and Delete. Delete asks for a second press to confirm. Two toggles sit underneath:
| Toggle | What it does |
|---|---|
| Autoload selected | Loads the selected config automatically the next time the interface starts. |
| Autosave loaded config | Writes changes back to the loaded config a moment after you make them. |
A config stores the value of every control that has an id, your keybinds and their modes, colour pickers with their animations, the active theme, your custom themes, player friendly and enemy marks, and the keybind list position.
local Config = UI.Config
Config:Write("legit")
Config:Load("legit")
Config:Delete("legit")
print(Config:List())
print(Config.Current)
Config:SetAutoload("legit")
Config:SetAutosave(true)| Member | Description |
|---|---|
Config:List() | Array of saved config names. |
Config:Exists(name) | Whether a config exists. |
Config:Write(name) | Saves the current state under a name. |
Config:Load(name) | Loads a config. Returns false if it cannot be read. |
Config:Delete(name) | Deletes a config. |
Config:SetAutoload(name) | Sets or clears (with nil) the autoload config. |
Config:GetAutoload() | Returns the autoload name. |
Config:SetAutosave(enabled) | Turns autosave on or off. |
Config.Current | Name of the loaded config. |
Configs are saved as JSON in <Folder>/configs inside your executor workspace. If your executor has no file functions, configs are kept in memory for the current session only.
Player list
The Players tab lists everyone else in the server. The list resizes to fit the number of players. Select someone to see their avatar, user id, team, health and distance, then use the buttons:
| Button | What it does |
|---|---|
| Teleport | Moves your character next to the selected player. |
| Spectate | Points your camera at them. The button becomes Stop Spectating, and pressing it again returns the camera to you. Spectating follows them through respawns and stops if they leave. |
| Friendly, Neutral, Enemy | Marks the player. Marks are shown in the list and saved with your config. |
local Players = game:GetService("Players")
for _, player in ipairs(Players:GetPlayers()) do
if UI:GetPlayerStatus(player) == "Enemy" then
print(player.Name)
end
end
UI:OnPlayerStatusChanged(function(player, status)
print(player.Name, status)
end)
UI:SetPlayerStatus(Players:GetPlayers()[2], "Friendly")| Member | Description |
|---|---|
UI:GetPlayerStatus(player) | Returns Friendly, Neutral or Enemy. |
UI:IsFriendly(player) | True for friendly players. |
UI:IsEnemy(player) | True for enemy players. |
UI:SetPlayerStatus(player, status) | Marks a player. |
UI:OnPlayerStatusChanged(fn) | Runs when any mark changes. |
UI.Spectate:Start(player) | Starts spectating. |
UI.Spectate:Stop() | Stops spectating. |
UI.Spectate:Toggle(player) | Starts, or stops if already on that player. |
UI.Spectate.Target | The player being spectated, if any. |
Lifecycle
UI:SetVisible(false)
UI:Toggle()
UI:SetToggleKey(Enum.KeyCode.RightShift)
UI.Animations = false
UI:Unload()| Member | Description |
|---|---|
UI:SetVisible(visible) | Shows or hides the window. |
UI:Toggle() | Flips the window. |
UI:SetToggleKey(keyCode) | Changes the menu key. |
UI.Animations | Set to false to turn off every animation. |
UI:Unload() | Removes the interface, disconnects every connection and stops spectating. |
Running the script a second time unloads the first copy automatically.
Full example
A compact script that uses most of what is on this page.
local Players = game:GetService("Players")
local Lighting = game:GetService("Lighting")
local Camera = workspace.CurrentCamera
local Window = UI:CreateWindow({ Folder = "Interium" })
local Combat = Window:AddTab("Combat")
local Visuals = Window:AddTab("Visuals")
local World = Window:AddTab("World")
local Aim = Combat:AddSection("Aim Assist", "Left")
local AimToggle = Aim:AddToggle("aim_enabled", { Text = "Enabled" })
AimToggle:AddKeybind("aim_key", { Default = "MB2", Mode = "Hold" })
Aim:AddToggle("aim_visible", { Text = "Visible Only", Default = true })
Aim:AddDropdown("aim_part", {
Text = "Target Part",
Items = { "Head", "Torso", "Left Arm", "Right Arm" },
Default = "Head",
})
Aim:AddSlider("aim_fov", { Text = "FOV", Min = 10, Max = 500, Default = 120, Suffix = "px" })
Aim:AddLabel("FOV Circle"):AddColorPicker("aim_fov_color", {
Default = Color3.fromRGB(204, 51, 71),
Alpha = 0.8,
})
local Filters = Combat:AddTabSection({ "Filters", "Weapons" }, "Right")
Filters.Filters:AddToggle("flt_forcefield", { Text = "Ignore Forcefield", Default = true })
Filters.Weapons:AddDropdown("wpn_mode", {
Text = "Mode",
Items = { "Any", "Hitscan", "Melee" },
Default = "Any",
})
local ESP = Visuals:AddSection("Player ESP", "Left")
ESP:AddToggle("esp_enabled", { Text = "Enabled" })
ESP:AddToggle("esp_box", { Text = "Box", Default = true }):AddColorPicker("esp_box_color", {
Default = Color3.fromRGB(255, 255, 255),
})
ESP:AddToggle("esp_health", { Text = "Health Bar", Default = true }):AddColorPicker("esp_health_color", {
Default = Color3.fromRGB(95, 200, 120),
Color2 = Color3.fromRGB(230, 75, 85),
Animation = "Fading",
})
local View = Visuals:AddSection("Camera", "Right")
View:AddSlider("cam_fov", {
Text = "Field Of View",
Min = 30,
Max = 120,
Default = Camera.FieldOfView,
Suffix = "°",
Callback = function(value)
Camera.FieldOfView = value
end,
})
local Light = World:AddSection("Lighting", "Left")
Light:AddToggle("wd_fullbright", {
Text = "Fullbright",
Callback = function(value)
Lighting.Brightness = value and 3 or 1
end,
})
Light:AddSlider("wd_time", {
Text = "Time Of Day",
Min = 0,
Max = 24,
Default = 14,
Rounding = 1,
Callback = function(value)
Lighting.ClockTime = value
end,
})
local Server = World:AddSection("Server", "Right")
Server:AddLabel("Players", tostring(#Players:GetPlayers()))
Server:AddButtonRow({
{ Text = "Rejoin", Callback = function() UI:Notify({ Title = "Server", Text = "Rejoining" }) end },
{ Text = "Server Hop", Callback = function() UI:Notify({ Title = "Server", Text = "Searching" }) end },
})
UI:Notify({ Title = "Interium", Text = "Loaded", Duration = 4 })