External vs Executor
The concrete differences between the two builds, and how a script written for one gets rewritten for the other.
| Executor | External | |
|---|---|---|
| Runs | Inside the Roblox process | In its own process |
| Instances are | Instance userdata | number addresses |
| Reaching the tree | game:GetService("Players") | find_first_child(get_datamodel(), "Players") |
| Properties | part.Transparency = 1 | write_BasePart_Transparency(part, 1) |
| Script compatibility | Hub scripts drop in | Scripts are written against this API |
| Survives Roblox updates | Needs a module update | Needs an offset update |
| Stream proof overlay | No | Yes |
The mechanical part is always the same: replace tree traversal with the explorer functions, and replace property access with the matching offset accessor.
What you would write inside Roblox
-- Executor
local part = workspace:FindFirstChild("Baseplate")
part.Transparency = 0.5
print(part.Name)The same thing from outside
-- External
local dm = get_datamodel()
local workspace_ = find_first_child(dm, "Workspace")
local part = find_first_child(workspace_, "Baseplate")
write_BasePart_Transparency(part, 0.5)
print(read_name(part))find_instance_by_path collapses the traversal when you already know where something lives, which is usually the readable option.
The short version
local part = find_instance_by_path("Workspace.Baseplate")
write_BasePart_Transparency(part, 0.5)- Signals and events. There is no :Connect. Polling on a wait() loop is the pattern.
- Metatables and hooking. There is no Luau VM inside Roblox to hook. getrawmetatable here operates on your own tables.
- Remotes. No FireServer. Anything that has to talk to the server has to be driven through the game's own code, which the External does not execute.
- Anything UNC-specific to in-process work. The UNC surface here covers what makes sense outside the process; the rest has no meaning.
Pick the build for the job
The External is for visuals, memory work and anything where not being inside the process matters. If a script needs to talk to the server, it needs the executor.