Guides
Runtimes
Last updated October 22, 2026
Ember installs into seven environments. Each one is a value of
[target] environment, and each one installs into its own
output folder. A project takes packages for its
own environment or portable Luau, with two exceptions for roblox
packages. See What a project installs.
| Environment | Runs on | Built-in libraries | Config files | Code files |
|---|---|---|---|---|
roblox | Roblox, client or server | the Roblox API | a Rojo project | .luau, .lua |
roblox_server | a Roblox server | the Roblox API | a Rojo project | .luau, .lua |
lune | Lune | @lune/* | .luaurc | .luau, .lua |
lute | Lute | @std/*, @lute/* | .luaurc, .config.luau | .luau, .lua |
seal | Seal | @std/*, @interop/* | .luaurc, .config.luau, .seal/config.luau | .luau only |
zune | Zune | the global zune table | .luaurc, zune.toml | .luau, .lua |
luau | every environment | none | none | .luau, .lua |
Link files work in every runtime#
Ember writes each link file as .luau with a string require. Lune, Lute,
Seal, and Zune all resolve string requires and .luaurc aliases. The same
install layout works in each of them.
Roblox and Roblox Server#
roblox is Roblox code for the client or the server. Its old name is
shared, and every manifest and lockfile that says shared still parses.
roblox_server is Roblox code for the server only. It is pesde's name for
the environment. Its old name is server, which still parses everywhere.
A roblox_server project takes roblox packages too, as wally's realm
rule does. Its packages install into packages/server.
Lune#
A lune project takes roblox packages too, because Lune runs Roblox code
through its @lune/roblox DOM. Lute has no such library, so a lute
project takes no roblox package.
Portable Luau#
A luau package uses no runtime API. It installs in every environment,
Roblox included. Publish a library as luau when it needs nothing from a
runtime.
The search page lists portable packages under every environment. Clear Show portable Luau packages under every environment to see only the packages published for one environment.
Seal#
Seal loads .luau files only. A package that ships .lua files
fails at require time under Seal. Publish .luau files for a Seal package.
Seal and Lute both own @std, with different APIs. A package
written against one @std does not run on the other.
embr init prints a note about both when you pick seal.
Zune#
Zune scripts reach the runtime through the global zune table. A Zune
project can also read zune.toml.
Set the environment#
embr init lists all seven. In an existing project, set it by hand:
[target]
environment = "seal"
A dependency for another environment fails the install. A target on the
dependency takes it on purpose. See
What a project installs.