A Beginner's Guide to Luau in Roblox Studio
You do not need to be a programmer to use companion tools, but understanding how Luau works makes the difference between guessing what a tool does and actually reading the code before you trust it. This guide gets you to that point in about an hour of reading.
Lua, Luau, and why Roblox uses one and not the other
Lua is a small, fast, embeddable scripting language designed in the 1990s in Brazil. Roblox originally embedded Lua as-is, then over the past decade forked it into Luau — gradually adding optional static typing, performance improvements, and safety tweaks. Today every line of code that runs inside a Roblox game is Luau, even when it looks like plain Lua.
For tool authors this matters because the language gives you primitives like type checking and continue statements that vanilla Lua does not. For tool readers it matters because Luau code that "looks weird" — :: type annotations, type Foo declarations, the && operator — is not a typo. It is just newer Luau syntax.
The five concepts that unlock everything else
Tables are the only collection type
Luau has one collection type — the table — and it doubles as array, dictionary, struct, and class. When you see local players = {} the variable could become a list of player objects, a key-value map of usernames to scores, or a record with named fields. Context tells you which.
Functions are values
You can put a function in a variable, in a table, or pass it as an argument. The pattern game:GetService("Players").PlayerAdded:Connect(function(plr) ... end) at the top of every Roblox script is a function value being passed to an event.
Services are how you reach the engine
game:GetService("Workspace") returns the global Workspace; game:GetService("ReplicatedStorage") returns the shared replicated container; game:GetService("RunService") gives you frame-by-frame loops. Reading any community tool starts with knowing what the most-used services do.
Events and connections
Most Roblox code reacts to events: a player joining, a key being pressed, a part being touched. Tools usually attach a function to an event with :Connect(...). When the tool is unloaded, those connections need to be :Disconnect()-ed or the tool keeps consuming CPU silently.
Coroutines and task scheduling
task.spawn, task.delay, and task.wait replace the older wait() and spawn() patterns. Modern tools use them because they integrate properly with the Roblox scheduler and avoid the throttling Roblox applies to legacy timing functions.
Reading a real tool
Open any tool listing on RblxScript and look at the code block. The first ten lines almost always tell you what the tool will do: what services it pulls in, what global tables it sets up, what UI it injects. The middle is the actual logic, usually a few event handlers and loops. The bottom is teardown — how the tool cleans up after itself.
Where to learn the language properly
Roblox publishes the Luau Reference Manual at luau-lang.org and a hands-on coding course at create.roblox.com/docs. Both are free and the second one covers Studio basics in addition to the language. After a weekend of going through the official tutorials you will read most community tools fluently.
Browse community tools
Now that you can read Luau, see what authors are building.