The modern Roblox development stack moves work out of Studio and into the filesystem, enabling version control, code review, automated testing, and all the practices expected in professional software engineering. Instead of editing scripts inside aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/brockmartin/roblox-game-skill/llms.txt
Use this file to discover all available pages before exploring further.
.rbxlx place file, developers write code in VS Code, manage dependencies through a package registry, enforce quality with static analysis, and keep everything in Git. The tools below form the standard external toolchain that the Roblox Game Skill expects and supports.
Tool Overview
Rojo
Syncs your filesystem project into Roblox Studio in real time. The foundation of every external workflow.
Wally
The community-standard package manager for Roblox. Installs third-party Luau libraries from a central registry.
Selene
A static analysis linter for Lua and Luau. Catches bugs, unused variables, and API misuse before runtime.
StyLua
An opinionated formatter for Luau, inspired by Prettier. Eliminates formatting debates and diff noise.
Lune
A standalone Luau runtime for running scripts outside Roblox. Ideal for tests, build scripts, and CI.
Aftman
A toolchain manager that installs and pins exact versions of all the above tools. Start here.
| Tool | Purpose | Install Via |
|---|---|---|
| Rojo | Filesystem ↔ Studio sync | Aftman / Cargo |
| Wally | Package manager | Aftman / Cargo |
| Selene | Luau linter | Aftman / Cargo |
| StyLua | Luau/Lua formatter | Aftman / Cargo |
| Lune | Luau runtime outside Roblox | Aftman / Cargo |
| Aftman | Toolchain manager (installs all above) | Cargo |
Aftman — Toolchain Manager
Aftman pins exact versions of every tool in your project, so every developer and every CI run uses identical binaries. Install it once via Cargo, then manage everything else throughaftman.toml.
aftman.toml for a Roblox project:
aftman.toml to Git so every contributor automatically gets the same tool versions.
Rojo — Filesystem Sync
Rojo syncs a filesystem project into Roblox Studio (and back). It is the foundation of all external tooling workflows, enabling you to write code in any editor and have changes appear in Studio instantly.Installation
File Naming Conventions
Rojo determines the Roblox class of each file by its suffix:| File Name Pattern | Roblox Class | Example |
|---|---|---|
*.server.luau | Script | main.server.luau |
*.client.luau | LocalScript | controller.client.luau |
*.luau (no prefix) | ModuleScript | Utils.luau |
init.luau | Folder → ModuleScript | MyModule/init.luau |
init.server.luau | Folder → Script | GameService/init.server.luau |
init.client.luau | Folder → LocalScript | HUD/init.client.luau |
init.meta.json | Sets properties on the folder | MyFolder/init.meta.json |
*.model.json | Rojo model file | part.model.json |
.lua also works, but .luau is the modern standard and enables better LSP support.project.json Configuration
Thedefault.project.json file maps filesystem directories to Roblox services. Here is a complete example:
Common Commands
Two-Way Sync
Rojo supports two-way sync via the Studio plugin. When connected, filesystem changes are pushed into Studio in real time, and script edits made in Studio are synced back to.luau files.
Two-way sync for non-script instances is limited. For level design, most teams commit a
base.rbxlx place file to Git and use Rojo to build on top of it.Wally — Package Manager
Wally is the community-standard package manager for Roblox, maintained by Uplift Games. It mirrors the experience of npm or Cargo: declare dependencies in a manifest, install them with one command, and import them from a localPackages/ directory.
wally.toml Configuration
Realms
Wally uses realms to control where packages end up in the Roblox DataModel:| Realm | Destination | Visible To |
|---|---|---|
shared | ReplicatedStorage | Server + Client |
server | ServerScriptService | Server only |
dev | ReplicatedStorage | Development only |
Installing Packages
wally install, packages appear in the Packages/ directory. Your default.project.json maps this directory into ReplicatedStorage (as shown in the Rojo config above). Generate a sourcemap afterward so the Luau LSP can resolve package types:
Popular Packages
| Package | Author | Purpose |
|---|---|---|
evaera/promise | evaera | Promise implementation for Luau |
sleitnick/knit | sleitnick | Lightweight service/controller framework |
sleitnick/signal | sleitnick | Custom signal (event) implementation |
sleitnick/trove | sleitnick | Cleanup/maid utility |
sleitnick/component | sleitnick | Component pattern for CollectionService tags |
madstudioroblox/profileservice | madstudio | Robust DataStore wrapper |
roblox/testez | Roblox | BDD-style testing framework |
evaera/cmdr | evaera | In-game admin command framework |
stravant/goodsignal | stravant | Optimized signal implementation |
sleitnick/table-util | sleitnick | Table utility functions |
Selene — Luau Linter
Selene is a static analysis tool for Lua and Luau. It catches bugs, style issues, and potential errors before runtime, and integrates into VS Code for inline warnings.Installation
selene.toml Configuration
std = "roblox" setting tells Selene about all Roblox globals (game, workspace, Instance, etc.). Without it, every Roblox API call would trigger undefined_variable. Generate an up-to-date standard library from your project’s types:
Common Commands
Inline Suppression
StyLua — Luau Formatter
StyLua is an opinionated code formatter for Lua and Luau, inspired by Prettier. It eliminates formatting debates and ensures consistent style across every contributor.stylua.toml Configuration
Common Commands
.vscode/settings.json for format-on-save:
VS Code Integration
The Roblox Game Skill is designed around a VS Code workflow. Install these extensions for the best experience:| Extension | Extension ID | Purpose |
|---|---|---|
| Luau LSP | JohnnyMorganz.luau-lsp | Autocomplete, type checking, go-to-definition |
| Rojo | evaera.vscode-rojo | Rojo integration in VS Code |
| Selene | Kampfkarren.selene-vscode | Inline lint warnings |
| StyLua | JohnnyMorganz.stylua | Format-on-save |
.vscode/settings.json
.vscode/extensions.json
Troubleshooting the LSP
Troubleshooting the LSP
- Red squiggles on Roblox APIs: Ensure
luau-lsp.types.robloxistrueand the sourcemap is being generated. Runrojo sourcemap default.project.json -o sourcemap.jsonmanually if auto-generation fails. - Packages not resolving: After
wally install, regenerate the sourcemap. The LSP readssourcemap.jsonto understand the full tree. - Type errors on third-party packages: Some Wally packages lack type annotations. Use
-- luau-lsp ignoreor add type stubs. - Rojo plugin not connecting: Ensure
rojo serveis running and Studio has the Rojo plugin installed via the Rojo VS Code extension or Roblox plugin marketplace.
Project Folder Structure
- Solo Developer
- Team Project
Minimal structure for a single developer:
.luaurc for Path Aliases
CI/CD with GitHub Actions
Common Anti-Patterns
Studio-only development without backups
Studio-only development without backups
Problem: All code lives exclusively inside a Roblox place file. If the file corrupts or you accidentally delete a script, the work is gone. Roblox auto-saves are not a reliable backup strategy.Fix: Use Rojo to keep code on the filesystem and commit to Git. Even a basic
git init + git commit cycle provides infinite undo.Committing Packages/ to Git
Committing Packages/ to Git
Problem: The
Packages/ directory contains third-party code installed by Wally. Committing it bloats the repository, creates noisy diffs on updates, and duplicates what the registry already provides.Fix: Add Packages/ to .gitignore. Run wally install as part of your setup and CI scripts. Commit wally.lock for reproducibility.Not using type annotations
Not using type annotations
Problem: Luau has a powerful type system, but many developers ignore it. Without types, refactoring is risky, autocomplete is limited, and bugs slip through.Fix: Annotate function signatures, especially on public module APIs. Use
--!strict at the top of critical modules. Run luau-lsp analyze in CI.Monolithic scripts
Monolithic scripts
Problem: A single 2,000-line server script handles combat, data, matchmaking, and UI updates. Impossible to test, review, or maintain.Fix: Split into focused services/modules. Each module should do one thing. Use
init.luau folders to group related files. Aim for files under 300 lines.