The manifest
ember.toml at a glance
Last updated October 23, 2026
Everything Ember knows about a project lives in one file: ember.toml. Each
table has its own page in this section; this one is the map.
The whole file at a glance#
[package]
name = "chief/core" # scope/name, lowercase; required
version = "0.1.0" # semver; required
description = "The core of Chief, a Luau module framework" # optional; max 200 chars
authors = ["ryancundiff"] # GitHub usernames — publish access to the scope!
repository = "ryancundiff/chief" # owner/repo or GitHub URL; optional
license = "MIT" # optional
logo = "assets/logo.png" # optional; .png, .jpg, or .webp, at most 512 KiB
private = true # optional; publish refuses this package
[target]
environment = "roblox" # roblox | roblox_server | lune | lute | seal | zune | luau; required
language = "luau" # luau | alloy | loom | luwu; optional, default luau
main = "src/init.luau" # entry point; optional (see detection order)
includes = ["src", "LICENSE"] # optional; publish file selection
excludes = ["src/tests"] # optional; subtracted from the selection
workspace = ["packages/*"] # optional; makes this a workspace root
[indices] # optional; named indices for dependencies
wally = "https://github.com/UpliftGames/wally-index"
pesde = "https://github.com/pesde-pkg/index"
default = "https://github.com/pesde-pkg/index" # overrides Ember's registry for bare deps
[dependencies] # optional
Promise = { name = "evaera/promise", version = "^4.0.0", index = "wally" }
Bin = { name = "chief/bin", version = "^" } # no index = default
Traits = { workspace = "chief/traits", version = "^" } # workspace member
Lapis = { name = "brinkokevin/lapis", version = "^", target = "roblox_server" } # install under server
Vow = { name = "synttx/vow", version = "^", entry = "src/vow" } # pick the module to link
[overrides] # optional; replace a dependency's dependency
"Traits.Promise" = "Promise" # alias shorthand: Traits gets my Promise
"Traits.Bin" = { name = "acme/bin", version = "^2" } # or a full specifier
[patches] # optional; written by `embr patch commit`
"chief/bin@0.2.0" = "patches/chief_bin@0.2.0.patch"
[tools] # optional; key = the command name you type
rojo = "rojo-rbx/rojo@7.7.0"
[scripts] # optional; `embr run <key>`, bare `embr run` lists them
build = "rojo build -o game.rbxl" # build/test/start/serve/dev/fmt drop the `run`
serve = ["larvae process -w", "rojo serve"] # a list runs at once, tagged [1] [2]
prebuild = "rm -rf build" # hooks are just scripts named pre<name>/post<name>
postinstall = "embr build" # commands hook their verb: install, add, publish
[studio] # optional; one form only
universe = 13058
place = 1818
# file = "game.rbxl"
[config] # optional; per-environment install folders
roblox-packages-out = "packages/roblox" # these are the defaults
server-packages-out = "packages/server"
lune-packages-out = "packages/lune"
luau-packages-out = "packages/luau"
lute-packages-out = "packages/lute"
seal-packages-out = "packages/seal"
zune-packages-out = "packages/zune"
Table by table#
- [package] — who the package is: name rules,
the version, the description cap, authors (and the access they grant),
the repository link, the logo,
private. - [target] — where the code runs and what
ships: environments, the language, which packages fit a project,
entry-point detection,
includes/excludesand their accepted spellings, workspace roots. - [dependencies] & [indices] — both
dependency forms, what version requirements mean, aliases and link
names, the per-dependency
entryandtargetkeys, named indices and the specialdefaultkey. - [overrides] — redirecting a dependency's dependency, alias paths, and exactly what one override changes.
- [patches] — keeping local edits to a dependency across installs.
- [tools], [scripts] & [studio] — pinned binaries and their exact spec format, project scripts, and what Studio opens.
- [config] — where each environment installs.
Accepted spellings#
The manifest accepts a few alternate spellings for compatibility, all
documented on their tables' pages: include/exclude for
includes/excludes, and pesde's workspace_members for workspace.
Write the canonical names; the aliases exist so foreign manifests parse.
Editor IntelliSense#
embr self code points VS Code (and its forks) at the hosted
ember.schema.json, which gives
ember.toml completions, validation, and hover docs for everything above.
See embr self.