meridian.getfeature(name)→ boolean | nilReturns whether a Meridian feature is enabled. Unknown names return nil.
A complete guide to feature automation, player and instance data, overlay drawing, native interfaces, files, HTTP, input, and guarded process access in Meridian's embedded Lua 5.4 runtime.
Fresh state
Every run starts isolated
Native output
Drawing and scripted UI
Guarded access
Safe by default
Start here
Start Meridian before Roblox, join a game, and wait for the attachment status to become ready. Press Insert, open LuaVM from the navbar, then create or select a script. Each press of Run new starts a clean Lua 5.4 state on its own worker. Up to eight scripts can run together.
Attach
Launch Meridian, join Roblox, and wait for Overlay ready.
Open LuaVM
Press Insert and choose LuaVM in the top navbar.
Run
Use Run new for another worker. Stop one from Active scripts, or use Stop all.
-- Open Meridian with Insert, select LuaVM, then press Run new.
local runtime, version = identifyexecutor()
print(runtime, version)
meridian.setsetting("esp max distance", 1500)
meridian.setfeature("esp", true)
for _, player in ipairs(meridian.players()) do
print(player.Name, math.floor(player.Distance), player.Health)
endWhere scripts live
%APPDATA%\Meridian\scripts. File functions and require are intentionally limited to its workspace subfolder.Runtime
Every run owns a new Lua state, script ID, cancellation flag, input state, Drawing objects, and native UI resources. Stop beside an active script cancels only that worker; Stop all cancels the set. Compile and runtime failures appear in the identified live console.
Lua 5.4 semantics
Standard Lua libraries are available except host-system surfaces removed by the sandbox.
Cooperative stopping
Tight Lua code is interrupted by the instruction hook; wait also checks the stop request.
Up to eight workers
Independent scripts continue when another script completes, fails, or is stopped.
Owned cleanup
Unload callbacks run and only the exiting script's windows, events, notifications, and drawings are removed.
print(meridian.script.id, meridian.script.name)
print(meridian.runtime.apiVersion) -- 1.2.0
print(meridian.runtime.luaVersion) -- 5.4.8
print(meridian.runtime.maxConcurrentScripts) -- 8
print(meridian.capabilities.taskScheduler) -- trueLong-running scripts
task.wait(). The cooperative scheduler drives delayed tasks, signal callbacks, input polling, RunService steps, and compatibility GUI updates on the script's worker. Native MeridianUI scripts still call MeridianUI:Step() to dispatch that separate UI library's queued events.Compatibility version stays stable
identifyexecutor() and getversion() still report 1.0.0 for existing scripts. New scripts should inspect meridian.runtime.apiVersion and meridian.capabilities.Core API
The meridian table is the primary high-level surface. It works with the same shared feature state, player cache, command system, and config store as Meridian's native interface.
-- Names ignore case, spaces, dashes, and underscores.
meridian.setsetting("aimbot fov", 145)
meridian.setsetting("aimbot-prediction", true)
local enabled = meridian.togglefeature("aimbot")
print("Aimbot enabled:", enabled)
-- The command API uses the same language as the command palette.
local ok, message = meridian.execute("speed 30")
print(ok, message)meridian.getfeature(name)→ boolean | nilReturns whether a Meridian feature is enabled. Unknown names return nil.
meridian.setfeature(name, enabled)→ booleanEnables or disables a feature and returns its new state.
meridian.togglefeature(name)→ booleanFlips a feature and returns its new state.
meridian.listfeatures()→ table<string, boolean>Returns every supported feature and its current state.
meridian.getsetting(name)→ number | boolean | nilReads a setting. Names ignore case, spaces, dashes, and underscores.
meridian.setsetting(name, value)→ number | booleanChanges a setting, clamps numeric values to its supported range, and returns the stored value.
meridian.execute(command)→ boolean, stringRuns a command-palette command without the prefix and returns success plus a status message.
meridian.players()→ PlayerSnapshot[]Returns the current valid non-local player snapshots from Meridian's shared cache.
meridian.findplayer(name)→ PlayerSnapshot | nilFinds a cached player by exact, prefix, or partial display name.
meridian.localplayer()→ LocalPlayerSnapshotReturns the attached local player, character, root address, and position when available.
meridian.refreshplayers()→ integerRefreshes the shared player cache immediately and returns its size.
meridian.teleport(playerOrName)→ booleanTeleports the local player to a target supplied as a snapshot, address, or name.
meridian.view(playerOrName)→ booleanMoves the local camera subject to a target supplied as a snapshot, address, or name.
meridian.unview()→ booleanRestores the camera to the local humanoid.
meridian.selectedplayer()→ PlayerSnapshot | nilReturns the player selected in Meridian's Player list workspace.
meridian.saveconfig(name)→ booleanSaves the current Meridian feature configuration under a name.
meridian.loadconfig(name)→ booleanLoads a named Meridian feature configuration.
meridian.listconfigs()→ string[]Refreshes and returns the available named configurations.
meridian.panic()→ trueImmediately disables active combat, visual, and movement overrides.
meridian.notify(message, title?, type?, duration?)→ nilShows a native Meridian notification. Type accepts Info, Success, Warning, or Error; title defaults to Meridian and duration defaults to four seconds.
meridian.clearmodulecache(path?)→ trueInvalidates one cached workspace module, or the complete module cache when path is omitted.
meridian.compatibility.isEnabled()→ booleanReturns whether Roblox compatibility translation is enabled.
meridian.compatibility.setEnabled(enabled)→ booleanEnables or disables virtual Instance and GUI translation globally, then returns the stored state.
meridian.compatibility.capabilities()→ tableReturns granular capability flags, including explicit false values for engine hooks and getgc.
Convenience globals
getfeature, setfeature, togglefeature, listfeatures, getsetting, setsetting, executecommand, saveconfig, loadconfig, listconfigs, and panic.Direct helpers include enableaimbot, disableaimbot, toggleaimbot, equivalent helpers for triggerbot and ESP, plus fly/unfly/togglefly, noclip, desync, and infjump variants.
Core API
Feature names are aimbot, triggerbot, esp, fly, noclip, desync, infjump, walkspeed, jumppower, animationchanger, teamcheck, and keybindhud.
| Setting key | Type | Accepted value | Effect |
|---|---|---|---|
aimbot fov | number | 1..1000 | Aimbot field-of-view radius. |
aimbot smoothing | number | 1..100 | Cursor movement smoothing. |
aimbot target | integer | 0..2 | Target bone index: implementation-defined UI order. |
aimbot method | integer | 0..1 | Aim method index: implementation-defined UI order. |
aimbot prediction | boolean | true / false | Enables velocity prediction. |
aimbot prediction amount | number | 0..3 | Prediction multiplier. |
aimbot sticky | boolean | true / false | Keeps the current valid target locked. |
triggerbot cps | number | 1..30 | Clicks per second. |
triggerbot radius | number | 1..100 | Activation radius around the cursor. |
fly speed | number | 1..500 | Camera-relative fly speed. |
walkspeed | number | 0..500 | Humanoid WalkSpeed override. |
jumppower | number | 0..500 | Humanoid JumpPower override. |
esp max distance | number | 1..50000 | Maximum ESP render distance. |
esp box style | integer | 0..2 | Box style index: full, corner, or rounded. |
esp boxes | boolean | true / false | Player boxes. |
esp names | boolean | true / false | Player names. |
esp distance | boolean | true / false | Distance labels. |
esp health bar | boolean | true / false | Health bars. |
esp skeleton | boolean | true / false | Character skeletons. |
esp snaplines | boolean | true / false | Screen-to-player snaplines. |
esp health text | boolean | true / false | Numeric health labels. |
esp equipped item | boolean | true / false | Equipped item labels. |
esp offscreen arrows | boolean | true / false | Off-screen direction indicators. |
desync display position | boolean | true / false | Shows the captured server-position silhouette. |
Normalized names
"ESP Max-Distance", "esp_max_distance", and "espmaxdistance" resolve to the same key. Numeric values are clamped, not rejected.Game data
Player functions use Meridian's shared live cache. A PlayerSnapshot contains Address, CharacterAddress, HumanoidAddress, RootPartAddress, Name, Health, MaxHealth, Distance, EquippedItem, Position, and ClassName.
meridian.refreshplayers()
local target = meridian.findplayer("alex")
if target then
print(target.Name, target.Health, target.EquippedItem)
print(target.Position, target.RootPartAddress)
meridian.view(target)
wait(2)
meridian.unview()
endgetplayers()→ PlayerSnapshot[]Returns valid cached non-local players.
findplayer(name)→ PlayerSnapshot | nilMatches a player by exact, prefix, or partial name.
getlocalplayer()→ LocalPlayerSnapshotReturns the local player snapshot.
refreshplayers()→ integerForces a cache refresh and returns the cache size.
teleport(playerOrName)→ booleanTeleports to a player.
view(playerOrName)→ booleanSpectates a player.
unview()→ booleanReturns the camera to the local player.
getselectedplayer()→ PlayerSnapshot | nilReturns the selection from the Player list workspace.
Snapshots, not engine objects
nil when a player leaves.Game data
Instance.new(address) still wraps a known engine address. With Roblox compatibility mode enabled, Instance.new("ClassName", parent?) also creates script-owned virtual Instances. Screen GUI classes are translated live into Meridian Drawing objects instead of being inserted into Roblox.
local players = game:GetService("Players")
local localPlayer = players.LocalPlayer
local character = localPlayer and localPlayer.Character
if character then
local root = character:FindFirstChild("HumanoidRootPart")
if root and root:IsA("BasePart") then
print(root:GetFullName(), root.Position)
end
endlocal ui = Instance.new("ScreenGui")
ui.Name = "ExistingScriptUI"
ui.Parent = game:GetService("CoreGui")
local panel = Instance.new("Frame", ui)
panel.Position = UDim2.fromOffset(32, 80)
panel.Size = UDim2.fromOffset(280, 150)
panel.BackgroundColor3 = Color3.fromRGB(24, 26, 38)
Instance.new("UICorner", panel).CornerRadius = UDim.new(0, 12)
local button = Instance.new("TextButton", panel)
button.Position = UDim2.fromOffset(20, 92)
button.Size = UDim2.fromOffset(240, 38)
button.Text = "Enable ESP"
button.MouseButton1Click:Connect(function()
meridian.togglefeature("esp")
end)GetChildren()GetDescendants()FindFirstChild(name, recursive?)FindFirstChildOfClass(class)WaitForChild(name, timeout?)IsA(class)GetFullName()Clone()Destroy()GetAttribute(name)SetAttribute(name, value)GetPropertyChangedSignal(name)Virtual classes and events
ScreenGui, common Frame/Text/Image GUI objects, UI layout/decorator objects, Folder and value objects, PlayerGui/CoreGui proxies, and BindableEvent/BindableFunction. Signals implement :Connect(), :Once(), and :Wait(); connections expose :Disconnect() and Connected.GUI translation boundary
Players
GetPlayers(), FindPlayer(name), LocalPlayer, and LocalPlayer:GetMouse().
game
GetService supports Players, Workspace, RunService, UserInputService, HttpService, TweenService, Debris, GuiService, and CoreGui.
workspace
Address plus CurrentCamera.FieldOfView and CurrentCamera.ViewportSize.
HttpService
GenerateGUID(braces?) returns a random UUID string.
Reachable discovery is available through getinstances(), getscripts(), and getloadedmodules(). getnilinstances() returns script-owned virtual Instances without a parent; externally unreachable Roblox nil instances cannot be discovered.
instanceinfo(address)→ { Address, Name, ClassName } | nilBuilds basic metadata for an instance address.
instancechildren(address)→ integer[]Returns direct child addresses.
instancefindchild(address, name)→ integer | nilFinds a direct child by name.
instancefindclass(address, className)→ integer | nilFinds a direct child by class.
instanceposition(address)→ Vector3Reads an instance position.
instancevelocity(address)→ Vector3Reads assembly velocity.
instanceparent(address)→ integer | nilReturns the parent address.
instanceprimarypart(address)→ integer | nilReturns a model's PrimaryPart address.
instancehealth(address)→ numberReads Humanoid health from an address.
instanceattribute(address, name)→ nilReserved compatibility call. Attributes are not exposed yet.
instancesetposition(address, position)→ nilWrites an instance position from a Vector3.
instancesetvelocity(address, velocity)→ nilWrites BasePart assembly velocity from a Vector3.
instancesethealth(address, health)→ nilWrites a Humanoid's verified Health field.
Compatibility
Meridian opens Lua's standard libraries, then removes direct host filesystem, process, and package loading surfaces. The compatibility layer is focused on common script patterns without pretending to be Roblox's internal Luau VM.
load(chunk, chunkName?, mode?, env?)→ function | nil, string?Lua 5.4 dynamic compilation.
loadstring(chunk, chunkName?)→ function | nil, string?Alias of Lua 5.4 load.
wait(seconds?)→ numberScheduler-aware alias of task.wait, defaulting to one frame. Stop requests interrupt it with an error.
task.wait(seconds?)→ numberYields the current scheduled coroutine and returns elapsed time. On the main chunk it pumps the scheduler while waiting.
task.spawn(fn, ...)→ threadResumes a new coroutine immediately and schedules it again whenever it yields.
task.defer(fn, ...)→ threadSchedules a coroutine for the next scheduler cycle.
task.delay(seconds, fn, ...)→ threadSchedules a coroutine after the requested delay without blocking the worker.
task.cancel(thread)→ booleanCancels a thread returned by spawn, defer, or delay. Returns false when it is no longer scheduled.
spawn(fn, ...)→ threadAlias of task.spawn.
tick()→ numberSeconds since the Meridian Lua runtime clock origin.
typeof(value)→ stringReturns Meridian datatype names when present, otherwise the Lua type name.
getfenv()→ tableCompatibility helper returning _G.
setfenv(fn, env)→ functionLua 5.4 compatibility no-op that returns fn.
print(...)→ nilWrites an informational console line.
printl(...)→ nilAlias of print.
warn(...)→ nilWrites a warning console line.
errorl(...)→ nilWrites an error-styled console line without raising a Lua error.
notify(message, title?, type?, duration?)→ nilShows a native, script-owned Meridian notification with sound and automatic cleanup.
identifyexecutor()→ "Meridian", "1.0.0"Returns the runtime name and compatibility version.
getexecutorname()→ "Meridian"Returns the runtime name.
getversion()→ "1.0.0"Returns the compatibility API version.
Lua 5.4 difference
unpack aliases table.unpack. loadstring aliases load. Compatibility setfenv cannot replace a function environment under Lua 5.4 and returns the original function.Compatibility
Synthetic input state is independent for every running script. It defaults on for compatibility with existing Meridian scripts; call setrobloxinput(false) when a script no longer needs to send input. Disabling it in one VM does not affect another.
setrobloxinput(true)
if isrbxactive() then
mousemoveabs(640, 360)
mouse1click()
end
setrobloxinput(false)setrobloxinput(enabled)→ nilAllows or blocks this script's synthetic input calls.
isrbxactive()→ booleanTrue when the attached Roblox window is foreground.
setclipboard(text)→ booleanCopies ANSI text to the Windows clipboard.
keypress(virtualKey)→ trueSends a key-down event using a Windows virtual-key code.
keyrelease(virtualKey)→ trueSends a key-up event using a Windows virtual-key code.
iskeypressed(virtualKey)→ booleanReads the current physical key state.
ismouse1pressed()→ booleanReads the left mouse button state.
ismouse2pressed()→ booleanReads the right mouse button state.
getmouseposition()→ integer, integerReturns cursor X and Y relative to Roblox when attached.
mouse1press()→ nilSends left-button down.
mouse1release()→ nilSends left-button up.
mouse1click()→ nilSends a full left click.
mouse2press()→ nilSends right-button down.
mouse2release()→ nilSends right-button up.
mouse2click()→ nilSends a full right click.
mousemoveabs(x, y)→ nilMoves the cursor to Roblox client coordinates.
mousemoverel(dx, dy)→ nilMoves the cursor by a relative delta.
mousescroll(delta)→ nilSends a Windows mouse-wheel delta.
WorldToScreen(position)→ Vector2, booleanProjects a Vector3 with the current view matrix and reports whether it lies on-screen.
getgamename()→ stringReturns the attached DataModel name, or Unknown.
GetPingValue()→ 0Compatibility placeholder; live ping is not exposed yet.
UserInputService
InputBegan, InputChanged, InputEnded, key and mouse queries, GetMouseLocation(), and pressed-input snapshots use external Windows polling.
RunService
RenderStepped, Heartbeat, Stepped, PreRender, PostSimulation, and BindToRenderStep run on the cooperative scheduler.
Windows virtual-key codes
keypress and keyrelease accept numeric Windows virtual-key codes, such as 0x46 for F. Key-down calls should always be paired with a release.Compatibility
The file API gives scripts useful persistence without exposing the rest of the computer. Allowed data extensions are .txt, .lua, .luau, .json, .cfg, .dat, .ini, and .mrd.
-- All paths resolve inside scripts\workspace.
makefolder("my-tool")
writefile("my-tool/settings.json", '{"enabled":true}')
appendfile("my-tool/log.txt", "started\n")
for _, path in ipairs(listfiles("my-tool")) do
print(path)
end
-- Module paths must include .lua or .luau.
local helpers = require("my-tool/helpers.lua")readfile(path)→ stringReads an allowed workspace file as bytes.
writefile(path, contents)→ nilCreates parent folders and replaces a workspace file.
appendfile(path, contents)→ nilCreates parent folders and appends to a workspace file.
makefolder(path)→ booleanCreates a workspace folder, including parents.
isfile(path)→ booleanChecks for a regular file.
isfolder(path)→ booleanChecks for a directory.
listfiles(path?)→ string[]Lists a directory, sorted, using workspace-relative paths. Defaults to the workspace root.
delfile(path)→ booleanDeletes a workspace file.
delfolder(path)→ booleanRecursively deletes a workspace folder.
require(path)→ anyLoads and caches a .lua or .luau module from the workspace. The extension is required and circular dependencies raise an error.
base64encode(data)→ stringBase64-encodes bytes. Also available as base64.encode.
base64decode(data)→ stringBase64-decodes bytes. Also available as base64.decode.
httpget(url)→ stringPerforms a GET with automatic proxy support and returns the response body.
httppost(url, body, contentType?)→ stringPerforms a POST. Content type defaults to application/json.
game:HttpGet(url)→ stringRoblox-style alias of httpget.
game:HttpPost(url, body, contentType?)→ stringRoblox-style alias of httppost.
Per-script module cache
require calls return the cached module values within that Lua state. Concurrent scripts never share module objects. Use meridian.clearmodulecache(path) to reload one module, or omit the path to clear the current script's cache.Path sandbox
Absolute paths, rooted paths, and any .. segment are rejected before access.
HTTP behaviour
GET and POST return response bodies. Current calls do not expose status codes or response headers.
Rendering
Meridian supplies Lua implementations of the geometry types most external scripts need. typeof() reports their Meridian type names and arithmetic returns typed values.
| Type | Constructor | Properties | Operations and methods |
|---|---|---|---|
Vector2 | Vector2.new(x?, y?) | X, Y, Magnitude, Unit | +, -, unary -, *, /; :Dot(other), :Lerp(other, alpha); zero, one, xAxis, yAxis |
Vector3 | Vector3.new(x?, y?, z?) | X, Y, Z, Magnitude, Unit | +, -, unary -, *, /; :Dot, :Cross, :Lerp, :Abs, :Ceil, :Floor, :Sign, :FuzzyEq, :Angle, :Min, :Max; zero, one, axes |
Color3 | Color3.new(r?, g?, b?) | R, G, B in 0..1 | Color3.fromRGB(r, g, b), Color3.fromHSV(h, s, v), Color3.fromHex(hex) |
CFrame | CFrame.new(...) | Position, LookVector, RightVector, UpVector | CFrame.Angles / fromOrientation; multiplication; :GetComponents, :Lerp, world/object vector and point transforms, :Inverse, Euler/orientation methods |
UDim | UDim.new(scale?, offset?) | Scale, Offset | + and - |
UDim2 | UDim2.new(...) / fromScale / fromOffset | X and Y as UDim | + and - |
Rect | Rect.new(min, max) / Rect.new(x0, y0, x1, y1) | Min, Max, Width, Height | Immutable geometry value |
NumberRange | NumberRange.new(min, max?) | Min, Max | One argument creates a constant range |
NumberSequence | NumberSequence.new(value, endValue?) | Keypoints | Also accepts NumberSequenceKeypoint[] |
ColorSequence | ColorSequence.new(color, endColor?) | Keypoints | Also accepts ColorSequenceKeypoint[] |
Ray | Ray.new(origin, direction) | Origin, Direction | :ClosestPoint(point), :Distance(point) |
Region3 | Region3.new(min, max) | CFrame, Size, Min, Max | Axis-aligned region value |
BrickColor | BrickColor.new(name | number | Color3) | Name, Number, Color | BrickColor.random() |
TweenInfo | TweenInfo.new(time?, style?, direction?, repeats?, reverses?, delay?) | Time, EasingStyle, EasingDirection, RepeatCount, Reverses, DelayTime | Used by TweenService:Create |
EnumItem | Enum.Category.Name | Name, Value, EnumType | tostring, :IsA(enumName); EnumType:GetEnumItems() |
Enum includes the common input, GUI, easing, rendering, material, and humanoid-state categories used by compatibility scripts. Enum items are cached values with Roblox-style names such as Enum.KeyCode.F and Enum.UserInputType.MouseButton1.
CFrame construction
CFrame.new accepts position only, a 12-number position-plus-rotation matrix, or seven values containing position and a quaternion. Multiplying by a Vector3 transforms a point; multiplying by another CFrame composes transforms.Rendering
Drawing objects render in Meridian's DirectX overlay. Create one with Drawing.new(type), set its properties, and call :Remove() or :Destroy() when finished.
local label = Drawing.new("Text")
label.Position = Vector2.new(32, 32)
label.Text = "Meridian LuaVM"
label.FontSize = 18
label.Color = Color3.fromHex("#9b8cff")
label.Outline = true
label.Visible = true
wait(3)
label:Remove()| Object | Shape properties | Shared properties |
|---|---|---|
Line | From, To | Visible, Color, Transparency, Thickness, ZIndex |
Circle | Position, Radius, NumSides, Filled | Visible, Color, Transparency, Thickness, ZIndex |
Square / Rectangle | Position, Size (Vector2), Filled, Corner / Rounding | Visible, Color, Transparency, Thickness, ZIndex |
Text | Position, Text, FontSize, Center, Outline | Visible, Color, Transparency, ZIndex |
Triangle | PointA, PointB, PointC, Filled | Visible, Color, Transparency, Thickness, ZIndex |
Layering
ZIndex controls stable render order. Lower values render first.
Colour and alpha
Color accepts Color3. Transparency is clamped from 0 to 1 and acts as opacity.
Drawing.Fonts defines UI = 0, System = 1, SystemBold = 2, and Monospace = 3 for compatibility. Text currently uses Meridian's overlay font renderer.
Rendering
MeridianUI, newui, and meridian.ui refer to the same native library. The bundled meridian_ui.lua module returns it, so scripts can use a familiar require pattern without downloading UI code. Several scripts can display interfaces simultaneously; each owns its windows and event queue.
local ui = require("meridian_ui.lua")
local window = ui:CreateWindow({
Title = "Movement kit",
Subtitle = "Powered by Meridian",
Width = 820,
Height = 580,
ShowLoader = true,
LoadingDuration = 0.9,
})
local movement = window:AddTab({ Title = "Movement", Icon = "zap" })
local controls = movement:AddSection("Controls")
controls:AddToggle({
Title = "Fly",
Description = "Camera-relative movement",
Keybind = "F",
Mode = "Toggle",
Callback = function(enabled)
meridian.setfeature("fly", enabled)
end,
})
local speed = controls:AddSlider({
Title = "Fly speed", Min = 1, Max = 500, Default = 75,
Callback = function(value) meridian.setsetting("fly speed", value) end,
})
ui:Notify({
Title = "Movement kit ready",
Content = "Controls loaded successfully",
Type = "Success",
Duration = 4,
})
ui:OnUnload(function() meridian.setfeature("fly", false) end)
while true do
ui:Step() -- dispatches native events to Lua callbacks
wait(0.02)
endCreateWindow({ Title, Subtitle, Width, Height, ShowLoader, LoadingDuration })window:AddTab({ Title, Icon })tab:AddSection(title)window:SelectTab(index)window:Show()window:Hide()window:Toggle()window:Minimize()window:Destroy()| Control | Options | Callback value |
|---|---|---|
AddToggle | Title, Description?, Default?, Keybind?, Mode?, Callback? | boolean |
AddButton | Title, Description?, Callback? | true on click |
AddSlider | Title, Description?, Min?, Max?, Default?, Rounding? (0..4), Callback? | number |
AddDropdown | Title, Description?, Values, Default?, Callback? | string |
AddKeybind | Title, Description?, Default?, Mode?, Callback? | boolean |
AddInput / AddTextbox | Title, Description?, Default?, Callback? | string |
AddParagraph | Title, Content | string |
control:GetValue()control:SetValue(value, silent?)control:SetContent(text)control:SetText(text)control:SetKey(name)ui:Notify({ Title, Content, Type, Duration })ui:OnUnload(callback)ui:Step()ui:Unload()ui:SetFolder(name)ui:LoadAutoloadConfig()Loading and notification styling
ShowLoader = false to skip it or use LoadingDuration from 0 to 3 seconds. Notification Type accepts Info, Success, Warning, or Error; each notification uses the shared Meridian sound, stacks safely, supports click-to-dismiss, and is cleaned up with its script.Tab Icon names render through Meridian's native Lucide-style icon set. Supported names include shield, eye, move, terminal, settings, sparkles, radar, crosshair, user, orbit, and zap. Unknown names fall back to sparkles instead of a letter.
Dispatch Step() continuously
Step() drains them. A typical UI loop calls it every 0.02 seconds.Keybind names accept A-Z, 0-9, F1-F24, Insert, Delete, Home, End, Page Up/Down, Space, Tab, LMB/RMB/MMB, Mouse 4/5, Shift, Ctrl, Alt, Enter, Escape, and arrow keys. Modes are Toggle, Hold, and Press. During capture, Backspace unbinds and Escape keeps the current key.
Safety
Raw process access is disabled by default and hidden behind the LuaVM's Unsafe memory API switch. Calls fail unless Roblox is attached. Keep it off for scripts that only use supported Meridian, player, Instance, Drawing, or UI APIs.
-- Requires Unsafe memory API and an active attachment.
local base = getbase()
local oldValue = getfflag("PhysicsSenderMaxBandwidthBps")
local ok, err = pcall(function()
setfflag("PhysicsSenderMaxBandwidthBps", 0)
end)
if not ok then warn(err) end
-- Restore values you change as soon as your script no longer needs them.
setfflag("PhysicsSenderMaxBandwidthBps", oldValue)getbase()→ integerReturns the attached Roblox module base address. Also memory.getbase().
memory_read(type, address)→ valueReads int, float, double, byte, pointer/uintptr_t, bool, or a null-terminated string (max 4096 bytes).
memory_write(type, address, value)→ nilWrites a supported primitive or raw string bytes.
memory_readvector3(address)→ Vector3Reads three contiguous floats.
memory_writevector3(address, value)→ nilWrites a Vector3 as three contiguous floats.
getfflag(name)→ integerReads a verified allowlisted fast flag.
setfflag(name, value)→ nilWrites a verified allowlisted fast flag.
Writes can destabilize the client
The verified FFlag allowlist currently contains PhysicsSenderMaxBandwidthBps and PhysicsSenderMaxBandwidthBpsScaling. Other names raise an explicit error.
Safety
Meridian is an external Lua 5.4 host, not Roblox's internal Luau VM. It reproduces useful behaviour only where the external can do so truthfully. Code that relies on engine-owned garbage collection, bytecode, or signals must use a verified game-specific adapter instead.
decompile / getscripthash / getscriptbytecodeRequires a game-specific bytecode adapter.getinstances / getscriptsOnly DataModel-reachable objects and Meridian virtual Instances are discoverable.getnilinstancesReturns parentless virtual Instances only; unreachable engine objects cannot be scanned externally.getgc / setgc / applygcRoblox garbage-collector scanning and mutation are unavailable.run_secureProtected payloads are not compatible with Meridian.Signals and RunServiceCooperative external equivalents are provided; they are not engine-owned Luau threads or exact frame phases.Instance attributesVirtual Instances support script-owned attributes. Address-wrapped engine attributes still return nil.Live pingGetPingValue currently returns 0.Sandboxed host surfaces
io, debug, package, dofile, and loadfile are removed. Dangerous os functions such as execute, exit, remove, rename, and tmpname are also removed. Use the documented workspace file API instead.Ready to build
Open bladeball_ai_meridian.lua in the script library to see six tabs, live telemetry, keybinds, Drawing-compatible datatypes, input, callbacks, and cleanup in a complete script.