Rojo enables Roblox developers to use professional-grade software engineering tools https://rojo.space
Find a file
Joe 63b0b031ff Optimize syncback process and enhance patch selection logic
- Improved the syncback functionality by detecting unchanged output file hashes to avoid unnecessary writes, optimizing performance for larger projects.
- Updated the patch selection logic to ensure that auto-selection only occurs when the current selection matches the default, enhancing user experience during patch reviews.

These changes aim to streamline file synchronization and improve the clarity of patch management in the application.
2026-03-01 06:43:25 -06:00
.cargo Use new Cargo config.toml convention 2021-07-12 13:19:36 -04:00
.config Add project configuration and test files in JSON5 format 2026-01-30 09:16:46 -06:00
.cursor Refactor error handling and improve code readability in ServeSession and applyPatch 2026-02-28 06:44:37 -06:00
.github/workflows Add plugin upload workflow and related enhancements 2026-02-19 06:12:03 -06:00
.lune 8.4.0 rc2 2026-02-19 06:23:55 -06:00
.vscode Merge branch 'master' of github.com:UserGeneratedLLC/rojo 2026-02-22 13:44:04 -06:00
assets Update TODO list and project template with new ignore paths and sync optimizations 2026-02-28 05:28:16 -06:00
benches Add plugin build flag (#735) 2023-07-17 19:15:40 -07:00
build/windows Support long file paths on Windows (past 256 limit) (#464) 2021-08-23 15:21:01 -04:00
crates Enhance file and directory removal logic in VFS 2026-02-19 05:24:56 -06:00
plugin Optimize syncback process and enhance patch selection logic 2026-03-01 06:43:25 -06:00
rbx-dom@b75dd401b2 Update submodule: rbx-dom to latest commit b75dd401 2026-02-19 05:32:27 -06:00
rojo-test Enhance scripts-only mode handling and improve temp ID resolution 2026-02-28 07:23:49 -06:00
scripts Add plugin upload workflow and related enhancements 2026-02-19 06:12:03 -06:00
src Refactor TODO list and enhance slugification for reserved names 2026-03-01 06:41:29 -06:00
test-projects Improves sourcemap path handling with pathdiff 2026-02-09 23:31:44 -06:00
tests Add wait_until_all_staged function to improve file staging checks 2026-02-28 14:26:44 -06:00
vscode-rojo@08656cd5f7 Update submodule to latest commit 08656cd5 2026-02-19 08:07:00 -06:00
.dir-locals.el Plugin dev ux improvements (#992) 2024-11-10 15:53:58 -08:00
.editorconfig Changed file extensions of init command from lua to luau (#831) 2024-01-05 16:00:49 -08:00
.git-blame-ignore-revs Create .git-blame-ignore-revs & Add Stylua pr (#787) 2023-09-19 05:56:39 +00:00
.gitattributes Set linguist language of lua files to luau (#956) 2024-08-02 10:03:57 -07:00
.gitignore Add .env to .gitignore and update dependencies 2026-02-09 22:20:33 -06:00
.gitmodules Add plugin upload workflow and related enhancements 2026-02-19 06:12:03 -06:00
build.rs Add plugin upload workflow and related enhancements 2026-02-19 06:12:03 -06:00
Cargo.lock v8.4.1 2026-02-19 08:08:17 -06:00
Cargo.toml v8.4.1 2026-02-19 08:08:17 -06:00
CHANGELOG.md Enhance scripts-only mode in RojoTree with optimizations and fixes 2026-02-28 11:17:41 -06:00
CONTRIBUTING.md Fix a grammar error and a typo (#1113) 2025-09-16 11:00:34 -07:00
install.ps1 Add vscode-rojo installation script execution to install scripts 2026-02-08 16:30:55 -06:00
install.sh Add vscode-rojo installation script execution to install scripts 2026-02-08 16:30:55 -06:00
LICENSE.txt Tweak bottom of README, move LICENSE to LICENSE.txt 2019-01-18 20:57:19 -08:00
plugin.project.json Add plugin upload workflow and related enhancements 2026-02-19 06:12:03 -06:00
README.md Update README and CLI clone command for Atlas 2026-02-19 07:08:11 -06:00
rokit.toml Add plugin upload workflow and related enhancements 2026-02-19 06:12:03 -06:00
selene.toml Move to using Rokit, update tools, and don't install unnecessary tools (#1109) 2025-08-29 18:45:15 -07:00
testez.yml Update selene (#550) 2022-06-12 03:41:49 -04:00
TODO.txt Optimize syncback process and enhance patch selection logic 2026-03-01 06:43:25 -06:00

Atlas
 
CI status VS Code Marketplace Open VSX Registry

Atlas bridges Roblox Studio with Cursor/Claude, so large teams can collaborate on complex games with full project context.

Features

  • Live Sync — Work on scripts and models from the filesystem with real-time sync to Roblox Studio
  • Two-Way Sync — Push changes from the filesystem to Studio, or pull changes from Studio back to the filesystem
  • Build & Upload — Package and deploy .rbxl, .rbxm, .rbxlx, and .rbxmx files from the command line
  • Syncback — Pull an entire Roblox place into a local project with one command
  • Clone — Create a full local project from any existing Roblox place: atlas clone PLACEID
  • Cursor / VS Code Extension — JSON5 schema support, automatic CLI installation, bundled Luau tooling

Installation

The fastest way to get started is to install the Cursor or VS Code extension, which handles CLI installation automatically.

1. Install the Extension

The extension will prompt to install the Atlas CLI via Rokit and the Roblox Studio plugin if they aren't already on your system.

2. Alternative: Manual CLI Install

If you prefer not to use the extension, install the CLI directly:

Via Rokit (recommended):

rokit add --global UserGeneratedLLC/rojo atlas

Build from source:

git clone --recursive https://github.com/UserGeneratedLLC/rojo
cd rojo
cargo build --release

The binary is output to target/release/atlas (or atlas.exe on Windows).

Getting Started

Clone an Existing PlaceId

atlas clone 123456789              # Download and set up the project locally
atlas serve                        # Start live sync server for Roblox Studio

Then just:

atlas studio                         # Open the project in Roblox Studio
atlas cursor                         # Open the project in Cursor IDE

New Project

atlas init --kind place
atlas serve

Then in Roblox Studio, open the Atlas plugin widget and click Connect.

CLI Commands

Core

atlas serve [project]                # Start live sync server (default port: 34873)
atlas serve --port 8080              # Use a custom port
atlas build [project] -o out.rbxl    # Build to .rbxl, .rbxm, .rbxlx, or .rbxmx
atlas build --watch -o out.rbxl      # Rebuild automatically on file changes
atlas build --plugin Plugin.rbxm     # Build directly to Studio's plugins folder
atlas upload [project] --asset_id ID # Upload to Roblox (cookie or API key auth)

Project Management

atlas init                           # Initialize a new place project
atlas init --kind model              # Initialize a model project
atlas init --kind plugin             # Initialize a plugin project
atlas clone PLACEID                  # Clone a Roblox place into a new local project
atlas fmt-project [project]          # Reformat project file with sorted keys

Syncback

atlas syncback [project]             # Sync from a local .rbxl to the filesystem
atlas syncback -d PLACEID            # Download the place from Roblox first
atlas syncback --incremental         # Preserve existing file structure
atlas syncback --list                # Preview what will change (no writes)
atlas syncback --dry-run             # Simulate without writing files
atlas syncback --sourcemap           # Generate sourcemap.json after sync

atlas pull is an alias for atlas syncback.

Tooling

atlas sourcemap [project]            # Generate sourcemap.json for Luau LSP
atlas sourcemap --watch              # Regenerate on file changes
atlas plugin install                 # Install the Studio plugin
atlas plugin uninstall               # Remove the Studio plugin
atlas studio [project]               # Open the project in Roblox Studio
atlas cursor [path]                  # Open the project in Cursor IDE
atlas doc                            # Open documentation in the browser

Global Options

atlas --verbose                      # Enable debug logging (-v, -vv, -vvv)
atlas --color never                  # Disable colored output (auto | always | never)

Workflows

Cloning from an Existing Place

atlas clone 123456789

What happens:

  1. Fetches the experience name from the Roblox API
  2. Creates a project folder with a sanitized name
  3. Initializes the project with atlas init
  4. Downloads the place and runs syncback to write all instances to the filesystem
  5. Commits the result if git was initialized

Updating from Roblox

If the place has been edited in Studio and you want to pull those changes back:

atlas syncback -d PLACEID

Or if you already have a local .rbxl file:

atlas syncback

Use --incremental to preserve your existing file layout, or omit it for a clean rebuild. Use --list or --dry-run to preview before committing to changes.

Shortcuts

Command What it does
atlas studio Opens the project's place in Roblox Studio (reads servePlaceIds from the project file)
atlas cursor Opens the project directory in Cursor IDE

One-Shot Mode

One-Shot Sync is a plugin setting (enabled by default) that performs a single sync and then disconnects. When enabled:

  • The project tree syncs once, then the plugin automatically disconnects
  • All automatic outgoing writes are blocked — only changes you explicitly confirm are applied
  • The sync lock is skipped, so any number of people can connect and work together simultaneously
  • A 30-second safety timeout ensures the connection is cleaned up

To use persistent (continuous) sync instead, disable "One-Shot Sync" in the plugin settings.

Working with Teams

Atlas includes a sync lock to prevent conflicts when multiple people work on the same place in Team Create.

  • A session lock (__Atlas_SessionLock in ServerStorage) is acquired when someone connects in persistent mode
  • Only one user can actively sync at a time — others see a message indicating who holds the lock
  • One-shot mode bypasses the lock, letting the whole team preview the synced state without conflicts

Recommended team workflow: One designated person syncs in persistent mode (one-shot disabled). Everyone else uses one-shot mode for quick, conflict-free previews.

File Formats

Scripts

Extension Result RunContext
*.luau ModuleScript —
*.server.luau Script Server
*.client.luau Script Client
*.plugin.luau Script Plugin
*.local.luau LocalScript —
*.legacy.luau Script Legacy

Data & Models

Extension Result
*.json5 ModuleScript (Lua table)
*.toml ModuleScript (Lua table)
*.yaml / *.yml ModuleScript (Lua table)
*.csv LocalizationTable
*.txt StringValue
*.rbxm Binary model
*.rbxmx XML model
*.model.json5 JSON model

Metadata & Projects

Extension Purpose
*.meta.json5 Add properties/attributes to a sibling instance
*.project.json5 Project file (or nested project)

Legacy .lua, .json, .meta.json, .model.json, and .project.json extensions are still supported.

Project Structure

A typical Atlas place project:

MyGame/
├── default.project.json5    # Project configuration
├── src/                     # Instance tree (synced to DataModel)
│   ├── ReplicatedStorage/
│   ├── ServerScriptService/
│   ├── ServerStorage/
│   ├── StarterGui/
│   ├── StarterPlayer/
│   └── Workspace/
├── rokit.toml               # Pins Atlas version for the project
└── .luaurc                  # Luau LSP configuration

Example default.project.json5:

{
  name: "MyGame",
  servePlaceIds: [123456789],
  tree: {
    $className: "DataModel",
    $path: "src"
  }
}

Troubleshooting

Plugin not connecting

  • Ensure atlas serve is running
  • Check that the port matches (default: 34873, or whatever servePort is set to in your project file)
  • Verify the Atlas CLI version matches the plugin version (major.minor must agree)

Syncback produces unexpected results

  • Use --list or --dry-run to preview changes before writing
  • Try --incremental to preserve your existing file structure
  • Check syncbackRules in your project file for ignored paths or classes

Build errors

  • Run atlas fmt-project to fix JSON formatting issues
  • Ensure all $path entries in the project file point to existing files/directories

Plugin shows "another user is syncing"

  • Someone else holds the sync lock in Team Create
  • Wait for them to disconnect, or use one-shot mode to preview without locking