Scripts Made Simple

Isotope

A Roblox Lua UI library and collection of scripts designed to make your coding or exploiting experience smoother.

Feature Icon
Isotope Library

A lightweight, composable Roblox Lua UI library with zero dependencies. Drop it in and build fast.

Docs Icon
Clean Docs

Every component documented with clear examples, detailed explanations, and copy-ready code snippets.

Quality Icon
Scripts with Quality

A growing collection of high-quality scripts, utilities, and tools. Available via GitHub and Discord.

Privacy Matters

No hidden code. No tricks. Only quality.

Isotope
Introduction

Welcome to the Isotope Docs.

This is the official documentation for the Isotope UI Library, a Roblox Lua UI framework. It gives you a full set of UI elements for building script interfaces fast, without boilerplate.

The library handles everything: window creation, tabs, elements, notifications, keybind tracking, a radial menu, a topbar, config saving, startup animations, a watermark, and more. Every element returns an object you can call :Set() on to update it at runtime.

Note: The library uses writefile, readfile, isfile, and makefolder for config saving. These are optional, all other features work without them.

Introduction

Installation

Load the library with loadstring and game:HttpGet in your executor.

lua
local Isotope = loadstring(game:HttpGet("https://raw.githubusercontent.com/GetIsotope/GetIsotope.github.io/refs/heads/main/Isotope.lua"))()

Legacy

If you encounter issues with the current release, load the previous stable version instead.

lua
local Isotope = loadstring(game:HttpGet("https://raw.githubusercontent.com/GetIsotope/GetIsotope.github.io/refs/heads/main/IsotopeLegacy.lua"))()

Script order matters. Always follow this structure.

lua
local Isotope = loadstring(game:HttpGet("https://raw.githubusercontent.com/Isotope/Isotope.github.io/refs/heads/main/Isotope.lua"))()

Isotope.ShowTopbar = true
Isotope.ShowRadial = true
Isotope.RadialHotkey = Enum.KeyCode.Z
Isotope.RadialMode = "hold"
Isotope.ShowKeybindList = true

local Window = Isotope:Window({
    Name = "My Script"
})

local wm = Isotope:Watermark("My Script")
wm:Field("Map", function() return game:GetService("Players").LocalPlayer:GetAttribute("Map") or "Lobby" end)

local Tab = Window:Tab({
    Name = "Main",
    Icon = "rbxassetid://4483345998"
})

Tab:Toggle({
    Name = "Infinite Jump",
    Default = false,
    Callback = function(state) print(state) end
})

Isotope:Init()

Important: Isotope.ShowTopbar, Isotope.ShowRadial, and other feature flags must be set before Isotope:Window(). The library auto-calls Isotope:Init() via task.defer, but calling it explicitly at the end is fine.

Introduction

Theming

Five built-in themes ship with the library. Custom themes can be registered before the window is created.

Built-in Themes

Available names: Dark, Light, Midnight, Crimson, Forest.

lua
local Window = Isotope:Window({
    Name = "My Script",
    Theme = "Midnight"
  })

Custom Themes

Register with Isotope.Themes:Add() before Isotope:Window(). Any keys you omit fall back to Dark theme defaults.

lua
Isotope.Themes:Add("Neon", {
    Main = Color3.fromRGB(5, 5, 10),
    Second = Color3.fromRGB(10, 10, 20),
    Stroke = Color3.fromRGB(0, 255, 180),
    Divider = Color3.fromRGB(0, 255, 180),
    Text = Color3.fromRGB(200, 255, 240),
    TextDark = Color3.fromRGB(80, 180, 150),
    Accent = Color3.fromRGB(0, 255, 180),
})

local Window = Isotope:Window({
   Name = "My Script",
   Theme = "Neon"
})

Switch Theme at Runtime

lua
Window:SetTheme("Light")

Note: Isotope:SetTheme() does not exist. Always call it on the window object: Window:SetTheme(name).

Introduction

Window

The window is the root container for your entire UI. Create it with Isotope:Window() after setting any feature flags.

lua
local Window = Isotope:Window({
    Name = "My Script",
    Theme = "Dark",
    Startup = true,
    StartupAnim = "Blob",
    StartupText = "Loading...",
    StartupIcon = "rbxassetid://...",
    CloseAnim = "Blob",
    MinimizeAnim = "Blob",
    ReopenKey = Enum.KeyCode.RightShift,
    CloseCallback = function() print("closed") end,
    SaveConfig = true,
    ConfigFolder = "MyScript",
    Config = tostring(game.GameId),
    ScriptKey = "my-unique-key-2025",
    ShowDisplayName = true,
    ShowUsername = true,
    KeySystem = true,
    Key = "my-secret-key",
    KeyLink = "https://example.com/getkey",
    KeyDeniedCallback = function()
      print("wrong key")
    end
})

Window Options

OptionTypeDefaultDescription
Namestring"IsotopeUI"Title shown in the top bar
Themestring"Dark"Theme name
SaveConfigbooleanfalseEnable auto-save and load of flagged values
ConfigFolderstringWindow NameFolder name for config files
Configstringgame.GameIdConfig filename without .json
ScriptKeystring""Unique key stamped into saved configs to prevent cross-script loading
StartupbooleanfalsePlay a startup animation on open
StartupAnimstring"Fade"Blob, Fade, Typewriter, Bounce, Unfold
StartupTextstring""Text shown during Typewriter animation
StartupIconstring""Asset ID shown during startup animation
CloseAnimstring"Shrink"Animation when X is clicked: Shrink or Blob
MinimizeAnimstring"Slide"Animation when minimizing: Slide or Blob
ReopenKeyKeyCodeRightShiftKey to reopen after closing or minimizing
CloseCallbackfunctionnilCalled when the X button is pressed
ShowDisplayNamebooleanfalseShow player display name in sidebar footer
ShowUsernamebooleanfalseShow @username in sidebar footer
KeySystembooleanfalseGate the window behind a key prompt. → docs
Keystring""The correct key string the user must enter.
KeyLinkstringnilURL copied to clipboard when "Get Key" is clicked
KeyDeniedCallbackfunctionnilFired when the user closes the key prompt without the correct key

Window Methods

MethodDescription
Window:Tab(config)Create a new tab. Returns a tab object.
Window:TabSection(name)Insert a collapsible label group in the sidebar. → docs
Window:SetTheme(name)Switch theme by name at runtime.
Window:SetAccentColor(color)Change the accent Color3 at runtime.
Window:SetTitle(text)Update the window title label. → docs
Window:Toast(text, icon?)Show a floating pill toast. → docs
Window:Lock(message?)Overlay the UI with a blocker. → docs
Window:Unlock()Remove the lock overlay.
Window:Flash(color?)Pulse the window border. → docs
Window:SetReopenKey(key)Change the reopen key at runtime.
Window:SetCloseAnim(anim)Change close animation at runtime.
Window:SetMinimizeAnim(anim)Change minimize animation at runtime.
Window:SetDisplayName(text)Override the display name label.
Window:SetUsername(text)Override the username label.
Window:SetAvatarText(text)Set a small sub-label below the avatar.
Window:OpenProfileView(btns)Open the fullscreen profile panel.
Window:SetUserSectionEnabled(bool)Show or hide the user section at runtime.
Window:SetAvatarMenuEnabled(bool)Enable right-click on avatar to open profile.
Window:AddAvatarMenuItem(name, cb, icon?)Add an item to the avatar right-click profile menu.
Window:ClearAvatarMenu()Remove all avatar menu items.
Window:GetAvatarFrame()Returns the avatar instance for custom styling.
Window:GetUserSectionContainer()Returns the user section Frame for advanced layout.
Elements

Button

A clickable row that fires a callback. The returned object has a :Set() method to change the label text at runtime.

lua
local btn = Tab:Button({
    Name = "Teleport to Spawn",
    Callback = function()
        game.Players.LocalPlayer.Character:SetPrimaryPartCFrame(CFrame.new(0, 5, 0))
    end
})

btn:Set("New Label")
OptionTypeDefaultDescription
Namestring"Button"Label shown on the row
CallbackfunctionnilCalled when clicked. Runs in a task.spawn.
Elements

Toggle

A checkbox element with a boolean value. Fires a callback with the new value on change.

lua
local toggle = Tab:Toggle({
    Name = "Infinite Jump",
    Default = false,
    Flag = "InfiniteJump",
    Save = true,
    Color = Color3.fromRGB(0, 170, 255),
    Confirm = false,
    Locked = false,
    Callback = function(value) print("Infinite Jump:", value) end
})

toggle:Set(true)
toggle:Lock()
toggle:Unlock()
print(toggle.Value)
OptionTypeDefaultDescription
Namestring"Toggle"Label shown on the row
DefaultbooleanfalseInitial state
FlagstringnilKey in Isotope.Flags
SavebooleanfalseInclude in config save
ColorColor3theme AccentCheckbox accent color when enabled
ConfirmbooleanfalseShow inline confirmation before firing. → docs
LockedbooleanfalseStart in locked state. → docs
CallbackfunctionnilCalled with new boolean value on change
Elements

Slider

A draggable range input. Supports min, max, default, increment, and an optional value label suffix. Double-click the track to type a value directly.

lua
local slider = Tab:Slider({
    Name = "Walk Speed",
    Min = 16,
    Max = 250,
    Default = 16,
    Increment = 1,
    ValueName = "studs/s",
    Flag = "WalkSpeed",
    Save = true,
    Color = Color3.fromRGB(9, 149, 98),
    Callback = function(value)
        game.Players.LocalPlayer.Character.Humanoid.WalkSpeed = value
    end
})

slider:Set(50)
print(slider.Value)

Tip: Double-clicking the slider track opens an inline text input so you can type an exact value instead of dragging.

OptionTypeDefaultDescription
Namestring"Slider"Label shown above the track
Minnumber0Minimum value
Maxnumber100Maximum value
Defaultnumber50Starting value
Incrementnumber1Snapping increment
ValueNamestring""Suffix appended to the displayed number
FlagstringnilKey in Isotope.Flags
SavebooleanfalseInclude in config save
ColorColor3theme AccentFill and border color of the track
CallbackfunctionnilCalled with the new number on drag
Elements

MultiDropdown

A collapsible list where multiple options can be selected simultaneously. The header shows a count when more than two are selected.

lua
local multi = Tab:MultiDropdown({
    Name = "Active Effects",
    Options = { "Speed", "Jump", "Fly", "NoClip" },
    Default = { "Speed" },
    Flag = "ActiveEffects",
    Save = true,
    Callback = function(values)
        print(table.concat(values, ", "))
    end
})

multi:Set({ "Speed", "Fly" })
print(multi.Value)
OptionTypeDefaultDescription
Namestring"Multi Dropdown"Label shown in the header
Optionstable{}Array of string options
Defaulttable{}Array of initially selected strings
FlagstringnilKey in Isotope.Flags
SavebooleanfalseInclude in config save
CallbackfunctionnilCalled with the full selected values table on any change
Elements

TextBox

A text input field. Clicking the row opens it for typing. The callback fires when focus is lost.

lua
Tab:TextBox({
    Name = "Set Player Name",
    Default = "",
    TextDisappear = true,
    Callback = function(text) print("Submitted:", text) end
})
OptionTypeDefaultDescription
Namestring"Input"Label on the left side of the row
Defaultstring""Pre-filled text value
TextDisappearbooleanfalseClears the box after focus is lost
CallbackfunctionnilCalled with the text string on focus lost
Elements

Bind

A keybind element. Click the row to enter binding mode, then press any key. Supports modifier keys and hold mode.

lua
local bind = Tab:Bind({
    Name = "Toggle UI",
    Default = Enum.KeyCode.E,
    Hold = false,
    Modifier = Enum.KeyCode.LeftControl,
    Flag = "ToggleUIBind",
    Save = true,
    Callback = function() print("Bind fired!") end
})

bind:Set(Enum.KeyCode.F)
print(bind.Value)

Hold Mode: When Hold = true, the callback fires with true on key down and false on release.

OptionTypeDefaultDescription
Namestring"Bind"Label shown on the row
DefaultKeyCodeKeyCode.UnknownDefault key to bind
HoldbooleanfalseFire on hold and release instead of single press
ModifierKeyCode / tablenilRequired modifier key(s) held alongside the bind
FlagstringnilKey in Isotope.Flags
SavebooleanfalseInclude in config save
CallbackfunctionnilFires when the bind is triggered
Elements

Colorpicker

A collapsible HSV color picker with a saturation/value field and a hue strip.

lua
local cp = Tab:Colorpicker({
    Name = "Trail Color",
    Default = Color3.fromRGB(0, 170, 255),
    Flag = "TrailColor",
    Save = true,
    Callback = function(color) print("Color:", color) end
})

cp:Set(Color3.fromRGB(255, 0, 100))
print(cp.Value)
OptionTypeDefaultDescription
Namestring"Colorpicker"Label shown in the header
DefaultColor3RGB(255,255,255)Initial color
FlagstringnilKey in Isotope.Flags
SavebooleanfalseInclude in config save
CallbackfunctionnilCalled with Color3 on change
Elements

Stepper

A discrete option selector with previous and next arrow buttons. Arrows dim at the first or last option.

lua
local stepper = Tab:Stepper({
    Name = "Quality",
    Options = { "Low", "Medium", "High", "Ultra" },
    Default = "Medium",
    Flag = "Quality",
    Save = true,
    Callback = function(value) print("Quality:", value) end
})

stepper:Set(4)
print(stepper.Value)

Note: :Set() takes a 1-based index into the Options table, not the value string itself.

OptionTypeDefaultDescription
Namestring"Stepper"Label on the left
Optionstable{}Ordered array of string options
DefaultstringOptions[1]Initially selected option value string
FlagstringnilKey in Isotope.Flags
SavebooleanfalseInclude in config save
CallbackfunctionnilCalled with the selected value string on change
Elements

Label

A static text row. Update the text at runtime with :Set(). Automatically wraps and resizes.

lua
local lbl = Tab:Label("Status: Idle")
lbl:Set("Status: Running")
Elements

Paragraph

A two-line block with a bold title and a wrapped body. Automatically resizes to fit the content.

lua
local para = Tab:Paragraph({
    Name = "Changelog v1.2",
    Content = "Fixed infinite jump not working after respawn. Added speed slider.",
})

para:Set("Updated Title", "Updated body text.")
OptionTypeDefaultDescription
Namestring"Paragraph"Bold title at the top
Contentstring""Wrapped body text below the divider
Elements

ProgressBar

A visual progress indicator with a fill bar and a label. The value is a float between 0 and 1.

lua
local pb = Tab:ProgressBar("Download Progress", 0)

task.spawn(function()
    for i = 1, 10 do
        task.wait(0.2)
        pb:Set(i / 10, "Downloading... " .. (i * 10) .. "%")
    end
    pb:Set(1, "Complete!")
end)
Elements

KeyValue

A compact table of key-value pairs. Each row shows a left-aligned key label and a right-aligned value.

lua
local kv = Tab:KeyValue({
    Name  = "Player Stats",
    Pairs = {
        { "Username", game.Players.LocalPlayer.Name },
        { "User ID",  tostring(game.Players.LocalPlayer.UserId) },
        { "Team",     "None" },
    }
})

kv:Set("Team", "Red Team")
kv:SetAll({ { "Ping", "42ms" }, { "FPS", "60" } })

Methods

MethodDescription
:Set(key, value)Update the value of a specific key by its label text.
:SetAll(pairs)Destroy all existing rows and rebuild with a new pairs table.
Elements

Section

A labeled group that contains other elements. Sections automatically resize to fit their children.

lua
local sec = Tab:Section("Movement")

sec:Toggle({
    Name = "Infinite Jump",
    Default = false,
    Callback = function(v) print(v) end,
})

sec:Slider({
    Name = "Walk Speed",
    Min = 16,
    Max = 250,
    Default = 16,
    Callback = function(v)
        game.Players.LocalPlayer.Character.Humanoid.WalkSpeed = v
    end
})

Sections support all element types: :Button(), :Toggle(), :Slider(), :Dropdown(), :MultiDropdown(), :TextBox(), :Bind(), :Colorpicker(), :Label(), :Paragraph(), :ProgressBar(), :Stepper(), :KeyValue().

Elements

Separator

A thin horizontal dividing line. Can optionally display a centered text label between two line segments.

lua
Tab:Separator()
Tab:Separator("Advanced Settings")
Elements

Grid

A fixed-column grid layout container. Elements placed inside arrange themselves into equal-width columns.

lua
local grid = Tab:Grid({ columns = 3 })
grid:Button("Teleport", function() print("Teleport") end)
grid:Button("Kill All",  function() print("Kill All") end)
grid:Button("Rejoin",    function() print("Rejoin") end)

Note: Grid objects only support :Button(), :Toggle(), and :Label(). For other elements use a Section.

Features

Notify

Sends a stacked notification from the bottom-right. Right-click to dismiss early.

lua
Isotope:Notify({
    Name = "Config Loaded",
    Content = "Your saved config has been applied.",
    Time = 5,
    Image = "rbxassetid://4384403532",
    DurationColor = Color3.fromRGB(0, 200, 120),
    SoundId = 452267918,
    OnClick = function() print("clicked") end,
})

Isotope:Notify("Simple message", 3)

Common mistake: The duration key is Time, not Duration.

OptionTypeDefaultDescription
Namestring"Notification"Bold title line
Contentstring""Secondary body text
Timenumber5Duration in seconds before auto-dismiss
Imagestringrbxassetid://4384403532Icon asset ID
DurationColorColor3RGB(0,170,255)Color of the side timer drain bar
SoundIdstring / numbernilSound played when the notification appears
OnClickfunctionnilFires when the notification is left-clicked
Features

CNotify

An advanced notification with hover-to-pause timer, right-click dismiss, and an optional Additional field that opens a fullscreen blurred modal on click.

lua
Isotope:CNotify({
    Name = "Update Available",
    Content = "Version 2.0 is out. Click for details.",
    Additional = "Full changelog text here. Opens as a fullscreen modal when clicked.",
    Time = 12,
    DurationColor = Color3.fromRGB(0, 170, 255),
    Image = "rbxassetid://4384403532",
    SoundId = 452267918,
    OnClick = function() print("CNotify clicked") end,
})
OptionTypeDefaultDescription
Namestring"Advanced Notification"Bold title
Contentstring""Short body text shown in the card
Additionalstring""Long-form text shown in the fullscreen modal on click
Timenumber5Duration. Timer pauses while hovering.
DurationColorColor3RGB(0,255,170)Side timer bar color
Imagestringrbxassetid://4384403532Icon asset ID
SoundIdstring / numbernilSound played on appear
OnClickfunctionnilFires on left-click before modal opens
Features

Toast

A small floating pill notification centered at the top of the screen. It slides in, waits 2 seconds, then fades out automatically.

lua
Window:Toast("Settings saved!")
Window:Toast("Teleported!", "rbxassetid://137352523558390")
ArgumentTypeDefaultDescription
textstring""Message displayed in the pill
iconstringnilOptional asset ID placed left of the text
Features

Watermark

A small floating bar in the top-left showing the script name, current time, live FPS, and any custom fields you add. Fully draggable and theme-aware.

lua
local wm = Isotope:Watermark("My Script")

wm:Field("Map", function()
    return game:GetService("Players").LocalPlayer:GetAttribute("Map") or "Lobby"
end)

wm:Field("Mode", "Ranked")

wm:SetField("Mode", "Casual")

wm:Title("My Script v2")

wm:Hide()
wm:Show()

wm:Destroy()

Note: Call Isotope:Watermark() after Isotope:Window() so the active theme is already set. The watermark always picks up Isotope._activeTheme.

Built-in Fields

The watermark always shows three built-in fields separated by | dividers: the script title (accent colored), the current local time (HH:MM:SS), and live FPS. Custom fields you add appear after these.

Methods

MethodDescription
:Title(text)Update the title label on the left.
:Field(name, valueFn)Add a custom field. valueFn can be a function (called every second for live updates) or a static string.
:SetField(name, value)Update a named field's text and stop any live-update function on it.
:Hide()Fade the watermark out.
:Show()Fade the watermark back in.
:RefreshTheme(theme)Apply a new theme table to the watermark. Called automatically by Window:SetTheme() if you store the wm object.
:Destroy()Stop the update loop and remove the GUI.
Features

Topbar

An optional floating panel at the top-center of the screen showing icon buttons for every tab, a search bar, and optional owner buttons. Fully draggable and theme-aware.

Must be set before Isotope:Window().

lua
Isotope.ShowTopbar = true

local Window = Isotope:Window({ ... })
Isotope:Init()

When more than 6 tabs are created the topbar adds a ... expand button to reveal additional rows. The built-in search panel indexes all flags, elements, and binds.

Features

Radial Menu

A circular menu mapping each tab to a card arranged around a center point. Supports hold and toggle modes, plus five open/close animations.

Must be set before Isotope:Window().

lua
Isotope.ShowRadial   = true
Isotope.RadialHotkey = Enum.KeyCode.Q
Isotope.RadialMode = "hold"
Isotope.RadialAnim = "Bloom"

local Window = Isotope:Window({ ... })
Isotope:Init()

Isotope.RadialAnim = "Spiral"
PropertyTypeDescription
ShowRadialbooleanEnable the radial menu
RadialHotkeyKeyCodeKey that opens/closes the wheel
RadialModestring"hold" releases on key-up; "toggle" stays open until pressed again
RadialAnimstringScale, Spiral, Fan, Bloom, Unfold. Can be changed at runtime.
Features

Keybind List

A persistent overlay in the bottom-left showing all active binds. Updates automatically when a bind changes.

lua
Isotope.ShowKeybindList = true

local Window = Isotope:Window({ ... })
Isotope:Init()
Features

Flags & Config

Flags let you reference any element's value globally via Isotope.Flags["FlagName"]. When SaveConfig = true and Save = true on an element, its value is written to a JSON file and auto-loaded on the next run.

lua
local Window = Isotope:Window({
    Name = "My Script",
    SaveConfig = true,
    ConfigFolder = "MyScript",
    Config = tostring(game.GameId),
    ScriptKey = "myscript-2025",
})

Tab:Toggle({
    Name = "Speed Hack",
    Flag = "SpeedHack",
    Save = true,
    Default = false,
    Callback = function(v) end,
})

print(Isotope.Flags["SpeedHack"].Value)
Isotope.Flags["SpeedHack"]:Set(true)
Isotope:Init()

Common mistake: Do not pass Config = true. Config is the filename string; SaveConfig is the boolean toggle. Set ScriptKey to prevent configs from loading in other scripts.

Features

Startup Animations

Enable a startup animation by setting Startup = true on the window and picking an animation name.

NameDescription
BlobA circle expands from center, then morphs into the window shape.
FadeThe window fades in from transparent.
TypewriterOverlay with a typing animation and progress bar. Supports StartupText and StartupIcon.
BounceThe window drops in from above and bounces into position.
UnfoldThe window expands horizontally then vertically.
Features

Tab Sections

Insert a collapsible label group between tabs in the sidebar. All tabs declared after a TabSection call until the next TabSection automatically belong to that section. Clicking the section header collapses or expands its tabs with a fade animation. An arrow icon rotates to indicate state.

lua
Window:TabSection("Combat")
local AimTab = Window:Tab({ Name = "Aimbot", Icon = "rbxassetid://..." })
local EspTab = Window:Tab({ Name = "ESP",    Icon = "rbxassetid://..." })

Window:TabSection("Misc")
local CfgTab = Window:Tab({ Name = "Config", Icon = "rbxassetid://..." })

No extra setup is needed. Tabs register themselves into the current section automatically based on the order they are created. Section membership is determined purely by call order.

Note: Tabs created before the first TabSection call are not part of any section and are always visible.

Features

User Section

An optional footer at the bottom of the sidebar showing the player's avatar, display name, and username. Set Isotope.UserSection = true before Isotope:Window() to enable it.

lua
Isotope.UserSection = true
Isotope.UserSectionRightClick = true

Isotope.USI = {
    { Name = "Discord", Callback = function() print("discord") end, Icon = "rbxassetid://4483345998" },
}

local Window = Isotope:Window({
    Name = "My Script",
    ShowDisplayName = true,
    ShowUsername = true,
})

Window:AddAvatarMenuItem("Copy UserId", function()
    if setclipboard then
        setclipboard(tostring(game.Players.LocalPlayer.UserId))
        Window:Toast("UserId copied!")
    end
end, "rbxassetid://3944703587")

Window:SetDisplayName("Test")
Window:SetUsername("@test")
MethodDescription
Window:SetUserSectionEnabled(bool)Show or hide the user section at runtime.
Window:SetAvatarMenuEnabled(bool)Allow or disallow right-click on the avatar.
Window:AddAvatarMenuItem(name, cb, icon?)Add a button to the avatar right-click profile panel.
Window:ClearAvatarMenu()Remove all added avatar menu items.
Window:SetDisplayName(text)Override the display name label.
Window:SetUsername(text)Override the username label.
Window:SetAvatarText(text)Set a small sub-label below the avatar.
Window:OpenProfileView(btns)Open the fullscreen profile panel.
Window:GetAvatarFrame()Returns the avatar button instance.
Window:GetUserSectionContainer()Returns the user section container Frame.
Features

Owner Buttons

Custom icon buttons in the topbar to the right of tab buttons. Useful for Discord links or script-level actions. Supports an optional Dropdown array, when set, clicking the button opens a small dropdown menu instead of calling Callback directly. The selected option is passed to Callback as the first argument.

Must be added before Isotope:Window(), or call Isotope:Topbar(theme) again after adding them at runtime.

lua
Isotope:AddOwnerButton({
    Name = "Discord",
    Icon = "rbxassetid://4483345998",
    Tooltip  = "Join Discord",
    Color = Color3.fromRGB(88, 101, 242),
    Order = 1,
    Callback = function() Window:Toast("discord.gg/example") end
})

Isotope:AddOwnerButton({
    Name = "Preset",
    Icon = "rbxassetid://4483345998",
    Tooltip  = "Load Preset",
    Order = 2,
    Dropdown = { "Default", "Rage", "Legit", "Silent" },
    Callback = function(selected)
        print("Preset selected:", selected)
    end
})

Isotope:ClearOwnerButtons()
OptionTypeDefaultDescription
Namestring"Button"Internal name, not displayed
Iconstring""Asset ID shown inside the button
Tooltipstring""Tooltip label shown on hover
ColorColor3nilBackground and stroke color. Falls back to theme Main.
Ordernumber100Sort order. Lower = further left.
DropdowntablenilArray of option strings. When provided, clicking opens a dropdown menu. The selected string is passed to Callback.
CallbackfunctionnilFires on click (no Dropdown), or fires with the selected option string (with Dropdown).
Features

Key System

Gate the window behind a key prompt. The prompt is animated and matches the current theme.

lua
local Window = Isotope:Window({
    Name = "My Script",
    KeySystem = true,
    Key = "mykey",
    KeyLink = "https://linkvertise.com/getkey",
    KeyDeniedCallback = function()
        print("User closed without entering the correct key.")
    end,
})
OptionTypeDefaultDescription
KeySystembooleanfalseEnable the key gate
Keystring""The correct key the user must enter.
KeyLinkstringnilURL copied when the user clicks "Get Key"
KeyDeniedCallbackfunctionnilCalled when the prompt is closed with an incorrect or no key
Features

SetTitle

Updates the window title label in the top bar at runtime.

lua
Window:SetTitle("My Script - Wave 3")
task.wait(2)
Window:SetTitle("My Script")
Features

Lock / Unlock

Overlays the entire UI with a semi-transparent dimmed blocker. All clicks are blocked while locked.

lua
Window:Lock("Loading data...")

task.spawn(function()
    task.wait(5)
    Window:Unlock()
end)

Note: Always run the timed work inside a task.spawn(). Never call :Lock() before a task.wait() on the main thread.

Features

Flash

Briefly pulses the window border stroke. Repeated rapid calls are safely ignored until the current flash finishes.

lua
Window:Flash()
Window:Flash(Color3.fromRGB(255, 200, 0))
Features

Toggle Confirm

When Confirm = true is passed to a toggle, clicking it expands the row to show "Are you sure?" with Confirm and Cancel buttons.

lua
Tab:Toggle({
    Name = "Delete All Data",
    Default = false,
    Confirm = true,
    Color = Color3.fromRGB(200, 60, 60),
    Callback = function(state)
        if state then clearAllData() end
    end
})
Features

Locked Toggle

When Locked = true is passed to a toggle, it starts with a lock overlay blocking interaction. Call :Lock() and :Unlock() at runtime to control it.

lua
local t = Tab:Toggle({
    Name = "Premium Feature",
    Default = false,
    Locked = true,
    Callback = function(v) print(v) end
})

t:Unlock()
t:Lock()
Features

Window Controls

Several window behaviors can be changed at runtime without recreating the window.

lua
Window:SetReopenKey(Enum.KeyCode.RightControl)
Window:SetCloseAnim("Blob")
Window:SetMinimizeAnim("Blob")
Window:SetAccentColor(Color3.fromRGB(255, 100, 0))
MethodDescription
Window:SetReopenKey(key)Change the key used to reopen after close or minimize.
Window:SetCloseAnim(anim)Change close animation: "Shrink" or "Blob".
Window:SetMinimizeAnim(anim)Change minimize animation: "Slide" or "Blob".
Window:SetAccentColor(color)Update the accent color across registered elements.
Features

Destroy

Completely removes all Isotope GUIs and clears all internal state. Use this before reloading a script.

lua
Isotope:Destroy()

Removes: IsotopeUI, IsotopeNotifications, IsotopeKeybindList, IsotopeTopbar, IsotopeRadial, IsotopeToasts. Also clears all Binds, Tabs, ElementRegistry, and OwnerButtons.

Isotope UI Library

The core Roblox Lua UI component library. Lightweight, composable, and fully themed. The only open-source project from Isotope.

open-sourceroblox luaui
Isotope Toolkit Coming Soon

Spoof, Uninstall Roblox, Find Directories, Multi-Instance. Will be Open-Source on Release.

toolkitrobloxutilities
Emergency Hamburg Closed Source

Feature-rich script with auto-drive, Car Dupe, and more. Available via the Discord server.

scriptsexploit
Arsenal Closed Source

Fully undetected Arsenal Script. Silent Aim, Legit, Ragebot, Kill-All.

scriptsexploit
Flick Closed Source

Lightweight script for Flick. Basic Aimbot and ESP.

scriptsexploits
Frontlines Closed Source - Bugged

Aimbot, NoClip, HBE. Undetected. Clean and easy use.

scriptsexploit
Bio

We lead Isotope, focused on building UI tooling and scripts that just work. Our projects are built with care, built to last, and made for developers and exploiters who care about quality.

We spend most of our time writing Lua, UI structure, and refining the gap between a functional script and a great one.

What we Offer
UI LibraryOpen Source
ToolkitOpen Source Soon
ScriptsClosed Source
Stack
LuaLuauPythonUser-Friendly
Philosophy

Quality over quantity. Scripts that run clean, UIs that feel right, and tools that actually get used. Everything built with intention, nothing shipped half-finished.

Isotope.lua
-- // reach out
local contact = {
Response = "Usually within 24h",
}
return contact