AI Skill Report Card

Writing LinusWare Scripts

A88·Oct 26, 2026·Source: Web
15 / 15

Save as scripts/MyScript.luau (folder next to run.sh, rescanned every 2s). Script auto-starts when a place loads.

LUA
local Players = game:GetService("Players") local me = Players.LocalPlayer while true do local on = lw.toggle("Show players", true) local color = lw.color("Box color", Color3.fromRGB(255, 90, 90)) for _, player in Players:GetPlayers() do local character = player.Character if player ~= me and character then lw.esp(character, on and { color = color, distance = true } or false) end end task.wait(0.5) end

Press F5 in the editor to save+run. Toggle the script on in the Scripts page's SCRIPTS card.

Recommendation▾
Add a brief troubleshooting section mapping common console error messages to fixes, to make debugging workflows even faster
  • Scripts run in LinusWare's own Luau VM, not inside Roblox. Nothing is injected into the game.
  • Instance reads come from memory reads (same as the ESP). Instance writes (Property = value, Instance.new, Destroy) are queued and applied on the game's own thread on its next frame — reading back immediately gives the old value.
  • Everything else that affects the game (movement, input, clicks, cheats) goes through lw, input, and the virtual mouse/keyboard — never direct game calls.
  • Events are polled once per tick (60Hz), so they fire one tick late. Only events explicitly documented in the API exist — no Touched, no Changed (use GetPropertyChangedSignal).
14 / 15

Progress:

  • Decide what the script reads (ESP targets, instances, raycasts) vs. what it changes (settings, movement, instance properties)
  • Declare any UI/settings widgets (lw.toggle, lw.slider, lw.color, lw.dropdown, lw.keybind, or lw.ui.window for a custom window) — call these every loop iteration, not once
  • Write the main loop with task.wait() somewhere inside it to stay under the yield limits
  • Use lw.esp, Drawing.new, lw.log for visuals/feedback
  • Use lw.set/lw.get/lw.fly/lw.teleport/lw.path/lw.follow for movement and cheat toggles
  • Wrap risky instance access in nil-checks (characters, humanoids disappear)
  • Test via F5, check the SCRIPT card's status and CONSOLE for errors
Recommendation▾
Include a minimal API reference or link/table summarizing key lw.* functions for quick lookup instead of relying solely on inline examples
18 / 20

Example 1 — Aimbot-style FOV circle + keybind toggle Input: "toggle aimbot with a keybind and show an FOV circle while active" Output:

LUA
while true do local key = lw.keybind("Aimbot key", Enum.KeyCode.CapsLock) local fov = lw.slider("FOV", 90, 10, 180) if key and lw.keyPressed(key) then local on = lw.get("aimbot") lw.set("aimbot", not on) end lw.set("fov", fov) task.wait() end

Example 2 — Walk a path to a fixed point Input: "teleport-walk my character to a coordinate using pathfinding" Output:

LUA
local root = game:GetService("Players").LocalPlayer.Character.HumanoidRootPart local path, why = lw.path(root.Position, Vector3.new(120, 5, -40), { jump = 6 }) if path then local follow = lw.follow(path, { mode = "teleport", speed = 60 }) while not follow.Done do task.wait() end lw.log(follow.Failed and follow.Reason or "arrived", "info") else warn("no path:", why) end

Example 3 — Custom window instead of SETTINGS card Input: "build a standalone UI window with a combat section" Output:

LUA
local win = lw.ui.window("My script", { size = Vector2.new(700, 480) }) local section = win:tab("Main"):section("Combat", "left") local enabled = section:toggle("Enabled", false, function(on) print("enabled", on) end) section:slider("FOV", 30, 120, 70, { suffix = "deg" })
Recommendation▾
Consider showing one 'bad vs good' code comparison explicitly (e.g., busy loop vs yielding loop) to reinforce the pitfalls section with concrete contrast
  • Always yield inside loops. task.wait() at minimum once per iteration — scripts die after 100ms (500ms on first run) without yielding, or 250ms total per tick.
  • Call card widgets every loop, never cache them outside — they return live values and are how settings persist.
  • Nil-check characters/humanoids/parts before indexing; they can vanish between ticks since everything is memory-read based.
  • Clean up on toggle-off: lw.esp(target, false) to remove boxes, rely on script stop to clear drawings/esp automatically, but explicit cleanup avoids stale state while still running.
  • Filter your own character out of raycasts (RaycastParams.FilterDescendantsInstances) since your character is in the world snapshot too.
  • Use lw.log for user-facing feedback (toasts) instead of just print, when something needs visibility outside the console.
  • Respect remote argument types: lw.fire infers types from previously observed server sends — turn on the remote spy first if a new type raises an error.
  • Batch HTTP and remote calls: 16 in-flight HTTP requests total, 60 lw.fire calls/sec, 240 input events/sec — all shared across scripts.
  • Keep labels (toggles, sliders, windows) short, stable, and unique — they're the saved-identity key in the config.
  • Writing while true do end or any busy loop with no yield — this stops the script, not the game, after 100ms.
  • Expecting instance writes to apply synchronously — part.Transparency = 0; print(part.Transparency) still prints the old value until the next frame.
  • Trying to use executor-only functions (hookfunction, getrawmetatable, firesignal, file I/O) — none exist here, there's no injection into Roblox.
  • Calling SetAttribute, PivotTo, Clone, BreakJoints, MoveTo, SetPrimaryPartCFrame — these all raise errors; move parts via CFrame/Position writes or use lw.teleport for your own character.
  • Expecting InvokeServer — doesn't exist; only lw.fire (= FireServer) is available, fire-and-forget.
  • Relying on Mouse.Target/Mouse.Hit for real hit detection — Target is always nil, Hit is just a 1000-stud ray point; use workspace:Raycast instead.
  • Assuming GetTags/HasTag work — tags are never read, always empty/false.
  • Ignoring the "world snapshot still loading" case from Raycast/lw.path — check the second return value before treating a nil result as a definite miss.
  • Forgetting AI-run scripts need "Allow AI actions" for settings, movement, input, and HTTP to work when executed via run_luau.
  • Loading more than 64 scripts or exceeding 20000 drawings / 1024 ESP targets / 64 widgets / 4 windows per script — these are hard caps, not soft warnings.
0
Grade AAI Skill Framework
Scorecard
Criteria Breakdown
Quick Start
15/15
Workflow
14/15
Examples
18/20
Completeness
19/20
Format
14/15
Conciseness
14/15