Documentation menu

Getting started

Quick start

Last updated October 22, 2026

Four commands#

mkdir my-game && cd my-game
embr init                     # interactive manifest wizard
embr add chief/core           # resolve + record a dependency (Ember registry)
embr install                  # download, link, write ember.lock

What you get#

my-game/
  ember.toml
  ember.lock
  packages/
    shared/
      core.luau              <- generated link file: require this
      .ember/
        chief_core/          <- the actual package contents

Require packages from the packages folder — each entry in it is a generated link file that re-exports the package and its types:

const core = require("@packages/core")

Here @packages is a require alias pointing at the output folder (packages/shared in this project; in Roblox it would resolve to something like ReplicatedStorage.packages).

Only what you declared gets a link file like core.luau. Whatever your dependencies depend on lives inside .ember/ and is reached by them, not by you. See Dependencies & installing for how linking works.

Project commands#

Anything you type often goes in [scripts], as one command or a list that runs at once:

[scripts]
build = "rojo build -o game.rbxl"
serve = ["larvae process -w", "rojo serve"]   # a list runs at once
embr run          # list every script, grouped by how you reach it
embr build        # build/test/start/serve/dev/fmt need no `run`
embr run lint     # everything else does

See embr run, and Lifecycle hooks for the pre/post entries Ember fires by itself.

Editor setup#

Using VS Code (or a fork like Cursor)? Install the Even Better TOML extension, then run embr self code once to get completions, validation, and hover docs for ember.toml.

Publishing#

embr publish

Signs in with GitHub (device flow, no OAuth scopes requested), and your first publish claims your scope. Read Publishing before you ship: authors grants scope co-ownership, and published versions are immutable.