Documentation menu

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/excludes and their accepted spellings, workspace roots.
  • [dependencies] & [indices] — both dependency forms, what version requirements mean, aliases and link names, the per-dependency entry and target keys, named indices and the special default key.
  • [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.