EZ Project Manager
A CLI build tool for Roblox projects that handles the tedious parts of the development pipeline (path aliasing, require path correction, DarkLua transformation, and Rojo live sync) so you can write Luau and not think about build plumbing.
ezpm is written in Luau, runs on Lune, and compiles to standalone binaries for Linux, macOS, and Windows.
Key Features
- Single-command dev server — File watcher, DarkLua processing, sourcemap generation, and Rojo live sync all run together via
ezpm serve. - Automatic require path fixing — Scans your source tree and rewrites
require()calls to use@alias/notation, eliminating broken or inconsistent paths. - Path alias management — Define aliases in
ezpm.tomlonce;.darklua.jsonand.luaurcare generated automatically to keep DarkLua and your LSP in sync. - Project scaffolding —
ezpm initdetects existing config files, imports aliases, creates directory structure, and generatesdefault.project.json. - Integrated toolchain — Linting (Selene), formatting (StyLua), Wally package installation, and Moonwave docs from one interface.
- Interactive menu — Arrow-key navigation for all commands. Subcommands also work directly from the CLI.
Installation
Requires Rokit.
rokit add Breezy1214/ezpm # install ezpm
To update to the latest version:
rokit update ezpm
Manual installation
From release binaries — Download a prebuilt binary from Releases for your platform (Linux, macOS, or Windows — x86_64 and aarch64). Extract and place ezpm on your PATH.
From source:
git clone https://github.com/Breezy1214/ezpm.git
cd ezpm
rokit install # installs Lune, Rojo, DarkLua, Wally, etc.
lune run ezpm # launches the interactive menu
Quick Start
New project
ezpm init # scaffolds directories, generates ezpm.toml, .darklua.json, .luaurc
ezpm serve # starts the dev server with file watching and Rojo sync
Existing project
If you already have a Rojo project with a .darklua.json:
ezpm init # detects existing files, offers to import aliases
ezpm serve # ready to go
Usage
Run ezpm with no arguments to open the interactive menu, or use subcommands directly:
ezpm Interactive menu
ezpm serve Dev server (file watcher + DarkLua + Rojo)
ezpm fix-requires One-shot require path correction
ezpm install Rokit install + Wally packages + type generation
ezpm lint Selene + StyLua --check
ezpm format StyLua format
ezpm init Scaffold project and generate ezpm.toml
ezpm alias add Add a path alias
ezpm alias remove Remove a path alias
ezpm alias list List configured aliases
ezpm docs Moonwave documentation server
ezpm help Print usage
What serve does
- Generates
build.project.jsonfromdefault.project.json(remaps source paths to the DarkLua output directory) - Generates a Rojo sourcemap
- Fixes require paths across your source tree
- Runs DarkLua to transform
@aliasrequires into Roblox-compatible paths - Starts Rojo with live sync to Studio
- Watches for file changes and re-runs steps 2-4 automatically
Configuration
Configuration lives in ezpm.toml. If the file is absent, defaults are used.
[project]
name = "my-roblox-game"
[paths]
src = "src"
darklua_build = "darklua_build"
[display]
file_changes = true
docs_enabled = false
[aliases]
Client = "src/client/"
Server = "src/server/"
Shared = "src/shared/"
Packages = "Packages/"
ServerPackages = "ServerPackages/"
Aliases
Aliases are the core mechanism for clean require paths. Define them under [aliases] in ezpm.toml — this is the single source of truth. Both .darklua.json and .luaurc are regenerated from these aliases automatically. Do not edit those files by hand; use the CLI:
ezpm alias add # interactive prompt for name and path
ezpm alias remove # select from existing aliases
ezpm alias list # display current aliases
Toolchain
Tools are managed via Rokit and pinned in rokit.toml. The default toolchain includes:
| Tool | Purpose |
|---|---|
| Lune | Luau runtime (runs ezpm itself) |
| Rojo | Studio sync |
| DarkLua | Require path transformation and Lua optimization |
| Wally | Package manager |
| Selene | Linter |
| StyLua | Formatter |
Limitations
- Polling-based file watcher. File change detection uses a 1-second polling interval, not OS-level filesystem events. Changes are picked up reliably but not instantly.
- No relative require paths. The require fixer does not support
./or../paths. All requires must use@alias/notation or absolute source paths. - Rojo port is hardcoded. The dev server uses Rojo’s default port (34872). Running multiple instances simultaneously requires manual port management.
- DarkLua is required. The build pipeline assumes DarkLua for path transformation. There is no bypass for projects that don’t need it.
- Early stage. The project is at v0.1.0. APIs and config format may change.