A Roblox game in native Luau, set up so that as much as possible is verified before anything touches a Roblox server: strict type-checking, linting, formatting, headless unit tests, and a headless place build — all runnable on Linux/CI with zero Roblox credentials.
Working with an AI coding agent? The rules live in AGENTS.md (Codex et al.) and CLAUDE.md (Claude Code — imports the same file).
- Install Rokit (toolchain manager).
- Then:
rokit install # installs pinned Rojo, StyLua, selene, luau-lsp, Lune
lune setup # one-time: @lune/* type definitions
lune run check # run every quality gate| Command | What it does |
|---|---|
lune run check |
all quality gates (format, lint, types, tests, build) |
lune run test |
unit tests only (append -- --update-snapshots to refresh snapshots) |
lune run analyze |
strict type analysis via luau-lsp (Roblox + Lune passes) |
stylua src tests lune |
auto-format |
rojo build default.project.json -o build.rbxl |
build the place file |
rojo serve |
live-sync into Roblox Studio while editing |
src/shared— pure game logic (no Roblox APIs; unit-tested under Lune)src/server— services (pure, dependency-injected, tested) + adapters/composition root (thin Roblox glue)src/client— thin client gluetests— tiniest specs + fakeslune— task scripts and vendored libsdocs/cloud-integration-tests.md— planned Roblox Open Cloud test harness (not wired up yet)
The example feature slice (player currency: Wallet + CurrencyService +
DataStoreAdapter) demonstrates the architecture every new feature should
follow — pure logic in shared, effects behind injected interfaces, glue kept
too thin to need tests.