AI Skill Report Card
Writing LinusWare Scripts
Quick Start15 / 15
Save as scripts/MyScript.luau (folder next to run.sh, rescanned every 2s). Script auto-starts when a place loads.
LUAlocal 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
Core Mental Model
- 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, noChanged(useGetPropertyChangedSignal).
Workflow14 / 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, orlw.ui.windowfor 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.logfor visuals/feedback - Use
lw.set/lw.get/lw.fly/lw.teleport/lw.path/lw.followfor 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
Examples18 / 20
Example 1 — Aimbot-style FOV circle + keybind toggle Input: "toggle aimbot with a keybind and show an FOV circle while active" Output:
LUAwhile 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:
LUAlocal 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:
LUAlocal 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
Best Practices
- 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.logfor user-facing feedback (toasts) instead of justprint, when something needs visibility outside the console. - Respect remote argument types:
lw.fireinfers 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.firecalls/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.
Common Pitfalls
- Writing
while true do endor 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 viaCFrame/Positionwrites or uselw.teleportfor your own character. - Expecting
InvokeServer— doesn't exist; onlylw.fire(=FireServer) is available, fire-and-forget. - Relying on
Mouse.Target/Mouse.Hitfor real hit detection —Targetis always nil,Hitis just a 1000-stud ray point; useworkspace:Raycastinstead. - Assuming
GetTags/HasTagwork — 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.