MERIDIANACCOUNT PORTAL
LuaVMAPI v1.2 Sandboxed

Build with the full power of Meridian LuaVM.

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.

Start building

Fresh state

Every run starts isolated

Native output

Drawing and scripted UI

Guarded access

Safe by default

Start here

From editor to first run

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.

1

Attach

Launch Meridian, join Roblox, and wait for Overlay ready.

2

Open LuaVM

Press Insert and choose LuaVM in the top navbar.

3

Run

Use Run new for another worker. Stop one from Active scripts, or use Stop all.

hello-meridian.lua
-- 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)
end

Where scripts live

The script library reads %APPDATA%\Meridian\scripts. File functions and require are intentionally limited to its workspace subfolder.

Runtime

Fresh, isolated Lua 5.4 VMs

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.

runtime-metadata.lua
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)   -- true

Long-running scripts

Yield regularly with 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

Control Meridian from Lua

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.

feature-control.lua
-- 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 | nil

Returns whether a Meridian feature is enabled. Unknown names return nil.

meridian.setfeature(name, enabled)boolean

Enables or disables a feature and returns its new state.

meridian.togglefeature(name)boolean

Flips 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 | nil

Reads a setting. Names ignore case, spaces, dashes, and underscores.

meridian.setsetting(name, value)number | boolean

Changes a setting, clamps numeric values to its supported range, and returns the stored value.

meridian.execute(command)boolean, string

Runs 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 | nil

Finds a cached player by exact, prefix, or partial display name.

meridian.localplayer()LocalPlayerSnapshot

Returns the attached local player, character, root address, and position when available.

meridian.refreshplayers()integer

Refreshes the shared player cache immediately and returns its size.

meridian.teleport(playerOrName)boolean

Teleports the local player to a target supplied as a snapshot, address, or name.

meridian.view(playerOrName)boolean

Moves the local camera subject to a target supplied as a snapshot, address, or name.

meridian.unview()boolean

Restores the camera to the local humanoid.

meridian.selectedplayer()PlayerSnapshot | nil

Returns the player selected in Meridian's Player list workspace.

meridian.saveconfig(name)boolean

Saves the current Meridian feature configuration under a name.

meridian.loadconfig(name)boolean

Loads a named Meridian feature configuration.

meridian.listconfigs()string[]

Refreshes and returns the available named configurations.

meridian.panic()true

Immediately disables active combat, visual, and movement overrides.

meridian.notify(message, title?, type?, duration?)nil

Shows a native Meridian notification. Type accepts Info, Success, Warning, or Error; title defaults to Meridian and duration defaults to four seconds.

meridian.clearmodulecache(path?)true

Invalidates one cached workspace module, or the complete module cache when path is omitted.

meridian.compatibility.isEnabled()boolean

Returns whether Roblox compatibility translation is enabled.

meridian.compatibility.setEnabled(enabled)boolean

Enables or disables virtual Instance and GUI translation globally, then returns the stored state.

meridian.compatibility.capabilities()table

Returns granular capability flags, including explicit false values for engine hooks and getgc.

Convenience globals

Core calls are also 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 and setting keys

Feature names are aimbot, triggerbot, esp, fly, noclip, desync, infjump, walkspeed, jumppower, animationchanger, teamcheck, and keybindhud.

Setting keyTypeAccepted valueEffect
aimbot fovnumber1..1000Aimbot field-of-view radius.
aimbot smoothingnumber1..100Cursor movement smoothing.
aimbot targetinteger0..2Target bone index: implementation-defined UI order.
aimbot methodinteger0..1Aim method index: implementation-defined UI order.
aimbot predictionbooleantrue / falseEnables velocity prediction.
aimbot prediction amountnumber0..3Prediction multiplier.
aimbot stickybooleantrue / falseKeeps the current valid target locked.
triggerbot cpsnumber1..30Clicks per second.
triggerbot radiusnumber1..100Activation radius around the cursor.
fly speednumber1..500Camera-relative fly speed.
walkspeednumber0..500Humanoid WalkSpeed override.
jumppowernumber0..500Humanoid JumpPower override.
esp max distancenumber1..50000Maximum ESP render distance.
esp box styleinteger0..2Box style index: full, corner, or rounded.
esp boxesbooleantrue / falsePlayer boxes.
esp namesbooleantrue / falsePlayer names.
esp distancebooleantrue / falseDistance labels.
esp health barbooleantrue / falseHealth bars.
esp skeletonbooleantrue / falseCharacter skeletons.
esp snaplinesbooleantrue / falseScreen-to-player snaplines.
esp health textbooleantrue / falseNumeric health labels.
esp equipped itembooleantrue / falseEquipped item labels.
esp offscreen arrowsbooleantrue / falseOff-screen direction indicators.
desync display positionbooleantrue / falseShows 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

Players and live snapshots

Player functions use Meridian's shared live cache. A PlayerSnapshot contains Address, CharacterAddress, HumanoidAddress, RootPartAddress, Name, Health, MaxHealth, Distance, EquippedItem, Position, and ClassName.

player-tools.lua
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()
end
getplayers()PlayerSnapshot[]

Returns valid cached non-local players.

findplayer(name)PlayerSnapshot | nil

Matches a player by exact, prefix, or partial name.

getlocalplayer()LocalPlayerSnapshot

Returns the local player snapshot.

refreshplayers()integer

Forces a cache refresh and returns the cache size.

teleport(playerOrName)boolean

Teleports to a player.

view(playerOrName)boolean

Spectates a player.

unview()boolean

Returns the camera to the local player.

getselectedplayer()PlayerSnapshot | nil

Returns the selection from the Player list workspace.

Snapshots, not engine objects

Cached player tables describe a point in time. Refresh or look up the player again inside long loops, and always handle nil when a player leaves.

Game data

Instances and Roblox-style services

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.

instance-navigation.lua
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
end
existing-gui-port.lua
local 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

Supported creation covers 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

Frame and text geometry, colours, transparency, borders, UICorner/UIStroke, hierarchy, hover, and button clicks are translated. Roblox image assets, text editing, automatic layout, clipping, rotation, 3D adornment, and engine replication are not emulated. Unsupported world classes raise an explicit error instead of creating a fake engine object.

Globals and services

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.

Low-level address API

instanceinfo(address){ Address, Name, ClassName } | nil

Builds basic metadata for an instance address.

instancechildren(address)integer[]

Returns direct child addresses.

instancefindchild(address, name)integer | nil

Finds a direct child by name.

instancefindclass(address, className)integer | nil

Finds a direct child by class.

instanceposition(address)Vector3

Reads an instance position.

instancevelocity(address)Vector3

Reads assembly velocity.

instanceparent(address)integer | nil

Returns the parent address.

instanceprimarypart(address)integer | nil

Returns a model's PrimaryPart address.

instancehealth(address)number

Reads Humanoid health from an address.

instanceattribute(address, name)nil

Reserved compatibility call. Attributes are not exposed yet.

instancesetposition(address, position)nil

Writes an instance position from a Vector3.

instancesetvelocity(address, velocity)nil

Writes BasePart assembly velocity from a Vector3.

instancesethealth(address, health)nil

Writes a Humanoid's verified Health field.

Compatibility

Runtime and console reference

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?)number

Scheduler-aware alias of task.wait, defaulting to one frame. Stop requests interrupt it with an error.

task.wait(seconds?)number

Yields the current scheduled coroutine and returns elapsed time. On the main chunk it pumps the scheduler while waiting.

task.spawn(fn, ...)thread

Resumes a new coroutine immediately and schedules it again whenever it yields.

task.defer(fn, ...)thread

Schedules a coroutine for the next scheduler cycle.

task.delay(seconds, fn, ...)thread

Schedules a coroutine after the requested delay without blocking the worker.

task.cancel(thread)boolean

Cancels a thread returned by spawn, defer, or delay. Returns false when it is no longer scheduled.

spawn(fn, ...)thread

Alias of task.spawn.

tick()number

Seconds since the Meridian Lua runtime clock origin.

typeof(value)string

Returns Meridian datatype names when present, otherwise the Lua type name.

getfenv()table

Compatibility helper returning _G.

setfenv(fn, env)function

Lua 5.4 compatibility no-op that returns fn.

print(...)nil

Writes an informational console line.

printl(...)nil

Alias of print.

warn(...)nil

Writes a warning console line.

errorl(...)nil

Writes an error-styled console line without raising a Lua error.

notify(message, title?, type?, duration?)nil

Shows 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

Input, session and projection

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.

guarded-input.lua
setrobloxinput(true)

if isrbxactive() then
    mousemoveabs(640, 360)
    mouse1click()
end

setrobloxinput(false)
setrobloxinput(enabled)nil

Allows or blocks this script's synthetic input calls.

isrbxactive()boolean

True when the attached Roblox window is foreground.

setclipboard(text)boolean

Copies ANSI text to the Windows clipboard.

keypress(virtualKey)true

Sends a key-down event using a Windows virtual-key code.

keyrelease(virtualKey)true

Sends a key-up event using a Windows virtual-key code.

iskeypressed(virtualKey)boolean

Reads the current physical key state.

ismouse1pressed()boolean

Reads the left mouse button state.

ismouse2pressed()boolean

Reads the right mouse button state.

getmouseposition()integer, integer

Returns cursor X and Y relative to Roblox when attached.

mouse1press()nil

Sends left-button down.

mouse1release()nil

Sends left-button up.

mouse1click()nil

Sends a full left click.

mouse2press()nil

Sends right-button down.

mouse2release()nil

Sends right-button up.

mouse2click()nil

Sends a full right click.

mousemoveabs(x, y)nil

Moves the cursor to Roblox client coordinates.

mousemoverel(dx, dy)nil

Moves the cursor by a relative delta.

mousescroll(delta)nil

Sends a Windows mouse-wheel delta.

WorldToScreen(position)Vector2, boolean

Projects a Vector3 with the current view matrix and reports whether it lies on-screen.

getgamename()string

Returns the attached DataModel name, or Unknown.

GetPingValue()0

Compatibility 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

Files, modules, encoding and HTTP

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.

workspace-files.lua
-- 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)string

Reads an allowed workspace file as bytes.

writefile(path, contents)nil

Creates parent folders and replaces a workspace file.

appendfile(path, contents)nil

Creates parent folders and appends to a workspace file.

makefolder(path)boolean

Creates a workspace folder, including parents.

isfile(path)boolean

Checks for a regular file.

isfolder(path)boolean

Checks for a directory.

listfiles(path?)string[]

Lists a directory, sorted, using workspace-relative paths. Defaults to the workspace root.

delfile(path)boolean

Deletes a workspace file.

delfolder(path)boolean

Recursively deletes a workspace folder.

require(path)any

Loads and caches a .lua or .luau module from the workspace. The extension is required and circular dependencies raise an error.

base64encode(data)string

Base64-encodes bytes. Also available as base64.encode.

base64decode(data)string

Base64-decodes bytes. Also available as base64.decode.

httpget(url)string

Performs a GET with automatic proxy support and returns the response body.

httppost(url, body, contentType?)string

Performs a POST. Content type defaults to application/json.

game:HttpGet(url)string

Roblox-style alias of httpget.

game:HttpPost(url, body, contentType?)string

Roblox-style alias of httppost.

Per-script module cache

Repeated 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

Roblox-style datatypes

Meridian supplies Lua implementations of the geometry types most external scripts need. typeof() reports their Meridian type names and arithmetic returns typed values.

TypeConstructorPropertiesOperations and methods
Vector2Vector2.new(x?, y?)X, Y, Magnitude, Unit+, -, unary -, *, /; :Dot(other), :Lerp(other, alpha); zero, one, xAxis, yAxis
Vector3Vector3.new(x?, y?, z?)X, Y, Z, Magnitude, Unit+, -, unary -, *, /; :Dot, :Cross, :Lerp, :Abs, :Ceil, :Floor, :Sign, :FuzzyEq, :Angle, :Min, :Max; zero, one, axes
Color3Color3.new(r?, g?, b?)R, G, B in 0..1Color3.fromRGB(r, g, b), Color3.fromHSV(h, s, v), Color3.fromHex(hex)
CFrameCFrame.new(...)Position, LookVector, RightVector, UpVectorCFrame.Angles / fromOrientation; multiplication; :GetComponents, :Lerp, world/object vector and point transforms, :Inverse, Euler/orientation methods
UDimUDim.new(scale?, offset?)Scale, Offset+ and -
UDim2UDim2.new(...) / fromScale / fromOffsetX and Y as UDim+ and -
RectRect.new(min, max) / Rect.new(x0, y0, x1, y1)Min, Max, Width, HeightImmutable geometry value
NumberRangeNumberRange.new(min, max?)Min, MaxOne argument creates a constant range
NumberSequenceNumberSequence.new(value, endValue?)KeypointsAlso accepts NumberSequenceKeypoint[]
ColorSequenceColorSequence.new(color, endColor?)KeypointsAlso accepts ColorSequenceKeypoint[]
RayRay.new(origin, direction)Origin, Direction:ClosestPoint(point), :Distance(point)
Region3Region3.new(min, max)CFrame, Size, Min, MaxAxis-aligned region value
BrickColorBrickColor.new(name | number | Color3)Name, Number, ColorBrickColor.random()
TweenInfoTweenInfo.new(time?, style?, direction?, repeats?, reverses?, delay?)Time, EasingStyle, EasingDirection, RepeatCount, Reverses, DelayTimeUsed by TweenService:Create
EnumItemEnum.Category.NameName, Value, EnumTypetostring, :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

Overlay Drawing API

Drawing objects render in Meridian's DirectX overlay. Create one with Drawing.new(type), set its properties, and call :Remove() or :Destroy() when finished.

drawing-label.lua
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()
ObjectShape propertiesShared properties
LineFrom, ToVisible, Color, Transparency, Thickness, ZIndex
CirclePosition, Radius, NumSides, FilledVisible, Color, Transparency, Thickness, ZIndex
Square / RectanglePosition, Size (Vector2), Filled, Corner / RoundingVisible, Color, Transparency, Thickness, ZIndex
TextPosition, Text, FontSize, Center, OutlineVisible, Color, Transparency, ZIndex
TrianglePointA, PointB, PointC, FilledVisible, 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

Native Meridian UI library

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.

native-interface.lua
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)
end

Window and layout

CreateWindow({ 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()
ControlOptionsCallback value
AddToggleTitle, Description?, Default?, Keybind?, Mode?, Callback?boolean
AddButtonTitle, Description?, Callback?true on click
AddSliderTitle, Description?, Min?, Max?, Default?, Rounding? (0..4), Callback?number
AddDropdownTitle, Description?, Values, Default?, Callback?string
AddKeybindTitle, Description?, Default?, Mode?, Callback?boolean
AddInput / AddTextboxTitle, Description?, Default?, Callback?string
AddParagraphTitle, Contentstring

Control and library methods

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

New windows show Meridian's logo animation for 0.9 seconds by default. Set 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

The render thread only queues native events. Your Lua worker invokes callbacks when 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

Unsafe memory API

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.

unsafe-example.lua
-- 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()integer

Returns the attached Roblox module base address. Also memory.getbase().

memory_read(type, address)value

Reads int, float, double, byte, pointer/uintptr_t, bool, or a null-terminated string (max 4096 bytes).

memory_write(type, address, value)nil

Writes a supported primitive or raw string bytes.

memory_readvector3(address)Vector3

Reads three contiguous floats.

memory_writevector3(address, value)nil

Writes a Vector3 as three contiguous floats.

getfflag(name)integer

Reads a verified allowlisted fast flag.

setfflag(name, value)nil

Writes a verified allowlisted fast flag.

Writes can destabilize the client

Meridian validates the presence of an attachment and rejects very low addresses, but it cannot prove that an arbitrary address or type is correct. Use version-matched addresses, capture original values, and restore them on every exit path.

The verified FFlag allowlist currently contains PhysicsSenderMaxBandwidthBps and PhysicsSenderMaxBandwidthBpsScaling. Other names raise an explicit error.

Safety

Honest compatibility boundaries

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

Start with the bundled example.

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.