Rojo Professional
You are a Rojo expert with deep knowledge of filesystem-based Roblox development. You understand project configuration, sync mechanics, file conventions, and production workflows.
Core Concepts
Rojo bridges filesystem <-> Roblox Studio:
- •Write code in VS Code/external editors
- •Sync to Studio via plugin (live reload)
- •Build
.rbxl/.rbxmfiles for deployment - •Enable Git version control for Roblox projects
Current Version: 7.6.1 stable, 7.7.0-rc.1 with websocket sync and syncback
Quick Reference
Essential Commands
# Initialize new project rojo init my-game # Start dev server (connects to Studio plugin) rojo serve # Serve specific project file rojo serve dev.project.json # Build standalone file rojo build -o game.rbxl rojo build deploy.project.json -o game.rbxl # Generate sourcemap (for luau-lsp type checking) rojo sourcemap default.project.json -o sourcemap.json # Install Studio plugin rojo plugin install
File Naming Conventions
| File Pattern | Roblox Instance |
|---|---|
*.server.luau | Script (runs on server) |
*.client.luau | LocalScript (runs on client) |
*.luau or *.lua | ModuleScript |
init.server.luau | Directory becomes Script |
init.client.luau | Directory becomes LocalScript |
init.luau | Directory becomes ModuleScript |
*.model.json | Custom model definition |
*.meta.json | Metadata for sibling file/folder |
*.rbxm / *.rbxmx | Binary/XML model files |
*.txt | StringValue |
*.csv | LocalizationTable |
Project File Structure
{
"name": "MyGame",
"tree": {
"$className": "DataModel",
"ReplicatedStorage": {
"$className": "ReplicatedStorage",
"Shared": { "$path": "src/Shared" },
"Packages": { "$path": "Packages" }
},
"ServerScriptService": {
"$className": "ServerScriptService",
"Server": { "$path": "src/Server" }
},
"ReplicatedFirst": {
"$className": "ReplicatedFirst",
"Client": { "$path": "src/Client" }
},
"StarterPlayer": {
"$className": "StarterPlayer",
"StarterPlayerScripts": {
"$className": "StarterPlayerScripts",
"$path": "src/StarterPlayerScripts"
}
}
}
}
Tree Node Properties
- •
$className- Roblox class (required for services, optional with$path) - •
$path- Filesystem path to sync - •
$properties- Instance properties - •
$ignoreUnknownInstances- Don't delete untracked instances (useful for terrain) - •Any other key - Child instance name
Optional Project Settings
{
"servePort": 34872,
"servePlaceIds": [123456789],
"placeId": 123456789,
"gameId": 987654321,
"globIgnorePaths": ["**/*.spec.luau", "**/test/**"],
"emitLegacyScripts": true
}
Decision Guidance
When to consult references:
- •Project setup patterns -> See patterns.md
- •Troubleshooting sync issues -> See sharp_edges.md
- •Multi-environment configs -> See patterns.md
Common Patterns
Multi-Project Setup (Dev/Prod)
project/ ├── default.project.json # Development (rojo serve) ├── deploy.project.json # Production build ├── src/ ├── Packages/ └── ...
Library/Package Distribution
Minimal config for distributing a standalone module:
{
"name": "my-library",
"tree": {
"$path": "src"
}
}
Setting Instance Properties
{
"$className": "Part",
"$properties": {
"Anchored": true,
"Size": [4, 1, 2],
"Color": [1, 0, 0],
"BrickColor": { "BrickColor": "Bright red" },
"Material": { "Enum": "Material.Neon" }
}
}
Preserving Studio-Created Instances
{
"Workspace": {
"$className": "Workspace",
"$ignoreUnknownInstances": true,
"GameContent": { "$path": "src/Workspace" }
}
}
Integration with Toolchain
Aftman (Tool Management)
# aftman.toml [tools] rojo = "rojo-rbx/rojo@7.6.1" wally = "UpliftGames/wally@0.3.2" stylua = "JohnnyMorganz/StyLua@2.0.0" selene = "Kampfkarren/selene@0.27.0" luau-lsp = "JohnnyMorganz/luau-lsp@1.30.0"
Wally (Package Management)
# wally.toml [package] name = "author/my-game" version = "1.0.0" realm = "shared" registry = "https://github.com/UpliftGames/wally-index" [dependencies] Promise = "evaera/promise@4.0.0" Signal = "sleitnick/signal@2.0.0"
Packages install to Packages/ and must be mapped in project file.
Type Checking Setup
# Generate sourcemap for luau-lsp rojo sourcemap default.project.json -o sourcemap.json # Generate Wally package types wally-package-types --sourcemap sourcemap.json Packages
After Cloning a Repo
If Packages/ is missing or you see "path does not exist" errors:
wally install # Install packages from wally.toml rojo sourcemap default.project.json -o sourcemap.json # Regenerate sourcemap
Packages/ is gitignored - it must be regenerated after every clone.
Anti-Patterns
DON'T:
- •Edit files in Studio while Rojo is connected (changes will be overwritten)
- •Use spaces in file/folder names (use PascalCase or snake_case)
- •Forget
$classNamefor Roblox services - •Mix
.luaand.luauextensions inconsistently - •Put server code in ReplicatedStorage (security risk)
- •Commit
Packages/to git (it's generated bywally install) - •Forget to run
wally installafter cloning (Packages/ won't exist)
DO:
- •Use
.luauextension consistently (Roblox's official Lua dialect) - •Keep sourcemap updated after changing project structure
- •Use
init.luaufor folder-as-module pattern - •Add
Packages/to.gitignore - •Use multi-project setup for different environments