Documentation menu

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.

EnvironmentRuns onBuilt-in librariesConfig filesCode files
robloxRoblox, client or serverthe Roblox APIa Rojo project.luau, .lua
roblox_servera Roblox serverthe Roblox APIa Rojo project.luau, .lua
luneLune@lune/*.luaurc.luau, .lua
luteLute@std/*, @lute/*.luaurc, .config.luau.luau, .lua
sealSeal@std/*, @interop/*.luaurc, .config.luau, .seal/config.luau.luau only
zuneZunethe global zune table.luaurc, zune.toml.luau, .lua
luauevery environmentnonenone.luau, .lua

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.