Skip to main content
This page maps the public API by object. See the customization reference for defaults and ranges and the icon catalogue for all built-in IDs. Task-specific guides have complete examples: controls, values, loading, key systems, and events.

Library

For the short API, use UI:CreateWindow("My project"), window:Tab("Home", "home"), and tab:Button("Hello", callback). Add an options table after the title when needed; value controls can take a callback after that table. The controls walkthrough explains each control with a working example. Full options-table calls remain supported. Button options include Text, Description, Icon, IconVariant, and Variant. Variant accepts Primary (default), Secondary, or Subtle to set the visual emphasis of an action. See the button example for the options-table form.

Window creation options

CreateWindow and the root of Create/Launch accept Id, Title, Subtitle, Theme, Style, Motion, Branding, Layout, Notifications, Navigation, Responsive, Position, AnchorPoint, Width, Height, ToggleKey, ShowWatermark, DiscordPrompt, ReducedMotion, Parent, DisplayOrder, and Storage. DiscordPrompt is disabled when omitted; setting it to an invite URL or options table opts in to showing the prompt after the window is created. ShowWatermark defaults to true; set it to false to hide the footer name and version while keeping the desktop hide-key hint and other actions. Create additionally accepts Tabs and Loading; Launch passes its root DiscordPrompt to the window it creates and adds KeySystem, Loading, Steps, OnReady, OnError, and OnCancel. Window, loader, and key-gate constructors accept Design as a schema table or registered design name. Declarative Create and Launch pass it through to the surfaces they create. UI:Design(options) validates and clones an options table; UI:Design(name) returns a fresh copy of a built-in or registered schema. Built-in presets are Studio, Minimal, Command, and Atelier. Atelier uses a monochrome palette, Comfortable density, Balanced corners, Left tabs, Rail navigation, and 0.08 panel transparency. RegisterDesign(name, schema) accepts a schema table, rejects duplicate and built-in names with false, and returns true when registration succeeds. GetDesignNames() returns a fresh list with built-ins first and custom names in registration order. UnregisterDesign(name) removes registered names and returns a boolean; built-in names are protected. Names are exact and case-sensitive, valid UTF-8, 1–64 bytes, contain a non-whitespace character, and contain no control characters. Custom schemas use a built-in Preset; they cannot inherit from other custom designs. Preset values are starting values; explicit constructor Theme, Style, Layout, and Navigation options take precedence. The Design schema has Preset, Accent, Transparency, Radius, Density, Tabs, and Navigation. See the single-page Design guide for exact values and complete examples. Defaults include Title = "Gabibou UI", Theme = "Graphite", Width = 800 (clamped to 320–1400), Height = 590 (clamped to 300–1000), ToggleKey = Enum.KeyCode.RightControl, and DisplayOrder = 90. The default GUI parent is the local player’s PlayerGui. Responsive defaults are Breakpoint = 620, TouchTarget = 44, and Margin = 12. Tabs is a dense, nonempty array. Each tab needs a nonempty Title and accepts Category (a category title string), Icon, IconVariant, Layout, Controls, and Sections. Tabs with the same Category title share a heading. Each section has a Title and optional Controls. Each declarative control requires a unique, nonempty Id (maximum 96 characters, without control characters).

Window methods

Category methods

window:Category("General") and window:Category({Title = "General"}) get or create a category. category:Tab(title, iconOrOptions?) adds a tab to it. A tab can also declare Category = "General" in window:Tab({Title = "Home", Category = "General"}) or in a declarative Create tab spec; a matching category is reused or created automatically.

Control and section methods

Create built-in controls with Toggle, Slider, Dropdown, Input, Keybind, ColorPicker, Button, Paragraph, or Custom on a section or tab. tab:Section({Title = "..."}) creates a section; section:Add(name, options) creates a registered component. Controls expose Get, Set(value, fireCallback), SetTitle, SetDescription, SetVisible, SetEnabled, SetLayout, SetOrder, GetParts, Animate, On, Connect, Own, and Destroy. Custom controls additionally expose SetHeight. ColorPicker exposes GetColor().

Key gate

UI:KeyProvider(name, options) returns a Validate(key) callback for CreateKeySystem or Launch. Provider names are case-insensitive: Luarmor, Vampauth, KeyAuth, and Custom. SDK objects and callbacks are supplied explicitly; this method does not load third-party code. See provider examples for exact option shapes. The Luarmor adapter reserves each SDK table for one ScriptId: the same table may be reused for that same ID, but a different ID needs a different SDK instance. It also fails closed if sdk.script_id changes after the provider is created. Provider errors fail closed and are converted to retryable status messages. KeyAuth initialization is lazy, shared across concurrent checks made through that provider callback, and retried after a failed initialization. Keep the Validate function’s result contract: true, result accepts; false, message rejects. A client-side gate is not an authorization boundary; check protected actions on a trusted server. UI:CreateKeySystem(options) requires Validate(key) and optionally accepts OnSuccess(gate, result), OnCancel(gate), and GetKey. GetKey can be an HTTPS URL/string, {Url, Text, Copy}, a custom function(gate), or false to disable. gate:GetKey() runs a single-flight key-link/custom action and returns a success boolean plus optional reason. It exposes Submit(key), Cancel(), Destroy(), Update(options), GetParts(), SetPartLayout(name, options), ResetPartLayout(name), CopyDiscordLink(), and GetKey(). GetParts() includes CredentialWell, GetKeyButton, KeyLink, and KeyLinkStatus. Layout methods accept named parts from GetParts() except the fixed Overlay and Card; options are Position, Size, AnchorPoint, and Visible. Overrides persist across responsive reflow and Update. For parts inside the scroll content, a finite vertical extent is required; moved content expands the scroll area to keep it reachable. Custom positions can overlap other controls. See the Design guide for a short example. Default Logo is "Avatar"; set it to false to show MarkText, or use an rbxassetid:// URI. Default SubmitText is Verify key. Width defaults to 420 px (range 280–600). Automatic card heights are 332 px without Discord/GetKey, 394 px with Discord, 404 px with GetKey, and 462 px with both; Height accepts 280–560 px. See Key systems for link behavior, Discord, and validation details.

Discord prompt

window:PromptDiscord(urlOrOptions) opens a community invite modal immediately. It accepts a code, https://discord.gg/{code}, or https://discord.com/invite/{code}; accepted links normalize to https://discord.gg/{code}. It returns true when opened or false, reason when unavailable, already open, or already shown for that invite during this library instance. The root DiscordPrompt option opts in to showing it after window creation; Launch passes that option to its window. Options are Url (required), Title, Content, JoinText, ContinueText, Copy(url), Open(url), and OncePerSession. Defaults are Title = "Join the community", Content = "Join the Gabibou UI community for updates and help.", JoinText = "Copy invite", ContinueText = "Not now", and OncePerSession = true. A supplied Open or Copy callback runs only after the corresponding user action; callback results of nil or true signal success. false or a thrown error keeps the dialog open and leaves the normalized invite available for manual copying. Without a callback, the existing clipboard function is used when available; in Studio the link remains selectable for manual copying. The modal never opens a browser or joins a server by itself. OncePerSession is in-memory only and can be set to false to show the same invite again. The fixed modal credit is Gabibou UI · by Gabibou, independent of ShowWatermark. See Discord prompt examples and Notifications and confirmation.

Loader

UI:CreateLoader(options) exposes SetProgress, SetStatus, Update, Run, GetParts, SetPartLayout, ResetPartLayout, Own, Complete, and Destroy. GetParts() includes StatusPanel, which can be positioned or resized with SetPartLayout. Fields include Progress, Status, Completed, Destroyed, and LastError. See Loading screens for variant and content customization.

Launch session

UI:Launch(spec) returns a session with Status, LastError, Gate, Loader, Window, Cancel(), and Destroy(). Status values are WaitingForKey, Loading, Ready, Failed, and Destroyed. Callbacks are OnReady(window, session), OnError(message, session), and OnCancel(session).

Theme tokens and motion fields

Theme names are Graphite, Aurora, and Ember. Theme tokens are Background, Surface, Raised, Hover, Border, Text, Muted, Accent, AccentText, Success, and Danger. Style fields are Font, FontBold, TextSize, DescriptionSize, TitleSize, WindowRadius, SectionRadius, ControlRadius, and RowPadding. Motion fields are Duration, Style, Direction, RepeatCount, Reverses, and Delay. See Appearance and layout for behavior and ranges.

Configuration limits

  • Input length defaults to 120; supported maximum is 4096.
  • Key input defaults to 256 UTF-8 characters; supported maximum is 4096.
  • Persistent configuration JSON is limited to 256 KiB.
  • The library uses no implicit filesystem adapter. Pass Storage.Read and Storage.Write when saving profiles.
  • Custom interface builders can have side effects that schema validation cannot predict. A failed build cleans up the new partial window but does not restore a same-ID window that was already replaced.