Skip to content
Interium

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.

PieceWhat it is
WindowThe draggable menu. Holds the tab bar, the search box and the pages.
TabA page of the window. Holds sections in a left and a right column.
SectionA titled panel inside a tab. Controls are added to it.
ControlA toggle, slider, dropdown, textbox, button, label or list.
Built-in tabsPlayers 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.

Lua
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:

Lua
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:

Lua
if UI.Flags.aim_enabled then
  print(UI.Flags.aim_fov, UI.Flags.aim_part)
end

Core 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

Lua
local Window = UI:CreateWindow({ Folder = "Interium", ToggleKey = Enum.KeyCode.RightShift })
OptionTypeDefaultDescription
Namestring"Interium"Title shown in the header and the watermark.
Folderstring"Interium"Folder in the executor workspace used for configs and settings.
ToggleKeyEnum.KeyCodeInsertKey that hides and shows the menu.
SizeVector2642 x 520Size of the window.
PositionUDim2centredStarting position. The window can be dragged by its header.
BuiltinbooleantrueSet to false to skip the Players and Config tabs.
MemberDescription
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.VisibleWhether the window is currently shown.
Window.TabsArray of every tab.

Tabs

Tabs appear in the header in the order they are created. The first tab is selected automatically.

Lua
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.

Lua
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.

Lua
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

Lua
local Toggle = Section:AddToggle("esp_enabled", {
  Text = "Enabled",
  Default = false,
  Tooltip = "Master switch",
  Callback = function(value)
    print(value)
  end,
})
OptionTypeDefaultDescription
Textstringthe idLabel shown next to the checkbox.
DefaultbooleanfalseStarting value.
Callbackfunction(boolean)noneRuns when the value changes.
TooltipstringnoneShown after hovering for a moment.
NoConfigbooleanfalseLeave out of saved configs.
MemberDescription
Toggle.ValueCurrent 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

Lua
Section:AddSlider("aim_smooth", {
  Text = "Smoothing",
  Min = 0,
  Max = 100,
  Default = 35,
  Suffix = "%",
  Callback = function(value)
    print(value)
  end,
})
OptionTypeDefaultDescription
Textstringthe idLabel shown above the track.
Minnumber0Lowest value.
Maxnumber100Highest value.
DefaultnumberMinStarting value.
Roundingnumber0Decimal places kept.
Prefixstring""Text before the value.
Suffixstring""Text after the value, such as px or %.
Callbackfunction(number)noneRuns while the value changes.
NoConfigbooleanfalseLeave out of saved configs.
MemberDescription
Slider.ValueCurrent 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.

Textbox

Lua
Section:AddTextbox("ms_tag", {
  Text = "Custom Tag",
  Placeholder = "shown on the watermark",
  Callback = function(text)
    UI:SetWatermark({ Extra = text })
  end,
})
OptionTypeDefaultDescription
Textstringthe idLabel shown above the box.
Defaultstring""Starting text.
Placeholderstring""Hint shown while empty.
Callbackfunction(string)noneRuns when the box loses focus.
NoConfigbooleanfalseLeave out of saved configs.
MemberDescription
Textbox.ValueCurrent text.
Textbox:SetValue(text, silent)Sets the text.

Button

Lua
Section:AddButton({
  Text = "Server Hop",
  Tooltip = "Finds a new server",
  Callback = function()
    print("clicked")
  end,
})

Section:AddButtonRow({
  { Text = "Save", Callback = function() end },
  { Text = "Load", Callback = function() end },
  { Text = "Delete", Accent = true, Callback = function() end },
})
OptionTypeDefaultDescription
Textstring"Button"Label.
Callbackfunction()noneRuns on click.
AccentbooleanfalseTints the button with the accent colour.
TooltipstringnoneShown on hover.
MemberDescription
Button:SetText(text)Changes the label.
Button:SetActive(active)Highlights the button as selected.
AddButtonRow(list)Places several buttons side by side and returns them as an array.

Label

Lua
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 })
MemberDescription
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

Lua
local Spots = Section:AddListbox("tp_spot", {
  Items = { "Spawn", "Market", "Harbor" },
  Default = "Spawn",
  Height = 110,
  NoConfig = true,
})

Spots:OnChanged(function(name)
  print(name)
end)
OptionTypeDefaultDescription
Itemstable{}List of strings.
Defaultstringfirst itemInitially selected item.
Heightnumber110Height of the box in pixels. Rows scroll with the mouse wheel.
Emptystring"Nothing here"Text shown when the list is empty.
Formatfunction(item)noneReturns dimmed text to show on the right of each row.
Callbackfunction(string)noneRuns when a row is selected.
MemberDescription
Listbox.ValueSelected item.
Listbox:SetValue(item, silent)Selects an item.
Listbox:SetItems(items)Replaces the rows.

Divider and custom

Lua
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
MemberDescription
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.

Lua
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,
})
OptionTypeDefaultDescription
DefaultColor3whiteStarting colour.
Alphanumber1Starting opacity from 0 to 1.
Color2Color3purpleSecond colour used by the fading animation.
Animationstring"None"None, Fading, Rainbow or Pulse.
Speednumber50Animation speed from 0 to 100.
Callbackfunction(Color3, number)noneReceives the colour and the alpha. Fires every frame while an animation runs.
NoAlphabooleanfalseHides the alpha strip.
NoAnimbooleanfalseHides the Animation tab.
NoConfigbooleanfalseLeave out of saved configs.
MemberDescription
Picker.ValueThe current colour. This is the animated colour when an animation is running.
Picker.ColorThe base colour you picked.
Picker.AlphaThe 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

Lua
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,
})
OptionTypeDefaultDescription
Defaultstring"None"A key name such as V or LeftShift, or MB1, MB2, MB3 for mouse buttons.
Modestring"Toggle"Always, Toggle or Hold.
Textstringparent labelName shown in the keybind list.
ShowInListbooleantrueWhether the bind appears in the on-screen list.
Callbackfunction(boolean)noneRuns when the bind turns on or off.
NoConfigbooleanfalseLeave out of saved configs.
MemberDescription
Bind.KeyCurrent key name.
Bind.ModeCurrent mode.
Bind.StateWhether 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.

ModeBehaviour
AlwaysThe bind is always on.
ToggleEach press flips it.
HoldOn while the key is held down.

Reading values

Lua
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 })
MemberDescription
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

Lua
UI:Notify({ Title = "Teleport", Text = "Going to Harbor", Duration = 4 })
UI:Notify("Saved", 2)
OptionTypeDefaultDescription
TitlestringnoneOptional bold first line.
Textstring""Message.
Durationnumber4Seconds before it slides away. Click a notification to dismiss it early.

Notifications stack in the top right under the watermark.

Watermark and keybind list

Lua
UI:SetWatermark({ Name = "Interium", Fps = true, Ping = true, Time = true, Extra = "v1" })
UI:SetWatermarkVisible(true)
UI:SetKeybindListVisible(true)
OptionTypeDefaultDescription
Namestringwindow nameTitle shown on the watermark.
FpsbooleantrueShow the frame rate.
PingbooleantrueShow the network ping.
TimebooleantrueShow the local time.
ExtrastringnoneExtra 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.

ColourUsed for
AccentHighlights, filled toggles, slider fills, the active tab.
BackgroundThe window background.
PanelSection panels.
OutlineBorders and dividers.
TextPrimary text. Dimmer text is derived from it.

Built-in themes: Interium, Midnight, Ocean, Forest, Amethyst, Sunset, Mono and Light.

Lua
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))
MemberDescription
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.BuiltinArray of the built-in theme specs.
UI.CustomThemesTable of saved custom themes by name.
UI.CurrentThemeThe 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:

ToggleWhat it does
Autoload selectedLoads the selected config automatically the next time the interface starts.
Autosave loaded configWrites 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.

Lua
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)
MemberDescription
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.CurrentName 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:

ButtonWhat it does
TeleportMoves your character next to the selected player.
SpectatePoints 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, EnemyMarks the player. Marks are shown in the list and saved with your config.
Lua
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")
MemberDescription
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.TargetThe player being spectated, if any.

Lifecycle

Lua
UI:SetVisible(false)
UI:Toggle()
UI:SetToggleKey(Enum.KeyCode.RightShift)

UI.Animations = false

UI:Unload()
MemberDescription
UI:SetVisible(visible)Shows or hides the window.
UI:Toggle()Flips the window.
UI:SetToggleKey(keyCode)Changes the menu key.
UI.AnimationsSet 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.

Lua
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 })