Sandbox
Scripts run in a restricted Lua 5.4 environment. Only a subset of the standard library is loaded. Anything that touches the filesystem, OS, or arbitrary module loading is blocked. Network access goes through a separate API that can be disabled from the menu.
Loaded libraries
base, core language functions (type,pairs,pcall,tostring,error, etc.)math, math functions (sin,cos,sqrt,floor,random, etc.)string, string manipulation (find,format,sub,gsub,match, etc.)table, table operations (insert,remove,sort,concat,unpack, etc.)coroutine, coroutine control (yield,resume,create,wrap, etc.)utf8, Unicode string handling (len,codes,char,codepoint, etc.)
Blocked libraries
io. No file read/writeos. Noos.execute,os.remove,os.clock, etc.package. Norequirepaths or module loadingdebug. Nodebug.getinfo,debug.sethook, stack inspection
Common replacements
Replacements for common blocked libraries:
- Need to persist data? Use Storage instead of
io. - Need timing? Use the global
clock()function instead ofos.clock. - Need network access? Use the HTTP library, opt-in, kill-switchable from the menu.
- Need modular code? Use
exportandimport.requireis blocked, but the engine provides two globals for cross-script module sharing:
lua
-- In your library script (e.g. utils.lua):
export("utils", {
clamp = function(v, lo, hi) return math.max(lo, math.min(hi, v)) end,
})
-- In any other script:
local utils = import("utils")
if utils then
local x = utils.clamp(value, 0, 100)
endexport(name, module) registers a table under a name. import(name) fetches it; returns nil if the exporting script hasn't loaded yet, so guard with an if.