Luau Developer Toolchain Guide — Professional Workflow with Rojo, Selene, StyLua & Wally [2026]
Complete Luau developer toolchain guide. Covers professional workflow with Rojo (Studio sync), Selene (linter), StyLua (formatter), Wally (package manager), Rokit (toolchain manager), luau-lsp (language server), TestEZ (testing), and Lune (standalone runtime).
Roblox Studio alone has limits for large-scale development — an external toolchain is essential
Roblox Studio is a capable IDE, but it lacks professional-grade features like Git integration, static analysis, and package management. By combining Rojo, Selene, StyLua, and Wally, you can achieve a modern software development workflow equivalent to any mainstream tech stack.
Why the Toolchain Matters
The core challenges with Studio-only development: - Version control: Studio's `.rbxl` format makes Git diffs nearly unreadable - Code quality: No real-time detection of bugs or deprecated API usage - Team development: Simultaneous editing and code reviews are difficult - Dependency management: External library updates require manual effort An external toolchain solves all of these and dramatically improves team scalability.
Rojo: The Core of VSCode-Studio Synchronization
Rojo syncs `.luau` files from your filesystem to the Roblox Studio object tree in real time. Key features: - Git-manage Luau files in their natural directory structure - Start with `rojo serve`, then connect via the Studio plugin - Define file-to-Roblox tree mappings in `.project.json`
# Initialize a Rojo project
rojo init my-game
cd my-game
rojo serveJust click Connect in the Studio Rojo plugin — from then on, every file save triggers an automatic Studio update.
Selene: Luau-Native Static Linter
Selene is a high-performance static analysis tool written in Rust with native Roblox API support. Key capabilities: - Detects unused variables, shadowing, and deprecated API calls - Ships with built-in Roblox standard library definitions - Supports custom lint rules
# selene.toml
[lints]
global_usage = "allow"
roblox = trueCombined with the VSCode extension, warnings appear inline while you type.
StyLua: The Prettier for Luau
StyLua is a Lua/Luau-dedicated code formatter that automatically enforces consistent style across the entire team.
# stylua.toml
column_width = 120
indent_type = "Spaces"
indent_width = 4
quote_style = "AutoPreferDouble"
call_parentheses = "Always"# Format all source files
stylua src/
# Check mode for CI
stylua --check src/Integrating `--check` into your CI/CD pipeline prevents improperly formatted code from merging.
Wally: The Package Manager for Luau
Wally, hosted at `wally.run`, is the npm or Cargo equivalent for the Luau ecosystem.
# wally.toml
[package]
name = "myorg/my-game"
version = "0.1.0"
registry = "https://github.com/UpliftGames/wally-index"
[dependencies]
Promise = "evaera/promise@4.0.0"
ProfileService = "madstudioroblox/profileservice@1.0.0"
Signal = "sleitnick/signal@1.5.0"wally installRunning `wally install` generates a Packages folder, making libraries accessible via `require(Packages.Promise)`.
Rokit: The Toolchain Version Manager
Rokit manages Rojo, Selene, StyLua, and Wally versions through a single `rokit.toml`.
# rokit.toml
[tools]
rojo = "rojo-rbx/rojo@7.4.4"
wally = "UpliftGames/wally@0.3.2"
selene = "Kampfkarren/selene@0.27.1"
stylua = "JohnnyMorganz/StyLua@0.20.0"rokit installTeam members run `rokit install` once to get every tool at the exact same version — no version drift.
luau-lsp: Language Server for VSCode and Neovim
luau-lsp is an LSP implementation providing: - Autocomplete: Method completion for Roblox APIs and custom classes - Type checking: Static type errors from `--!strict` mode shown inline - Go to definition: Jump to ModuleScript source with F12 - Hover info: Inline function signatures and documentation Install the "Luau Language Server" VSCode extension and it starts automatically.
TestEZ: Unit Testing Framework
TestEZ is Roblox's official unit testing framework with a Jest-like API.
-- AnimalSpec.luau
return function()
describe("Animal", function()
it("should have correct name", function()
local animal = Animal.new("Rex", "Woof")
expect(animal:getName()).to.equal("Rex")
end)
end)
endPaired with Lune, tests can run outside Roblox Studio and integrate directly into CI/CD pipelines.
Lune: Standalone Luau Runtime in Rust
Lune runs Luau without Roblox Studio, making it ideal for build scripts, file operations, and HTTP calls in CI/CD.
-- build.luau
local fs = require("@lune/fs")
local process = require("@lune/process")
local result = process.spawn("rojo", {"build", "--output", "game.rbxl"})
if result.ok then
print("Build succeeded")
else
error(result.stderr)
endSetup Guide: From Zero to Pro Workflow
# 1. Install Rokit (tool manager)
curl -sSf https://raw.githubusercontent.com/rojo-rbx/rokit/main/scripts/install.sh | sh
# 2. Create rokit.toml and install all tools
rokit init
rokit add rojo-rbx/rojo
rokit add UpliftGames/wally
rokit add Kampfkarren/selene
rokit add JohnnyMorganz/StyLua
rokit install
# 3. Initialize Rojo project
rojo init
# 4. Initialize Wally and install packages
wally init
wally install
# 5. Generate Selene Roblox definitions
selene generate-roblox-std
# 6. Start developing
rojo serveTool Comparison Table
| Tool | Category | Primary Role | Priority |
|---|---|---|---|
| Rojo | File Sync | Real-time VSCode-Studio sync | Essential |
| Selene | Static Analysis | Bug, deprecated API, style detection | Highly Recommended |
| StyLua | Formatter | Automatic code style enforcement | Highly Recommended |
| Wally | Package Manager | External library install and updates | Essential for mid-large projects |
| Rokit | Tool Manager | Unified versioning across the team | Essential for teams |
| luau-lsp | Language Server | Autocomplete and type checking | Essential |
| TestEZ | Testing | Unit test execution | Essential for quality-focused projects |
| Lune | Runtime | CI tooling and build scripts | Valuable for advanced CI/CD |
Frequently Asked Questions
Q1. Isn't Roblox Studio alone sufficient? A. For solo small-scale projects, yes. But for team development, long-term maintenance, and code reviews, an external toolchain provides significant advantages in both speed and quality. Q2. What are the minimum essential tools for team development? A. Rojo (for Git management) and luau-lsp (for code completion) are the top priorities. Adding Rokit (version unification) and Selene (code quality) is strongly recommended next. Q3. How mature is Wally compared to npm or Cargo? A. The package count doesn't match npm, but all major Roblox development libraries — Promise, Signal, ProfileService, and more — are available. As of 2026, active maintenance continues. Q4. Do Selene and luau-lsp type checking overlap? A. They serve different purposes. Selene detects code style issues, deprecated APIs, and logic patterns. luau-lsp detects type-system errors. Using both is recommended. Q5. When should I use Lune? A. Use Lune for CI/CD automated builds, test execution scripts, and file generation tools — any scenario where you need to run Luau code outside Roblox. Q6. Can this toolchain be used for non-Roblox Luau projects? A. Yes. Selene, StyLua, and Lune are pure Luau/Lua tools independent of Roblox. Rojo and Wally are Roblox-specific.
Professional Roblox Development Support by Oflight
Need help setting up a Roblox development toolchain, building a CI/CD pipeline, or structuring your engineering team? Oflight's specialists provide end-to-end support from environment setup to long-term maintenance. Visit our Software Development Service for details.
Feel free to contact us
Contact Us