roblox-rojo
Official sources (always check these for the latest):
- https://rojo.space/docs/v7/ (docs index; current major is v7)
- https://rojo.space/docs/v7/getting-started/installation/
- https://rojo.space/docs/v7/getting-started/new-game/
- https://rojo.space/docs/v7/getting-started/existing-game/
- https://rojo.space/docs/v7/project-format/
- https://rojo.space/docs/v7/properties/
- https://rojo.space/docs/v7/sync-details/
- https://rojo.space/docs/v7/upgrade/
- https://github.com/rojo-rbx/rojo/releases (latest CLI/plugin releases; verify version before recommending install pins)
- https://github.com/rojo-rbx/rojo (source of truth for CLI flags and changelog when docs lag)
Rojo maps a filesystem project to Roblox instances so you can edit with external tools (VS Code, Git, linters, formatters) and live-sync or build into Studio/place files. This skill covers Rojo 7 as documented at rojo.space and implemented in the current rojo-rbx/rojo release line.
When to use this skill
Activate when the user is:
- Installing or upgrading Rojo (CLI, Studio plugin, VS Code extension, Rokit).
- Creating a new place/model/plugin project (
rojo init). - Writing or fixing
.project.json/.project.jsonctrees. - Live-syncing with
rojo serve+ the Studio plugin. - Building places/models (
rojo build) or uploading (rojo upload). - Generating sourcemaps for Luau LSP (
rojo sourcemap). - Porting an existing place (
rojo syncback, rbxlx-to-rojo, Lune). - Choosing script naming (
.server.luauvs.client.luauvs modules) oremitLegacyScripts.
Cross-reference:
- roblox/SKILL.md for architecture and routing.
- roblox-core/SKILL.md for services,
RunContext, and the data model. - roblox-mcp/SKILL.md when combining Rojo with Studio MCP / Script Sync for agent workflows.
Mental model
| Piece | Role |
|---|---|
| Rojo CLI | Reads the project file + filesystem; serves live sync, builds place/model files, uploads, sourcemaps, syncback. |
| Studio plugin | Connects to the local serve session and applies patches into the open place. |
| Project file | *.project.json / *.project.jsonc describing the instance tree and options. |
| Filesystem tree | Scripts, models, JSON/TOML/YAML/CSV/text under $path nodes become Instances. |
Rojo is filesystem → Studio for live sync (one primary direction). Optional two-way sync in the plugin is experimental and incomplete — do not design production workflows around it. For place → files, use rojo syncback (Rojo 7.7+) or external porting tools.
Quick start (correct order)
- Install the CLI (Rokit recommended for projects; GitHub binaries or
cargo install rojo --version ^7also supported). - Install the Studio plugin with
rojo plugin install(or GitHubrbxm/ Roblox.com plugin for the matching major). rojo init my-game(or open folder + VS Code “Rojo: Open Menu”).rojo servein the project folder.- In Studio: open the Rojo plugin panel → Connect.
- Edit files on disk; watch them sync. Use
rojo build -o build.rbxlxfor a one-shot place file.
Full install matrix and CLI flags: references/installation-and-cli.md.
Script file → Instance mapping (defaults)
Both .lua and .luau are supported. Default rules (from Rojo source / sync docs):
| File pattern | Instance (when emitLegacyScripts is true, the default) |
Instance (when emitLegacyScripts is false) |
|---|---|---|
*.server.lua(u) |
Script (legacy RunContext) |
Script with RunContext = Server |
*.client.lua(u) |
LocalScript |
Script with RunContext = Client |
*.plugin.lua(u) |
Script with RunContext = Plugin |
same |
other *.lua(u) |
ModuleScript |
same |
Init usurpers (replace the parent folder with a script): init.server.lua(u), init.client.lua(u), init.plugin.lua(u), init.lua(u). Only one init script type per folder. A directory with default.project.json / default.project.jsonc is treated as a nested project instead of a plain folder.
Other defaults: .rbxm/.rbxmx models, .model.json(c), plain .json(c) → ModuleScript returning a table, .toml / .yml/.yaml similarly, .csv → LocalizationTable, .txt → StringValue.
Details, meta files, limitations: references/sync-details.md.
Project file essentials
Minimal place-shaped tree (services inferred without $className for known services):
{
"name": "MyGame",
"tree": {
"$className": "DataModel",
"ReplicatedStorage": {
"$path": "src/ReplicatedStorage"
},
"ServerScriptService": {
"$path": "src/ServerScriptService"
},
"StarterPlayer": {
"StarterPlayerScripts": {
"$path": "src/StarterPlayerScripts"
}
}
}
}
Important top-level fields (docs + current CLI):
| Field | Purpose |
|---|---|
name |
Project/instance name (optional for default.project.json — folder name used). |
tree |
Root instance description (required). |
servePort |
Default port for rojo serve (default 34872). |
serveAddress |
Default bind address when CLI --address omitted. |
servePlaceIds / blockedPlaceIds |
Allow/deny live-sync targets by place ID. |
placeId / gameId |
Set Studio place/universe IDs on connect. |
serveAllowedHosts |
Extra Host/Origin values for serve (hostname access); CLI --allowed-hosts overrides. |
globIgnorePaths |
Globs to ignore (gitignore-style negation supported in recent releases). |
emitLegacyScripts |
Default true = Script/LocalScript; false = RunContext Scripts for server/client files. |
syncRules |
Custom file→middleware patterns. |
syncbackRules |
Controls rojo syncback behavior. |
Instance nodes use $className, $path, $properties, $attributes, $ignoreUnknownInstances, plus child keys. Prefer implicit property syntax. Full format: references/project-format.md.
Daily commands
# New project (place | model | plugin)
rojo init my-game
rojo init --kind model
rojo init --kind plugin --skip-git
# Live sync (default localhost:34872)
rojo serve
rojo serve --port 34872 --address 127.0.0.1
# Build place/model
rojo build -o build.rbxlx
rojo build -o build.rbxl
rojo build --plugin MyPlugin.rbxm
rojo build -o out.rbxlx --watch
# Sourcemap for editor tooling
rojo sourcemap --output sourcemap.json
rojo sourcemap --watch --absolute
# Upload (prefer dedicated deploy account; never commit cookies/keys)
rojo upload --asset_id PLACE_ID --cookie "..."
rojo upload --asset_id PLACE_ID --api_key "..." --universe_id UNIVERSE_ID
# Place file → filesystem into an existing project tree
rojo syncback . --input place.rbxl
rojo syncback . --input place.rbxlx --dry-run --list
# Plugin management / docs / format
rojo plugin install
rojo plugin uninstall
rojo doc
rojo fmt-project
Live-sync limitations (do not ignore)
Not all property types apply in real time (Studio plugin API limits). Common cases that may need a full build + open instead of live sync:
- Binary data (Terrain, CSG)
MeshPart.MeshIdHttpService.HttpEnabled
Property type coverage for build vs live sync is documented on the Properties page and rbx-dom’s coverage chart. When live sync fails for a class/property, rebuild with rojo build and open the place.
rojo serve binds to loopback by default. Binding to a network-reachable address exposes the session: recent Rojo versions validate Host/Origin, gate some APIs to local clients, and warn on non-local binds. Prefer localhost; if you must expose, use serveAllowedHosts / --allowed-hosts deliberately.
Porting existing games
- Refactor Studio code into fewer service-rooted locations (
ReplicatedStorage,ServerScriptService,StarterPlayer, tags viaCollectionService) before porting. - Prefer
rojo syncbackwith a project that already lists the services/paths you want filled (rojo syncback path/to/project --input place.rbxl). Only descendants of nodes present in the project tree are written. - Alternatives called out in official docs: rbxlx-to-rojo, Lune for custom pipelines.
- Leaving Rojo is always possible: Rojo builds normal place/model files; you can stop using the filesystem tree and edit in Studio only.
Workflows and syncback rules: references/workflows-and-syncback.md.
Agent checklist (do this, not that)
- Do pin CLI + plugin to the same major (Rojo 7 plugin with Rojo 7 CLI).
- Do run
rojo plugin installafter upgrading the CLI. - Do put shared modules under
ReplicatedStoragepaths and server authority underServerScriptService. - Do use
.luau(Rojo’sinittemplates use.luausince 7.4). - Do set
emitLegacyScripts: falseonly when the team understands modernRunContextscripts (and that client files becomeScript+Client, notLocalScript). - Do not invent CLI flags or project keys — if unsure, run
rojo --help/rojo <cmd> --helpor re-check docs/changelog. - Do not commit
.ROBLOSECURITYcookies or Open Cloud API keys used withrojo upload. - Do not treat experimental two-way sync as reliable source control.
- Do not confuse Rojo with Roblox Script Sync or Studio MCP — different tools; they can coexist (see roblox-mcp).
Verification
-
rojo --versionreports a 7.x release matching the intended pin. - Studio shows the Rojo 7 plugin; connect succeeds against
rojo serve. - Editing a
.server.luauunder a mapped$pathupdates the correct service in Studio. -
rojo build -o build.rbxlxopens cleanly in Studio. -
sourcemap.jsonis gitignored if generated (Rojo’s default gitignore template includes it in recent releases).
How to proceed
- Confirm install path: references/installation-and-cli.md.
- Shape the tree: references/project-format.md.
- Name files correctly: references/sync-details.md.
- For teams / porting / deploy: references/workflows-and-syncback.md.
Reference index
- installation-and-cli.md
- project-format.md
- sync-details.md
- workflows-and-syncback.md