Library
The Library contains all essential functions and data used to create and get data from the UI.
Window

The Window object is your base UI container. It hosts tabs, groupboxes and mostly everything else driven by the library. The next step to using the library is to create a tab inside the window.
Usage
Create a window with Library:CreateWindow() and override any defaults you need:
Prop
Type
Sidebar Layout & Resizing
Obsidian can expose a draggable handle that lets players resize the sidebar at runtime. Enable it and tweak the behaviour directly from your window configuration:
Sidebar Methods
All window instances expose helpers for responding to layout changes or driving your own resizing logic.
GetSidebarWidth
Returns the current sidebar width in pixels.
IsSidebarCompacted
Checks if the sidebar is currently in compact (icon-only) mode.
SetSidebarWidth
Programmatically resize the sidebar. Values outside the configured bounds are clamped automatically.
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Desired sidebar width in pixels | number | Width |
SetCompact
Toggle compact mode explicitly. Pass true to force compact, or false to restore the last expanded width.
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Whether the sidebar should stay compacted | boolean | — |
ApplyLayout
Re-apply all sidebar measurements.
Notifications

Use Library:Notify() for quick, non-blocking feedback. Notifications support:
- Simple timed popups.
- Persistent messages you can update or destroy.
- Progress indicators with step counters.
- Optional sounds or other custom behavior based on your own logic.
Creating a notification
Choose between positional arguments for quick calls or a configuration table for full control.
Regular parameters
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Description of the notification | string | "nil" |
| 2 | Amount of time to show the notification for | number | instance | 4 |
| 3 | SoundId to play when the notification is shown | number | nil |
Table parameters
Pick an example that matches your use case:
Prop
Type
Methods
ChangeTitle
Update the notification title without recreating it.
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | New title of the notification | string | nil |
ChangeDescription
Refresh the supporting text while keeping the notification open.
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | New description of the notification | string | nil |
ChangeStep
Advance or rewind the progress bar when using step-based notifications.
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | New step of the progress notification | number | nil |
Destroy
Immediately dismiss the notification and free its resources.
Watermark
Watermarks are now deprecated. Please use Library:AddDraggableLabel instead.
Draggable Labels

Draggable Labels are compact, draggable overlays containing text. They are ideal for surfacing information such as FPS, ping, server info, etc. The feature is inspired by the LinoriaLib UI Library Watermark feature.
Methods
AddDraggableLabel
Adds a draggable label to the UI.
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Text to display in the draggable label | string | nil |
SetText
Sets the draggable label text.
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Text to display in the draggable label | string | nil |
SetVisible
Sets the draggable label visibility.
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Whether to show the draggable label | boolean | true |
Example
Keybinds Menu

The keybinds menu surfaces every registered keybind alongside its current state. When a keybind is configured in Toggle mode the menu also renders tap-friendly buttons, giving mobile players parity with keyboard users.
Custom Cursor

Enable the custom cursor to render the Obsidian-styled pointer at your mouse position—handy for experiences that hide or replace Roblox's default cursor.
Icons
Icons originate from the lucide icon pack. You can change the icon library so long as you call it before creating any UI elements and it follows the expected return data.
The direct lucide module can be found here. (Our automation updates the icon spritesheet each month)
Custom Icon Registry
If you'd like to make your own custom Icon Module, make sure it follows these types:
Obsidian is dependent on a few icons to be able to be displayed properly.
Please make sure you have icons named: check (Toggles), chevron-up (Dropdowns), move-diagonal-2 (Window Resizing Icon bottom right of the window), key (Key System Tab Icon), search (Searchbar), move (Window movement Icon top right of the window)
Custom Asset Icons
If you'd like to use custom hosted images (like those on Github) with a Roblox Asset ID as a fallback, you can use the built-in ImageManager:
AddAsset
Adds a custom asset to the ImageManager
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Asset Name | string | nil |
| 2 | Roblox Asset ID | number | nil |
| 3 | Asset URL | string | nil |
| 4 | Force Redownload | boolean? | nil |
GetAsset
Retrieves the asset ID for the provided asset
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Asset Name | string | nil |
DownloadAsset
Downloads the asset image to the workspace folder
This runs automatically in AddAsset, so you don't need to call it separately (unless you want to redownload the asset image)
| Arg Idx | Argument Description | Type | Default |
|---|---|---|---|
| 1 | Asset Name | string | nil |
| 2 | Force Redownload | boolean? | nil |
Menu Keybind
In Obsidian, there is a helper field that you can set that allows you to easily bind a Keybind to toggle the main window.